diff --git a/dist/echarts.common.js b/dist/echarts.common.js
index 1a8dead..8e6c234 100644
--- a/dist/echarts.common.js
+++ b/dist/echarts.common.js
@@ -63,21 +63,21 @@
 	__webpack_require__(139);
 	__webpack_require__(146);
 	__webpack_require__(155);
-	__webpack_require__(312);
-	__webpack_require__(320);
+	__webpack_require__(318);
+	__webpack_require__(326);
 	__webpack_require__(297);
-	__webpack_require__(314);
+	__webpack_require__(320);
 
-	__webpack_require__(313);
-	__webpack_require__(354);
+	__webpack_require__(319);
+	__webpack_require__(361);
 
-	__webpack_require__(383);
-	__webpack_require__(389);
-	__webpack_require__(392);
-	__webpack_require__(355);
-	__webpack_require__(404);
+	__webpack_require__(390);
+	__webpack_require__(396);
+	__webpack_require__(399);
+	__webpack_require__(362);
+	__webpack_require__(411);
 
-	__webpack_require__(416);
+	__webpack_require__(423);
 
 /***/ },
 /* 1 */
@@ -115,23 +115,23 @@
 	    var env = __webpack_require__(2);
 
 	    var GlobalModel = __webpack_require__(3);
-	    var ExtensionAPI = __webpack_require__(25);
-	    var CoordinateSystemManager = __webpack_require__(26);
-	    var OptionManager = __webpack_require__(27);
+	    var ExtensionAPI = __webpack_require__(75);
+	    var CoordinateSystemManager = __webpack_require__(76);
+	    var OptionManager = __webpack_require__(77);
 
-	    var ComponentModel = __webpack_require__(19);
-	    var SeriesModel = __webpack_require__(28);
+	    var ComponentModel = __webpack_require__(69);
+	    var SeriesModel = __webpack_require__(78);
 
-	    var ComponentView = __webpack_require__(29);
-	    var ChartView = __webpack_require__(43);
-	    var graphic = __webpack_require__(44);
+	    var ComponentView = __webpack_require__(79);
+	    var ChartView = __webpack_require__(80);
+	    var graphic = __webpack_require__(18);
 	    var modelUtil = __webpack_require__(5);
 	    var throttle = __webpack_require__(81);
 
 	    var zrender = __webpack_require__(82);
 	    var zrUtil = __webpack_require__(4);
-	    var colorTool = __webpack_require__(39);
-	    var Eventful = __webpack_require__(33);
+	    var colorTool = __webpack_require__(31);
+	    var Eventful = __webpack_require__(25);
 	    var timsort = __webpack_require__(86);
 
 	    var each = zrUtil.each;
@@ -361,14 +361,7 @@
 	            ecModel.init(null, null, theme, optionManager);
 	        }
 
-	        // FIXME
-	        // ugly
-	        this.__lastOnlyGraphic = !!(option && option.graphic);
-	        zrUtil.each(option, function (o, mainType) {
-	            mainType !== 'graphic' && (this.__lastOnlyGraphic = false);
-	        }, this);
-
-	        this._model.setOption(option, optionPreprocessorFuncs, this.__lastOnlyGraphic);
+	        this._model.setOption(option, optionPreprocessorFuncs);
 
 	        if (lazyUpdate) {
 	            this[OPTION_UPDATED] = {silent: silent};
@@ -894,21 +887,7 @@
 
 	            prepareView.call(this, 'chart', ecModel);
 
-	            // FIXME
-	            // ugly
-	            if (this.__lastOnlyGraphic) {
-	                each(this._componentsViews, function (componentView) {
-	                    var componentModel = componentView.__model;
-	                    if (componentModel && componentModel.mainType === 'graphic') {
-	                        componentView.render(componentModel, ecModel, this._api, payload);
-	                        updateZ(componentModel, componentView);
-	                    }
-	                }, this);
-	                this.__lastOnlyGraphic = false;
-	            }
-	            else {
-	                updateMethods.update.call(this, payload);
-	            }
+	            updateMethods.update.call(this, payload);
 	        }
 	    };
 
@@ -1225,7 +1204,7 @@
 	            }
 
 	            // Consider: id same and type changed.
-	            var viewId = model.id + '_' + model.type;
+	            var viewId = '_ec_' + model.id + '_' + model.type;
 	            var view = viewMap[viewId];
 	            if (!view) {
 	                var classType = parseClassType(model.type);
@@ -1291,7 +1270,8 @@
 	            var data = series.getData();
 	            if (stack && data.type === 'list') {
 	                var previousStack = stackedDataMap[stack];
-	                if (previousStack) {
+	                // Avoid conflict with Object.prototype
+	                if (stackedDataMap.hasOwnProperty(stack) && previousStack) {
 	                    data.stackedOn = previousStack;
 	                }
 	                stackedDataMap[stack] = data;
@@ -1613,6 +1593,7 @@
 	    var idBase = new Date() - 0;
 	    var groupIdBase = new Date() - 0;
 	    var DOM_ATTRIBUTE_KEY = '_echarts_instance_';
+
 	    /**
 	     * @alias module:echarts
 	     */
@@ -1620,9 +1601,9 @@
 	        /**
 	         * @type {number}
 	         */
-	        version: '3.5.4',
+	        version: '3.6.0',
 	        dependencies: {
-	            zrender: '3.4.4'
+	            zrender: '3.5.0'
 	        }
 	    };
 
@@ -1689,9 +1670,21 @@
 	                    + echarts.dependencies.zrender + '+'
 	                );
 	            }
+
 	            if (!dom) {
 	                throw new Error('Initialize failed: invalid dom.');
 	            }
+	        }
+
+	        var existInstance = echarts.getInstanceByDom(dom);
+	        if (existInstance) {
+	            if (true) {
+	                console.warn('There is a chart instance already initialized on the dom.');
+	            }
+	            return existInstance;
+	        }
+
+	        if (true) {
 	            if (zrUtil.isDom(dom)
 	                && dom.nodeName.toUpperCase() !== 'CANVAS'
 	                && (
@@ -1707,8 +1700,12 @@
 	        chart.id = 'ec_' + idBase++;
 	        instances[chart.id] = chart;
 
-	        dom.setAttribute &&
+	        if (dom.setAttribute) {
 	            dom.setAttribute(DOM_ATTRIBUTE_KEY, chart.id);
+	        }
+	        else {
+	            dom[DOM_ATTRIBUTE_KEY] = chart.id;
+	        }
 
 	        enableConnect(chart);
 
@@ -1756,12 +1753,13 @@
 	     * @param  {module:echarts~ECharts|HTMLDomElement|string} chart
 	     */
 	    echarts.dispose = function (chart) {
-	        if (zrUtil.isDom(chart)) {
-	            chart = echarts.getInstanceByDom(chart);
-	        }
-	        else if (typeof chart === 'string') {
+	        if (typeof chart === 'string') {
 	            chart = instances[chart];
 	        }
+	        else if (!(chart instanceof ECharts)){
+	            // Try to treat as dom
+	            chart = echarts.getInstanceByDom(chart);
+	        }
 	        if ((chart instanceof ECharts) && !chart.isDisposed()) {
 	            chart.dispose();
 	        }
@@ -1772,9 +1770,16 @@
 	     * @return {echarts~ECharts}
 	     */
 	    echarts.getInstanceByDom = function (dom) {
-	        var key = dom.getAttribute(DOM_ATTRIBUTE_KEY);
+	        var key;
+	        if (dom.getAttribute) {
+	            key = dom.getAttribute(DOM_ATTRIBUTE_KEY);
+	        }
+	        else {
+	            key = dom[DOM_ATTRIBUTE_KEY];
+	        }
 	        return instances[key];
 	    };
+
 	    /**
 	     * @param {string} key
 	     * @return {echarts~ECharts}
@@ -2027,13 +2032,13 @@
 
 	    echarts.Axis = __webpack_require__(100);
 
-	    echarts.graphic = __webpack_require__(44);
+	    echarts.graphic = __webpack_require__(18);
 	    echarts.number = __webpack_require__(7);
 	    echarts.format = __webpack_require__(6);
 	    echarts.throttle = throttle.throttle;
 	    echarts.matrix = __webpack_require__(11);
 	    echarts.vector = __webpack_require__(10);
-	    echarts.color = __webpack_require__(39);
+	    echarts.color = __webpack_require__(31);
 
 	    echarts.util = {};
 	    each([
@@ -2046,7 +2051,7 @@
 	        }
 	    );
 
-	    echarts.helper = __webpack_require__(101);
+	    echarts.helper = __webpack_require__(108);
 
 
 	    // PRIORITY
@@ -2236,9 +2241,9 @@
 	    var indexOf = zrUtil.indexOf;
 	    var isObject = zrUtil.isObject;
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 
-	    var globalDefault = __webpack_require__(23);
+	    var globalDefault = __webpack_require__(73);
 
 	    var OPTION_INNER_KEY = '\0_ec_inner';
 
@@ -2270,7 +2275,7 @@
 	            this._optionManager = optionManager;
 	        },
 
-	        setOption: function (option, optionPreprocessorFuncs, onlyGraphic) {
+	        setOption: function (option, optionPreprocessorFuncs) {
 	            zrUtil.assert(
 	                !(OPTION_INNER_KEY in option),
 	                'please use chart.getOption()'
@@ -2278,7 +2283,7 @@
 
 	            this._optionManager.setOption(option, optionPreprocessorFuncs);
 
-	            this.resetOption(null, onlyGraphic);
+	            this.resetOption(null);
 	        },
 
 	        /**
@@ -2288,7 +2293,7 @@
 	         *                      'media': only reset media query option
 	         * @return {boolean} Whether option changed.
 	         */
-	        resetOption: function (type, onlyGraphic) {
+	        resetOption: function (type) {
 	            var optionChanged = false;
 	            var optionManager = this._optionManager;
 
@@ -2299,11 +2304,7 @@
 	                    initBase.call(this, baseOption);
 	                }
 	                else {
-	                    // If only graphic, other series and component will not
-	                    // go through update process, data should not be restored.
-	                    // Otherwise grphic els mounted on data will be eliminated
-	                    // and downplay will not work.
-	                    !onlyGraphic && this.restoreData();
+	                    this.restoreData();
 	                    this.mergeOption(baseOption);
 	                }
 	                optionChanged = true;
@@ -2365,7 +2366,7 @@
 	                var newCptOptionList = modelUtil.normalizeToArray(newOption[mainType]);
 
 	                var mapResult = modelUtil.mappingToExists(
-	                    componentsMap[mainType], newCptOptionList
+	                    componentsMap.get(mainType), newCptOptionList
 	                );
 
 	                modelUtil.makeIdAndName(mapResult);
@@ -2384,7 +2385,7 @@
 	                );
 
 	                option[mainType] = [];
-	                componentsMap[mainType] = [];
+	                componentsMap.set(mainType, []);
 
 	                each(mapResult, function (resultItem, index) {
 	                    var componentModel = resultItem.exist;
@@ -2434,13 +2435,13 @@
 	                        }
 	                    }
 
-	                    componentsMap[mainType][index] = componentModel;
+	                    componentsMap.get(mainType)[index] = componentModel;
 	                    option[mainType][index] = componentModel.option;
 	                }, this);
 
 	                // Backup series for filtering.
 	                if (mainType === 'series') {
-	                    this._seriesIndices = createSeriesIndices(componentsMap.series);
+	                    this._seriesIndices = createSeriesIndices(componentsMap.get('series'));
 	                }
 	            }
 	        },
@@ -2484,7 +2485,7 @@
 	         * @return {module:echarts/model/Component}
 	         */
 	        getComponent: function (mainType, idx) {
-	            var list = this._componentsMap[mainType];
+	            var list = this._componentsMap.get(mainType);
 	            if (list) {
 	                return list[idx || 0];
 	            }
@@ -2510,7 +2511,7 @@
 	            var id = condition.id;
 	            var name = condition.name;
 
-	            var cpts = this._componentsMap[mainType];
+	            var cpts = this._componentsMap.get(mainType);
 
 	            if (!cpts || !cpts.length) {
 	                return [];
@@ -2585,7 +2586,7 @@
 	            var queryCond = getQueryCond(query);
 	            var result = queryCond
 	                ? this.queryComponents(queryCond)
-	                : this._componentsMap[mainType];
+	                : this._componentsMap.get(mainType);
 
 	            return doFilter(filterBySubType(result, condition));
 
@@ -2644,14 +2645,14 @@
 	            if (typeof mainType === 'function') {
 	                context = cb;
 	                cb = mainType;
-	                each(componentsMap, function (components, componentType) {
+	                componentsMap.each(function (components, componentType) {
 	                    each(components, function (component, index) {
 	                        cb.call(context, componentType, component, index);
 	                    });
 	                });
 	            }
 	            else if (zrUtil.isString(mainType)) {
-	                each(componentsMap[mainType], cb, context);
+	                each(componentsMap.get(mainType), cb, context);
 	            }
 	            else if (isObject(mainType)) {
 	                var queryResult = this.findComponents(mainType);
@@ -2664,7 +2665,7 @@
 	         * @return {Array.<module:echarts/model/Series>}
 	         */
 	        getSeriesByName: function (name) {
-	            var series = this._componentsMap.series;
+	            var series = this._componentsMap.get('series');
 	            return filter(series, function (oneSeries) {
 	                return oneSeries.name === name;
 	            });
@@ -2675,7 +2676,7 @@
 	         * @return {module:echarts/model/Series}
 	         */
 	        getSeriesByIndex: function (seriesIndex) {
-	            return this._componentsMap.series[seriesIndex];
+	            return this._componentsMap.get('series')[seriesIndex];
 	        },
 
 	        /**
@@ -2683,7 +2684,7 @@
 	         * @return {Array.<module:echarts/model/Series>}
 	         */
 	        getSeriesByType: function (subType) {
-	            var series = this._componentsMap.series;
+	            var series = this._componentsMap.get('series');
 	            return filter(series, function (oneSeries) {
 	                return oneSeries.subType === subType;
 	            });
@@ -2693,7 +2694,7 @@
 	         * @return {Array.<module:echarts/model/Series>}
 	         */
 	        getSeries: function () {
-	            return this._componentsMap.series.slice();
+	            return this._componentsMap.get('series').slice();
 	        },
 
 	        /**
@@ -2706,7 +2707,7 @@
 	        eachSeries: function (cb, context) {
 	            assertSeriesInitialized(this);
 	            each(this._seriesIndices, function (rawSeriesIndex) {
-	                var series = this._componentsMap.series[rawSeriesIndex];
+	                var series = this._componentsMap.get('series')[rawSeriesIndex];
 	                cb.call(context, series, rawSeriesIndex);
 	            }, this);
 	        },
@@ -2718,7 +2719,7 @@
 	         * @param {*} context
 	         */
 	        eachRawSeries: function (cb, context) {
-	            each(this._componentsMap.series, cb, context);
+	            each(this._componentsMap.get('series'), cb, context);
 	        },
 
 	        /**
@@ -2732,7 +2733,7 @@
 	        eachSeriesByType: function (subType, cb, context) {
 	            assertSeriesInitialized(this);
 	            each(this._seriesIndices, function (rawSeriesIndex) {
-	                var series = this._componentsMap.series[rawSeriesIndex];
+	                var series = this._componentsMap.get('series')[rawSeriesIndex];
 	                if (series.subType === subType) {
 	                    cb.call(context, series, rawSeriesIndex);
 	                }
@@ -2759,13 +2760,20 @@
 	        },
 
 	        /**
+	         * @return {Array.<number>}
+	         */
+	        getCurrentSeriesIndices: function () {
+	            return (this._seriesIndices || []).slice();
+	        },
+
+	        /**
 	         * @param {Function} cb
 	         * @param {*} context
 	         */
 	        filterSeries: function (cb, context) {
 	            assertSeriesInitialized(this);
 	            var filteredSeries = filter(
-	                this._componentsMap.series, cb, context
+	                this._componentsMap.get('series'), cb, context
 	            );
 	            this._seriesIndices = createSeriesIndices(filteredSeries);
 	        },
@@ -2773,10 +2781,10 @@
 	        restoreData: function () {
 	            var componentsMap = this._componentsMap;
 
-	            this._seriesIndices = createSeriesIndices(componentsMap.series);
+	            this._seriesIndices = createSeriesIndices(componentsMap.get('series'));
 
 	            var componentTypes = [];
-	            each(componentsMap, function (components, componentType) {
+	            componentsMap.each(function (components, componentType) {
 	                componentTypes.push(componentType);
 	            });
 
@@ -2784,7 +2792,7 @@
 	                componentTypes,
 	                ComponentModel.getAllClassMainTypes(),
 	                function (componentType, dependencies) {
-	                    each(componentsMap[componentType], function (component) {
+	                    each(componentsMap.get(componentType), function (component) {
 	                        component.restoreData();
 	                    });
 	                }
@@ -2828,7 +2836,7 @@
 	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
 	         * @private
 	         */
-	        this._componentsMap = {series: []};
+	        this._componentsMap = zrUtil.createHashMap({series: []});
 
 	        /**
 	         * Mapping between filtered series list and raw series list.
@@ -2858,7 +2866,7 @@
 
 	        var ret = {};
 	        each(types, function (type) {
-	            ret[type] = (componentsMap[type] || []).slice();
+	            ret[type] = (componentsMap.get(type) || []).slice();
 	        });
 
 	        return ret;
@@ -2909,12 +2917,12 @@
 	        // which make sure that their initialization is after series.
 	        if (true) {
 	            if (!ecModel._seriesIndices) {
-	                throw new Error('Series has not been initialized yet.');
+	                throw new Error('Option should contains series.');
 	            }
 	        }
 	    }
 
-	    zrUtil.mixin(GlobalModel, __webpack_require__(24));
+	    zrUtil.mixin(GlobalModel, __webpack_require__(74));
 
 	    module.exports = GlobalModel;
 
@@ -3435,9 +3443,12 @@
 
 	    /**
 	     * @constructor
+	     * @param {Object} obj Only apply `ownProperty`.
 	     */
 	    function HashMap(obj) {
-	        obj && extend(this, obj);
+	        obj && each(obj, function (value, key) {
+	            this.set(key, value);
+	        }, this);
 	    }
 
 	    // Add prefix to avoid conflict with Object.prototype.
@@ -3473,8 +3484,8 @@
 	        }
 	    };
 
-	    function createHashMap() {
-	        return new HashMap();
+	    function createHashMap(obj) {
+	        return new HashMap(obj);
 	    }
 
 	    var util = {
@@ -3665,6 +3676,7 @@
 	            var rawDataIndex = data.getRawIndex(dataIndex);
 	            var name = data.getName(dataIndex, true);
 	            var itemOpt = data.getRawDataItem(dataIndex);
+	            var color = data.getItemVisual(dataIndex, 'color');
 
 	            return {
 	                componentType: this.mainType,
@@ -3678,7 +3690,8 @@
 	                data: itemOpt,
 	                dataType: dataType,
 	                value: rawValue,
-	                color: data.getItemVisual(dataIndex, 'color'),
+	                color: color,
+	                marker: formatUtil.getTooltipMarker(color),
 
 	                // Param name list for mapping `a`, `b`, `c`, `d`, `e`
 	                $vars: ['seriesName', 'name', 'value']
@@ -3853,22 +3866,22 @@
 	        // to specify multi components (like series) by one name.
 
 	        // Ensure that each id is distinct.
-	        var idMap = {};
+	        var idMap = zrUtil.createHashMap();
 
 	        each(mapResult, function (item, index) {
 	            var existCpt = item.exist;
-	            existCpt && (idMap[existCpt.id] = item);
+	            existCpt && idMap.set(existCpt.id, item);
 	        });
 
 	        each(mapResult, function (item, index) {
 	            var opt = item.option;
 
 	            zrUtil.assert(
-	                !opt || opt.id == null || !idMap[opt.id] || idMap[opt.id] === item,
+	                !opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item,
 	                'id duplicates: ' + (opt && opt.id)
 	            );
 
-	            opt && opt.id != null && (idMap[opt.id] = item);
+	            opt && opt.id != null && idMap.set(opt.id, item);
 	            !item.keyInfo && (item.keyInfo = {});
 	        });
 
@@ -3908,10 +3921,10 @@
 	                do {
 	                    keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++;
 	                }
-	                while (idMap[keyInfo.id]);
+	                while (idMap.get(keyInfo.id));
 	            }
 
-	            idMap[keyInfo.id] = item;
+	            idMap.set(keyInfo.id, item);
 	        });
 	    };
 
@@ -4117,6 +4130,60 @@
 	        return result;
 	    };
 
+	    /**
+	     * @see {module:echarts/data/helper/completeDimensions}
+	     * @param {module:echarts/data/List} data
+	     * @param {string|number} dataDim
+	     * @return {string}
+	     */
+	    modelUtil.dataDimToCoordDim = function (data, dataDim) {
+	        var dimensions = data.dimensions;
+	        dataDim = data.getDimension(dataDim);
+	        for (var i = 0; i < dimensions.length; i++) {
+	            var dimItem = data.getDimensionInfo(dimensions[i]);
+	            if (dimItem.name === dataDim) {
+	                return dimItem.coordDim;
+	            }
+	        }
+	    };
+
+	    /**
+	     * @see {module:echarts/data/helper/completeDimensions}
+	     * @param {module:echarts/data/List} data
+	     * @param {string} coordDim
+	     * @return {Array.<string>} data dimensions on the coordDim.
+	     */
+	    modelUtil.coordDimToDataDim = function (data, coordDim) {
+	        var dataDim = [];
+	        each(data.dimensions, function (dimName) {
+	            var dimItem = data.getDimensionInfo(dimName);
+	            if (dimItem.coordDim === coordDim) {
+	                dataDim[dimItem.coordDimIndex] = dimItem.name;
+	            }
+	        });
+	        return dataDim;
+	    };
+
+	    /**
+	     * @see {module:echarts/data/helper/completeDimensions}
+	     * @param {module:echarts/data/List} data
+	     * @param {string} otherDim Can be `otherDims`
+	     *                        like 'label' or 'tooltip'.
+	     * @return {Array.<string>} data dimensions on the otherDim.
+	     */
+	    modelUtil.otherDimToDataDim = function (data, otherDim) {
+	        var dataDim = [];
+	        each(data.dimensions, function (dimName) {
+	            var dimItem = data.getDimensionInfo(dimName);
+	            var otherDims = dimItem.otherDims;
+	            var dimIndex = otherDims[otherDim];
+	            if (dimIndex != null && dimIndex !== false) {
+	                dataDim[dimIndex] = dimItem.name;
+	            }
+	        });
+	        return dataDim;
+	    };
+
 	    function has(obj, prop) {
 	        return obj && obj.hasOwnProperty(prop);
 	    }
@@ -4260,6 +4327,18 @@
 	        return tpl;
 	    };
 
+	    /**
+	     * @param {string} color
+	     * @param {string} [extraCssText]
+	     * @return {string}
+	     */
+	    formatUtil.getTooltipMarker = function (color, extraCssText) {
+	        return color
+	            ? '<span style="display:inline-block;margin-right:5px;'
+	                + 'border-radius:10px;width:9px;height:9px;background-color:'
+	                + formatUtil.encodeHTML(color) + ';' + (extraCssText || '') + '"></span>'
+	            : '';
+	    };
 
 	    /**
 	     * @param {string} str
@@ -5871,7 +5950,7 @@
 	    mixin(Model, __webpack_require__(14));
 	    mixin(Model, __webpack_require__(16));
 	    mixin(Model, __webpack_require__(17));
-	    mixin(Model, __webpack_require__(18));
+	    mixin(Model, __webpack_require__(68));
 
 	    module.exports = Model;
 
@@ -6247,10 +6326,7 @@
 	
 
 	    var textContain = __webpack_require__(8);
-
-	    function getShallow(model, path) {
-	        return model && model.getShallow(path);
-	    }
+	    var graphicUtil = __webpack_require__(18);
 
 	    module.exports = {
 	        /**
@@ -6268,15 +6344,12 @@
 	         * @return {string}
 	         */
 	        getFont: function () {
-	            var ecModel = this.ecModel;
-	            var gTextStyleModel = ecModel && ecModel.getModel('textStyle');
-	            return [
-	                // FIXME in node-canvas fontWeight is before fontStyle
-	                this.getShallow('fontStyle') || getShallow(gTextStyleModel, 'fontStyle'),
-	                this.getShallow('fontWeight') || getShallow(gTextStyleModel, 'fontWeight'),
-	                (this.getShallow('fontSize') || getShallow(gTextStyleModel, 'fontSize') || 12) + 'px',
-	                this.getShallow('fontFamily') || getShallow(gTextStyleModel, 'fontFamily') || 'sans-serif'
-	            ].join(' ');
+	            return graphicUtil.getFont({
+	                fontStyle: this.getShallow('fontStyle'),
+	                fontWeight: this.getShallow('fontWeight'),
+	                fontSize: this.getShallow('fontSize'),
+	                fontFamily: this.getShallow('fontFamily')
+	            }, this.ecModel);
 	        },
 
 	        getTextRect: function (text) {
@@ -6300,2254 +6373,2040 @@
 /* 18 */
 /***/ function(module, exports, __webpack_require__) {
 
-	
-	    var getItemStyle = __webpack_require__(15)(
-	        [
-	            ['fill', 'color'],
-	            ['stroke', 'borderColor'],
-	            ['lineWidth', 'borderWidth'],
-	            ['opacity'],
-	            ['shadowBlur'],
-	            ['shadowOffsetX'],
-	            ['shadowOffsetY'],
-	            ['shadowColor'],
-	            ['textPosition'],
-	            ['textAlign']
-	        ]
-	    );
-	    module.exports = {
-	        getItemStyle: function (excludes, includes) {
-	            var style = getItemStyle.call(this, excludes, includes);
-	            var lineDash = this.getBorderLineDash();
-	            lineDash && (style.lineDash = lineDash);
-	            return style;
-	        },
+	'use strict';
 
-	        getBorderLineDash: function () {
-	            var lineType = this.get('borderType');
-	            return (lineType === 'solid' || lineType == null) ? null
-	                : (lineType === 'dashed' ? [5, 5] : [1, 1]);
+
+	    var zrUtil = __webpack_require__(4);
+
+	    var pathTool = __webpack_require__(19);
+	    var Path = __webpack_require__(20);
+	    var colorTool = __webpack_require__(31);
+	    var matrix = __webpack_require__(11);
+	    var vector = __webpack_require__(10);
+	    var Transformable = __webpack_require__(26);
+	    var BoundingRect = __webpack_require__(9);
+
+	    var round = Math.round;
+	    var mathMax = Math.max;
+	    var mathMin = Math.min;
+
+	    var graphic = {};
+
+	    graphic.Group = __webpack_require__(48);
+
+	    graphic.Image = __webpack_require__(49);
+
+	    graphic.Text = __webpack_require__(50);
+
+	    graphic.Circle = __webpack_require__(51);
+
+	    graphic.Sector = __webpack_require__(52);
+
+	    graphic.Ring = __webpack_require__(53);
+
+	    graphic.Polygon = __webpack_require__(54);
+
+	    graphic.Polyline = __webpack_require__(58);
+
+	    graphic.Rect = __webpack_require__(59);
+
+	    graphic.Line = __webpack_require__(61);
+
+	    graphic.BezierCurve = __webpack_require__(62);
+
+	    graphic.Arc = __webpack_require__(63);
+
+	    graphic.CompoundPath = __webpack_require__(64);
+
+	    graphic.LinearGradient = __webpack_require__(65);
+
+	    graphic.RadialGradient = __webpack_require__(67);
+
+	    graphic.BoundingRect = BoundingRect;
+
+	    /**
+	     * Extend shape with parameters
+	     */
+	    graphic.extendShape = function (opts) {
+	        return Path.extend(opts);
+	    };
+
+	    /**
+	     * Extend path
+	     */
+	    graphic.extendPath = function (pathData, opts) {
+	        return pathTool.extendFromString(pathData, opts);
+	    };
+
+	    /**
+	     * Create a path element from path data string
+	     * @param {string} pathData
+	     * @param {Object} opts
+	     * @param {module:zrender/core/BoundingRect} rect
+	     * @param {string} [layout=cover] 'center' or 'cover'
+	     */
+	    graphic.makePath = function (pathData, opts, rect, layout) {
+	        var path = pathTool.createFromString(pathData, opts);
+	        var boundingRect = path.getBoundingRect();
+	        if (rect) {
+	            var aspect = boundingRect.width / boundingRect.height;
+
+	            if (layout === 'center') {
+	                // Set rect to center, keep width / height ratio.
+	                var width = rect.height * aspect;
+	                var height;
+	                if (width <= rect.width) {
+	                    height = rect.height;
+	                }
+	                else {
+	                    width = rect.width;
+	                    height = width / aspect;
+	                }
+	                var cx = rect.x + rect.width / 2;
+	                var cy = rect.y + rect.height / 2;
+
+	                rect.x = cx - width / 2;
+	                rect.y = cy - height / 2;
+	                rect.width = width;
+	                rect.height = height;
+	            }
+
+	            graphic.resizePath(path, rect);
+	        }
+	        return path;
+	    };
+
+	    graphic.mergePath = pathTool.mergePath,
+
+	    /**
+	     * Resize a path to fit the rect
+	     * @param {module:zrender/graphic/Path} path
+	     * @param {Object} rect
+	     */
+	    graphic.resizePath = function (path, rect) {
+	        if (!path.applyTransform) {
+	            return;
+	        }
+
+	        var pathRect = path.getBoundingRect();
+
+	        var m = pathRect.calculateTransform(rect);
+
+	        path.applyTransform(m);
+	    };
+
+	    /**
+	     * Sub pixel optimize line for canvas
+	     *
+	     * @param {Object} param
+	     * @param {Object} [param.shape]
+	     * @param {number} [param.shape.x1]
+	     * @param {number} [param.shape.y1]
+	     * @param {number} [param.shape.x2]
+	     * @param {number} [param.shape.y2]
+	     * @param {Object} [param.style]
+	     * @param {number} [param.style.lineWidth]
+	     * @return {Object} Modified param
+	     */
+	    graphic.subPixelOptimizeLine = function (param) {
+	        var subPixelOptimize = graphic.subPixelOptimize;
+	        var shape = param.shape;
+	        var lineWidth = param.style.lineWidth;
+
+	        if (round(shape.x1 * 2) === round(shape.x2 * 2)) {
+	            shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);
+	        }
+	        if (round(shape.y1 * 2) === round(shape.y2 * 2)) {
+	            shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);
+	        }
+	        return param;
+	    };
+
+	    /**
+	     * Sub pixel optimize rect for canvas
+	     *
+	     * @param {Object} param
+	     * @param {Object} [param.shape]
+	     * @param {number} [param.shape.x]
+	     * @param {number} [param.shape.y]
+	     * @param {number} [param.shape.width]
+	     * @param {number} [param.shape.height]
+	     * @param {Object} [param.style]
+	     * @param {number} [param.style.lineWidth]
+	     * @return {Object} Modified param
+	     */
+	    graphic.subPixelOptimizeRect = function (param) {
+	        var subPixelOptimize = graphic.subPixelOptimize;
+	        var shape = param.shape;
+	        var lineWidth = param.style.lineWidth;
+	        var originX = shape.x;
+	        var originY = shape.y;
+	        var originWidth = shape.width;
+	        var originHeight = shape.height;
+	        shape.x = subPixelOptimize(shape.x, lineWidth, true);
+	        shape.y = subPixelOptimize(shape.y, lineWidth, true);
+	        shape.width = Math.max(
+	            subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x,
+	            originWidth === 0 ? 0 : 1
+	        );
+	        shape.height = Math.max(
+	            subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y,
+	            originHeight === 0 ? 0 : 1
+	        );
+	        return param;
+	    };
+
+	    /**
+	     * Sub pixel optimize for canvas
+	     *
+	     * @param {number} position Coordinate, such as x, y
+	     * @param {number} lineWidth Should be nonnegative integer.
+	     * @param {boolean=} positiveOrNegative Default false (negative).
+	     * @return {number} Optimized position.
+	     */
+	    graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) {
+	        // Assure that (position + lineWidth / 2) is near integer edge,
+	        // otherwise line will be fuzzy in canvas.
+	        var doubledPosition = round(position * 2);
+	        return (doubledPosition + round(lineWidth)) % 2 === 0
+	            ? doubledPosition / 2
+	            : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;
+	    };
+
+	    function hasFillOrStroke(fillOrStroke) {
+	        return fillOrStroke != null && fillOrStroke != 'none';
+	    }
+
+	    function liftColor(color) {
+	        return typeof color === 'string' ? colorTool.lift(color, -0.1) : color;
+	    }
+
+	    /**
+	     * @private
+	     */
+	    function cacheElementStl(el) {
+	        if (el.__hoverStlDirty) {
+	            var stroke = el.style.stroke;
+	            var fill = el.style.fill;
+
+	            // Create hoverStyle on mouseover
+	            var hoverStyle = el.__hoverStl;
+	            hoverStyle.fill = hoverStyle.fill
+	                || (hasFillOrStroke(fill) ? liftColor(fill) : null);
+	            hoverStyle.stroke = hoverStyle.stroke
+	                || (hasFillOrStroke(stroke) ? liftColor(stroke) : null);
+
+	            var normalStyle = {};
+	            for (var name in hoverStyle) {
+	                if (hoverStyle.hasOwnProperty(name)) {
+	                    normalStyle[name] = el.style[name];
+	                }
+	            }
+
+	            el.__normalStl = normalStyle;
+
+	            el.__hoverStlDirty = false;
+	        }
+	    }
+
+	    /**
+	     * @private
+	     */
+	    function doSingleEnterHover(el) {
+	        if (el.__isHover) {
+	            return;
+	        }
+
+	        cacheElementStl(el);
+
+	        if (el.useHoverLayer) {
+	            el.__zr && el.__zr.addHover(el, el.__hoverStl);
+	        }
+	        else {
+	            el.setStyle(el.__hoverStl);
+	            el.z2 += 1;
+	        }
+
+	        el.__isHover = true;
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function doSingleLeaveHover(el) {
+	        if (!el.__isHover) {
+	            return;
+	        }
+
+	        var normalStl = el.__normalStl;
+	        if (el.useHoverLayer) {
+	            el.__zr && el.__zr.removeHover(el);
+	        }
+	        else {
+	            normalStl && el.setStyle(normalStl);
+	            el.z2 -= 1;
+	        }
+
+	        el.__isHover = false;
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function doEnterHover(el) {
+	        el.type === 'group'
+	            ? el.traverse(function (child) {
+	                if (child.type !== 'group') {
+	                    doSingleEnterHover(child);
+	                }
+	            })
+	            : doSingleEnterHover(el);
+	    }
+
+	    function doLeaveHover(el) {
+	        el.type === 'group'
+	            ? el.traverse(function (child) {
+	                if (child.type !== 'group') {
+	                    doSingleLeaveHover(child);
+	                }
+	            })
+	            : doSingleLeaveHover(el);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function setElementHoverStl(el, hoverStl) {
+	        // If element has sepcified hoverStyle, then use it instead of given hoverStyle
+	        // Often used when item group has a label element and it's hoverStyle is different
+	        el.__hoverStl = el.hoverStyle || hoverStl || {};
+	        el.__hoverStlDirty = true;
+
+	        if (el.__isHover) {
+	            cacheElementStl(el);
+	        }
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function onElementMouseOver(e) {
+	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
+	            return;
+	        }
+
+	        // Only if element is not in emphasis status
+	        !this.__isEmphasis && doEnterHover(this);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function onElementMouseOut(e) {
+	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
+	            return;
+	        }
+
+	        // Only if element is not in emphasis status
+	        !this.__isEmphasis && doLeaveHover(this);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function enterEmphasis() {
+	        this.__isEmphasis = true;
+	        doEnterHover(this);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function leaveEmphasis() {
+	        this.__isEmphasis = false;
+	        doLeaveHover(this);
+	    }
+
+	    /**
+	     * Set hover style of element.
+	     * This method can be called repeatly without side-effects.
+	     * @param {module:zrender/Element} el
+	     * @param {Object} [hoverStyle]
+	     * @param {Object} [opt]
+	     * @param {boolean} [opt.hoverSilentOnTouch=false]
+	     *        In touch device, mouseover event will be trigger on touchstart event
+	     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
+	     *        conviniently use hoverStyle when tap on touch screen without additional
+	     *        code for compatibility.
+	     *        But if the chart/component has select feature, which usually also use
+	     *        hoverStyle, there might be conflict between 'select-highlight' and
+	     *        'hover-highlight' especially when roam is enabled (see geo for example).
+	     *        In this case, hoverSilentOnTouch should be used to disable hover-highlight
+	     *        on touch device.
+	     */
+	    graphic.setHoverStyle = function (el, hoverStyle, opt) {
+	        el.__hoverSilentOnTouch = opt && opt.hoverSilentOnTouch;
+
+	        el.type === 'group'
+	            ? el.traverse(function (child) {
+	                if (child.type !== 'group') {
+	                    setElementHoverStl(child, hoverStyle);
+	                }
+	            })
+	            : setElementHoverStl(el, hoverStyle);
+
+	        // Duplicated function will be auto-ignored, see Eventful.js.
+	        el.on('mouseover', onElementMouseOver)
+	          .on('mouseout', onElementMouseOut);
+
+	        // Emphasis, normal can be triggered manually
+	        el.on('emphasis', enterEmphasis)
+	          .on('normal', leaveEmphasis);
+	    };
+
+	    /**
+	     * Set text option in the style
+	     * @param {Object} textStyle
+	     * @param {module:echarts/model/Model} labelModel
+	     * @param {string} color
+	     */
+	    graphic.setText = function (textStyle, labelModel, color) {
+	        var labelPosition = labelModel.getShallow('position') || 'inside';
+	        var labelOffset = labelModel.getShallow('offset');
+	        var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color;
+	        var textStyleModel = labelModel.getModel('textStyle');
+	        zrUtil.extend(textStyle, {
+	            textDistance: labelModel.getShallow('distance') || 5,
+	            textFont: textStyleModel.getFont(),
+	            textPosition: labelPosition,
+	            textOffset: labelOffset,
+	            textFill: textStyleModel.getTextColor() || labelColor
+	        });
+	    };
+
+	    graphic.getFont = function (opt, ecModel) {
+	        var gTextStyleModel = ecModel && ecModel.getModel('textStyle');
+	        return [
+	            // FIXME in node-canvas fontWeight is before fontStyle
+	            opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '',
+	            opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '',
+	            (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px',
+	            opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'
+	        ].join(' ');
+	    };
+
+	    function animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {
+	        if (typeof dataIndex === 'function') {
+	            cb = dataIndex;
+	            dataIndex = null;
+	        }
+	        // Do not check 'animation' property directly here. Consider this case:
+	        // animation model is an `itemModel`, whose does not have `isAnimationEnabled`
+	        // but its parent model (`seriesModel`) does.
+	        var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();
+
+	        if (animationEnabled) {
+	            var postfix = isUpdate ? 'Update' : '';
+	            var duration = animatableModel.getShallow('animationDuration' + postfix);
+	            var animationEasing = animatableModel.getShallow('animationEasing' + postfix);
+	            var animationDelay = animatableModel.getShallow('animationDelay' + postfix);
+	            if (typeof animationDelay === 'function') {
+	                animationDelay = animationDelay(
+	                    dataIndex,
+	                    animatableModel.getAnimationDelayParams
+	                        ? animatableModel.getAnimationDelayParams(el, dataIndex)
+	                        : null
+	                );
+	            }
+	            if (typeof duration === 'function') {
+	                duration = duration(dataIndex);
+	            }
+
+	            duration > 0
+	                ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb)
+	                : (el.stopAnimation(), el.attr(props), cb && cb());
+	        }
+	        else {
+	            el.stopAnimation();
+	            el.attr(props);
+	            cb && cb();
+	        }
+	    }
+
+	    /**
+	     * Update graphic element properties with or without animation according to the configuration in series
+	     * @param {module:zrender/Element} el
+	     * @param {Object} props
+	     * @param {module:echarts/model/Model} [animatableModel]
+	     * @param {number} [dataIndex]
+	     * @param {Function} [cb]
+	     * @example
+	     *     graphic.updateProps(el, {
+	     *         position: [100, 100]
+	     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
+	     *     // Or
+	     *     graphic.updateProps(el, {
+	     *         position: [100, 100]
+	     *     }, seriesModel, function () { console.log('Animation done!'); });
+	     */
+	    graphic.updateProps = function (el, props, animatableModel, dataIndex, cb) {
+	        animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);
+	    };
+
+	    /**
+	     * Init graphic element properties with or without animation according to the configuration in series
+	     * @param {module:zrender/Element} el
+	     * @param {Object} props
+	     * @param {module:echarts/model/Model} [animatableModel]
+	     * @param {number} [dataIndex]
+	     * @param {Function} cb
+	     */
+	    graphic.initProps = function (el, props, animatableModel, dataIndex, cb) {
+	        animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);
+	    };
+
+	    /**
+	     * Get transform matrix of target (param target),
+	     * in coordinate of its ancestor (param ancestor)
+	     *
+	     * @param {module:zrender/mixin/Transformable} target
+	     * @param {module:zrender/mixin/Transformable} [ancestor]
+	     */
+	    graphic.getTransform = function (target, ancestor) {
+	        var mat = matrix.identity([]);
+
+	        while (target && target !== ancestor) {
+	            matrix.mul(mat, target.getLocalTransform(), mat);
+	            target = target.parent;
+	        }
+
+	        return mat;
+	    };
+
+	    /**
+	     * Apply transform to an vertex.
+	     * @param {Array.<number>} target [x, y]
+	     * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:
+	     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
+	     *      + {position, rotation, scale}, the same as `zrender/Transformable`.
+	     * @param {boolean=} invert Whether use invert matrix.
+	     * @return {Array.<number>} [x, y]
+	     */
+	    graphic.applyTransform = function (target, transform, invert) {
+	        if (transform && !zrUtil.isArrayLike(transform)) {
+	            transform = Transformable.getLocalTransform(transform);
+	        }
+
+	        if (invert) {
+	            transform = matrix.invert([], transform);
+	        }
+	        return vector.applyTransform([], target, transform);
+	    };
+
+	    /**
+	     * @param {string} direction 'left' 'right' 'top' 'bottom'
+	     * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]
+	     * @param {boolean=} invert Whether use invert matrix.
+	     * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'
+	     */
+	    graphic.transformDirection = function (direction, transform, invert) {
+
+	        // Pick a base, ensure that transform result will not be (0, 0).
+	        var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0)
+	            ? 1 : Math.abs(2 * transform[4] / transform[0]);
+	        var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0)
+	            ? 1 : Math.abs(2 * transform[4] / transform[2]);
+
+	        var vertex = [
+	            direction === 'left' ? -hBase : direction === 'right' ? hBase : 0,
+	            direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0
+	        ];
+
+	        vertex = graphic.applyTransform(vertex, transform, invert);
+
+	        return Math.abs(vertex[0]) > Math.abs(vertex[1])
+	            ? (vertex[0] > 0 ? 'right' : 'left')
+	            : (vertex[1] > 0 ? 'bottom' : 'top');
+	    };
+
+	    /**
+	     * Apply group transition animation from g1 to g2.
+	     * If no animatableModel, no animation.
+	     */
+	    graphic.groupTransition = function (g1, g2, animatableModel, cb) {
+	        if (!g1 || !g2) {
+	            return;
+	        }
+
+	        function getElMap(g) {
+	            var elMap = {};
+	            g.traverse(function (el) {
+	                if (!el.isGroup && el.anid) {
+	                    elMap[el.anid] = el;
+	                }
+	            });
+	            return elMap;
+	        }
+	        function getAnimatableProps(el) {
+	            var obj = {
+	                position: vector.clone(el.position),
+	                rotation: el.rotation
+	            };
+	            if (el.shape) {
+	                obj.shape = zrUtil.extend({}, el.shape);
+	            }
+	            return obj;
+	        }
+	        var elMap1 = getElMap(g1);
+
+	        g2.traverse(function (el) {
+	            if (!el.isGroup && el.anid) {
+	                var oldEl = elMap1[el.anid];
+	                if (oldEl) {
+	                    var newProp = getAnimatableProps(el);
+	                    el.attr(getAnimatableProps(oldEl));
+	                    graphic.updateProps(el, newProp, animatableModel, el.dataIndex);
+	                }
+	                // else {
+	                //     if (el.previousProps) {
+	                //         graphic.updateProps
+	                //     }
+	                // }
+	            }
+	        });
+	    };
+
+	    /**
+	     * @param {Array.<Array.<number>>} points Like: [[23, 44], [53, 66], ...]
+	     * @param {Object} rect {x, y, width, height}
+	     * @return {Array.<Array.<number>>} A new clipped points.
+	     */
+	    graphic.clipPointsByRect = function (points, rect) {
+	        return zrUtil.map(points, function (point) {
+	            var x = point[0];
+	            x = mathMax(x, rect.x);
+	            x = mathMin(x, rect.x + rect.width);
+	            var y = point[1];
+	            y = mathMax(y, rect.y);
+	            y = mathMin(y, rect.y + rect.height);
+	            return [x, y];
+	        });
+	    };
+
+	    /**
+	     * @param {Object} targetRect {x, y, width, height}
+	     * @param {Object} rect {x, y, width, height}
+	     * @return {Object} A new clipped rect. If rect size are negative, return undefined.
+	     */
+	    graphic.clipRectByRect = function (targetRect, rect) {
+	        var x = mathMax(targetRect.x, rect.x);
+	        var x2 = mathMin(targetRect.x + targetRect.width, rect.x + rect.width);
+	        var y = mathMax(targetRect.y, rect.y);
+	        var y2 = mathMin(targetRect.y + targetRect.height, rect.y + rect.height);
+
+	        if (x2 >= x && y2 >= y) {
+	            return {
+	                x: x,
+	                y: y,
+	                width: x2 - x,
+	                height: y2 - y
+	            };
 	        }
 	    };
 
+	    module.exports = graphic;
+
+
 
 /***/ },
 /* 19 */
 /***/ function(module, exports, __webpack_require__) {
 
-	/**
-	 * Component model
-	 *
-	 * @module echarts/model/Component
-	 */
+	
 
+	    var Path = __webpack_require__(20);
+	    var PathProxy = __webpack_require__(36);
+	    var transformPath = __webpack_require__(47);
 
-	    var Model = __webpack_require__(12);
-	    var zrUtil = __webpack_require__(4);
-	    var arrayPush = Array.prototype.push;
-	    var componentUtil = __webpack_require__(20);
-	    var clazzUtil = __webpack_require__(13);
-	    var layout = __webpack_require__(21);
+	    // command chars
+	    var cc = [
+	        'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z',
+	        'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'
+	    ];
 
-	    /**
-	     * @alias module:echarts/model/Component
-	     * @constructor
-	     * @param {Object} option
-	     * @param {module:echarts/model/Model} parentModel
-	     * @param {module:echarts/model/Model} ecModel
-	     */
-	    var ComponentModel = Model.extend({
+	    var mathSqrt = Math.sqrt;
+	    var mathSin = Math.sin;
+	    var mathCos = Math.cos;
+	    var PI = Math.PI;
 
-	        type: 'component',
+	    var vMag = function(v) {
+	        return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
+	    };
+	    var vRatio = function(u, v) {
+	        return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
+	    };
+	    var vAngle = function(u, v) {
+	        return (u[0] * v[1] < u[1] * v[0] ? -1 : 1)
+	                * Math.acos(vRatio(u, v));
+	    };
 
-	        /**
-	         * @readOnly
-	         * @type {string}
-	         */
-	        id: '',
+	    function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {
+	        var psi = psiDeg * (PI / 180.0);
+	        var xp = mathCos(psi) * (x1 - x2) / 2.0
+	                 + mathSin(psi) * (y1 - y2) / 2.0;
+	        var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0
+	                 + mathCos(psi) * (y1 - y2) / 2.0;
 
-	        /**
-	         * @readOnly
-	         */
-	        name: '',
+	        var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);
 
-	        /**
-	         * @readOnly
-	         * @type {string}
-	         */
-	        mainType: '',
-
-	        /**
-	         * @readOnly
-	         * @type {string}
-	         */
-	        subType: '',
-
-	        /**
-	         * @readOnly
-	         * @type {number}
-	         */
-	        componentIndex: 0,
-
-	        /**
-	         * @type {Object}
-	         * @protected
-	         */
-	        defaultOption: null,
-
-	        /**
-	         * @type {module:echarts/model/Global}
-	         * @readOnly
-	         */
-	        ecModel: null,
-
-	        /**
-	         * key: componentType
-	         * value:  Component model list, can not be null.
-	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
-	         * @readOnly
-	         */
-	        dependentModels: [],
-
-	        /**
-	         * @type {string}
-	         * @readOnly
-	         */
-	        uid: null,
-
-	        /**
-	         * Support merge layout params.
-	         * Only support 'box' now (left/right/top/bottom/width/height).
-	         * @type {string|Object} Object can be {ignoreSize: true}
-	         * @readOnly
-	         */
-	        layoutMode: null,
-
-	        $constructor: function (option, parentModel, ecModel, extraOpt) {
-	            Model.call(this, option, parentModel, ecModel, extraOpt);
-
-	            this.uid = componentUtil.getUID('componentModel');
-	        },
-
-
-	        init: function (option, parentModel, ecModel, extraOpt) {
-	            this.mergeDefaultAndTheme(option, ecModel);
-	        },
-
-	        mergeDefaultAndTheme: function (option, ecModel) {
-	            var layoutMode = this.layoutMode;
-	            var inputPositionParams = layoutMode
-	                ? layout.getLayoutParams(option) : {};
-
-	            var themeModel = ecModel.getTheme();
-	            zrUtil.merge(option, themeModel.get(this.mainType));
-	            zrUtil.merge(option, this.getDefaultOption());
-
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
-	            }
-	        },
-
-	        mergeOption: function (option, extraOpt) {
-	            zrUtil.merge(this.option, option, true);
-
-	            var layoutMode = this.layoutMode;
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(this.option, option, layoutMode);
-	            }
-	        },
-
-	        // Hooker after init or mergeOption
-	        optionUpdated: function (newCptOption, isInit) {},
-
-	        getDefaultOption: function () {
-	            if (!clazzUtil.hasOwn(this, '__defaultOption')) {
-	                var optList = [];
-	                var Class = this.constructor;
-	                while (Class) {
-	                    var opt = Class.prototype.defaultOption;
-	                    opt && optList.push(opt);
-	                    Class = Class.superClass;
-	                }
-
-	                var defaultOption = {};
-	                for (var i = optList.length - 1; i >= 0; i--) {
-	                    defaultOption = zrUtil.merge(defaultOption, optList[i], true);
-	                }
-	                clazzUtil.set(this, '__defaultOption', defaultOption);
-	            }
-	            return clazzUtil.get(this, '__defaultOption');
-	        },
-
-	        getReferringComponents: function (mainType) {
-	            return this.ecModel.queryComponents({
-	                mainType: mainType,
-	                index: this.get(mainType + 'Index', true),
-	                id: this.get(mainType + 'Id', true)
-	            });
+	        if (lambda > 1) {
+	            rx *= mathSqrt(lambda);
+	            ry *= mathSqrt(lambda);
 	        }
 
-	    });
+	        var f = (fa === fs ? -1 : 1)
+	            * mathSqrt((((rx * rx) * (ry * ry))
+	                    - ((rx * rx) * (yp * yp))
+	                    - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp)
+	                    + (ry * ry) * (xp * xp))
+	                ) || 0;
 
-	    // Reset ComponentModel.extend, add preConstruct.
-	    // clazzUtil.enableClassExtend(
-	    //     ComponentModel,
-	    //     function (option, parentModel, ecModel, extraOpt) {
-	    //         // Set dependentModels, componentIndex, name, id, mainType, subType.
-	    //         zrUtil.extend(this, extraOpt);
+	        var cxp = f * rx * yp / ry;
+	        var cyp = f * -ry * xp / rx;
 
-	    //         this.uid = componentUtil.getUID('componentModel');
+	        var cx = (x1 + x2) / 2.0
+	                 + mathCos(psi) * cxp
+	                 - mathSin(psi) * cyp;
+	        var cy = (y1 + y2) / 2.0
+	                + mathSin(psi) * cxp
+	                + mathCos(psi) * cyp;
 
-	    //         // this.setReadOnly([
-	    //         //     'type', 'id', 'uid', 'name', 'mainType', 'subType',
-	    //         //     'dependentModels', 'componentIndex'
-	    //         // ]);
-	    //     }
-	    // );
+	        var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]);
+	        var u = [ (xp - cxp) / rx, (yp - cyp) / ry ];
+	        var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ];
+	        var dTheta = vAngle(u, v);
 
-	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
-	    clazzUtil.enableClassManagement(
-	        ComponentModel, {registerWhenExtend: true}
-	    );
-	    componentUtil.enableSubTypeDefaulter(ComponentModel);
+	        if (vRatio(u, v) <= -1) {
+	            dTheta = PI;
+	        }
+	        if (vRatio(u, v) >= 1) {
+	            dTheta = 0;
+	        }
+	        if (fs === 0 && dTheta > 0) {
+	            dTheta = dTheta - 2 * PI;
+	        }
+	        if (fs === 1 && dTheta < 0) {
+	            dTheta = dTheta + 2 * PI;
+	        }
 
-	    // Add capability of ComponentModel.topologicalTravel.
-	    componentUtil.enableTopologicalTravel(ComponentModel, getDependencies);
-
-	    function getDependencies(componentType) {
-	        var deps = [];
-	        zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
-	            arrayPush.apply(deps, Clazz.prototype.dependencies || []);
-	        });
-	        // Ensure main type
-	        return zrUtil.map(deps, function (type) {
-	            return clazzUtil.parseClassType(type).main;
-	        });
+	        path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);
 	    }
 
-	    zrUtil.mixin(ComponentModel, __webpack_require__(22));
+	    function createPathProxyFromString(data) {
+	        if (!data) {
+	            return [];
+	        }
 
-	    module.exports = ComponentModel;
+	        // command string
+	        var cs = data.replace(/-/g, ' -')
+	            .replace(/  /g, ' ')
+	            .replace(/ /g, ',')
+	            .replace(/,,/g, ',');
+
+	        var n;
+	        // create pipes so that we can split the data
+	        for (n = 0; n < cc.length; n++) {
+	            cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
+	        }
+
+	        // create array
+	        var arr = cs.split('|');
+	        // init context point
+	        var cpx = 0;
+	        var cpy = 0;
+
+	        var path = new PathProxy();
+	        var CMD = PathProxy.CMD;
+
+	        var prevCmd;
+	        for (n = 1; n < arr.length; n++) {
+	            var str = arr[n];
+	            var c = str.charAt(0);
+	            var off = 0;
+	            var p = str.slice(1).replace(/e,-/g, 'e-').split(',');
+	            var cmd;
+
+	            if (p.length > 0 && p[0] === '') {
+	                p.shift();
+	            }
+
+	            for (var i = 0; i < p.length; i++) {
+	                p[i] = parseFloat(p[i]);
+	            }
+	            while (off < p.length && !isNaN(p[off])) {
+	                if (isNaN(p[0])) {
+	                    break;
+	                }
+	                var ctlPtx;
+	                var ctlPty;
+
+	                var rx;
+	                var ry;
+	                var psi;
+	                var fa;
+	                var fs;
+
+	                var x1 = cpx;
+	                var y1 = cpy;
+
+	                // convert l, H, h, V, and v to L
+	                switch (c) {
+	                    case 'l':
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'L':
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'm':
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.M;
+	                        path.addData(cmd, cpx, cpy);
+	                        c = 'l';
+	                        break;
+	                    case 'M':
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.M;
+	                        path.addData(cmd, cpx, cpy);
+	                        c = 'L';
+	                        break;
+	                    case 'h':
+	                        cpx += p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'H':
+	                        cpx = p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'v':
+	                        cpy += p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'V':
+	                        cpy = p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'C':
+	                        cmd = CMD.C;
+	                        path.addData(
+	                            cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]
+	                        );
+	                        cpx = p[off - 2];
+	                        cpy = p[off - 1];
+	                        break;
+	                    case 'c':
+	                        cmd = CMD.C;
+	                        path.addData(
+	                            cmd,
+	                            p[off++] + cpx, p[off++] + cpy,
+	                            p[off++] + cpx, p[off++] + cpy,
+	                            p[off++] + cpx, p[off++] + cpy
+	                        );
+	                        cpx += p[off - 2];
+	                        cpy += p[off - 1];
+	                        break;
+	                    case 'S':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.C) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cmd = CMD.C;
+	                        x1 = p[off++];
+	                        y1 = p[off++];
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
+	                        break;
+	                    case 's':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.C) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cmd = CMD.C;
+	                        x1 = cpx + p[off++];
+	                        y1 = cpy + p[off++];
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
+	                        break;
+	                    case 'Q':
+	                        x1 = p[off++];
+	                        y1 = p[off++];
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, x1, y1, cpx, cpy);
+	                        break;
+	                    case 'q':
+	                        x1 = p[off++] + cpx;
+	                        y1 = p[off++] + cpy;
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, x1, y1, cpx, cpy);
+	                        break;
+	                    case 'T':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.Q) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
+	                        break;
+	                    case 't':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.Q) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
+	                        break;
+	                    case 'A':
+	                        rx = p[off++];
+	                        ry = p[off++];
+	                        psi = p[off++];
+	                        fa = p[off++];
+	                        fs = p[off++];
+
+	                        x1 = cpx, y1 = cpy;
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.A;
+	                        processArc(
+	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
+	                        );
+	                        break;
+	                    case 'a':
+	                        rx = p[off++];
+	                        ry = p[off++];
+	                        psi = p[off++];
+	                        fa = p[off++];
+	                        fs = p[off++];
+
+	                        x1 = cpx, y1 = cpy;
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.A;
+	                        processArc(
+	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
+	                        );
+	                        break;
+	                }
+	            }
+
+	            if (c === 'z' || c === 'Z') {
+	                cmd = CMD.Z;
+	                path.addData(cmd);
+	            }
+
+	            prevCmd = cmd;
+	        }
+
+	        path.toStatic();
+
+	        return path;
+	    }
+
+	    // TODO Optimize double memory cost problem
+	    function createPathOptions(str, opts) {
+	        var pathProxy = createPathProxyFromString(str);
+	        opts = opts || {};
+	        opts.buildPath = function (path) {
+	            if (path.setData) {
+	                path.setData(pathProxy.data);
+	                // Svg and vml renderer don't have context
+	                var ctx = path.getContext();
+	                if (ctx) {
+	                    path.rebuildPath(ctx);
+	                }
+	            }
+	            else {
+	                var ctx = path;
+	                pathProxy.rebuildPath(ctx);
+	            }
+	        };
+
+	        opts.applyTransform = function (m) {
+	            transformPath(pathProxy, m);
+
+	            this.dirty(true);
+	        };
+
+	        return opts;
+	    }
+
+	    module.exports = {
+	        /**
+	         * Create a Path object from path string data
+	         * http://www.w3.org/TR/SVG/paths.html#PathData
+	         * @param  {Object} opts Other options
+	         */
+	        createFromString: function (str, opts) {
+	            return new Path(createPathOptions(str, opts));
+	        },
+
+	        /**
+	         * Create a Path class from path string data
+	         * @param  {string} str
+	         * @param  {Object} opts Other options
+	         */
+	        extendFromString: function (str, opts) {
+	            return Path.extend(createPathOptions(str, opts));
+	        },
+
+	        /**
+	         * Merge multiple paths
+	         */
+	        // TODO Apply transform
+	        // TODO stroke dash
+	        // TODO Optimize double memory cost problem
+	        mergePath: function (pathEls, opts) {
+	            var pathList = [];
+	            var len = pathEls.length;
+	            for (var i = 0; i < len; i++) {
+	                var pathEl = pathEls[i];
+	                if (!pathEl.path) {
+	                    pathEl.createPathProxy();
+	                }
+	                if (pathEl.__dirtyPath) {
+	                    pathEl.buildPath(pathEl.path, pathEl.shape, true);
+	                }
+	                pathList.push(pathEl.path);
+	            }
+
+	            var pathBundle = new Path(opts);
+	            // Need path proxy.
+	            pathBundle.createPathProxy();
+	            pathBundle.buildPath = function (path) {
+	                path.appendPath(pathList);
+	                // Svg and vml renderer don't have context
+	                var ctx = path.getContext();
+	                if (ctx) {
+	                    path.rebuildPath(ctx);
+	                }
+	            };
+
+	            return pathBundle;
+	        }
+	    };
 
 
 /***/ },
 /* 20 */
 /***/ function(module, exports, __webpack_require__) {
 
-	
+	/**
+	 * Path element
+	 * @module zrender/graphic/Path
+	 */
 
+
+
+	    var Displayable = __webpack_require__(21);
 	    var zrUtil = __webpack_require__(4);
-	    var clazz = __webpack_require__(13);
+	    var PathProxy = __webpack_require__(36);
+	    var pathContain = __webpack_require__(39);
 
-	    var parseClassType = clazz.parseClassType;
+	    var Pattern = __webpack_require__(46);
+	    var getCanvasPattern = Pattern.prototype.getCanvasPattern;
 
-	    var base = 0;
+	    var abs = Math.abs;
 
-	    var componentUtil = {};
-
-	    var DELIMITER = '_';
-
+	    var pathProxyForDraw = new PathProxy(true);
 	    /**
-	     * @public
-	     * @param {string} type
-	     * @return {string}
+	     * @alias module:zrender/graphic/Path
+	     * @extends module:zrender/graphic/Displayable
+	     * @constructor
+	     * @param {Object} opts
 	     */
-	    componentUtil.getUID = function (type) {
-	        // Considering the case of crossing js context,
-	        // use Math.random to make id as unique as possible.
-	        return [(type || ''), base++, Math.random()].join(DELIMITER);
-	    };
-
-	    /**
-	     * @inner
-	     */
-	    componentUtil.enableSubTypeDefaulter = function (entity) {
-
-	        var subTypeDefaulters = {};
-
-	        entity.registerSubTypeDefaulter = function (componentType, defaulter) {
-	            componentType = parseClassType(componentType);
-	            subTypeDefaulters[componentType.main] = defaulter;
-	        };
-
-	        entity.determineSubType = function (componentType, option) {
-	            var type = option.type;
-	            if (!type) {
-	                var componentTypeMain = parseClassType(componentType).main;
-	                if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {
-	                    type = subTypeDefaulters[componentTypeMain](option);
-	                }
-	            }
-	            return type;
-	        };
-
-	        return entity;
-	    };
-
-	    /**
-	     * Topological travel on Activity Network (Activity On Vertices).
-	     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
-	     *
-	     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
-	     *
-	     * If there is circle dependencey, Error will be thrown.
-	     *
-	     */
-	    componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) {
+	    function Path(opts) {
+	        Displayable.call(this, opts);
 
 	        /**
-	         * @public
-	         * @param {Array.<string>} targetNameList Target Component type list.
-	         *                                           Can be ['aa', 'bb', 'aa.xx']
-	         * @param {Array.<string>} fullNameList By which we can build dependency graph.
-	         * @param {Function} callback Params: componentType, dependencies.
-	         * @param {Object} context Scope of callback.
+	         * @type {module:zrender/core/PathProxy}
+	         * @readOnly
 	         */
-	        entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {
-	            if (!targetNameList.length) {
-	                return;
-	            }
+	        this.path = null;
+	    }
 
-	            var result = makeDepndencyGraph(fullNameList);
-	            var graph = result.graph;
-	            var stack = result.noEntryList;
+	    Path.prototype = {
 
-	            var targetNameSet = {};
-	            zrUtil.each(targetNameList, function (name) {
-	                targetNameSet[name] = true;
-	            });
+	        constructor: Path,
 
-	            while (stack.length) {
-	                var currComponentType = stack.pop();
-	                var currVertex = graph[currComponentType];
-	                var isInTargetNameSet = !!targetNameSet[currComponentType];
-	                if (isInTargetNameSet) {
-	                    callback.call(context, currComponentType, currVertex.originalDeps.slice());
-	                    delete targetNameSet[currComponentType];
+	        type: 'path',
+
+	        __dirtyPath: true,
+
+	        strokeContainThreshold: 5,
+
+	        brush: function (ctx, prevEl) {
+	            var style = this.style;
+	            var path = this.path || pathProxyForDraw;
+	            var hasStroke = style.hasStroke();
+	            var hasFill = style.hasFill();
+	            var fill = style.fill;
+	            var stroke = style.stroke;
+	            var hasFillGradient = hasFill && !!(fill.colorStops);
+	            var hasStrokeGradient = hasStroke && !!(stroke.colorStops);
+	            var hasFillPattern = hasFill && !!(fill.image);
+	            var hasStrokePattern = hasStroke && !!(stroke.image);
+
+	            style.bind(ctx, this, prevEl);
+	            this.setTransform(ctx);
+
+	            if (this.__dirty) {
+	                var rect;
+	                // Update gradient because bounding rect may changed
+	                if (hasFillGradient) {
+	                    rect = rect || this.getBoundingRect();
+	                    this._fillGradient = style.getGradient(ctx, fill, rect);
 	                }
-	                zrUtil.each(
-	                    currVertex.successor,
-	                    isInTargetNameSet ? removeEdgeAndAdd : removeEdge
-	                );
-	            }
-
-	            zrUtil.each(targetNameSet, function () {
-	                throw new Error('Circle dependency may exists');
-	            });
-
-	            function removeEdge(succComponentType) {
-	                graph[succComponentType].entryCount--;
-	                if (graph[succComponentType].entryCount === 0) {
-	                    stack.push(succComponentType);
+	                if (hasStrokeGradient) {
+	                    rect = rect || this.getBoundingRect();
+	                    this._strokeGradient = style.getGradient(ctx, stroke, rect);
 	                }
 	            }
-
-	            // Consider this case: legend depends on series, and we call
-	            // chart.setOption({series: [...]}), where only series is in option.
-	            // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will
-	            // not be called, but only sereis.mergeOption is called. Thus legend
-	            // have no chance to update its local record about series (like which
-	            // name of series is available in legend).
-	            function removeEdgeAndAdd(succComponentType) {
-	                targetNameSet[succComponentType] = true;
-	                removeEdge(succComponentType);
+	            // Use the gradient or pattern
+	            if (hasFillGradient) {
+	                // PENDING If may have affect the state
+	                ctx.fillStyle = this._fillGradient;
 	            }
-	        };
+	            else if (hasFillPattern) {
+	                ctx.fillStyle = getCanvasPattern.call(fill, ctx);
+	            }
+	            if (hasStrokeGradient) {
+	                ctx.strokeStyle = this._strokeGradient;
+	            }
+	            else if (hasStrokePattern) {
+	                ctx.strokeStyle = getCanvasPattern.call(stroke, ctx);
+	            }
+
+	            var lineDash = style.lineDash;
+	            var lineDashOffset = style.lineDashOffset;
+
+	            var ctxLineDash = !!ctx.setLineDash;
+
+	            // Update path sx, sy
+	            var scale = this.getGlobalScale();
+	            path.setScale(scale[0], scale[1]);
+
+	            // Proxy context
+	            // Rebuild path in following 2 cases
+	            // 1. Path is dirty
+	            // 2. Path needs javascript implemented lineDash stroking.
+	            //    In this case, lineDash information will not be saved in PathProxy
+	            if (this.__dirtyPath
+	                || (lineDash && !ctxLineDash && hasStroke)
+	            ) {
+	                path.beginPath(ctx);
+
+	                // Setting line dash before build path
+	                if (lineDash && !ctxLineDash) {
+	                    path.setLineDash(lineDash);
+	                    path.setLineDashOffset(lineDashOffset);
+	                }
+
+	                this.buildPath(path, this.shape, false);
+
+	                // Clear path dirty flag
+	                if (this.path) {
+	                    this.__dirtyPath = false;
+	                }
+	            }
+	            else {
+	                // Replay path building
+	                ctx.beginPath();
+	                this.path.rebuildPath(ctx);
+	            }
+
+	            hasFill && path.fill(ctx);
+
+	            if (lineDash && ctxLineDash) {
+	                ctx.setLineDash(lineDash);
+	                ctx.lineDashOffset = lineDashOffset;
+	            }
+
+	            hasStroke && path.stroke(ctx);
+
+	            if (lineDash && ctxLineDash) {
+	                // PENDING
+	                // Remove lineDash
+	                ctx.setLineDash([]);
+	            }
+
+
+	            this.restoreTransform(ctx);
+
+	            // Draw rect text
+	            if (style.text != null) {
+	                // var rect = this.getBoundingRect();
+	                this.drawRectText(ctx, this.getBoundingRect());
+	            }
+	        },
+
+	        // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath
+	        // Like in circle
+	        buildPath: function (ctx, shapeCfg, inBundle) {},
+
+	        createPathProxy: function () {
+	            this.path = new PathProxy();
+	        },
+
+	        getBoundingRect: function () {
+	            var rect = this._rect;
+	            var style = this.style;
+	            var needsUpdateRect = !rect;
+	            if (needsUpdateRect) {
+	                var path = this.path;
+	                if (!path) {
+	                    // Create path on demand.
+	                    path = this.path = new PathProxy();
+	                }
+	                if (this.__dirtyPath) {
+	                    path.beginPath();
+	                    this.buildPath(path, this.shape, false);
+	                }
+	                rect = path.getBoundingRect();
+	            }
+	            this._rect = rect;
+
+	            if (style.hasStroke()) {
+	                // Needs update rect with stroke lineWidth when
+	                // 1. Element changes scale or lineWidth
+	                // 2. Shape is changed
+	                var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone());
+	                if (this.__dirty || needsUpdateRect) {
+	                    rectWithStroke.copy(rect);
+	                    // FIXME Must after updateTransform
+	                    var w = style.lineWidth;
+	                    // PENDING, Min line width is needed when line is horizontal or vertical
+	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
+
+	                    // Only add extra hover lineWidth when there are no fill
+	                    if (!style.hasFill()) {
+	                        w = Math.max(w, this.strokeContainThreshold || 4);
+	                    }
+	                    // Consider line width
+	                    // Line scale can't be 0;
+	                    if (lineScale > 1e-10) {
+	                        rectWithStroke.width += w / lineScale;
+	                        rectWithStroke.height += w / lineScale;
+	                        rectWithStroke.x -= w / lineScale / 2;
+	                        rectWithStroke.y -= w / lineScale / 2;
+	                    }
+	                }
+
+	                // Return rect with stroke
+	                return rectWithStroke;
+	            }
+
+	            return rect;
+	        },
+
+	        contain: function (x, y) {
+	            var localPos = this.transformCoordToLocal(x, y);
+	            var rect = this.getBoundingRect();
+	            var style = this.style;
+	            x = localPos[0];
+	            y = localPos[1];
+
+	            if (rect.contain(x, y)) {
+	                var pathData = this.path.data;
+	                if (style.hasStroke()) {
+	                    var lineWidth = style.lineWidth;
+	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
+	                    // Line scale can't be 0;
+	                    if (lineScale > 1e-10) {
+	                        // Only add extra hover lineWidth when there are no fill
+	                        if (!style.hasFill()) {
+	                            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);
+	                        }
+	                        if (pathContain.containStroke(
+	                            pathData, lineWidth / lineScale, x, y
+	                        )) {
+	                            return true;
+	                        }
+	                    }
+	                }
+	                if (style.hasFill()) {
+	                    return pathContain.contain(pathData, x, y);
+	                }
+	            }
+	            return false;
+	        },
 
 	        /**
-	         * DepndencyGraph: {Object}
-	         * key: conponentType,
-	         * value: {
-	         *     successor: [conponentTypes...],
-	         *     originalDeps: [conponentTypes...],
-	         *     entryCount: {number}
-	         * }
+	         * @param  {boolean} dirtyPath
 	         */
-	        function makeDepndencyGraph(fullNameList) {
-	            var graph = {};
-	            var noEntryList = [];
-
-	            zrUtil.each(fullNameList, function (name) {
-
-	                var thisItem = createDependencyGraphItem(graph, name);
-	                var originalDeps = thisItem.originalDeps = dependencyGetter(name);
-
-	                var availableDeps = getAvailableDependencies(originalDeps, fullNameList);
-	                thisItem.entryCount = availableDeps.length;
-	                if (thisItem.entryCount === 0) {
-	                    noEntryList.push(name);
-	                }
-
-	                zrUtil.each(availableDeps, function (dependentName) {
-	                    if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) {
-	                        thisItem.predecessor.push(dependentName);
-	                    }
-	                    var thatItem = createDependencyGraphItem(graph, dependentName);
-	                    if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) {
-	                        thatItem.successor.push(name);
-	                    }
-	                });
-	            });
-
-	            return {graph: graph, noEntryList: noEntryList};
-	        }
-
-	        function createDependencyGraphItem(graph, name) {
-	            if (!graph[name]) {
-	                graph[name] = {predecessor: [], successor: []};
+	        dirty: function (dirtyPath) {
+	            if (dirtyPath == null) {
+	                dirtyPath = true;
 	            }
-	            return graph[name];
-	        }
+	            // Only mark dirty, not mark clean
+	            if (dirtyPath) {
+	                this.__dirtyPath = dirtyPath;
+	                this._rect = null;
+	            }
 
-	        function getAvailableDependencies(originalDeps, fullNameList) {
-	            var availableDeps = [];
-	            zrUtil.each(originalDeps, function (dep) {
-	                zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);
-	            });
-	            return availableDeps;
+	            this.__dirty = true;
+
+	            this.__zr && this.__zr.refresh();
+
+	            // Used as a clipping path
+	            if (this.__clipTarget) {
+	                this.__clipTarget.dirty();
+	            }
+	        },
+
+	        /**
+	         * Alias for animate('shape')
+	         * @param {boolean} loop
+	         */
+	        animateShape: function (loop) {
+	            return this.animate('shape', loop);
+	        },
+
+	        // Overwrite attrKV
+	        attrKV: function (key, value) {
+	            // FIXME
+	            if (key === 'shape') {
+	                this.setShape(value);
+	                this.__dirtyPath = true;
+	                this._rect = null;
+	            }
+	            else {
+	                Displayable.prototype.attrKV.call(this, key, value);
+	            }
+	        },
+
+	        /**
+	         * @param {Object|string} key
+	         * @param {*} value
+	         */
+	        setShape: function (key, value) {
+	            var shape = this.shape;
+	            // Path from string may not have shape
+	            if (shape) {
+	                if (zrUtil.isObject(key)) {
+	                    for (var name in key) {
+	                        if (key.hasOwnProperty(name)) {
+	                            shape[name] = key[name];
+	                        }
+	                    }
+	                }
+	                else {
+	                    shape[key] = value;
+	                }
+	                this.dirty(true);
+	            }
+	            return this;
+	        },
+
+	        getLineScale: function () {
+	            var m = this.transform;
+	            // Get the line scale.
+	            // Determinant of `m` means how much the area is enlarged by the
+	            // transformation. So its square root can be used as a scale factor
+	            // for width.
+	            return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10
+	                ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1]))
+	                : 1;
 	        }
 	    };
 
-	    module.exports = componentUtil;
+	    /**
+	     * 扩展一个 Path element, 比如星形，圆等。
+	     * Extend a path element
+	     * @param {Object} props
+	     * @param {string} props.type Path type
+	     * @param {Function} props.init Initialize
+	     * @param {Function} props.buildPath Overwrite buildPath method
+	     * @param {Object} [props.style] Extended default style config
+	     * @param {Object} [props.shape] Extended default shape config
+	     */
+	    Path.extend = function (defaults) {
+	        var Sub = function (opts) {
+	            Path.call(this, opts);
+
+	            if (defaults.style) {
+	                // Extend default style
+	                this.style.extendFrom(defaults.style, false);
+	            }
+
+	            // Extend default shape
+	            var defaultShape = defaults.shape;
+	            if (defaultShape) {
+	                this.shape = this.shape || {};
+	                var thisShape = this.shape;
+	                for (var name in defaultShape) {
+	                    if (
+	                        ! thisShape.hasOwnProperty(name)
+	                        && defaultShape.hasOwnProperty(name)
+	                    ) {
+	                        thisShape[name] = defaultShape[name];
+	                    }
+	                }
+	            }
+
+	            defaults.init && defaults.init.call(this, opts);
+	        };
+
+	        zrUtil.inherits(Sub, Path);
+
+	        // FIXME 不能 extend position, rotation 等引用对象
+	        for (var name in defaults) {
+	            // Extending prototype values and methods
+	            if (name !== 'style' && name !== 'shape') {
+	                Sub.prototype[name] = defaults[name];
+	            }
+	        }
+
+	        return Sub;
+	    };
+
+	    zrUtil.inherits(Path, Displayable);
+
+	    module.exports = Path;
 
 
 /***/ },
 /* 21 */
 /***/ function(module, exports, __webpack_require__) {
 
-	'use strict';
-	// Layout helpers for each component positioning
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var BoundingRect = __webpack_require__(9);
-	    var numberUtil = __webpack_require__(7);
-	    var formatUtil = __webpack_require__(6);
-	    var parsePercent = numberUtil.parsePercent;
-	    var each = zrUtil.each;
-
-	    var layout = {};
-
-	    /**
-	     * @public
-	     */
-	    var LOCATION_PARAMS = layout.LOCATION_PARAMS = [
-	        'left', 'right', 'top', 'bottom', 'width', 'height'
-	    ];
-
-	    /**
-	     * @public
-	     */
-	    var HV_NAMES = layout.HV_NAMES = [
-	        ['width', 'left', 'right'],
-	        ['height', 'top', 'bottom']
-	    ];
-
-	    function boxLayout(orient, group, gap, maxWidth, maxHeight) {
-	        var x = 0;
-	        var y = 0;
-	        if (maxWidth == null) {
-	            maxWidth = Infinity;
-	        }
-	        if (maxHeight == null) {
-	            maxHeight = Infinity;
-	        }
-	        var currentLineMaxSize = 0;
-	        group.eachChild(function (child, idx) {
-	            var position = child.position;
-	            var rect = child.getBoundingRect();
-	            var nextChild = group.childAt(idx + 1);
-	            var nextChildRect = nextChild && nextChild.getBoundingRect();
-	            var nextX;
-	            var nextY;
-	            if (orient === 'horizontal') {
-	                var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0);
-	                nextX = x + moveX;
-	                // Wrap when width exceeds maxWidth or meet a `newline` group
-	                if (nextX > maxWidth || child.newline) {
-	                    x = 0;
-	                    nextX = moveX;
-	                    y += currentLineMaxSize + gap;
-	                    currentLineMaxSize = rect.height;
-	                }
-	                else {
-	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);
-	                }
-	            }
-	            else {
-	                var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0);
-	                nextY = y + moveY;
-	                // Wrap when width exceeds maxHeight or meet a `newline` group
-	                if (nextY > maxHeight || child.newline) {
-	                    x += currentLineMaxSize + gap;
-	                    y = 0;
-	                    nextY = moveY;
-	                    currentLineMaxSize = rect.width;
-	                }
-	                else {
-	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);
-	                }
-	            }
-
-	            if (child.newline) {
-	                return;
-	            }
-
-	            position[0] = x;
-	            position[1] = y;
-
-	            orient === 'horizontal'
-	                ? (x = nextX + gap)
-	                : (y = nextY + gap);
-	        });
-	    }
-
-	    /**
-	     * VBox or HBox layouting
-	     * @param {string} orient
-	     * @param {module:zrender/container/Group} group
-	     * @param {number} gap
-	     * @param {number} [width=Infinity]
-	     * @param {number} [height=Infinity]
-	     */
-	    layout.box = boxLayout;
-
-	    /**
-	     * VBox layouting
-	     * @param {module:zrender/container/Group} group
-	     * @param {number} gap
-	     * @param {number} [width=Infinity]
-	     * @param {number} [height=Infinity]
-	     */
-	    layout.vbox = zrUtil.curry(boxLayout, 'vertical');
-
-	    /**
-	     * HBox layouting
-	     * @param {module:zrender/container/Group} group
-	     * @param {number} gap
-	     * @param {number} [width=Infinity]
-	     * @param {number} [height=Infinity]
-	     */
-	    layout.hbox = zrUtil.curry(boxLayout, 'horizontal');
-
-	    /**
-	     * If x or x2 is not specified or 'center' 'left' 'right',
-	     * the width would be as long as possible.
-	     * If y or y2 is not specified or 'middle' 'top' 'bottom',
-	     * the height would be as long as possible.
-	     *
-	     * @param {Object} positionInfo
-	     * @param {number|string} [positionInfo.x]
-	     * @param {number|string} [positionInfo.y]
-	     * @param {number|string} [positionInfo.x2]
-	     * @param {number|string} [positionInfo.y2]
-	     * @param {Object} containerRect
-	     * @param {string|number} margin
-	     * @return {Object} {width, height}
-	     */
-	    layout.getAvailableSize = function (positionInfo, containerRect, margin) {
-	        var containerWidth = containerRect.width;
-	        var containerHeight = containerRect.height;
-
-	        var x = parsePercent(positionInfo.x, containerWidth);
-	        var y = parsePercent(positionInfo.y, containerHeight);
-	        var x2 = parsePercent(positionInfo.x2, containerWidth);
-	        var y2 = parsePercent(positionInfo.y2, containerHeight);
-
-	        (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);
-	        (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);
-	        (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);
-	        (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);
-
-	        margin = formatUtil.normalizeCssArray(margin || 0);
-
-	        return {
-	            width: Math.max(x2 - x - margin[1] - margin[3], 0),
-	            height: Math.max(y2 - y - margin[0] - margin[2], 0)
-	        };
-	    };
-
-	    /**
-	     * Parse position info.
-	     *
-	     * @param {Object} positionInfo
-	     * @param {number|string} [positionInfo.left]
-	     * @param {number|string} [positionInfo.top]
-	     * @param {number|string} [positionInfo.right]
-	     * @param {number|string} [positionInfo.bottom]
-	     * @param {number|string} [positionInfo.width]
-	     * @param {number|string} [positionInfo.height]
-	     * @param {number|string} [positionInfo.aspect] Aspect is width / height
-	     * @param {Object} containerRect
-	     * @param {string|number} [margin]
-	     *
-	     * @return {module:zrender/core/BoundingRect}
-	     */
-	    layout.getLayoutRect = function (
-	        positionInfo, containerRect, margin
-	    ) {
-	        margin = formatUtil.normalizeCssArray(margin || 0);
-
-	        var containerWidth = containerRect.width;
-	        var containerHeight = containerRect.height;
-
-	        var left = parsePercent(positionInfo.left, containerWidth);
-	        var top = parsePercent(positionInfo.top, containerHeight);
-	        var right = parsePercent(positionInfo.right, containerWidth);
-	        var bottom = parsePercent(positionInfo.bottom, containerHeight);
-	        var width = parsePercent(positionInfo.width, containerWidth);
-	        var height = parsePercent(positionInfo.height, containerHeight);
-
-	        var verticalMargin = margin[2] + margin[0];
-	        var horizontalMargin = margin[1] + margin[3];
-	        var aspect = positionInfo.aspect;
-
-	        // If width is not specified, calculate width from left and right
-	        if (isNaN(width)) {
-	            width = containerWidth - right - horizontalMargin - left;
-	        }
-	        if (isNaN(height)) {
-	            height = containerHeight - bottom - verticalMargin - top;
-	        }
-
-	        // If width and height are not given
-	        // 1. Graph should not exceeds the container
-	        // 2. Aspect must be keeped
-	        // 3. Graph should take the space as more as possible
-	        if (isNaN(width) && isNaN(height)) {
-	            if (aspect > containerWidth / containerHeight) {
-	                width = containerWidth * 0.8;
-	            }
-	            else {
-	                height = containerHeight * 0.8;
-	            }
-	        }
-
-	        if (aspect != null) {
-	            // Calculate width or height with given aspect
-	            if (isNaN(width)) {
-	                width = aspect * height;
-	            }
-	            if (isNaN(height)) {
-	                height = width / aspect;
-	            }
-	        }
-
-	        // If left is not specified, calculate left from right and width
-	        if (isNaN(left)) {
-	            left = containerWidth - right - width - horizontalMargin;
-	        }
-	        if (isNaN(top)) {
-	            top = containerHeight - bottom - height - verticalMargin;
-	        }
-
-	        // Align left and top
-	        switch (positionInfo.left || positionInfo.right) {
-	            case 'center':
-	                left = containerWidth / 2 - width / 2 - margin[3];
-	                break;
-	            case 'right':
-	                left = containerWidth - width - horizontalMargin;
-	                break;
-	        }
-	        switch (positionInfo.top || positionInfo.bottom) {
-	            case 'middle':
-	            case 'center':
-	                top = containerHeight / 2 - height / 2 - margin[0];
-	                break;
-	            case 'bottom':
-	                top = containerHeight - height - verticalMargin;
-	                break;
-	        }
-	        // If something is wrong and left, top, width, height are calculated as NaN
-	        left = left || 0;
-	        top = top || 0;
-	        if (isNaN(width)) {
-	            // Width may be NaN if only one value is given except width
-	            width = containerWidth - left - (right || 0);
-	        }
-	        if (isNaN(height)) {
-	            // Height may be NaN if only one value is given except height
-	            height = containerHeight - top - (bottom || 0);
-	        }
-
-	        var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);
-	        rect.margin = margin;
-	        return rect;
-	    };
-
-
-	    /**
-	     * Position a zr element in viewport
-	     *  Group position is specified by either
-	     *  {left, top}, {right, bottom}
-	     *  If all properties exists, right and bottom will be igonred.
-	     *
-	     * Logic:
-	     *     1. Scale (against origin point in parent coord)
-	     *     2. Rotate (against origin point in parent coord)
-	     *     3. Traslate (with el.position by this method)
-	     * So this method only fixes the last step 'Traslate', which does not affect
-	     * scaling and rotating.
-	     *
-	     * If be called repeatly with the same input el, the same result will be gotten.
-	     *
-	     * @param {module:zrender/Element} el Should have `getBoundingRect` method.
-	     * @param {Object} positionInfo
-	     * @param {number|string} [positionInfo.left]
-	     * @param {number|string} [positionInfo.top]
-	     * @param {number|string} [positionInfo.right]
-	     * @param {number|string} [positionInfo.bottom]
-	     * @param {Object} containerRect
-	     * @param {string|number} margin
-	     * @param {Object} [opt]
-	     * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.
-	     * @param {Array.<number>} [opt.boundingMode='all']
-	     *        Specify how to calculate boundingRect when locating.
-	     *        'all': Position the boundingRect that is transformed and uioned
-	     *               both itself and its descendants.
-	     *               This mode simplies confine the elements in the bounding
-	     *               of their container (e.g., using 'right: 0').
-	     *        'raw': Position the boundingRect that is not transformed and only itself.
-	     *               This mode is useful when you want a element can overflow its
-	     *               container. (Consider a rotated circle needs to be located in a corner.)
-	     *               In this mode positionInfo.width/height can only be number.
-	     */
-	    layout.positionElement = function (el, positionInfo, containerRect, margin, opt) {
-	        var h = !opt || !opt.hv || opt.hv[0];
-	        var v = !opt || !opt.hv || opt.hv[1];
-	        var boundingMode = opt && opt.boundingMode || 'all';
-
-	        if (!h && !v) {
-	            return;
-	        }
-
-	        var rect;
-	        if (boundingMode === 'raw') {
-	            rect = el.type === 'group'
-	                ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0)
-	                : el.getBoundingRect();
-	        }
-	        else {
-	            rect = el.getBoundingRect();
-	            if (el.needLocalTransform()) {
-	                var transform = el.getLocalTransform();
-	                // Notice: raw rect may be inner object of el,
-	                // which should not be modified.
-	                rect = rect.clone();
-	                rect.applyTransform(transform);
-	            }
-	        }
-
-	        positionInfo = layout.getLayoutRect(
-	            zrUtil.defaults(
-	                {width: rect.width, height: rect.height},
-	                positionInfo
-	            ),
-	            containerRect,
-	            margin
-	        );
-
-	        // Because 'tranlate' is the last step in transform
-	        // (see zrender/core/Transformable#getLocalTransfrom),
-	        // we can just only modify el.position to get final result.
-	        var elPos = el.position;
-	        var dx = h ? positionInfo.x - rect.x : 0;
-	        var dy = v ? positionInfo.y - rect.y : 0;
-
-	        el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);
-	    };
-
-	    /**
-	     * @param {Object} option Contains some of the properties in HV_NAMES.
-	     * @param {number} hvIdx 0: horizontal; 1: vertical.
-	     */
-	    layout.sizeCalculable = function (option, hvIdx) {
-	        return option[HV_NAMES[hvIdx][0]] != null
-	            || (option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null);
-	    };
-
-	    /**
-	     * Consider Case:
-	     * When defulat option has {left: 0, width: 100}, and we set {right: 0}
-	     * through setOption or media query, using normal zrUtil.merge will cause
-	     * {right: 0} does not take effect.
-	     *
-	     * @example
-	     * ComponentModel.extend({
-	     *     init: function () {
-	     *         ...
-	     *         var inputPositionParams = layout.getLayoutParams(option);
-	     *         this.mergeOption(inputPositionParams);
-	     *     },
-	     *     mergeOption: function (newOption) {
-	     *         newOption && zrUtil.merge(thisOption, newOption, true);
-	     *         layout.mergeLayoutParam(thisOption, newOption);
-	     *     }
-	     * });
-	     *
-	     * @param {Object} targetOption
-	     * @param {Object} newOption
-	     * @param {Object|string} [opt]
-	     * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Some component must has width and height.
-	     */
-	    layout.mergeLayoutParam = function (targetOption, newOption, opt) {
-	        !zrUtil.isObject(opt) && (opt = {});
-
-	        var ignoreSize = opt.ignoreSize;
-	        !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);
-
-	        var hResult = merge(HV_NAMES[0], 0);
-	        var vResult = merge(HV_NAMES[1], 1);
-
-	        copy(HV_NAMES[0], targetOption, hResult);
-	        copy(HV_NAMES[1], targetOption, vResult);
-
-	        function merge(names, hvIdx) {
-	            var newParams = {};
-	            var newValueCount = 0;
-	            var merged = {};
-	            var mergedValueCount = 0;
-	            var enoughParamNumber = 2;
-
-	            each(names, function (name) {
-	                merged[name] = targetOption[name];
-	            });
-	            each(names, function (name) {
-	                // Consider case: newOption.width is null, which is
-	                // set by user for removing width setting.
-	                hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);
-	                hasValue(newParams, name) && newValueCount++;
-	                hasValue(merged, name) && mergedValueCount++;
-	            });
-
-	            if (ignoreSize[hvIdx]) {
-	                // Only one of left/right is premitted to exist.
-	                if (hasValue(newOption, names[1])) {
-	                    merged[names[2]] = null;
-	                }
-	                else if (hasValue(newOption, names[2])) {
-	                    merged[names[1]] = null;
-	                }
-	                return merged;
-	            }
-
-	            // Case: newOption: {width: ..., right: ...},
-	            // or targetOption: {right: ...} and newOption: {width: ...},
-	            // There is no conflict when merged only has params count
-	            // little than enoughParamNumber.
-	            if (mergedValueCount === enoughParamNumber || !newValueCount) {
-	                return merged;
-	            }
-	            // Case: newOption: {width: ..., right: ...},
-	            // Than we can make sure user only want those two, and ignore
-	            // all origin params in targetOption.
-	            else if (newValueCount >= enoughParamNumber) {
-	                return newParams;
-	            }
-	            else {
-	                // Chose another param from targetOption by priority.
-	                for (var i = 0; i < names.length; i++) {
-	                    var name = names[i];
-	                    if (!hasProp(newParams, name) && hasProp(targetOption, name)) {
-	                        newParams[name] = targetOption[name];
-	                        break;
-	                    }
-	                }
-	                return newParams;
-	            }
-	        }
-
-	        function hasProp(obj, name) {
-	            return obj.hasOwnProperty(name);
-	        }
-
-	        function hasValue(obj, name) {
-	            return obj[name] != null && obj[name] !== 'auto';
-	        }
-
-	        function copy(names, target, source) {
-	            each(names, function (name) {
-	                target[name] = source[name];
-	            });
-	        }
-	    };
-
-	    /**
-	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
-	     * @param {Object} source
-	     * @return {Object} Result contains those props.
-	     */
-	    layout.getLayoutParams = function (source) {
-	        return layout.copyLayoutParams({}, source);
-	    };
-
-	    /**
-	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
-	     * @param {Object} source
-	     * @return {Object} Result contains those props.
-	     */
-	    layout.copyLayoutParams = function (target, source) {
-	        source && target && each(LOCATION_PARAMS, function (name) {
-	            source.hasOwnProperty(name) && (target[name] = source[name]);
-	        });
-	        return target;
-	    };
-
-	    module.exports = layout;
-
-
-
-/***/ },
-/* 22 */
-/***/ function(module, exports) {
-
-	
-
-	    module.exports = {
-	        getBoxLayoutParams: function () {
-	            return {
-	                left: this.get('left'),
-	                top: this.get('top'),
-	                right: this.get('right'),
-	                bottom: this.get('bottom'),
-	                width: this.get('width'),
-	                height: this.get('height')
-	            };
-	        }
-	    };
-
-
-/***/ },
-/* 23 */
-/***/ function(module, exports) {
-
-	
-	    var platform = '';
-	    // Navigator not exists in node
-	    if (typeof navigator !== 'undefined') {
-	        platform = navigator.platform || '';
-	    }
-	    module.exports = {
-	        // 全图默认背景
-	        // backgroundColor: 'rgba(0,0,0,0)',
-
-	        // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization
-	        // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'],
-	        // 浅色
-	        // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'],
-	        // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'],
-	        // 深色
-	        color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83',  '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'],
-
-	        // 默认需要 Grid 配置项
-	        // grid: {},
-	        // 主题，主题
-	        textStyle: {
-	            // color: '#000',
-	            // decoration: 'none',
-	            // PENDING
-	            fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',
-	            // fontFamily: 'Arial, Verdana, sans-serif',
-	            fontSize: 12,
-	            fontStyle: 'normal',
-	            fontWeight: 'normal'
-	        },
-
-	        // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/
-	        // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
-	        // Default is source-over
-	        blendMode: null,
-
-	        animation: 'auto',
-	        animationDuration: 1000,
-	        animationDurationUpdate: 300,
-	        animationEasing: 'exponentialOut',
-	        animationEasingUpdate: 'cubicOut',
-
-	        animationThreshold: 2000,
-	        // Configuration for progressive/incremental rendering
-	        progressiveThreshold: 3000,
-	        progressive: 400,
-
-	        // Threshold of if use single hover layer to optimize.
-	        // It is recommended that `hoverLayerThreshold` is equivalent to or less than
-	        // `progressiveThreshold`, otherwise hover will cause restart of progressive,
-	        // which is unexpected.
-	        // see example <echarts/test/heatmap-large.html>.
-	        hoverLayerThreshold: 3000,
-
-	        // See: module:echarts/scale/Time
-	        useUTC: false
-	    };
-
-
-/***/ },
-/* 24 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var classUtil = __webpack_require__(13);
-	    var set = classUtil.set;
-	    var get = classUtil.get;
-
-	    module.exports = {
-	        clearColorPalette: function () {
-	            set(this, 'colorIdx', 0);
-	            set(this, 'colorNameMap', {});
-	        },
-
-	        getColorFromPalette: function (name, scope) {
-	            scope = scope || this;
-	            var colorIdx = get(scope, 'colorIdx') || 0;
-	            var colorNameMap = get(scope, 'colorNameMap') || set(scope, 'colorNameMap', {});
-	            if (colorNameMap[name]) {
-	                return colorNameMap[name];
-	            }
-	            var colorPalette = this.get('color', true) || [];
-	            if (!colorPalette.length) {
-	                return;
-	            }
-
-	            var color = colorPalette[colorIdx];
-	            if (name) {
-	                colorNameMap[name] = color;
-	            }
-	            set(scope, 'colorIdx', (colorIdx + 1) % colorPalette.length);
-
-	            return color;
-	        }
-	    };
-
-
-/***/ },
-/* 25 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var echartsAPIList = [
-	        'getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed',
-	        'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption',
-	        'getViewOfComponentModel', 'getViewOfSeriesModel'
-	    ];
-	    // And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js
-
-	    function ExtensionAPI(chartInstance) {
-	        zrUtil.each(echartsAPIList, function (name) {
-	            this[name] = zrUtil.bind(chartInstance[name], chartInstance);
-	        }, this);
-	    }
-
-	    module.exports = ExtensionAPI;
-
-
-/***/ },
-/* 26 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var coordinateSystemCreators = {};
-
-	    function CoordinateSystemManager() {
-
-	        this._coordinateSystems = [];
-	    }
-
-	    CoordinateSystemManager.prototype = {
-
-	        constructor: CoordinateSystemManager,
-
-	        create: function (ecModel, api) {
-	            var coordinateSystems = [];
-	            zrUtil.each(coordinateSystemCreators, function (creater, type) {
-	                var list = creater.create(ecModel, api);
-	                coordinateSystems = coordinateSystems.concat(list || []);
-	            });
-
-	            this._coordinateSystems = coordinateSystems;
-	        },
-
-	        update: function (ecModel, api) {
-	            zrUtil.each(this._coordinateSystems, function (coordSys) {
-	                // FIXME MUST have
-	                coordSys.update && coordSys.update(ecModel, api);
-	            });
-	        },
-
-	        getCoordinateSystems: function () {
-	            return this._coordinateSystems.slice();
-	        }
-	    };
-
-	    CoordinateSystemManager.register = function (type, coordinateSystemCreator) {
-	        coordinateSystemCreators[type] = coordinateSystemCreator;
-	    };
-
-	    CoordinateSystemManager.get = function (type) {
-	        return coordinateSystemCreators[type];
-	    };
-
-	    module.exports = CoordinateSystemManager;
-
-
-/***/ },
-/* 27 */
-/***/ function(module, exports, __webpack_require__) {
-
 	/**
-	 * ECharts option manager
-	 *
-	 * @module {echarts/model/OptionManager}
+	 * 可绘制的图形基类
+	 * Base class of all displayable graphic objects
+	 * @module zrender/graphic/Displayable
 	 */
 
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var modelUtil = __webpack_require__(5);
-	    var ComponentModel = __webpack_require__(19);
-	    var each = zrUtil.each;
-	    var clone = zrUtil.clone;
-	    var map = zrUtil.map;
-	    var merge = zrUtil.merge;
 
-	    var QUERY_REG = /^(min|max)?(.+)$/;
+	    var Style = __webpack_require__(22);
+
+	    var Element = __webpack_require__(23);
+	    var RectText = __webpack_require__(35);
+	    // var Stateful = require('./mixin/Stateful');
 
 	    /**
-	     * TERM EXPLANATIONS:
-	     *
-	     * [option]:
-	     *
-	     *     An object that contains definitions of components. For example:
-	     *     var option = {
-	     *         title: {...},
-	     *         legend: {...},
-	     *         visualMap: {...},
-	     *         series: [
-	     *             {data: [...]},
-	     *             {data: [...]},
-	     *             ...
-	     *         ]
-	     *     };
-	     *
-	     * [rawOption]:
-	     *
-	     *     An object input to echarts.setOption. 'rawOption' may be an
-	     *     'option', or may be an object contains multi-options. For example:
-	     *     var option = {
-	     *         baseOption: {
-	     *             title: {...},
-	     *             legend: {...},
-	     *             series: [
-	     *                 {data: [...]},
-	     *                 {data: [...]},
-	     *                 ...
-	     *             ]
-	     *         },
-	     *         timeline: {...},
-	     *         options: [
-	     *             {title: {...}, series: {data: [...]}},
-	     *             {title: {...}, series: {data: [...]}},
-	     *             ...
-	     *         ],
-	     *         media: [
-	     *             {
-	     *                 query: {maxWidth: 320},
-	     *                 option: {series: {x: 20}, visualMap: {show: false}}
-	     *             },
-	     *             {
-	     *                 query: {minWidth: 320, maxWidth: 720},
-	     *                 option: {series: {x: 500}, visualMap: {show: true}}
-	     *             },
-	     *             {
-	     *                 option: {series: {x: 1200}, visualMap: {show: true}}
-	     *             }
-	     *         ]
-	     *     };
-	     *
-	     * @alias module:echarts/model/OptionManager
-	     * @param {module:echarts/ExtensionAPI} api
+	     * @alias module:zrender/graphic/Displayable
+	     * @extends module:zrender/Element
+	     * @extends module:zrender/graphic/mixin/RectText
 	     */
-	    function OptionManager(api) {
-
-	        /**
-	         * @private
-	         * @type {module:echarts/ExtensionAPI}
-	         */
-	        this._api = api;
-
-	        /**
-	         * @private
-	         * @type {Array.<number>}
-	         */
-	        this._timelineOptions = [];
-
-	        /**
-	         * @private
-	         * @type {Array.<Object>}
-	         */
-	        this._mediaList = [];
-
-	        /**
-	         * @private
-	         * @type {Object}
-	         */
-	        this._mediaDefault;
-
-	        /**
-	         * -1, means default.
-	         * empty means no media.
-	         * @private
-	         * @type {Array.<number>}
-	         */
-	        this._currentMediaIndices = [];
-
-	        /**
-	         * @private
-	         * @type {Object}
-	         */
-	        this._optionBackup;
-
-	        /**
-	         * @private
-	         * @type {Object}
-	         */
-	        this._newBaseOption;
-	    }
-
-	    // timeline.notMerge is not supported in ec3. Firstly there is rearly
-	    // case that notMerge is needed. Secondly supporting 'notMerge' requires
-	    // rawOption cloned and backuped when timeline changed, which does no
-	    // good to performance. What's more, that both timeline and setOption
-	    // method supply 'notMerge' brings complex and some problems.
-	    // Consider this case:
-	    // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);
-	    // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);
-
-	    OptionManager.prototype = {
-
-	        constructor: OptionManager,
-
-	        /**
-	         * @public
-	         * @param {Object} rawOption Raw option.
-	         * @param {module:echarts/model/Global} ecModel
-	         * @param {Array.<Function>} optionPreprocessorFuncs
-	         * @return {Object} Init option
-	         */
-	        setOption: function (rawOption, optionPreprocessorFuncs) {
-	            rawOption = clone(rawOption, true);
-
-	            // FIXME
-	            // 如果 timeline options 或者 media 中设置了某个属性，而baseOption中没有设置，则进行警告。
-
-	            var oldOptionBackup = this._optionBackup;
-	            var newParsedOption = parseRawOption.call(
-	                this, rawOption, optionPreprocessorFuncs, !oldOptionBackup
-	            );
-	            this._newBaseOption = newParsedOption.baseOption;
-
-	            // For setOption at second time (using merge mode);
-	            if (oldOptionBackup) {
-	                // Only baseOption can be merged.
-	                mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption);
-
-	                // For simplicity, timeline options and media options do not support merge,
-	                // that is, if you `setOption` twice and both has timeline options, the latter
-	                // timeline opitons will not be merged to the formers, but just substitude them.
-	                if (newParsedOption.timelineOptions.length) {
-	                    oldOptionBackup.timelineOptions = newParsedOption.timelineOptions;
-	                }
-	                if (newParsedOption.mediaList.length) {
-	                    oldOptionBackup.mediaList = newParsedOption.mediaList;
-	                }
-	                if (newParsedOption.mediaDefault) {
-	                    oldOptionBackup.mediaDefault = newParsedOption.mediaDefault;
-	                }
-	            }
-	            else {
-	                this._optionBackup = newParsedOption;
-	            }
-	        },
-
-	        /**
-	         * @param {boolean} isRecreate
-	         * @return {Object}
-	         */
-	        mountOption: function (isRecreate) {
-	            var optionBackup = this._optionBackup;
-
-	            // TODO
-	            // 如果没有reset功能则不clone。
-
-	            this._timelineOptions = map(optionBackup.timelineOptions, clone);
-	            this._mediaList = map(optionBackup.mediaList, clone);
-	            this._mediaDefault = clone(optionBackup.mediaDefault);
-	            this._currentMediaIndices = [];
-
-	            return clone(isRecreate
-	                // this._optionBackup.baseOption, which is created at the first `setOption`
-	                // called, and is merged into every new option by inner method `mergeOption`
-	                // each time `setOption` called, can be only used in `isRecreate`, because
-	                // its reliability is under suspicion. In other cases option merge is
-	                // performed by `model.mergeOption`.
-	                ? optionBackup.baseOption : this._newBaseOption
-	            );
-	        },
-
-	        /**
-	         * @param {module:echarts/model/Global} ecModel
-	         * @return {Object}
-	         */
-	        getTimelineOption: function (ecModel) {
-	            var option;
-	            var timelineOptions = this._timelineOptions;
-
-	            if (timelineOptions.length) {
-	                // getTimelineOption can only be called after ecModel inited,
-	                // so we can get currentIndex from timelineModel.
-	                var timelineModel = ecModel.getComponent('timeline');
-	                if (timelineModel) {
-	                    option = clone(
-	                        timelineOptions[timelineModel.getCurrentIndex()],
-	                        true
-	                    );
-	                }
-	            }
-
-	            return option;
-	        },
-
-	        /**
-	         * @param {module:echarts/model/Global} ecModel
-	         * @return {Array.<Object>}
-	         */
-	        getMediaOption: function (ecModel) {
-	            var ecWidth = this._api.getWidth();
-	            var ecHeight = this._api.getHeight();
-	            var mediaList = this._mediaList;
-	            var mediaDefault = this._mediaDefault;
-	            var indices = [];
-	            var result = [];
-
-	            // No media defined.
-	            if (!mediaList.length && !mediaDefault) {
-	                return result;
-	            }
-
-	            // Multi media may be applied, the latter defined media has higher priority.
-	            for (var i = 0, len = mediaList.length; i < len; i++) {
-	                if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {
-	                    indices.push(i);
-	                }
-	            }
-
-	            // FIXME
-	            // 是否mediaDefault应该强制用户设置，否则可能修改不能回归。
-	            if (!indices.length && mediaDefault) {
-	                indices = [-1];
-	            }
-
-	            if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {
-	                result = map(indices, function (index) {
-	                    return clone(
-	                        index === -1 ? mediaDefault.option : mediaList[index].option
-	                    );
-	                });
-	            }
-	            // Otherwise return nothing.
-
-	            this._currentMediaIndices = indices;
-
-	            return result;
-	        }
-	    };
-
-	    function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) {
-	        var timelineOptions = [];
-	        var mediaList = [];
-	        var mediaDefault;
-	        var baseOption;
-
-	        // Compatible with ec2.
-	        var timelineOpt = rawOption.timeline;
-
-	        if (rawOption.baseOption) {
-	            baseOption = rawOption.baseOption;
-	        }
-
-	        // For timeline
-	        if (timelineOpt || rawOption.options) {
-	            baseOption = baseOption || {};
-	            timelineOptions = (rawOption.options || []).slice();
-	        }
-
-	        // For media query
-	        if (rawOption.media) {
-	            baseOption = baseOption || {};
-	            var media = rawOption.media;
-	            each(media, function (singleMedia) {
-	                if (singleMedia && singleMedia.option) {
-	                    if (singleMedia.query) {
-	                        mediaList.push(singleMedia);
-	                    }
-	                    else if (!mediaDefault) {
-	                        // Use the first media default.
-	                        mediaDefault = singleMedia;
-	                    }
-	                }
-	            });
-	        }
-
-	        // For normal option
-	        if (!baseOption) {
-	            baseOption = rawOption;
-	        }
-
-	        // Set timelineOpt to baseOption in ec3,
-	        // which is convenient for merge option.
-	        if (!baseOption.timeline) {
-	            baseOption.timeline = timelineOpt;
-	        }
-
-	        // Preprocess.
-	        each([baseOption].concat(timelineOptions)
-	            .concat(zrUtil.map(mediaList, function (media) {
-	                return media.option;
-	            })),
-	            function (option) {
-	                each(optionPreprocessorFuncs, function (preProcess) {
-	                    preProcess(option, isNew);
-	                });
-	            }
-	        );
-
-	        return {
-	            baseOption: baseOption,
-	            timelineOptions: timelineOptions,
-	            mediaDefault: mediaDefault,
-	            mediaList: mediaList
-	        };
-	    }
-
-	    /**
-	     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
-	     * Support: width, height, aspectRatio
-	     * Can use max or min as prefix.
-	     */
-	    function applyMediaQuery(query, ecWidth, ecHeight) {
-	        var realMap = {
-	            width: ecWidth,
-	            height: ecHeight,
-	            aspectratio: ecWidth / ecHeight // lowser case for convenientce.
-	        };
-
-	        var applicatable = true;
-
-	        zrUtil.each(query, function (value, attr) {
-	            var matched = attr.match(QUERY_REG);
-
-	            if (!matched || !matched[1] || !matched[2]) {
-	                return;
-	            }
-
-	            var operator = matched[1];
-	            var realAttr = matched[2].toLowerCase();
-
-	            if (!compare(realMap[realAttr], value, operator)) {
-	                applicatable = false;
-	            }
-	        });
-
-	        return applicatable;
-	    }
-
-	    function compare(real, expect, operator) {
-	        if (operator === 'min') {
-	            return real >= expect;
-	        }
-	        else if (operator === 'max') {
-	            return real <= expect;
-	        }
-	        else { // Equals
-	            return real === expect;
-	        }
-	    }
-
-	    function indicesEquals(indices1, indices2) {
-	        // indices is always order by asc and has only finite number.
-	        return indices1.join(',') === indices2.join(',');
-	    }
-
-	    /**
-	     * Consider case:
-	     * `chart.setOption(opt1);`
-	     * Then user do some interaction like dataZoom, dataView changing.
-	     * `chart.setOption(opt2);`
-	     * Then user press 'reset button' in toolbox.
-	     *
-	     * After doing that all of the interaction effects should be reset, the
-	     * chart should be the same as the result of invoke
-	     * `chart.setOption(opt1); chart.setOption(opt2);`.
-	     *
-	     * Although it is not able ensure that
-	     * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to
-	     * `chart.setOption(merge(opt1, opt2));` exactly,
-	     * this might be the only simple way to implement that feature.
-	     *
-	     * MEMO: We've considered some other approaches:
-	     * 1. Each model handle its self restoration but not uniform treatment.
-	     *     (Too complex in logic and error-prone)
-	     * 2. Use a shadow ecModel. (Performace expensive)
-	     */
-	    function mergeOption(oldOption, newOption) {
-	        newOption = newOption || {};
-
-	        each(newOption, function (newCptOpt, mainType) {
-	            if (newCptOpt == null) {
-	                return;
-	            }
-
-	            var oldCptOpt = oldOption[mainType];
-
-	            if (!ComponentModel.hasClass(mainType)) {
-	                oldOption[mainType] = merge(oldCptOpt, newCptOpt, true);
-	            }
-	            else {
-	                newCptOpt = modelUtil.normalizeToArray(newCptOpt);
-	                oldCptOpt = modelUtil.normalizeToArray(oldCptOpt);
-
-	                var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt);
-
-	                oldOption[mainType] = map(mapResult, function (item) {
-	                    return (item.option && item.exist)
-	                        ? merge(item.exist, item.option, true)
-	                        : (item.exist || item.option);
-	                });
-	            }
-	        });
-	    }
-
-	    module.exports = OptionManager;
-
-
-/***/ },
-/* 28 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var formatUtil = __webpack_require__(6);
-	    var classUtil = __webpack_require__(13);
-	    var modelUtil = __webpack_require__(5);
-	    var ComponentModel = __webpack_require__(19);
-	    var colorPaletteMixin = __webpack_require__(24);
-	    var env = __webpack_require__(2);
-	    var layout = __webpack_require__(21);
-
-	    var set = classUtil.set;
-	    var get = classUtil.get;
-	    var encodeHTML = formatUtil.encodeHTML;
-	    var addCommas = formatUtil.addCommas;
-
-	    var SeriesModel = ComponentModel.extend({
-
-	        type: 'series.__base__',
-
-	        /**
-	         * @readOnly
-	         */
-	        seriesIndex: 0,
-
-	        // coodinateSystem will be injected in the echarts/CoordinateSystem
-	        coordinateSystem: null,
-
-	        /**
-	         * @type {Object}
-	         * @protected
-	         */
-	        defaultOption: null,
-
-	        /**
-	         * Data provided for legend
-	         * @type {Function}
-	         */
-	        // PENDING
-	        legendDataProvider: null,
-
-	        /**
-	         * Access path of color for visual
-	         */
-	        visualColorAccessPath: 'itemStyle.normal.color',
-
-	        /**
-	         * Support merge layout params.
-	         * Only support 'box' now (left/right/top/bottom/width/height).
-	         * @type {string|Object} Object can be {ignoreSize: true}
-	         * @readOnly
-	         */
-	        layoutMode: null,
-
-	        init: function (option, parentModel, ecModel, extraOpt) {
-
-	            /**
-	             * @type {number}
-	             * @readOnly
-	             */
-	            this.seriesIndex = this.componentIndex;
-
-	            this.mergeDefaultAndTheme(option, ecModel);
-
-	            var data = this.getInitialData(option, ecModel);
-	            if (true) {
-	                zrUtil.assert(data, 'getInitialData returned invalid data.');
-	            }
-	            /**
-	             * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph}
-	             * @private
-	             */
-	            set(this, 'dataBeforeProcessed', data);
-
-	            // If we reverse the order (make data firstly, and then make
-	            // dataBeforeProcessed by cloneShallow), cloneShallow will
-	            // cause data.graph.data !== data when using
-	            // module:echarts/data/Graph or module:echarts/data/Tree.
-	            // See module:echarts/data/helper/linkList
-	            this.restoreData();
-	        },
-
-	        /**
-	         * Util for merge default and theme to option
-	         * @param  {Object} option
-	         * @param  {module:echarts/model/Global} ecModel
-	         */
-	        mergeDefaultAndTheme: function (option, ecModel) {
-	            var layoutMode = this.layoutMode;
-	            var inputPositionParams = layoutMode
-	                ? layout.getLayoutParams(option) : {};
-
-	            zrUtil.merge(
-	                option,
-	                ecModel.getTheme().get(this.subType)
-	            );
-	            zrUtil.merge(option, this.getDefaultOption());
-
-	            // Default label emphasis `position` and `show`
-	            // FIXME Set label in mergeOption
-	            modelUtil.defaultEmphasis(option.label, modelUtil.LABEL_OPTIONS);
-
-	            this.fillDataTextStyle(option.data);
-
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
-	            }
-	        },
-
-	        mergeOption: function (newSeriesOption, ecModel) {
-	            newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);
-	            this.fillDataTextStyle(newSeriesOption.data);
-
-	            var layoutMode = this.layoutMode;
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(this.option, newSeriesOption, layoutMode);
-	            }
-
-	            var data = this.getInitialData(newSeriesOption, ecModel);
-	            // TODO Merge data?
-	            if (data) {
-	                set(this, 'data', data);
-	                set(this, 'dataBeforeProcessed', data.cloneShallow());
-	            }
-	        },
-
-	        fillDataTextStyle: function (data) {
-	            // Default data label emphasis `position` and `show`
-	            // FIXME Tree structure data ?
-	            // FIXME Performance ?
-	            if (data) {
-	                for (var i = 0; i < data.length; i++) {
-	                    if (data[i] && data[i].label) {
-	                        modelUtil.defaultEmphasis(data[i].label, modelUtil.LABEL_OPTIONS);
-	                    }
-	                }
-	            }
-	        },
-
-	        /**
-	         * Init a data structure from data related option in series
-	         * Must be overwritten
-	         */
-	        getInitialData: function () {},
-
-	        /**
-	         * @param {string} [dataType]
-	         * @return {module:echarts/data/List}
-	         */
-	        getData: function (dataType) {
-	            var data = get(this, 'data');
-	            return dataType == null ? data : data.getLinkedData(dataType);
-	        },
-
-	        /**
-	         * @param {module:echarts/data/List} data
-	         */
-	        setData: function (data) {
-	            set(this, 'data', data);
-	        },
-
-	        /**
-	         * Get data before processed
-	         * @return {module:echarts/data/List}
-	         */
-	        getRawData: function () {
-	            return get(this, 'dataBeforeProcessed');
-	        },
-
-	        /**
-	         * Coord dimension to data dimension.
-	         *
-	         * By default the result is the same as dimensions of series data.
-	         * But in some series data dimensions are different from coord dimensions (i.e.
-	         * candlestick and boxplot). Override this method to handle those cases.
-	         *
-	         * Coord dimension to data dimension can be one-to-many
-	         *
-	         * @param {string} coordDim
-	         * @return {Array.<string>} dimensions on the axis.
-	         */
-	        coordDimToDataDim: function (coordDim) {
-	            return [coordDim];
-	        },
-
-	        /**
-	         * Convert data dimension to coord dimension.
-	         *
-	         * @param {string|number} dataDim
-	         * @return {string}
-	         */
-	        dataDimToCoordDim: function (dataDim) {
-	            return dataDim;
-	        },
-
-	        /**
-	         * Get base axis if has coordinate system and has axis.
-	         * By default use coordSys.getBaseAxis();
-	         * Can be overrided for some chart.
-	         * @return {type} description
-	         */
-	        getBaseAxis: function () {
-	            var coordSys = this.coordinateSystem;
-	            return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
-	        },
-
-	        // FIXME
-	        /**
-	         * Default tooltip formatter
-	         *
-	         * @param {number} dataIndex
-	         * @param {boolean} [multipleSeries=false]
-	         * @param {number} [dataType]
-	         */
-	        formatTooltip: function (dataIndex, multipleSeries, dataType) {
-	            function formatArrayValue(value) {
-	                var result = [];
-
-	                zrUtil.each(value, function (val, idx) {
-	                    var dimInfo = data.getDimensionInfo(idx);
-	                    var dimType = dimInfo && dimInfo.type;
-	                    var valStr;
-
-	                    if (dimType === 'ordinal') {
-	                        valStr = val + '';
-	                    }
-	                    else if (dimType === 'time') {
-	                        valStr = multipleSeries ? '' : formatUtil.formatTime('yyyy/MM/dd hh:mm:ss', val);
-	                    }
-	                    else {
-	                        valStr = addCommas(val);
-	                    }
-
-	                    valStr && result.push(valStr);
-	                });
-
-	                return result.join(', ');
-	            }
-
-	            var data = get(this, 'data');
-
-	            var value = this.getRawValue(dataIndex);
-	            var formattedValue = encodeHTML(
-	                zrUtil.isArray(value) ? formatArrayValue(value) : addCommas(value)
-	            );
-	            var name = data.getName(dataIndex);
-
-	            var color = data.getItemVisual(dataIndex, 'color');
-	            if (zrUtil.isObject(color) && color.colorStops) {
-	                color = (color.colorStops[0] || {}).color;
-	            }
-	            color = color || 'transparent';
-
-	            var colorEl = '<span style="display:inline-block;margin-right:5px;'
-	                + 'border-radius:10px;width:9px;height:9px;background-color:' + encodeHTML(color) + '"></span>';
-
-	            var seriesName = this.name;
-	            // FIXME
-	            if (seriesName === '\0-') {
-	                // Not show '-'
-	                seriesName = '';
-	            }
-	            return !multipleSeries
-	                ? ((seriesName && encodeHTML(seriesName) + '<br />') + colorEl
-	                    + (name
-	                        ? encodeHTML(name) + ' : ' + formattedValue
-	                        : formattedValue
-	                    )
-	                  )
-	                : (colorEl + encodeHTML(this.name) + ' : ' + formattedValue);
-	        },
-
-	        /**
-	         * @return {boolean}
-	         */
-	        isAnimationEnabled: function () {
-	            if (env.node) {
-	                return false;
-	            }
-
-	            var animationEnabled = this.getShallow('animation');
-	            if (animationEnabled) {
-	                if (this.getData().count() > this.getShallow('animationThreshold')) {
-	                    animationEnabled = false;
-	                }
-	            }
-	            return animationEnabled;
-	        },
-
-	        restoreData: function () {
-	            set(this, 'data', get(this, 'dataBeforeProcessed').cloneShallow());
-	        },
-
-	        getColorFromPalette: function (name, scope) {
-	            var ecModel = this.ecModel;
-	            // PENDING
-	            var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope);
-	            if (!color) {
-	                color = ecModel.getColorFromPalette(name, scope);
-	            }
-	            return color;
-	        },
-
-	        /**
-	         * Get data indices for show tooltip content. See tooltip.
-	         * @abstract
-	         * @param {Array.<string>|string} dim
-	         * @param {Array.<number>} value
-	         * @param {module:echarts/coord/single/SingleAxis} baseAxis
-	         * @return {Object} {dataIndices, nestestValue}.
-	         */
-	        getAxisTooltipData: null,
-
-	        /**
-	         * See tooltip.
-	         * @abstract
-	         * @param {number} dataIndex
-	         * @return {Array.<number>} Point of tooltip. null/undefined can be returned.
-	         */
-	        getTooltipPosition: null
-	    });
-
-	    zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin);
-	    zrUtil.mixin(SeriesModel, colorPaletteMixin);
-
-	    module.exports = SeriesModel;
-
-
-/***/ },
-/* 29 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var Group = __webpack_require__(30);
-	    var componentUtil = __webpack_require__(20);
-	    var clazzUtil = __webpack_require__(13);
-
-	    var Component = function () {
-	        /**
-	         * @type {module:zrender/container/Group}
-	         * @readOnly
-	         */
-	        this.group = new Group();
-
-	        /**
-	         * @type {string}
-	         * @readOnly
-	         */
-	        this.uid = componentUtil.getUID('viewComponent');
-	    };
-
-	    Component.prototype = {
-
-	        constructor: Component,
-
-	        init: function (ecModel, api) {},
-
-	        render: function (componentModel, ecModel, api, payload) {},
-
-	        dispose: function () {}
-
-	    };
-
-	    var componentProto = Component.prototype;
-	    componentProto.updateView
-	        = componentProto.updateLayout
-	        = componentProto.updateVisual
-	        = function (seriesModel, ecModel, api, payload) {
-	            // Do nothing;
-	        };
-	    // Enable Component.extend.
-	    clazzUtil.enableClassExtend(Component);
-
-	    // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
-	    clazzUtil.enableClassManagement(Component, {registerWhenExtend: true});
-
-	    module.exports = Component;
-
-
-/***/ },
-/* 30 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Group是一个容器，可以插入子节点，Group的变换也会被应用到子节点上
-	 * @module zrender/graphic/Group
-	 * @example
-	 *     var Group = require('zrender/lib/container/Group');
-	 *     var Circle = require('zrender/lib/graphic/shape/Circle');
-	 *     var g = new Group();
-	 *     g.position[0] = 100;
-	 *     g.position[1] = 100;
-	 *     g.add(new Circle({
-	 *         style: {
-	 *             x: 100,
-	 *             y: 100,
-	 *             r: 20,
-	 *         }
-	 *     }));
-	 *     zr.add(g);
-	 */
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var Element = __webpack_require__(31);
-	    var BoundingRect = __webpack_require__(9);
-
-	    /**
-	     * @alias module:zrender/graphic/Group
-	     * @constructor
-	     * @extends module:zrender/mixin/Transformable
-	     * @extends module:zrender/mixin/Eventful
-	     */
-	    var Group = function (opts) {
+	    function Displayable(opts) {
 
 	        opts = opts || {};
 
 	        Element.call(this, opts);
 
-	        for (var key in opts) {
-	            if (opts.hasOwnProperty(key)) {
-	                this[key] = opts[key];
+	        // Extend properties
+	        for (var name in opts) {
+	            if (
+	                opts.hasOwnProperty(name) &&
+	                name !== 'style'
+	            ) {
+	                this[name] = opts[name];
 	            }
 	        }
 
-	        this._children = [];
-
-	        this.__storage = null;
-
-	        this.__dirty = true;
-	    };
-
-	    Group.prototype = {
-
-	        constructor: Group,
-
-	        isGroup: true,
-
 	        /**
-	         * @type {string}
+	         * @type {module:zrender/graphic/Style}
 	         */
-	        type: 'group',
+	        this.style = new Style(opts.style);
+
+	        this._rect = null;
+	        // Shapes for cascade clipping.
+	        this.__clipPaths = [];
+
+	        // FIXME Stateful must be mixined after style is setted
+	        // Stateful.call(this, opts);
+	    }
+
+	    Displayable.prototype = {
+
+	        constructor: Displayable,
+
+	        type: 'displayable',
 
 	        /**
-	         * 所有子孙元素是否响应鼠标事件
-	         * @name module:/zrender/container/Group#silent
+	         * Displayable 是否为脏，Painter 中会根据该标记判断是否需要是否需要重新绘制
+	         * Dirty flag. From which painter will determine if this displayable object needs brush
+	         * @name module:zrender/graphic/Displayable#__dirty
+	         * @type {boolean}
+	         */
+	        __dirty: true,
+
+	        /**
+	         * 图形是否可见，为true时不绘制图形，但是仍能触发鼠标事件
+	         * If ignore drawing of the displayable object. Mouse event will still be triggered
+	         * @name module:/zrender/graphic/Displayable#invisible
+	         * @type {boolean}
+	         * @default false
+	         */
+	        invisible: false,
+
+	        /**
+	         * @name module:/zrender/graphic/Displayable#z
+	         * @type {number}
+	         * @default 0
+	         */
+	        z: 0,
+
+	        /**
+	         * @name module:/zrender/graphic/Displayable#z
+	         * @type {number}
+	         * @default 0
+	         */
+	        z2: 0,
+
+	        /**
+	         * z层level，决定绘画在哪层canvas中
+	         * @name module:/zrender/graphic/Displayable#zlevel
+	         * @type {number}
+	         * @default 0
+	         */
+	        zlevel: 0,
+
+	        /**
+	         * 是否可拖拽
+	         * @name module:/zrender/graphic/Displayable#draggable
+	         * @type {boolean}
+	         * @default false
+	         */
+	        draggable: false,
+
+	        /**
+	         * 是否正在拖拽
+	         * @name module:/zrender/graphic/Displayable#draggable
+	         * @type {boolean}
+	         * @default false
+	         */
+	        dragging: false,
+
+	        /**
+	         * 是否相应鼠标事件
+	         * @name module:/zrender/graphic/Displayable#silent
 	         * @type {boolean}
 	         * @default false
 	         */
 	        silent: false,
 
 	        /**
-	         * @return {Array.<module:zrender/Element>}
+	         * If enable culling
+	         * @type {boolean}
+	         * @default false
 	         */
-	        children: function () {
-	            return this._children.slice();
+	        culling: false,
+
+	        /**
+	         * Mouse cursor when hovered
+	         * @name module:/zrender/graphic/Displayable#cursor
+	         * @type {string}
+	         */
+	        cursor: 'pointer',
+
+	        /**
+	         * If hover area is bounding rect
+	         * @name module:/zrender/graphic/Displayable#rectHover
+	         * @type {string}
+	         */
+	        rectHover: false,
+
+	        /**
+	         * Render the element progressively when the value >= 0,
+	         * usefull for large data.
+	         * @type {number}
+	         */
+	        progressive: -1,
+
+	        beforeBrush: function (ctx) {},
+
+	        afterBrush: function (ctx) {},
+
+	        /**
+	         * 图形绘制方法
+	         * @param {Canvas2DRenderingContext} ctx
+	         */
+	        // Interface
+	        brush: function (ctx, prevEl) {},
+
+	        /**
+	         * 获取最小包围盒
+	         * @return {module:zrender/core/BoundingRect}
+	         */
+	        // Interface
+	        getBoundingRect: function () {},
+
+	        /**
+	         * 判断坐标 x, y 是否在图形上
+	         * If displayable element contain coord x, y
+	         * @param  {number} x
+	         * @param  {number} y
+	         * @return {boolean}
+	         */
+	        contain: function (x, y) {
+	            return this.rectContain(x, y);
 	        },
 
 	        /**
-	         * 获取指定 index 的儿子节点
-	         * @param  {number} idx
-	         * @return {module:zrender/Element}
-	         */
-	        childAt: function (idx) {
-	            return this._children[idx];
-	        },
-
-	        /**
-	         * 获取指定名字的儿子节点
-	         * @param  {string} name
-	         * @return {module:zrender/Element}
-	         */
-	        childOfName: function (name) {
-	            var children = this._children;
-	            for (var i = 0; i < children.length; i++) {
-	                if (children[i].name === name) {
-	                    return children[i];
-	                }
-	             }
-	        },
-
-	        /**
-	         * @return {number}
-	         */
-	        childCount: function () {
-	            return this._children.length;
-	        },
-
-	        /**
-	         * 添加子节点到最后
-	         * @param {module:zrender/Element} child
-	         */
-	        add: function (child) {
-	            if (child && child !== this && child.parent !== this) {
-
-	                this._children.push(child);
-
-	                this._doAdd(child);
-	            }
-
-	            return this;
-	        },
-
-	        /**
-	         * 添加子节点在 nextSibling 之前
-	         * @param {module:zrender/Element} child
-	         * @param {module:zrender/Element} nextSibling
-	         */
-	        addBefore: function (child, nextSibling) {
-	            if (child && child !== this && child.parent !== this
-	                && nextSibling && nextSibling.parent === this) {
-
-	                var children = this._children;
-	                var idx = children.indexOf(nextSibling);
-
-	                if (idx >= 0) {
-	                    children.splice(idx, 0, child);
-	                    this._doAdd(child);
-	                }
-	            }
-
-	            return this;
-	        },
-
-	        _doAdd: function (child) {
-	            if (child.parent) {
-	                child.parent.remove(child);
-	            }
-
-	            child.parent = this;
-
-	            var storage = this.__storage;
-	            var zr = this.__zr;
-	            if (storage && storage !== child.__storage) {
-
-	                storage.addToStorage(child);
-
-	                if (child instanceof Group) {
-	                    child.addChildrenToStorage(storage);
-	                }
-	            }
-
-	            zr && zr.refresh();
-	        },
-
-	        /**
-	         * 移除子节点
-	         * @param {module:zrender/Element} child
-	         */
-	        remove: function (child) {
-	            var zr = this.__zr;
-	            var storage = this.__storage;
-	            var children = this._children;
-
-	            var idx = zrUtil.indexOf(children, child);
-	            if (idx < 0) {
-	                return this;
-	            }
-	            children.splice(idx, 1);
-
-	            child.parent = null;
-
-	            if (storage) {
-
-	                storage.delFromStorage(child);
-
-	                if (child instanceof Group) {
-	                    child.delChildrenFromStorage(storage);
-	                }
-	            }
-
-	            zr && zr.refresh();
-
-	            return this;
-	        },
-
-	        /**
-	         * 移除所有子节点
-	         */
-	        removeAll: function () {
-	            var children = this._children;
-	            var storage = this.__storage;
-	            var child;
-	            var i;
-	            for (i = 0; i < children.length; i++) {
-	                child = children[i];
-	                if (storage) {
-	                    storage.delFromStorage(child);
-	                    if (child instanceof Group) {
-	                        child.delChildrenFromStorage(storage);
-	                    }
-	                }
-	                child.parent = null;
-	            }
-	            children.length = 0;
-
-	            return this;
-	        },
-
-	        /**
-	         * 遍历所有子节点
-	         * @param  {Function} cb
-	         * @param  {}   context
-	         */
-	        eachChild: function (cb, context) {
-	            var children = this._children;
-	            for (var i = 0; i < children.length; i++) {
-	                var child = children[i];
-	                cb.call(context, child, i);
-	            }
-	            return this;
-	        },
-
-	        /**
-	         * 深度优先遍历所有子孙节点
 	         * @param  {Function} cb
 	         * @param  {}   context
 	         */
 	        traverse: function (cb, context) {
-	            for (var i = 0; i < this._children.length; i++) {
-	                var child = this._children[i];
-	                cb.call(context, child);
-
-	                if (child.type === 'group') {
-	                    child.traverse(cb, context);
-	                }
-	            }
-	            return this;
+	            cb.call(context, this);
 	        },
 
-	        addChildrenToStorage: function (storage) {
-	            for (var i = 0; i < this._children.length; i++) {
-	                var child = this._children[i];
-	                storage.addToStorage(child);
-	                if (child instanceof Group) {
-	                    child.addChildrenToStorage(storage);
-	                }
-	            }
+	        /**
+	         * 判断坐标 x, y 是否在图形的包围盒上
+	         * If bounding rect of element contain coord x, y
+	         * @param  {number} x
+	         * @param  {number} y
+	         * @return {boolean}
+	         */
+	        rectContain: function (x, y) {
+	            var coord = this.transformCoordToLocal(x, y);
+	            var rect = this.getBoundingRect();
+	            return rect.contain(coord[0], coord[1]);
 	        },
 
-	        delChildrenFromStorage: function (storage) {
-	            for (var i = 0; i < this._children.length; i++) {
-	                var child = this._children[i];
-	                storage.delFromStorage(child);
-	                if (child instanceof Group) {
-	                    child.delChildrenFromStorage(storage);
-	                }
-	            }
-	        },
-
+	        /**
+	         * 标记图形元素为脏，并且在下一帧重绘
+	         * Mark displayable element dirty and refresh next frame
+	         */
 	        dirty: function () {
 	            this.__dirty = true;
+
+	            this._rect = null;
+
 	            this.__zr && this.__zr.refresh();
+	        },
+
+	        /**
+	         * 图形是否会触发事件
+	         * If displayable object binded any event
+	         * @return {boolean}
+	         */
+	        // TODO, 通过 bind 绑定的事件
+	        // isSilent: function () {
+	        //     return !(
+	        //         this.hoverable || this.draggable
+	        //         || this.onmousemove || this.onmouseover || this.onmouseout
+	        //         || this.onmousedown || this.onmouseup || this.onclick
+	        //         || this.ondragenter || this.ondragover || this.ondragleave
+	        //         || this.ondrop
+	        //     );
+	        // },
+	        /**
+	         * Alias for animate('style')
+	         * @param {boolean} loop
+	         */
+	        animateStyle: function (loop) {
+	            return this.animate('style', loop);
+	        },
+
+	        attrKV: function (key, value) {
+	            if (key !== 'style') {
+	                Element.prototype.attrKV.call(this, key, value);
+	            }
+	            else {
+	                this.style.set(value);
+	            }
+	        },
+
+	        /**
+	         * @param {Object|string} key
+	         * @param {*} value
+	         */
+	        setStyle: function (key, value) {
+	            this.style.set(key, value);
+	            this.dirty(false);
 	            return this;
 	        },
 
 	        /**
-	         * @return {module:zrender/core/BoundingRect}
+	         * Use given style object
+	         * @param  {Object} obj
 	         */
-	        getBoundingRect: function (includeChildren) {
-	            // TODO Caching
-	            var rect = null;
-	            var tmpRect = new BoundingRect(0, 0, 0, 0);
-	            var children = includeChildren || this._children;
-	            var tmpMat = [];
-
-	            for (var i = 0; i < children.length; i++) {
-	                var child = children[i];
-	                if (child.ignore || child.invisible) {
-	                    continue;
-	                }
-
-	                var childRect = child.getBoundingRect();
-	                var transform = child.getLocalTransform(tmpMat);
-	                // TODO
-	                // The boundingRect cacluated by transforming original
-	                // rect may be bigger than the actual bundingRect when rotation
-	                // is used. (Consider a circle rotated aginst its center, where
-	                // the actual boundingRect should be the same as that not be
-	                // rotated.) But we can not find better approach to calculate
-	                // actual boundingRect yet, considering performance.
-	                if (transform) {
-	                    tmpRect.copy(childRect);
-	                    tmpRect.applyTransform(transform);
-	                    rect = rect || tmpRect.clone();
-	                    rect.union(tmpRect);
-	                }
-	                else {
-	                    rect = rect || childRect.clone();
-	                    rect.union(childRect);
-	                }
-	            }
-	            return rect || tmpRect;
+	        useStyle: function (obj) {
+	            this.style = new Style(obj);
+	            this.dirty(false);
+	            return this;
 	        }
 	    };
 
-	    zrUtil.inherits(Group, Element);
+	    zrUtil.inherits(Displayable, Element);
 
-	    module.exports = Group;
+	    zrUtil.mixin(Displayable, RectText);
+	    // zrUtil.mixin(Displayable, Stateful);
+
+	    module.exports = Displayable;
 
 
 /***/ },
-/* 31 */
+/* 22 */
+/***/ function(module, exports) {
+
+	/**
+	 * @module zrender/graphic/Style
+	 */
+
+
+	    var STYLE_COMMON_PROPS = [
+	        ['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'],
+	        ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]
+	    ];
+
+	    // var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);
+	    // var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);
+
+	    var Style = function (opts) {
+	        this.extendFrom(opts);
+	    };
+
+	    function createLinearGradient(ctx, obj, rect) {
+	        var x = obj.x == null ? 0 : obj.x;
+	        var x2 = obj.x2 == null ? 1 : obj.x2;
+	        var y = obj.y == null ? 0 : obj.y;
+	        var y2 = obj.y2 == null ? 0 : obj.y2;
+
+	        if (!obj.global) {
+	            x = x * rect.width + rect.x;
+	            x2 = x2 * rect.width + rect.x;
+	            y = y * rect.height + rect.y;
+	            y2 = y2 * rect.height + rect.y;
+	        }
+
+	        var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);
+
+	        return canvasGradient;
+	    }
+
+	    function createRadialGradient(ctx, obj, rect) {
+	        var width = rect.width;
+	        var height = rect.height;
+	        var min = Math.min(width, height);
+
+	        var x = obj.x == null ? 0.5 : obj.x;
+	        var y = obj.y == null ? 0.5 : obj.y;
+	        var r = obj.r == null ? 0.5 : obj.r;
+	        if (!obj.global) {
+	            x = x * width + rect.x;
+	            y = y * height + rect.y;
+	            r = r * min;
+	        }
+
+	        var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);
+
+	        return canvasGradient;
+	    }
+
+
+	    Style.prototype = {
+
+	        constructor: Style,
+
+	        /**
+	         * @type {string}
+	         */
+	        fill: '#000000',
+
+	        /**
+	         * @type {string}
+	         */
+	        stroke: null,
+
+	        /**
+	         * @type {number}
+	         */
+	        opacity: 1,
+
+	        /**
+	         * @type {Array.<number>}
+	         */
+	        lineDash: null,
+
+	        /**
+	         * @type {number}
+	         */
+	        lineDashOffset: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        shadowBlur: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        shadowOffsetX: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        shadowOffsetY: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        lineWidth: 1,
+
+	        /**
+	         * If stroke ignore scale
+	         * @type {Boolean}
+	         */
+	        strokeNoScale: false,
+
+	        // Bounding rect text configuration
+	        // Not affected by element transform
+	        /**
+	         * @type {string}
+	         */
+	        text: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textFill: '#000',
+
+	        /**
+	         * @type {string}
+	         */
+	        textStroke: null,
+
+	        /**
+	         * 'inside', 'left', 'right', 'top', 'bottom'
+	         * [x, y]
+	         * @type {string|Array.<number>}
+	         * @default 'inside'
+	         */
+	        textPosition: 'inside',
+
+	        /**
+	         * [x, y]
+	         * @type {Array.<number>}
+	         */
+	        textOffset: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textBaseline: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textAlign: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textVerticalAlign: null,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textDistance: 5,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textShadowBlur: 0,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textShadowOffsetX: 0,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textShadowOffsetY: 0,
+
+	        /**
+	         * If transform text
+	         * Only useful in Path and Image element
+	         * @type {boolean}
+	         */
+	        textTransform: false,
+
+	        /**
+	         * Text rotate around position of Path or Image
+	         * Only useful in Path and Image element and textTransform is false.
+	         */
+	        textRotation: 0,
+
+	        /**
+	         * @type {string}
+	         * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
+	         */
+	        blend: null,
+
+	        /**
+	         * @param {CanvasRenderingContext2D} ctx
+	         */
+	        bind: function (ctx, el, prevEl) {
+	            var style = this;
+	            var prevStyle = prevEl && prevEl.style;
+	            var firstDraw = !prevStyle;
+
+	            for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
+	                var prop = STYLE_COMMON_PROPS[i];
+	                var styleName = prop[0];
+
+	                if (firstDraw || style[styleName] !== prevStyle[styleName]) {
+	                    // FIXME Invalid property value will cause style leak from previous element.
+	                    ctx[styleName] = style[styleName] || prop[1];
+	                }
+	            }
+
+	            if ((firstDraw || style.fill !== prevStyle.fill)) {
+	                ctx.fillStyle = style.fill;
+	            }
+	            if ((firstDraw || style.stroke !== prevStyle.stroke)) {
+	                ctx.strokeStyle = style.stroke;
+	            }
+	            if ((firstDraw || style.opacity !== prevStyle.opacity)) {
+	                ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;
+	            }
+
+	            if ((firstDraw || style.blend !== prevStyle.blend)) {
+	                ctx.globalCompositeOperation = style.blend || 'source-over';
+	            }
+	            if (this.hasStroke()) {
+	                var lineWidth = style.lineWidth;
+	                ctx.lineWidth = lineWidth / (
+	                    (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1
+	                );
+	            }
+	        },
+
+	        hasFill: function () {
+	            var fill = this.fill;
+	            return fill != null && fill !== 'none';
+	        },
+
+	        hasStroke: function () {
+	            var stroke = this.stroke;
+	            return stroke != null && stroke !== 'none' && this.lineWidth > 0;
+	        },
+
+	        /**
+	         * Extend from other style
+	         * @param {zrender/graphic/Style} otherStyle
+	         * @param {boolean} overwrite
+	         */
+	        extendFrom: function (otherStyle, overwrite) {
+	            if (otherStyle) {
+	                var target = this;
+	                for (var name in otherStyle) {
+	                    if (otherStyle.hasOwnProperty(name)
+	                        && (overwrite || ! target.hasOwnProperty(name))
+	                    ) {
+	                        target[name] = otherStyle[name];
+	                    }
+	                }
+	            }
+	        },
+
+	        /**
+	         * Batch setting style with a given object
+	         * @param {Object|string} obj
+	         * @param {*} [obj]
+	         */
+	        set: function (obj, value) {
+	            if (typeof obj === 'string') {
+	                this[obj] = value;
+	            }
+	            else {
+	                this.extendFrom(obj, true);
+	            }
+	        },
+
+	        /**
+	         * Clone
+	         * @return {zrender/graphic/Style} [description]
+	         */
+	        clone: function () {
+	            var newStyle = new this.constructor();
+	            newStyle.extendFrom(this, true);
+	            return newStyle;
+	        },
+
+	        getGradient: function (ctx, obj, rect) {
+	            var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;
+	            var canvasGradient = method(ctx, obj, rect);
+	            var colorStops = obj.colorStops;
+	            for (var i = 0; i < colorStops.length; i++) {
+	                canvasGradient.addColorStop(
+	                    colorStops[i].offset, colorStops[i].color
+	                );
+	            }
+	            return canvasGradient;
+	        }
+	    };
+
+	    var styleProto = Style.prototype;
+	    for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
+	        var prop = STYLE_COMMON_PROPS[i];
+	        if (!(prop[0] in styleProto)) {
+	            styleProto[prop[0]] = prop[1];
+	        }
+	    }
+
+	    // Provide for others
+	    Style.getGradient = styleProto.getGradient;
+
+	    module.exports = Style;
+
+
+/***/ },
+/* 23 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -8556,10 +8415,10 @@
 	 */
 
 
-	    var guid = __webpack_require__(32);
-	    var Eventful = __webpack_require__(33);
-	    var Transformable = __webpack_require__(34);
-	    var Animatable = __webpack_require__(35);
+	    var guid = __webpack_require__(24);
+	    var Eventful = __webpack_require__(25);
+	    var Transformable = __webpack_require__(26);
+	    var Animatable = __webpack_require__(27);
 	    var zrUtil = __webpack_require__(4);
 
 	    /**
@@ -8815,7 +8674,7 @@
 
 
 /***/ },
-/* 32 */
+/* 24 */
 /***/ function(module, exports) {
 
 	/**
@@ -8834,7 +8693,7 @@
 
 
 /***/ },
-/* 33 */
+/* 25 */
 /***/ function(module, exports) {
 
 	/**
@@ -9142,7 +9001,7 @@
 
 
 /***/ },
-/* 34 */
+/* 26 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -9410,7 +9269,7 @@
 
 
 /***/ },
-/* 35 */
+/* 27 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -9419,12 +9278,12 @@
 	 */
 
 
-	    var Animator = __webpack_require__(36);
+	    var Animator = __webpack_require__(28);
 	    var util = __webpack_require__(4);
 	    var isString = util.isString;
 	    var isFunction = util.isFunction;
 	    var isObject = util.isObject;
-	    var log = __webpack_require__(41);
+	    var log = __webpack_require__(33);
 
 	    /**
 	     * @alias modue:zrender/mixin/Animatable
@@ -9684,7 +9543,7 @@
 
 
 /***/ },
-/* 36 */
+/* 28 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -9692,8 +9551,8 @@
 	 */
 
 
-	    var Clip = __webpack_require__(37);
-	    var color = __webpack_require__(39);
+	    var Clip = __webpack_require__(29);
+	    var color = __webpack_require__(31);
 	    var util = __webpack_require__(4);
 	    var isArrayLike = util.isArrayLike;
 
@@ -9742,7 +9601,7 @@
 	            }
 	        }
 	        else {
-	            var len2 = p0[0].length;
+	            var len2 = len && p0[0].length;
 	            for (var i = 0; i < len; i++) {
 	                for (var j = 0; j < len2; j++) {
 	                    out[i][j] = interpolateNumber(
@@ -9906,6 +9765,11 @@
 	        return 'rgba(' + rgba.join(',') + ')';
 	    }
 
+	    function getArrayDim(keyframes) {
+	        var lastValue = keyframes[keyframes.length - 1].value;
+	        return isArrayLike(lastValue && lastValue[0]) ? 2 : 1;
+	    }
+
 	    function createTrackClip (animator, easing, oneTrackDone, keyframes, propName) {
 	        var getter = animator._getter;
 	        var setter = animator._setter;
@@ -9922,11 +9786,8 @@
 	        var isValueString = false;
 
 	        // For vertices morphing
-	        var arrDim = (
-	                isValueArray
-	                && isArrayLike(firstVal[0])
-	            )
-	            ? 2 : 1;
+	        var arrDim = isValueArray ? getArrayDim(keyframes) : 0;
+
 	        var trackMaxTime;
 	        // Sort keyframe as ascending
 	        keyframes.sort(function(a, b) {
@@ -10338,7 +10199,7 @@
 
 
 /***/ },
-/* 37 */
+/* 29 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -10357,7 +10218,7 @@
 	 */
 
 
-	    var easingFuncs = __webpack_require__(38);
+	    var easingFuncs = __webpack_require__(30);
 
 	    function Clip(options) {
 
@@ -10467,7 +10328,7 @@
 
 
 /***/ },
-/* 38 */
+/* 30 */
 /***/ function(module, exports) {
 
 	/**
@@ -10818,7 +10679,7 @@
 
 
 /***/ },
-/* 39 */
+/* 31 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -10826,7 +10687,7 @@
 	 */
 
 
-	    var LRU = __webpack_require__(40);
+	    var LRU = __webpack_require__(32);
 
 	    var kCSSColorTable = {
 	        'transparent': [0,0,0,0], 'aliceblue': [240,248,255,1],
@@ -11356,7 +11217,7 @@
 
 
 /***/ },
-/* 40 */
+/* 32 */
 /***/ function(module, exports) {
 
 	// Simple LRU cache use doubly linked list
@@ -11558,11 +11419,11 @@
 
 
 /***/ },
-/* 41 */
+/* 33 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
-	        var config = __webpack_require__(42);
+	        var config = __webpack_require__(34);
 
 	        /**
 	         * @exports zrender/tool/log
@@ -11596,7 +11457,7 @@
 
 
 /***/ },
-/* 42 */
+/* 34 */
 /***/ function(module, exports) {
 
 	
@@ -11628,2139 +11489,7 @@
 
 
 /***/ },
-/* 43 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var Group = __webpack_require__(30);
-	    var componentUtil = __webpack_require__(20);
-	    var clazzUtil = __webpack_require__(13);
-	    var modelUtil = __webpack_require__(5);
-	    var zrUtil = __webpack_require__(4);
-
-	    function Chart() {
-
-	        /**
-	         * @type {module:zrender/container/Group}
-	         * @readOnly
-	         */
-	        this.group = new Group();
-
-	        /**
-	         * @type {string}
-	         * @readOnly
-	         */
-	        this.uid = componentUtil.getUID('viewChart');
-	    }
-
-	    Chart.prototype = {
-
-	        type: 'chart',
-
-	        /**
-	         * Init the chart
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         */
-	        init: function (ecModel, api) {},
-
-	        /**
-	         * Render the chart
-	         * @param  {module:echarts/model/Series} seriesModel
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         * @param  {Object} payload
-	         */
-	        render: function (seriesModel, ecModel, api, payload) {},
-
-	        /**
-	         * Highlight series or specified data item
-	         * @param  {module:echarts/model/Series} seriesModel
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         * @param  {Object} payload
-	         */
-	        highlight: function (seriesModel, ecModel, api, payload) {
-	            toggleHighlight(seriesModel.getData(), payload, 'emphasis');
-	        },
-
-	        /**
-	         * Downplay series or specified data item
-	         * @param  {module:echarts/model/Series} seriesModel
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         * @param  {Object} payload
-	         */
-	        downplay: function (seriesModel, ecModel, api, payload) {
-	            toggleHighlight(seriesModel.getData(), payload, 'normal');
-	        },
-
-	        /**
-	         * Remove self
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         */
-	        remove: function (ecModel, api) {
-	            this.group.removeAll();
-	        },
-
-	        /**
-	         * Dispose self
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         */
-	        dispose: function () {}
-
-	        /**
-	         * The view contains the given point.
-	         * @interface
-	         * @param {Array.<number>} point
-	         * @return {boolean}
-	         */
-	        // containPoint: function () {}
-
-	    };
-
-	    var chartProto = Chart.prototype;
-	    chartProto.updateView
-	        = chartProto.updateLayout
-	        = chartProto.updateVisual
-	        = function (seriesModel, ecModel, api, payload) {
-	            this.render(seriesModel, ecModel, api, payload);
-	        };
-
-	    /**
-	     * Set state of single element
-	     * @param  {module:zrender/Element} el
-	     * @param  {string} state
-	     */
-	    function elSetState(el, state) {
-	        if (el) {
-	            el.trigger(state);
-	            if (el.type === 'group') {
-	                for (var i = 0; i < el.childCount(); i++) {
-	                    elSetState(el.childAt(i), state);
-	                }
-	            }
-	        }
-	    }
-	    /**
-	     * @param  {module:echarts/data/List} data
-	     * @param  {Object} payload
-	     * @param  {string} state 'normal'|'emphasis'
-	     * @inner
-	     */
-	    function toggleHighlight(data, payload, state) {
-	        var dataIndex = modelUtil.queryDataIndex(data, payload);
-
-	        if (dataIndex != null) {
-	            zrUtil.each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {
-	                elSetState(data.getItemGraphicEl(dataIdx), state);
-	            });
-	        }
-	        else {
-	            data.eachItemGraphicEl(function (el) {
-	                elSetState(el, state);
-	            });
-	        }
-	    }
-
-	    // Enable Chart.extend.
-	    clazzUtil.enableClassExtend(Chart, ['dispose']);
-
-	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
-	    clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true});
-
-	    module.exports = Chart;
-
-
-/***/ },
-/* 44 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var pathTool = __webpack_require__(45);
-	    var round = Math.round;
-	    var Path = __webpack_require__(46);
-	    var colorTool = __webpack_require__(39);
-	    var matrix = __webpack_require__(11);
-	    var vector = __webpack_require__(10);
-	    var Transformable = __webpack_require__(34);
-	    var BoundingRect = __webpack_require__(9);
-
-	    var graphic = {};
-
-	    graphic.Group = __webpack_require__(30);
-
-	    graphic.Image = __webpack_require__(62);
-
-	    graphic.Text = __webpack_require__(63);
-
-	    graphic.Circle = __webpack_require__(64);
-
-	    graphic.Sector = __webpack_require__(65);
-
-	    graphic.Ring = __webpack_require__(66);
-
-	    graphic.Polygon = __webpack_require__(67);
-
-	    graphic.Polyline = __webpack_require__(71);
-
-	    graphic.Rect = __webpack_require__(72);
-
-	    graphic.Line = __webpack_require__(74);
-
-	    graphic.BezierCurve = __webpack_require__(75);
-
-	    graphic.Arc = __webpack_require__(76);
-
-	    graphic.CompoundPath = __webpack_require__(77);
-
-	    graphic.LinearGradient = __webpack_require__(78);
-
-	    graphic.RadialGradient = __webpack_require__(80);
-
-	    graphic.BoundingRect = BoundingRect;
-
-	    /**
-	     * Extend shape with parameters
-	     */
-	    graphic.extendShape = function (opts) {
-	        return Path.extend(opts);
-	    };
-
-	    /**
-	     * Extend path
-	     */
-	    graphic.extendPath = function (pathData, opts) {
-	        return pathTool.extendFromString(pathData, opts);
-	    };
-
-	    /**
-	     * Create a path element from path data string
-	     * @param {string} pathData
-	     * @param {Object} opts
-	     * @param {module:zrender/core/BoundingRect} rect
-	     * @param {string} [layout=cover] 'center' or 'cover'
-	     */
-	    graphic.makePath = function (pathData, opts, rect, layout) {
-	        var path = pathTool.createFromString(pathData, opts);
-	        var boundingRect = path.getBoundingRect();
-	        if (rect) {
-	            var aspect = boundingRect.width / boundingRect.height;
-
-	            if (layout === 'center') {
-	                // Set rect to center, keep width / height ratio.
-	                var width = rect.height * aspect;
-	                var height;
-	                if (width <= rect.width) {
-	                    height = rect.height;
-	                }
-	                else {
-	                    width = rect.width;
-	                    height = width / aspect;
-	                }
-	                var cx = rect.x + rect.width / 2;
-	                var cy = rect.y + rect.height / 2;
-
-	                rect.x = cx - width / 2;
-	                rect.y = cy - height / 2;
-	                rect.width = width;
-	                rect.height = height;
-	            }
-
-	            graphic.resizePath(path, rect);
-	        }
-	        return path;
-	    };
-
-	    graphic.mergePath = pathTool.mergePath,
-
-	    /**
-	     * Resize a path to fit the rect
-	     * @param {module:zrender/graphic/Path} path
-	     * @param {Object} rect
-	     */
-	    graphic.resizePath = function (path, rect) {
-	        if (!path.applyTransform) {
-	            return;
-	        }
-
-	        var pathRect = path.getBoundingRect();
-
-	        var m = pathRect.calculateTransform(rect);
-
-	        path.applyTransform(m);
-	    };
-
-	    /**
-	     * Sub pixel optimize line for canvas
-	     *
-	     * @param {Object} param
-	     * @param {Object} [param.shape]
-	     * @param {number} [param.shape.x1]
-	     * @param {number} [param.shape.y1]
-	     * @param {number} [param.shape.x2]
-	     * @param {number} [param.shape.y2]
-	     * @param {Object} [param.style]
-	     * @param {number} [param.style.lineWidth]
-	     * @return {Object} Modified param
-	     */
-	    graphic.subPixelOptimizeLine = function (param) {
-	        var subPixelOptimize = graphic.subPixelOptimize;
-	        var shape = param.shape;
-	        var lineWidth = param.style.lineWidth;
-
-	        if (round(shape.x1 * 2) === round(shape.x2 * 2)) {
-	            shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);
-	        }
-	        if (round(shape.y1 * 2) === round(shape.y2 * 2)) {
-	            shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);
-	        }
-	        return param;
-	    };
-
-	    /**
-	     * Sub pixel optimize rect for canvas
-	     *
-	     * @param {Object} param
-	     * @param {Object} [param.shape]
-	     * @param {number} [param.shape.x]
-	     * @param {number} [param.shape.y]
-	     * @param {number} [param.shape.width]
-	     * @param {number} [param.shape.height]
-	     * @param {Object} [param.style]
-	     * @param {number} [param.style.lineWidth]
-	     * @return {Object} Modified param
-	     */
-	    graphic.subPixelOptimizeRect = function (param) {
-	        var subPixelOptimize = graphic.subPixelOptimize;
-	        var shape = param.shape;
-	        var lineWidth = param.style.lineWidth;
-	        var originX = shape.x;
-	        var originY = shape.y;
-	        var originWidth = shape.width;
-	        var originHeight = shape.height;
-	        shape.x = subPixelOptimize(shape.x, lineWidth, true);
-	        shape.y = subPixelOptimize(shape.y, lineWidth, true);
-	        shape.width = Math.max(
-	            subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x,
-	            originWidth === 0 ? 0 : 1
-	        );
-	        shape.height = Math.max(
-	            subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y,
-	            originHeight === 0 ? 0 : 1
-	        );
-	        return param;
-	    };
-
-	    /**
-	     * Sub pixel optimize for canvas
-	     *
-	     * @param {number} position Coordinate, such as x, y
-	     * @param {number} lineWidth Should be nonnegative integer.
-	     * @param {boolean=} positiveOrNegative Default false (negative).
-	     * @return {number} Optimized position.
-	     */
-	    graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) {
-	        // Assure that (position + lineWidth / 2) is near integer edge,
-	        // otherwise line will be fuzzy in canvas.
-	        var doubledPosition = round(position * 2);
-	        return (doubledPosition + round(lineWidth)) % 2 === 0
-	            ? doubledPosition / 2
-	            : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;
-	    };
-
-	    function hasFillOrStroke(fillOrStroke) {
-	        return fillOrStroke != null && fillOrStroke != 'none';
-	    }
-
-	    function liftColor(color) {
-	        return typeof color === 'string' ? colorTool.lift(color, -0.1) : color;
-	    }
-
-	    /**
-	     * @private
-	     */
-	    function cacheElementStl(el) {
-	        if (el.__hoverStlDirty) {
-	            var stroke = el.style.stroke;
-	            var fill = el.style.fill;
-
-	            // Create hoverStyle on mouseover
-	            var hoverStyle = el.__hoverStl;
-	            hoverStyle.fill = hoverStyle.fill
-	                || (hasFillOrStroke(fill) ? liftColor(fill) : null);
-	            hoverStyle.stroke = hoverStyle.stroke
-	                || (hasFillOrStroke(stroke) ? liftColor(stroke) : null);
-
-	            var normalStyle = {};
-	            for (var name in hoverStyle) {
-	                if (hoverStyle.hasOwnProperty(name)) {
-	                    normalStyle[name] = el.style[name];
-	                }
-	            }
-
-	            el.__normalStl = normalStyle;
-
-	            el.__hoverStlDirty = false;
-	        }
-	    }
-
-	    /**
-	     * @private
-	     */
-	    function doSingleEnterHover(el) {
-	        if (el.__isHover) {
-	            return;
-	        }
-
-	        cacheElementStl(el);
-
-	        if (el.useHoverLayer) {
-	            el.__zr && el.__zr.addHover(el, el.__hoverStl);
-	        }
-	        else {
-	            el.setStyle(el.__hoverStl);
-	            el.z2 += 1;
-	        }
-
-	        el.__isHover = true;
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function doSingleLeaveHover(el) {
-	        if (!el.__isHover) {
-	            return;
-	        }
-
-	        var normalStl = el.__normalStl;
-	        if (el.useHoverLayer) {
-	            el.__zr && el.__zr.removeHover(el);
-	        }
-	        else {
-	            normalStl && el.setStyle(normalStl);
-	            el.z2 -= 1;
-	        }
-
-	        el.__isHover = false;
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function doEnterHover(el) {
-	        el.type === 'group'
-	            ? el.traverse(function (child) {
-	                if (child.type !== 'group') {
-	                    doSingleEnterHover(child);
-	                }
-	            })
-	            : doSingleEnterHover(el);
-	    }
-
-	    function doLeaveHover(el) {
-	        el.type === 'group'
-	            ? el.traverse(function (child) {
-	                if (child.type !== 'group') {
-	                    doSingleLeaveHover(child);
-	                }
-	            })
-	            : doSingleLeaveHover(el);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function setElementHoverStl(el, hoverStl) {
-	        // If element has sepcified hoverStyle, then use it instead of given hoverStyle
-	        // Often used when item group has a label element and it's hoverStyle is different
-	        el.__hoverStl = el.hoverStyle || hoverStl || {};
-	        el.__hoverStlDirty = true;
-
-	        if (el.__isHover) {
-	            cacheElementStl(el);
-	        }
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function onElementMouseOver(e) {
-	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
-	            return;
-	        }
-
-	        // Only if element is not in emphasis status
-	        !this.__isEmphasis && doEnterHover(this);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function onElementMouseOut(e) {
-	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
-	            return;
-	        }
-
-	        // Only if element is not in emphasis status
-	        !this.__isEmphasis && doLeaveHover(this);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function enterEmphasis() {
-	        this.__isEmphasis = true;
-	        doEnterHover(this);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function leaveEmphasis() {
-	        this.__isEmphasis = false;
-	        doLeaveHover(this);
-	    }
-
-	    /**
-	     * Set hover style of element.
-	     * This method can be called repeatly without side-effects.
-	     * @param {module:zrender/Element} el
-	     * @param {Object} [hoverStyle]
-	     * @param {Object} [opt]
-	     * @param {boolean} [opt.hoverSilentOnTouch=false]
-	     *        In touch device, mouseover event will be trigger on touchstart event
-	     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
-	     *        conviniently use hoverStyle when tap on touch screen without additional
-	     *        code for compatibility.
-	     *        But if the chart/component has select feature, which usually also use
-	     *        hoverStyle, there might be conflict between 'select-highlight' and
-	     *        'hover-highlight' especially when roam is enabled (see geo for example).
-	     *        In this case, hoverSilentOnTouch should be used to disable hover-highlight
-	     *        on touch device.
-	     */
-	    graphic.setHoverStyle = function (el, hoverStyle, opt) {
-	        el.__hoverSilentOnTouch = opt && opt.hoverSilentOnTouch;
-
-	        el.type === 'group'
-	            ? el.traverse(function (child) {
-	                if (child.type !== 'group') {
-	                    setElementHoverStl(child, hoverStyle);
-	                }
-	            })
-	            : setElementHoverStl(el, hoverStyle);
-
-	        // Duplicated function will be auto-ignored, see Eventful.js.
-	        el.on('mouseover', onElementMouseOver)
-	          .on('mouseout', onElementMouseOut);
-
-	        // Emphasis, normal can be triggered manually
-	        el.on('emphasis', enterEmphasis)
-	          .on('normal', leaveEmphasis);
-	    };
-
-	    /**
-	     * Set text option in the style
-	     * @param {Object} textStyle
-	     * @param {module:echarts/model/Model} labelModel
-	     * @param {string} color
-	     */
-	    graphic.setText = function (textStyle, labelModel, color) {
-	        var labelPosition = labelModel.getShallow('position') || 'inside';
-	        var labelOffset = labelModel.getShallow('offset');
-	        var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color;
-	        var textStyleModel = labelModel.getModel('textStyle');
-	        zrUtil.extend(textStyle, {
-	            textDistance: labelModel.getShallow('distance') || 5,
-	            textFont: textStyleModel.getFont(),
-	            textPosition: labelPosition,
-	            textOffset: labelOffset,
-	            textFill: textStyleModel.getTextColor() || labelColor
-	        });
-	    };
-
-	    function animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {
-	        if (typeof dataIndex === 'function') {
-	            cb = dataIndex;
-	            dataIndex = null;
-	        }
-	        // Do not check 'animation' property directly here. Consider this case:
-	        // animation model is an `itemModel`, whose does not have `isAnimationEnabled`
-	        // but its parent model (`seriesModel`) does.
-	        var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();
-
-	        if (animationEnabled) {
-	            var postfix = isUpdate ? 'Update' : '';
-	            var duration = animatableModel.getShallow('animationDuration' + postfix);
-	            var animationEasing = animatableModel.getShallow('animationEasing' + postfix);
-	            var animationDelay = animatableModel.getShallow('animationDelay' + postfix);
-	            if (typeof animationDelay === 'function') {
-	                animationDelay = animationDelay(
-	                    dataIndex,
-	                    animatableModel.getAnimationDelayParams
-	                        ? animatableModel.getAnimationDelayParams(el, dataIndex)
-	                        : null
-	                );
-	            }
-	            if (typeof duration === 'function') {
-	                duration = duration(dataIndex);
-	            }
-
-	            duration > 0
-	                ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb)
-	                : (el.stopAnimation(), el.attr(props), cb && cb());
-	        }
-	        else {
-	            el.stopAnimation();
-	            el.attr(props);
-	            cb && cb();
-	        }
-	    }
-
-	    /**
-	     * Update graphic element properties with or without animation according to the configuration in series
-	     * @param {module:zrender/Element} el
-	     * @param {Object} props
-	     * @param {module:echarts/model/Model} [animatableModel]
-	     * @param {number} [dataIndex]
-	     * @param {Function} [cb]
-	     * @example
-	     *     graphic.updateProps(el, {
-	     *         position: [100, 100]
-	     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
-	     *     // Or
-	     *     graphic.updateProps(el, {
-	     *         position: [100, 100]
-	     *     }, seriesModel, function () { console.log('Animation done!'); });
-	     */
-	    graphic.updateProps = function (el, props, animatableModel, dataIndex, cb) {
-	        animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);
-	    };
-
-	    /**
-	     * Init graphic element properties with or without animation according to the configuration in series
-	     * @param {module:zrender/Element} el
-	     * @param {Object} props
-	     * @param {module:echarts/model/Model} [animatableModel]
-	     * @param {number} [dataIndex]
-	     * @param {Function} cb
-	     */
-	    graphic.initProps = function (el, props, animatableModel, dataIndex, cb) {
-	        animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);
-	    };
-
-	    /**
-	     * Get transform matrix of target (param target),
-	     * in coordinate of its ancestor (param ancestor)
-	     *
-	     * @param {module:zrender/mixin/Transformable} target
-	     * @param {module:zrender/mixin/Transformable} [ancestor]
-	     */
-	    graphic.getTransform = function (target, ancestor) {
-	        var mat = matrix.identity([]);
-
-	        while (target && target !== ancestor) {
-	            matrix.mul(mat, target.getLocalTransform(), mat);
-	            target = target.parent;
-	        }
-
-	        return mat;
-	    };
-
-	    /**
-	     * Apply transform to an vertex.
-	     * @param {Array.<number>} target [x, y]
-	     * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:
-	     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
-	     *      + {position, rotation, scale}, the same as `zrender/Transformable`.
-	     * @param {boolean=} invert Whether use invert matrix.
-	     * @return {Array.<number>} [x, y]
-	     */
-	    graphic.applyTransform = function (target, transform, invert) {
-	        if (transform && !zrUtil.isArrayLike(transform)) {
-	            transform = Transformable.getLocalTransform(transform);
-	        }
-
-	        if (invert) {
-	            transform = matrix.invert([], transform);
-	        }
-	        return vector.applyTransform([], target, transform);
-	    };
-
-	    /**
-	     * @param {string} direction 'left' 'right' 'top' 'bottom'
-	     * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]
-	     * @param {boolean=} invert Whether use invert matrix.
-	     * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'
-	     */
-	    graphic.transformDirection = function (direction, transform, invert) {
-
-	        // Pick a base, ensure that transform result will not be (0, 0).
-	        var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0)
-	            ? 1 : Math.abs(2 * transform[4] / transform[0]);
-	        var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0)
-	            ? 1 : Math.abs(2 * transform[4] / transform[2]);
-
-	        var vertex = [
-	            direction === 'left' ? -hBase : direction === 'right' ? hBase : 0,
-	            direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0
-	        ];
-
-	        vertex = graphic.applyTransform(vertex, transform, invert);
-
-	        return Math.abs(vertex[0]) > Math.abs(vertex[1])
-	            ? (vertex[0] > 0 ? 'right' : 'left')
-	            : (vertex[1] > 0 ? 'bottom' : 'top');
-	    };
-
-	    /**
-	     * Apply group transition animation from g1 to g2.
-	     * If no animatableModel, no animation.
-	     */
-	    graphic.groupTransition = function (g1, g2, animatableModel, cb) {
-	        if (!g1 || !g2) {
-	            return;
-	        }
-
-	        function getElMap(g) {
-	            var elMap = {};
-	            g.traverse(function (el) {
-	                if (!el.isGroup && el.anid) {
-	                    elMap[el.anid] = el;
-	                }
-	            });
-	            return elMap;
-	        }
-	        function getAnimatableProps(el) {
-	            var obj = {
-	                position: vector.clone(el.position),
-	                rotation: el.rotation
-	            };
-	            if (el.shape) {
-	                obj.shape = zrUtil.extend({}, el.shape);
-	            }
-	            return obj;
-	        }
-	        var elMap1 = getElMap(g1);
-
-	        g2.traverse(function (el) {
-	            if (!el.isGroup && el.anid) {
-	                var oldEl = elMap1[el.anid];
-	                if (oldEl) {
-	                    var newProp = getAnimatableProps(el);
-	                    el.attr(getAnimatableProps(oldEl));
-	                    graphic.updateProps(el, newProp, animatableModel, el.dataIndex);
-	                }
-	                // else {
-	                //     if (el.previousProps) {
-	                //         graphic.updateProps
-	                //     }
-	                // }
-	            }
-	        });
-	    };
-
-	    module.exports = graphic;
-
-
-
-/***/ },
-/* 45 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var Path = __webpack_require__(46);
-	    var PathProxy = __webpack_require__(50);
-	    var transformPath = __webpack_require__(61);
-
-	    // command chars
-	    var cc = [
-	        'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z',
-	        'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'
-	    ];
-
-	    var mathSqrt = Math.sqrt;
-	    var mathSin = Math.sin;
-	    var mathCos = Math.cos;
-	    var PI = Math.PI;
-
-	    var vMag = function(v) {
-	        return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
-	    };
-	    var vRatio = function(u, v) {
-	        return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
-	    };
-	    var vAngle = function(u, v) {
-	        return (u[0] * v[1] < u[1] * v[0] ? -1 : 1)
-	                * Math.acos(vRatio(u, v));
-	    };
-
-	    function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {
-	        var psi = psiDeg * (PI / 180.0);
-	        var xp = mathCos(psi) * (x1 - x2) / 2.0
-	                 + mathSin(psi) * (y1 - y2) / 2.0;
-	        var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0
-	                 + mathCos(psi) * (y1 - y2) / 2.0;
-
-	        var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);
-
-	        if (lambda > 1) {
-	            rx *= mathSqrt(lambda);
-	            ry *= mathSqrt(lambda);
-	        }
-
-	        var f = (fa === fs ? -1 : 1)
-	            * mathSqrt((((rx * rx) * (ry * ry))
-	                    - ((rx * rx) * (yp * yp))
-	                    - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp)
-	                    + (ry * ry) * (xp * xp))
-	                ) || 0;
-
-	        var cxp = f * rx * yp / ry;
-	        var cyp = f * -ry * xp / rx;
-
-	        var cx = (x1 + x2) / 2.0
-	                 + mathCos(psi) * cxp
-	                 - mathSin(psi) * cyp;
-	        var cy = (y1 + y2) / 2.0
-	                + mathSin(psi) * cxp
-	                + mathCos(psi) * cyp;
-
-	        var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]);
-	        var u = [ (xp - cxp) / rx, (yp - cyp) / ry ];
-	        var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ];
-	        var dTheta = vAngle(u, v);
-
-	        if (vRatio(u, v) <= -1) {
-	            dTheta = PI;
-	        }
-	        if (vRatio(u, v) >= 1) {
-	            dTheta = 0;
-	        }
-	        if (fs === 0 && dTheta > 0) {
-	            dTheta = dTheta - 2 * PI;
-	        }
-	        if (fs === 1 && dTheta < 0) {
-	            dTheta = dTheta + 2 * PI;
-	        }
-
-	        path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);
-	    }
-
-	    function createPathProxyFromString(data) {
-	        if (!data) {
-	            return [];
-	        }
-
-	        // command string
-	        var cs = data.replace(/-/g, ' -')
-	            .replace(/  /g, ' ')
-	            .replace(/ /g, ',')
-	            .replace(/,,/g, ',');
-
-	        var n;
-	        // create pipes so that we can split the data
-	        for (n = 0; n < cc.length; n++) {
-	            cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
-	        }
-
-	        // create array
-	        var arr = cs.split('|');
-	        // init context point
-	        var cpx = 0;
-	        var cpy = 0;
-
-	        var path = new PathProxy();
-	        var CMD = PathProxy.CMD;
-
-	        var prevCmd;
-	        for (n = 1; n < arr.length; n++) {
-	            var str = arr[n];
-	            var c = str.charAt(0);
-	            var off = 0;
-	            var p = str.slice(1).replace(/e,-/g, 'e-').split(',');
-	            var cmd;
-
-	            if (p.length > 0 && p[0] === '') {
-	                p.shift();
-	            }
-
-	            for (var i = 0; i < p.length; i++) {
-	                p[i] = parseFloat(p[i]);
-	            }
-	            while (off < p.length && !isNaN(p[off])) {
-	                if (isNaN(p[0])) {
-	                    break;
-	                }
-	                var ctlPtx;
-	                var ctlPty;
-
-	                var rx;
-	                var ry;
-	                var psi;
-	                var fa;
-	                var fs;
-
-	                var x1 = cpx;
-	                var y1 = cpy;
-
-	                // convert l, H, h, V, and v to L
-	                switch (c) {
-	                    case 'l':
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'L':
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'm':
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.M;
-	                        path.addData(cmd, cpx, cpy);
-	                        c = 'l';
-	                        break;
-	                    case 'M':
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.M;
-	                        path.addData(cmd, cpx, cpy);
-	                        c = 'L';
-	                        break;
-	                    case 'h':
-	                        cpx += p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'H':
-	                        cpx = p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'v':
-	                        cpy += p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'V':
-	                        cpy = p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'C':
-	                        cmd = CMD.C;
-	                        path.addData(
-	                            cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]
-	                        );
-	                        cpx = p[off - 2];
-	                        cpy = p[off - 1];
-	                        break;
-	                    case 'c':
-	                        cmd = CMD.C;
-	                        path.addData(
-	                            cmd,
-	                            p[off++] + cpx, p[off++] + cpy,
-	                            p[off++] + cpx, p[off++] + cpy,
-	                            p[off++] + cpx, p[off++] + cpy
-	                        );
-	                        cpx += p[off - 2];
-	                        cpy += p[off - 1];
-	                        break;
-	                    case 'S':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.C) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cmd = CMD.C;
-	                        x1 = p[off++];
-	                        y1 = p[off++];
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
-	                        break;
-	                    case 's':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.C) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cmd = CMD.C;
-	                        x1 = cpx + p[off++];
-	                        y1 = cpy + p[off++];
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
-	                        break;
-	                    case 'Q':
-	                        x1 = p[off++];
-	                        y1 = p[off++];
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, x1, y1, cpx, cpy);
-	                        break;
-	                    case 'q':
-	                        x1 = p[off++] + cpx;
-	                        y1 = p[off++] + cpy;
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, x1, y1, cpx, cpy);
-	                        break;
-	                    case 'T':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.Q) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
-	                        break;
-	                    case 't':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.Q) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
-	                        break;
-	                    case 'A':
-	                        rx = p[off++];
-	                        ry = p[off++];
-	                        psi = p[off++];
-	                        fa = p[off++];
-	                        fs = p[off++];
-
-	                        x1 = cpx, y1 = cpy;
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.A;
-	                        processArc(
-	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
-	                        );
-	                        break;
-	                    case 'a':
-	                        rx = p[off++];
-	                        ry = p[off++];
-	                        psi = p[off++];
-	                        fa = p[off++];
-	                        fs = p[off++];
-
-	                        x1 = cpx, y1 = cpy;
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.A;
-	                        processArc(
-	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
-	                        );
-	                        break;
-	                }
-	            }
-
-	            if (c === 'z' || c === 'Z') {
-	                cmd = CMD.Z;
-	                path.addData(cmd);
-	            }
-
-	            prevCmd = cmd;
-	        }
-
-	        path.toStatic();
-
-	        return path;
-	    }
-
-	    // TODO Optimize double memory cost problem
-	    function createPathOptions(str, opts) {
-	        var pathProxy = createPathProxyFromString(str);
-	        opts = opts || {};
-	        opts.buildPath = function (path) {
-	            if (path.setData) {
-	                path.setData(pathProxy.data);
-	                // Svg and vml renderer don't have context
-	                var ctx = path.getContext();
-	                if (ctx) {
-	                    path.rebuildPath(ctx);
-	                }
-	            }
-	            else {
-	                var ctx = path;
-	                pathProxy.rebuildPath(ctx);
-	            }
-	        };
-
-	        opts.applyTransform = function (m) {
-	            transformPath(pathProxy, m);
-
-	            this.dirty(true);
-	        };
-
-	        return opts;
-	    }
-
-	    module.exports = {
-	        /**
-	         * Create a Path object from path string data
-	         * http://www.w3.org/TR/SVG/paths.html#PathData
-	         * @param  {Object} opts Other options
-	         */
-	        createFromString: function (str, opts) {
-	            return new Path(createPathOptions(str, opts));
-	        },
-
-	        /**
-	         * Create a Path class from path string data
-	         * @param  {string} str
-	         * @param  {Object} opts Other options
-	         */
-	        extendFromString: function (str, opts) {
-	            return Path.extend(createPathOptions(str, opts));
-	        },
-
-	        /**
-	         * Merge multiple paths
-	         */
-	        // TODO Apply transform
-	        // TODO stroke dash
-	        // TODO Optimize double memory cost problem
-	        mergePath: function (pathEls, opts) {
-	            var pathList = [];
-	            var len = pathEls.length;
-	            for (var i = 0; i < len; i++) {
-	                var pathEl = pathEls[i];
-	                if (!pathEl.path) {
-	                    pathEl.createPathProxy();
-	                }
-	                if (pathEl.__dirtyPath) {
-	                    pathEl.buildPath(pathEl.path, pathEl.shape, true);
-	                }
-	                pathList.push(pathEl.path);
-	            }
-
-	            var pathBundle = new Path(opts);
-	            // Need path proxy.
-	            pathBundle.createPathProxy();
-	            pathBundle.buildPath = function (path) {
-	                path.appendPath(pathList);
-	                // Svg and vml renderer don't have context
-	                var ctx = path.getContext();
-	                if (ctx) {
-	                    path.rebuildPath(ctx);
-	                }
-	            };
-
-	            return pathBundle;
-	        }
-	    };
-
-
-/***/ },
-/* 46 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Path element
-	 * @module zrender/graphic/Path
-	 */
-
-
-
-	    var Displayable = __webpack_require__(47);
-	    var zrUtil = __webpack_require__(4);
-	    var PathProxy = __webpack_require__(50);
-	    var pathContain = __webpack_require__(53);
-
-	    var Pattern = __webpack_require__(60);
-	    var getCanvasPattern = Pattern.prototype.getCanvasPattern;
-
-	    var abs = Math.abs;
-
-	    var pathProxyForDraw = new PathProxy(true);
-	    /**
-	     * @alias module:zrender/graphic/Path
-	     * @extends module:zrender/graphic/Displayable
-	     * @constructor
-	     * @param {Object} opts
-	     */
-	    function Path(opts) {
-	        Displayable.call(this, opts);
-
-	        /**
-	         * @type {module:zrender/core/PathProxy}
-	         * @readOnly
-	         */
-	        this.path = null;
-	    }
-
-	    Path.prototype = {
-
-	        constructor: Path,
-
-	        type: 'path',
-
-	        __dirtyPath: true,
-
-	        strokeContainThreshold: 5,
-
-	        brush: function (ctx, prevEl) {
-	            var style = this.style;
-	            var path = this.path || pathProxyForDraw;
-	            var hasStroke = style.hasStroke();
-	            var hasFill = style.hasFill();
-	            var fill = style.fill;
-	            var stroke = style.stroke;
-	            var hasFillGradient = hasFill && !!(fill.colorStops);
-	            var hasStrokeGradient = hasStroke && !!(stroke.colorStops);
-	            var hasFillPattern = hasFill && !!(fill.image);
-	            var hasStrokePattern = hasStroke && !!(stroke.image);
-
-	            style.bind(ctx, this, prevEl);
-	            this.setTransform(ctx);
-
-	            if (this.__dirty) {
-	                var rect;
-	                // Update gradient because bounding rect may changed
-	                if (hasFillGradient) {
-	                    rect = rect || this.getBoundingRect();
-	                    this._fillGradient = style.getGradient(ctx, fill, rect);
-	                }
-	                if (hasStrokeGradient) {
-	                    rect = rect || this.getBoundingRect();
-	                    this._strokeGradient = style.getGradient(ctx, stroke, rect);
-	                }
-	            }
-	            // Use the gradient or pattern
-	            if (hasFillGradient) {
-	                // PENDING If may have affect the state
-	                ctx.fillStyle = this._fillGradient;
-	            }
-	            else if (hasFillPattern) {
-	                ctx.fillStyle = getCanvasPattern.call(fill, ctx);
-	            }
-	            if (hasStrokeGradient) {
-	                ctx.strokeStyle = this._strokeGradient;
-	            }
-	            else if (hasStrokePattern) {
-	                ctx.strokeStyle = getCanvasPattern.call(stroke, ctx);
-	            }
-
-	            var lineDash = style.lineDash;
-	            var lineDashOffset = style.lineDashOffset;
-
-	            var ctxLineDash = !!ctx.setLineDash;
-
-	            // Update path sx, sy
-	            var scale = this.getGlobalScale();
-	            path.setScale(scale[0], scale[1]);
-
-	            // Proxy context
-	            // Rebuild path in following 2 cases
-	            // 1. Path is dirty
-	            // 2. Path needs javascript implemented lineDash stroking.
-	            //    In this case, lineDash information will not be saved in PathProxy
-	            if (this.__dirtyPath
-	                || (lineDash && !ctxLineDash && hasStroke)
-	            ) {
-	                path.beginPath(ctx);
-
-	                // Setting line dash before build path
-	                if (lineDash && !ctxLineDash) {
-	                    path.setLineDash(lineDash);
-	                    path.setLineDashOffset(lineDashOffset);
-	                }
-
-	                this.buildPath(path, this.shape, false);
-
-	                // Clear path dirty flag
-	                if (this.path) {
-	                    this.__dirtyPath = false;
-	                }
-	            }
-	            else {
-	                // Replay path building
-	                ctx.beginPath();
-	                this.path.rebuildPath(ctx);
-	            }
-
-	            hasFill && path.fill(ctx);
-
-	            if (lineDash && ctxLineDash) {
-	                ctx.setLineDash(lineDash);
-	                ctx.lineDashOffset = lineDashOffset;
-	            }
-
-	            hasStroke && path.stroke(ctx);
-
-	            if (lineDash && ctxLineDash) {
-	                // PENDING
-	                // Remove lineDash
-	                ctx.setLineDash([]);
-	            }
-
-
-	            this.restoreTransform(ctx);
-
-	            // Draw rect text
-	            if (style.text != null) {
-	                // var rect = this.getBoundingRect();
-	                this.drawRectText(ctx, this.getBoundingRect());
-	            }
-	        },
-
-	        // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath
-	        // Like in circle
-	        buildPath: function (ctx, shapeCfg, inBundle) {},
-
-	        createPathProxy: function () {
-	            this.path = new PathProxy();
-	        },
-
-	        getBoundingRect: function () {
-	            var rect = this._rect;
-	            var style = this.style;
-	            var needsUpdateRect = !rect;
-	            if (needsUpdateRect) {
-	                var path = this.path;
-	                if (!path) {
-	                    // Create path on demand.
-	                    path = this.path = new PathProxy();
-	                }
-	                if (this.__dirtyPath) {
-	                    path.beginPath();
-	                    this.buildPath(path, this.shape, false);
-	                }
-	                rect = path.getBoundingRect();
-	            }
-	            this._rect = rect;
-
-	            if (style.hasStroke()) {
-	                // Needs update rect with stroke lineWidth when
-	                // 1. Element changes scale or lineWidth
-	                // 2. Shape is changed
-	                var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone());
-	                if (this.__dirty || needsUpdateRect) {
-	                    rectWithStroke.copy(rect);
-	                    // FIXME Must after updateTransform
-	                    var w = style.lineWidth;
-	                    // PENDING, Min line width is needed when line is horizontal or vertical
-	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
-
-	                    // Only add extra hover lineWidth when there are no fill
-	                    if (!style.hasFill()) {
-	                        w = Math.max(w, this.strokeContainThreshold || 4);
-	                    }
-	                    // Consider line width
-	                    // Line scale can't be 0;
-	                    if (lineScale > 1e-10) {
-	                        rectWithStroke.width += w / lineScale;
-	                        rectWithStroke.height += w / lineScale;
-	                        rectWithStroke.x -= w / lineScale / 2;
-	                        rectWithStroke.y -= w / lineScale / 2;
-	                    }
-	                }
-
-	                // Return rect with stroke
-	                return rectWithStroke;
-	            }
-
-	            return rect;
-	        },
-
-	        contain: function (x, y) {
-	            var localPos = this.transformCoordToLocal(x, y);
-	            var rect = this.getBoundingRect();
-	            var style = this.style;
-	            x = localPos[0];
-	            y = localPos[1];
-
-	            if (rect.contain(x, y)) {
-	                var pathData = this.path.data;
-	                if (style.hasStroke()) {
-	                    var lineWidth = style.lineWidth;
-	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
-	                    // Line scale can't be 0;
-	                    if (lineScale > 1e-10) {
-	                        // Only add extra hover lineWidth when there are no fill
-	                        if (!style.hasFill()) {
-	                            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);
-	                        }
-	                        if (pathContain.containStroke(
-	                            pathData, lineWidth / lineScale, x, y
-	                        )) {
-	                            return true;
-	                        }
-	                    }
-	                }
-	                if (style.hasFill()) {
-	                    return pathContain.contain(pathData, x, y);
-	                }
-	            }
-	            return false;
-	        },
-
-	        /**
-	         * @param  {boolean} dirtyPath
-	         */
-	        dirty: function (dirtyPath) {
-	            if (dirtyPath == null) {
-	                dirtyPath = true;
-	            }
-	            // Only mark dirty, not mark clean
-	            if (dirtyPath) {
-	                this.__dirtyPath = dirtyPath;
-	                this._rect = null;
-	            }
-
-	            this.__dirty = true;
-
-	            this.__zr && this.__zr.refresh();
-
-	            // Used as a clipping path
-	            if (this.__clipTarget) {
-	                this.__clipTarget.dirty();
-	            }
-	        },
-
-	        /**
-	         * Alias for animate('shape')
-	         * @param {boolean} loop
-	         */
-	        animateShape: function (loop) {
-	            return this.animate('shape', loop);
-	        },
-
-	        // Overwrite attrKV
-	        attrKV: function (key, value) {
-	            // FIXME
-	            if (key === 'shape') {
-	                this.setShape(value);
-	                this.__dirtyPath = true;
-	                this._rect = null;
-	            }
-	            else {
-	                Displayable.prototype.attrKV.call(this, key, value);
-	            }
-	        },
-
-	        /**
-	         * @param {Object|string} key
-	         * @param {*} value
-	         */
-	        setShape: function (key, value) {
-	            var shape = this.shape;
-	            // Path from string may not have shape
-	            if (shape) {
-	                if (zrUtil.isObject(key)) {
-	                    for (var name in key) {
-	                        if (key.hasOwnProperty(name)) {
-	                            shape[name] = key[name];
-	                        }
-	                    }
-	                }
-	                else {
-	                    shape[key] = value;
-	                }
-	                this.dirty(true);
-	            }
-	            return this;
-	        },
-
-	        getLineScale: function () {
-	            var m = this.transform;
-	            // Get the line scale.
-	            // Determinant of `m` means how much the area is enlarged by the
-	            // transformation. So its square root can be used as a scale factor
-	            // for width.
-	            return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10
-	                ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1]))
-	                : 1;
-	        }
-	    };
-
-	    /**
-	     * 扩展一个 Path element, 比如星形，圆等。
-	     * Extend a path element
-	     * @param {Object} props
-	     * @param {string} props.type Path type
-	     * @param {Function} props.init Initialize
-	     * @param {Function} props.buildPath Overwrite buildPath method
-	     * @param {Object} [props.style] Extended default style config
-	     * @param {Object} [props.shape] Extended default shape config
-	     */
-	    Path.extend = function (defaults) {
-	        var Sub = function (opts) {
-	            Path.call(this, opts);
-
-	            if (defaults.style) {
-	                // Extend default style
-	                this.style.extendFrom(defaults.style, false);
-	            }
-
-	            // Extend default shape
-	            var defaultShape = defaults.shape;
-	            if (defaultShape) {
-	                this.shape = this.shape || {};
-	                var thisShape = this.shape;
-	                for (var name in defaultShape) {
-	                    if (
-	                        ! thisShape.hasOwnProperty(name)
-	                        && defaultShape.hasOwnProperty(name)
-	                    ) {
-	                        thisShape[name] = defaultShape[name];
-	                    }
-	                }
-	            }
-
-	            defaults.init && defaults.init.call(this, opts);
-	        };
-
-	        zrUtil.inherits(Sub, Path);
-
-	        // FIXME 不能 extend position, rotation 等引用对象
-	        for (var name in defaults) {
-	            // Extending prototype values and methods
-	            if (name !== 'style' && name !== 'shape') {
-	                Sub.prototype[name] = defaults[name];
-	            }
-	        }
-
-	        return Sub;
-	    };
-
-	    zrUtil.inherits(Path, Displayable);
-
-	    module.exports = Path;
-
-
-/***/ },
-/* 47 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * 可绘制的图形基类
-	 * Base class of all displayable graphic objects
-	 * @module zrender/graphic/Displayable
-	 */
-
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var Style = __webpack_require__(48);
-
-	    var Element = __webpack_require__(31);
-	    var RectText = __webpack_require__(49);
-	    // var Stateful = require('./mixin/Stateful');
-
-	    /**
-	     * @alias module:zrender/graphic/Displayable
-	     * @extends module:zrender/Element
-	     * @extends module:zrender/graphic/mixin/RectText
-	     */
-	    function Displayable(opts) {
-
-	        opts = opts || {};
-
-	        Element.call(this, opts);
-
-	        // Extend properties
-	        for (var name in opts) {
-	            if (
-	                opts.hasOwnProperty(name) &&
-	                name !== 'style'
-	            ) {
-	                this[name] = opts[name];
-	            }
-	        }
-
-	        /**
-	         * @type {module:zrender/graphic/Style}
-	         */
-	        this.style = new Style(opts.style);
-
-	        this._rect = null;
-	        // Shapes for cascade clipping.
-	        this.__clipPaths = [];
-
-	        // FIXME Stateful must be mixined after style is setted
-	        // Stateful.call(this, opts);
-	    }
-
-	    Displayable.prototype = {
-
-	        constructor: Displayable,
-
-	        type: 'displayable',
-
-	        /**
-	         * Displayable 是否为脏，Painter 中会根据该标记判断是否需要是否需要重新绘制
-	         * Dirty flag. From which painter will determine if this displayable object needs brush
-	         * @name module:zrender/graphic/Displayable#__dirty
-	         * @type {boolean}
-	         */
-	        __dirty: true,
-
-	        /**
-	         * 图形是否可见，为true时不绘制图形，但是仍能触发鼠标事件
-	         * If ignore drawing of the displayable object. Mouse event will still be triggered
-	         * @name module:/zrender/graphic/Displayable#invisible
-	         * @type {boolean}
-	         * @default false
-	         */
-	        invisible: false,
-
-	        /**
-	         * @name module:/zrender/graphic/Displayable#z
-	         * @type {number}
-	         * @default 0
-	         */
-	        z: 0,
-
-	        /**
-	         * @name module:/zrender/graphic/Displayable#z
-	         * @type {number}
-	         * @default 0
-	         */
-	        z2: 0,
-
-	        /**
-	         * z层level，决定绘画在哪层canvas中
-	         * @name module:/zrender/graphic/Displayable#zlevel
-	         * @type {number}
-	         * @default 0
-	         */
-	        zlevel: 0,
-
-	        /**
-	         * 是否可拖拽
-	         * @name module:/zrender/graphic/Displayable#draggable
-	         * @type {boolean}
-	         * @default false
-	         */
-	        draggable: false,
-
-	        /**
-	         * 是否正在拖拽
-	         * @name module:/zrender/graphic/Displayable#draggable
-	         * @type {boolean}
-	         * @default false
-	         */
-	        dragging: false,
-
-	        /**
-	         * 是否相应鼠标事件
-	         * @name module:/zrender/graphic/Displayable#silent
-	         * @type {boolean}
-	         * @default false
-	         */
-	        silent: false,
-
-	        /**
-	         * If enable culling
-	         * @type {boolean}
-	         * @default false
-	         */
-	        culling: false,
-
-	        /**
-	         * Mouse cursor when hovered
-	         * @name module:/zrender/graphic/Displayable#cursor
-	         * @type {string}
-	         */
-	        cursor: 'pointer',
-
-	        /**
-	         * If hover area is bounding rect
-	         * @name module:/zrender/graphic/Displayable#rectHover
-	         * @type {string}
-	         */
-	        rectHover: false,
-
-	        /**
-	         * Render the element progressively when the value >= 0,
-	         * usefull for large data.
-	         * @type {number}
-	         */
-	        progressive: -1,
-
-	        beforeBrush: function (ctx) {},
-
-	        afterBrush: function (ctx) {},
-
-	        /**
-	         * 图形绘制方法
-	         * @param {Canvas2DRenderingContext} ctx
-	         */
-	        // Interface
-	        brush: function (ctx, prevEl) {},
-
-	        /**
-	         * 获取最小包围盒
-	         * @return {module:zrender/core/BoundingRect}
-	         */
-	        // Interface
-	        getBoundingRect: function () {},
-
-	        /**
-	         * 判断坐标 x, y 是否在图形上
-	         * If displayable element contain coord x, y
-	         * @param  {number} x
-	         * @param  {number} y
-	         * @return {boolean}
-	         */
-	        contain: function (x, y) {
-	            return this.rectContain(x, y);
-	        },
-
-	        /**
-	         * @param  {Function} cb
-	         * @param  {}   context
-	         */
-	        traverse: function (cb, context) {
-	            cb.call(context, this);
-	        },
-
-	        /**
-	         * 判断坐标 x, y 是否在图形的包围盒上
-	         * If bounding rect of element contain coord x, y
-	         * @param  {number} x
-	         * @param  {number} y
-	         * @return {boolean}
-	         */
-	        rectContain: function (x, y) {
-	            var coord = this.transformCoordToLocal(x, y);
-	            var rect = this.getBoundingRect();
-	            return rect.contain(coord[0], coord[1]);
-	        },
-
-	        /**
-	         * 标记图形元素为脏，并且在下一帧重绘
-	         * Mark displayable element dirty and refresh next frame
-	         */
-	        dirty: function () {
-	            this.__dirty = true;
-
-	            this._rect = null;
-
-	            this.__zr && this.__zr.refresh();
-	        },
-
-	        /**
-	         * 图形是否会触发事件
-	         * If displayable object binded any event
-	         * @return {boolean}
-	         */
-	        // TODO, 通过 bind 绑定的事件
-	        // isSilent: function () {
-	        //     return !(
-	        //         this.hoverable || this.draggable
-	        //         || this.onmousemove || this.onmouseover || this.onmouseout
-	        //         || this.onmousedown || this.onmouseup || this.onclick
-	        //         || this.ondragenter || this.ondragover || this.ondragleave
-	        //         || this.ondrop
-	        //     );
-	        // },
-	        /**
-	         * Alias for animate('style')
-	         * @param {boolean} loop
-	         */
-	        animateStyle: function (loop) {
-	            return this.animate('style', loop);
-	        },
-
-	        attrKV: function (key, value) {
-	            if (key !== 'style') {
-	                Element.prototype.attrKV.call(this, key, value);
-	            }
-	            else {
-	                this.style.set(value);
-	            }
-	        },
-
-	        /**
-	         * @param {Object|string} key
-	         * @param {*} value
-	         */
-	        setStyle: function (key, value) {
-	            this.style.set(key, value);
-	            this.dirty(false);
-	            return this;
-	        },
-
-	        /**
-	         * Use given style object
-	         * @param  {Object} obj
-	         */
-	        useStyle: function (obj) {
-	            this.style = new Style(obj);
-	            this.dirty(false);
-	            return this;
-	        }
-	    };
-
-	    zrUtil.inherits(Displayable, Element);
-
-	    zrUtil.mixin(Displayable, RectText);
-	    // zrUtil.mixin(Displayable, Stateful);
-
-	    module.exports = Displayable;
-
-
-/***/ },
-/* 48 */
-/***/ function(module, exports) {
-
-	/**
-	 * @module zrender/graphic/Style
-	 */
-
-
-	    var STYLE_COMMON_PROPS = [
-	        ['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'],
-	        ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]
-	    ];
-
-	    // var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);
-	    // var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);
-
-	    var Style = function (opts) {
-	        this.extendFrom(opts);
-	    };
-
-	    function createLinearGradient(ctx, obj, rect) {
-	        var x = obj.x == null ? 0 : obj.x;
-	        var x2 = obj.x2 == null ? 1 : obj.x2;
-	        var y = obj.y == null ? 0 : obj.y;
-	        var y2 = obj.y2 == null ? 0 : obj.y2;
-
-	        if (!obj.global) {
-	            x = x * rect.width + rect.x;
-	            x2 = x2 * rect.width + rect.x;
-	            y = y * rect.height + rect.y;
-	            y2 = y2 * rect.height + rect.y;
-	        }
-
-	        var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);
-
-	        return canvasGradient;
-	    }
-
-	    function createRadialGradient(ctx, obj, rect) {
-	        var width = rect.width;
-	        var height = rect.height;
-	        var min = Math.min(width, height);
-
-	        var x = obj.x == null ? 0.5 : obj.x;
-	        var y = obj.y == null ? 0.5 : obj.y;
-	        var r = obj.r == null ? 0.5 : obj.r;
-	        if (!obj.global) {
-	            x = x * width + rect.x;
-	            y = y * height + rect.y;
-	            r = r * min;
-	        }
-
-	        var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);
-
-	        return canvasGradient;
-	    }
-
-
-	    Style.prototype = {
-
-	        constructor: Style,
-
-	        /**
-	         * @type {string}
-	         */
-	        fill: '#000000',
-
-	        /**
-	         * @type {string}
-	         */
-	        stroke: null,
-
-	        /**
-	         * @type {number}
-	         */
-	        opacity: 1,
-
-	        /**
-	         * @type {Array.<number>}
-	         */
-	        lineDash: null,
-
-	        /**
-	         * @type {number}
-	         */
-	        lineDashOffset: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        shadowBlur: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        shadowOffsetX: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        shadowOffsetY: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        lineWidth: 1,
-
-	        /**
-	         * If stroke ignore scale
-	         * @type {Boolean}
-	         */
-	        strokeNoScale: false,
-
-	        // Bounding rect text configuration
-	        // Not affected by element transform
-	        /**
-	         * @type {string}
-	         */
-	        text: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textFill: '#000',
-
-	        /**
-	         * @type {string}
-	         */
-	        textStroke: null,
-
-	        /**
-	         * 'inside', 'left', 'right', 'top', 'bottom'
-	         * [x, y]
-	         * @type {string|Array.<number>}
-	         * @default 'inside'
-	         */
-	        textPosition: 'inside',
-
-	        /**
-	         * [x, y]
-	         * @type {Array.<number>}
-	         */
-	        textOffset: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textBaseline: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textAlign: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textVerticalAlign: null,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textDistance: 5,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textShadowBlur: 0,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textShadowOffsetX: 0,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textShadowOffsetY: 0,
-
-	        /**
-	         * If transform text
-	         * Only useful in Path and Image element
-	         * @type {boolean}
-	         */
-	        textTransform: false,
-
-	        /**
-	         * Text rotate around position of Path or Image
-	         * Only useful in Path and Image element and textTransform is false.
-	         */
-	        textRotation: 0,
-
-	        /**
-	         * @type {string}
-	         * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
-	         */
-	        blend: null,
-
-	        /**
-	         * @param {CanvasRenderingContext2D} ctx
-	         */
-	        bind: function (ctx, el, prevEl) {
-	            var style = this;
-	            var prevStyle = prevEl && prevEl.style;
-	            var firstDraw = !prevStyle;
-
-	            for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
-	                var prop = STYLE_COMMON_PROPS[i];
-	                var styleName = prop[0];
-
-	                if (firstDraw || style[styleName] !== prevStyle[styleName]) {
-	                    // FIXME Invalid property value will cause style leak from previous element.
-	                    ctx[styleName] = style[styleName] || prop[1];
-	                }
-	            }
-
-	            if ((firstDraw || style.fill !== prevStyle.fill)) {
-	                ctx.fillStyle = style.fill;
-	            }
-	            if ((firstDraw || style.stroke !== prevStyle.stroke)) {
-	                ctx.strokeStyle = style.stroke;
-	            }
-	            if ((firstDraw || style.opacity !== prevStyle.opacity)) {
-	                ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;
-	            }
-
-	            if ((firstDraw || style.blend !== prevStyle.blend)) {
-	                ctx.globalCompositeOperation = style.blend || 'source-over';
-	            }
-	            if (this.hasStroke()) {
-	                var lineWidth = style.lineWidth;
-	                ctx.lineWidth = lineWidth / (
-	                    (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1
-	                );
-	            }
-	        },
-
-	        hasFill: function () {
-	            var fill = this.fill;
-	            return fill != null && fill !== 'none';
-	        },
-
-	        hasStroke: function () {
-	            var stroke = this.stroke;
-	            return stroke != null && stroke !== 'none' && this.lineWidth > 0;
-	        },
-
-	        /**
-	         * Extend from other style
-	         * @param {zrender/graphic/Style} otherStyle
-	         * @param {boolean} overwrite
-	         */
-	        extendFrom: function (otherStyle, overwrite) {
-	            if (otherStyle) {
-	                var target = this;
-	                for (var name in otherStyle) {
-	                    if (otherStyle.hasOwnProperty(name)
-	                        && (overwrite || ! target.hasOwnProperty(name))
-	                    ) {
-	                        target[name] = otherStyle[name];
-	                    }
-	                }
-	            }
-	        },
-
-	        /**
-	         * Batch setting style with a given object
-	         * @param {Object|string} obj
-	         * @param {*} [obj]
-	         */
-	        set: function (obj, value) {
-	            if (typeof obj === 'string') {
-	                this[obj] = value;
-	            }
-	            else {
-	                this.extendFrom(obj, true);
-	            }
-	        },
-
-	        /**
-	         * Clone
-	         * @return {zrender/graphic/Style} [description]
-	         */
-	        clone: function () {
-	            var newStyle = new this.constructor();
-	            newStyle.extendFrom(this, true);
-	            return newStyle;
-	        },
-
-	        getGradient: function (ctx, obj, rect) {
-	            var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;
-	            var canvasGradient = method(ctx, obj, rect);
-	            var colorStops = obj.colorStops;
-	            for (var i = 0; i < colorStops.length; i++) {
-	                canvasGradient.addColorStop(
-	                    colorStops[i].offset, colorStops[i].color
-	                );
-	            }
-	            return canvasGradient;
-	        }
-	    };
-
-	    var styleProto = Style.prototype;
-	    for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
-	        var prop = STYLE_COMMON_PROPS[i];
-	        if (!(prop[0] in styleProto)) {
-	            styleProto[prop[0]] = prop[1];
-	        }
-	    }
-
-	    // Provide for others
-	    Style.getGradient = styleProto.getGradient;
-
-	    module.exports = Style;
-
-
-/***/ },
-/* 49 */
+/* 35 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -13916,7 +11645,7 @@
 
 
 /***/ },
-/* 50 */
+/* 36 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -13931,11 +11660,11 @@
 	 // TODO getTotalLength, getPointAtLength
 
 
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 	    var vec2 = __webpack_require__(10);
-	    var bbox = __webpack_require__(52);
+	    var bbox = __webpack_require__(38);
 	    var BoundingRect = __webpack_require__(9);
-	    var dpr = __webpack_require__(42).devicePixelRatio;
+	    var dpr = __webpack_require__(34).devicePixelRatio;
 
 	    var CMD = {
 	        M: 1,
@@ -14710,7 +12439,7 @@
 
 
 /***/ },
-/* 51 */
+/* 37 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -15256,7 +12985,7 @@
 
 
 /***/ },
-/* 52 */
+/* 38 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -15265,7 +12994,7 @@
 
 
 	    var vec2 = __webpack_require__(10);
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 
 	    var bbox = {};
 	    var mathMin = Math.min;
@@ -15492,21 +13221,21 @@
 
 
 /***/ },
-/* 53 */
+/* 39 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var CMD = __webpack_require__(50).CMD;
-	    var line = __webpack_require__(54);
-	    var cubic = __webpack_require__(55);
-	    var quadratic = __webpack_require__(56);
-	    var arc = __webpack_require__(57);
-	    var normalizeRadian = __webpack_require__(58).normalizeRadian;
-	    var curve = __webpack_require__(51);
+	    var CMD = __webpack_require__(36).CMD;
+	    var line = __webpack_require__(40);
+	    var cubic = __webpack_require__(41);
+	    var quadratic = __webpack_require__(42);
+	    var arc = __webpack_require__(43);
+	    var normalizeRadian = __webpack_require__(44).normalizeRadian;
+	    var curve = __webpack_require__(37);
 
-	    var windingLine = __webpack_require__(59);
+	    var windingLine = __webpack_require__(45);
 
 	    var containStroke = line.containStroke;
 
@@ -15898,7 +13627,7 @@
 
 
 /***/ },
-/* 54 */
+/* 40 */
 /***/ function(module, exports) {
 
 	
@@ -15946,12 +13675,12 @@
 
 
 /***/ },
-/* 55 */
+/* 41 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 
 	    module.exports = {
 	        /**
@@ -15993,12 +13722,12 @@
 
 
 /***/ },
-/* 56 */
+/* 42 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 
 	    module.exports = {
 	        /**
@@ -16038,12 +13767,12 @@
 
 
 /***/ },
-/* 57 */
+/* 43 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var normalizeRadian = __webpack_require__(58).normalizeRadian;
+	    var normalizeRadian = __webpack_require__(44).normalizeRadian;
 	    var PI2 = Math.PI * 2;
 
 	    module.exports = {
@@ -16104,7 +13833,7 @@
 
 
 /***/ },
-/* 58 */
+/* 44 */
 /***/ function(module, exports) {
 
 	
@@ -16122,7 +13851,7 @@
 
 
 /***/ },
-/* 59 */
+/* 45 */
 /***/ function(module, exports) {
 
 	
@@ -16149,7 +13878,7 @@
 
 
 /***/ },
-/* 60 */
+/* 46 */
 /***/ function(module, exports) {
 
 	
@@ -16173,12 +13902,12 @@
 
 
 /***/ },
-/* 61 */
+/* 47 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var CMD = __webpack_require__(50).CMD;
+	    var CMD = __webpack_require__(36).CMD;
 	    var vec2 = __webpack_require__(10);
 	    var v2ApplyTransform = vec2.applyTransform;
 
@@ -16276,7 +14005,329 @@
 
 
 /***/ },
-/* 62 */
+/* 48 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Group是一个容器，可以插入子节点，Group的变换也会被应用到子节点上
+	 * @module zrender/graphic/Group
+	 * @example
+	 *     var Group = require('zrender/lib/container/Group');
+	 *     var Circle = require('zrender/lib/graphic/shape/Circle');
+	 *     var g = new Group();
+	 *     g.position[0] = 100;
+	 *     g.position[1] = 100;
+	 *     g.add(new Circle({
+	 *         style: {
+	 *             x: 100,
+	 *             y: 100,
+	 *             r: 20,
+	 *         }
+	 *     }));
+	 *     zr.add(g);
+	 */
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var Element = __webpack_require__(23);
+	    var BoundingRect = __webpack_require__(9);
+
+	    /**
+	     * @alias module:zrender/graphic/Group
+	     * @constructor
+	     * @extends module:zrender/mixin/Transformable
+	     * @extends module:zrender/mixin/Eventful
+	     */
+	    var Group = function (opts) {
+
+	        opts = opts || {};
+
+	        Element.call(this, opts);
+
+	        for (var key in opts) {
+	            if (opts.hasOwnProperty(key)) {
+	                this[key] = opts[key];
+	            }
+	        }
+
+	        this._children = [];
+
+	        this.__storage = null;
+
+	        this.__dirty = true;
+	    };
+
+	    Group.prototype = {
+
+	        constructor: Group,
+
+	        isGroup: true,
+
+	        /**
+	         * @type {string}
+	         */
+	        type: 'group',
+
+	        /**
+	         * 所有子孙元素是否响应鼠标事件
+	         * @name module:/zrender/container/Group#silent
+	         * @type {boolean}
+	         * @default false
+	         */
+	        silent: false,
+
+	        /**
+	         * @return {Array.<module:zrender/Element>}
+	         */
+	        children: function () {
+	            return this._children.slice();
+	        },
+
+	        /**
+	         * 获取指定 index 的儿子节点
+	         * @param  {number} idx
+	         * @return {module:zrender/Element}
+	         */
+	        childAt: function (idx) {
+	            return this._children[idx];
+	        },
+
+	        /**
+	         * 获取指定名字的儿子节点
+	         * @param  {string} name
+	         * @return {module:zrender/Element}
+	         */
+	        childOfName: function (name) {
+	            var children = this._children;
+	            for (var i = 0; i < children.length; i++) {
+	                if (children[i].name === name) {
+	                    return children[i];
+	                }
+	             }
+	        },
+
+	        /**
+	         * @return {number}
+	         */
+	        childCount: function () {
+	            return this._children.length;
+	        },
+
+	        /**
+	         * 添加子节点到最后
+	         * @param {module:zrender/Element} child
+	         */
+	        add: function (child) {
+	            if (child && child !== this && child.parent !== this) {
+
+	                this._children.push(child);
+
+	                this._doAdd(child);
+	            }
+
+	            return this;
+	        },
+
+	        /**
+	         * 添加子节点在 nextSibling 之前
+	         * @param {module:zrender/Element} child
+	         * @param {module:zrender/Element} nextSibling
+	         */
+	        addBefore: function (child, nextSibling) {
+	            if (child && child !== this && child.parent !== this
+	                && nextSibling && nextSibling.parent === this) {
+
+	                var children = this._children;
+	                var idx = children.indexOf(nextSibling);
+
+	                if (idx >= 0) {
+	                    children.splice(idx, 0, child);
+	                    this._doAdd(child);
+	                }
+	            }
+
+	            return this;
+	        },
+
+	        _doAdd: function (child) {
+	            if (child.parent) {
+	                child.parent.remove(child);
+	            }
+
+	            child.parent = this;
+
+	            var storage = this.__storage;
+	            var zr = this.__zr;
+	            if (storage && storage !== child.__storage) {
+
+	                storage.addToStorage(child);
+
+	                if (child instanceof Group) {
+	                    child.addChildrenToStorage(storage);
+	                }
+	            }
+
+	            zr && zr.refresh();
+	        },
+
+	        /**
+	         * 移除子节点
+	         * @param {module:zrender/Element} child
+	         */
+	        remove: function (child) {
+	            var zr = this.__zr;
+	            var storage = this.__storage;
+	            var children = this._children;
+
+	            var idx = zrUtil.indexOf(children, child);
+	            if (idx < 0) {
+	                return this;
+	            }
+	            children.splice(idx, 1);
+
+	            child.parent = null;
+
+	            if (storage) {
+
+	                storage.delFromStorage(child);
+
+	                if (child instanceof Group) {
+	                    child.delChildrenFromStorage(storage);
+	                }
+	            }
+
+	            zr && zr.refresh();
+
+	            return this;
+	        },
+
+	        /**
+	         * 移除所有子节点
+	         */
+	        removeAll: function () {
+	            var children = this._children;
+	            var storage = this.__storage;
+	            var child;
+	            var i;
+	            for (i = 0; i < children.length; i++) {
+	                child = children[i];
+	                if (storage) {
+	                    storage.delFromStorage(child);
+	                    if (child instanceof Group) {
+	                        child.delChildrenFromStorage(storage);
+	                    }
+	                }
+	                child.parent = null;
+	            }
+	            children.length = 0;
+
+	            return this;
+	        },
+
+	        /**
+	         * 遍历所有子节点
+	         * @param  {Function} cb
+	         * @param  {}   context
+	         */
+	        eachChild: function (cb, context) {
+	            var children = this._children;
+	            for (var i = 0; i < children.length; i++) {
+	                var child = children[i];
+	                cb.call(context, child, i);
+	            }
+	            return this;
+	        },
+
+	        /**
+	         * 深度优先遍历所有子孙节点
+	         * @param  {Function} cb
+	         * @param  {}   context
+	         */
+	        traverse: function (cb, context) {
+	            for (var i = 0; i < this._children.length; i++) {
+	                var child = this._children[i];
+	                cb.call(context, child);
+
+	                if (child.type === 'group') {
+	                    child.traverse(cb, context);
+	                }
+	            }
+	            return this;
+	        },
+
+	        addChildrenToStorage: function (storage) {
+	            for (var i = 0; i < this._children.length; i++) {
+	                var child = this._children[i];
+	                storage.addToStorage(child);
+	                if (child instanceof Group) {
+	                    child.addChildrenToStorage(storage);
+	                }
+	            }
+	        },
+
+	        delChildrenFromStorage: function (storage) {
+	            for (var i = 0; i < this._children.length; i++) {
+	                var child = this._children[i];
+	                storage.delFromStorage(child);
+	                if (child instanceof Group) {
+	                    child.delChildrenFromStorage(storage);
+	                }
+	            }
+	        },
+
+	        dirty: function () {
+	            this.__dirty = true;
+	            this.__zr && this.__zr.refresh();
+	            return this;
+	        },
+
+	        /**
+	         * @return {module:zrender/core/BoundingRect}
+	         */
+	        getBoundingRect: function (includeChildren) {
+	            // TODO Caching
+	            var rect = null;
+	            var tmpRect = new BoundingRect(0, 0, 0, 0);
+	            var children = includeChildren || this._children;
+	            var tmpMat = [];
+
+	            for (var i = 0; i < children.length; i++) {
+	                var child = children[i];
+	                if (child.ignore || child.invisible) {
+	                    continue;
+	                }
+
+	                var childRect = child.getBoundingRect();
+	                var transform = child.getLocalTransform(tmpMat);
+	                // TODO
+	                // The boundingRect cacluated by transforming original
+	                // rect may be bigger than the actual bundingRect when rotation
+	                // is used. (Consider a circle rotated aginst its center, where
+	                // the actual boundingRect should be the same as that not be
+	                // rotated.) But we can not find better approach to calculate
+	                // actual boundingRect yet, considering performance.
+	                if (transform) {
+	                    tmpRect.copy(childRect);
+	                    tmpRect.applyTransform(transform);
+	                    rect = rect || tmpRect.clone();
+	                    rect.union(tmpRect);
+	                }
+	                else {
+	                    rect = rect || childRect.clone();
+	                    rect.union(childRect);
+	                }
+	            }
+	            return rect || tmpRect;
+	        }
+	    };
+
+	    zrUtil.inherits(Group, Element);
+
+	    module.exports = Group;
+
+
+/***/ },
+/* 49 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16286,11 +14337,11 @@
 
 
 
-	    var Displayable = __webpack_require__(47);
+	    var Displayable = __webpack_require__(21);
 	    var BoundingRect = __webpack_require__(9);
 	    var zrUtil = __webpack_require__(4);
 
-	    var LRU = __webpack_require__(40);
+	    var LRU = __webpack_require__(32);
 	    var globalImageCache = new LRU(50);
 	    /**
 	     * @alias zrender/graphic/Image
@@ -16440,7 +14491,7 @@
 
 
 /***/ },
-/* 63 */
+/* 50 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16454,7 +14505,7 @@
 
 
 
-	    var Displayable = __webpack_require__(47);
+	    var Displayable = __webpack_require__(21);
 	    var zrUtil = __webpack_require__(4);
 	    var textContain = __webpack_require__(8);
 
@@ -16581,7 +14632,7 @@
 
 
 /***/ },
-/* 64 */
+/* 51 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -16592,7 +14643,7 @@
 
 
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'circle',
 
@@ -16623,7 +14674,7 @@
 
 
 /***/ },
-/* 65 */
+/* 52 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16634,7 +14685,7 @@
 
 
 	    var env = __webpack_require__(2);
-	    var Path = __webpack_require__(46);
+	    var Path = __webpack_require__(20);
 
 	    var shadowTemp = [
 	        ['shadowBlur', 0],
@@ -16742,7 +14793,7 @@
 
 
 /***/ },
-/* 66 */
+/* 53 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16751,7 +14802,7 @@
 	 */
 
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'ring',
 
@@ -16776,7 +14827,7 @@
 
 
 /***/ },
-/* 67 */
+/* 54 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16785,9 +14836,9 @@
 	 */
 
 
-	    var polyHelper = __webpack_require__(68);
+	    var polyHelper = __webpack_require__(55);
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 	        
 	        type: 'polygon',
 
@@ -16806,13 +14857,13 @@
 
 
 /***/ },
-/* 68 */
+/* 55 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var smoothSpline = __webpack_require__(69);
-	    var smoothBezier = __webpack_require__(70);
+	    var smoothSpline = __webpack_require__(56);
+	    var smoothBezier = __webpack_require__(57);
 
 	    module.exports = {
 	        buildPath: function (ctx, shape, closePath) {
@@ -16853,7 +14904,7 @@
 
 
 /***/ },
-/* 69 */
+/* 56 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16929,7 +14980,7 @@
 
 
 /***/ },
-/* 70 */
+/* 57 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17036,7 +15087,7 @@
 
 
 /***/ },
-/* 71 */
+/* 58 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17044,9 +15095,9 @@
 	 */
 
 
-	    var polyHelper = __webpack_require__(68);
+	    var polyHelper = __webpack_require__(55);
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 	        
 	        type: 'polyline',
 
@@ -17071,7 +15122,7 @@
 
 
 /***/ },
-/* 72 */
+/* 59 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17080,9 +15131,9 @@
 	 */
 
 
-	    var roundRectHelper = __webpack_require__(73);
+	    var roundRectHelper = __webpack_require__(60);
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'rect',
 
@@ -17119,7 +15170,7 @@
 
 
 /***/ },
-/* 73 */
+/* 60 */
 /***/ function(module, exports) {
 
 	
@@ -17214,7 +15265,7 @@
 
 
 /***/ },
-/* 74 */
+/* 61 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17222,7 +15273,7 @@
 	 * @module zrender/graphic/shape/Line
 	 */
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'line',
 
@@ -17279,7 +15330,7 @@
 
 
 /***/ },
-/* 75 */
+/* 62 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -17289,7 +15340,7 @@
 	 */
 
 
-	    var curveTool = __webpack_require__(51);
+	    var curveTool = __webpack_require__(37);
 	    var vec2 = __webpack_require__(10);
 	    var quadraticSubdivide = curveTool.quadraticSubdivide;
 	    var cubicSubdivide = curveTool.cubicSubdivide;
@@ -17316,7 +15367,7 @@
 	            ];
 	        }
 	    }
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'bezier-curve',
 
@@ -17420,7 +15471,7 @@
 
 
 /***/ },
-/* 76 */
+/* 63 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17429,7 +15480,7 @@
 	 */
 	 
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'arc',
 
@@ -17474,13 +15525,13 @@
 
 
 /***/ },
-/* 77 */
+/* 64 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// CompoundPath to improve performance
 
 
-	    var Path = __webpack_require__(46);
+	    var Path = __webpack_require__(20);
 
 	    module.exports = Path.extend({
 
@@ -17537,7 +15588,7 @@
 
 
 /***/ },
-/* 78 */
+/* 65 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -17545,7 +15596,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 
 	    /**
 	     * x, y, x2, y2 are all percent from 0 to 1
@@ -17589,7 +15640,7 @@
 
 
 /***/ },
-/* 79 */
+/* 66 */
 /***/ function(module, exports) {
 
 	
@@ -17620,7 +15671,7 @@
 
 
 /***/ },
-/* 80 */
+/* 67 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -17628,7 +15679,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 
 	    /**
 	     * x, y, r are all percent from 0 to 1
@@ -17669,6 +15720,2095 @@
 
 
 /***/ },
+/* 68 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+	    var getItemStyle = __webpack_require__(15)(
+	        [
+	            ['fill', 'color'],
+	            ['stroke', 'borderColor'],
+	            ['lineWidth', 'borderWidth'],
+	            ['opacity'],
+	            ['shadowBlur'],
+	            ['shadowOffsetX'],
+	            ['shadowOffsetY'],
+	            ['shadowColor'],
+	            ['textPosition'],
+	            ['textAlign']
+	        ]
+	    );
+	    module.exports = {
+	        getItemStyle: function (excludes, includes) {
+	            var style = getItemStyle.call(this, excludes, includes);
+	            var lineDash = this.getBorderLineDash();
+	            lineDash && (style.lineDash = lineDash);
+	            return style;
+	        },
+
+	        getBorderLineDash: function () {
+	            var lineType = this.get('borderType');
+	            return (lineType === 'solid' || lineType == null) ? null
+	                : (lineType === 'dashed' ? [5, 5] : [1, 1]);
+	        }
+	    };
+
+
+/***/ },
+/* 69 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Component model
+	 *
+	 * @module echarts/model/Component
+	 */
+
+
+	    var Model = __webpack_require__(12);
+	    var zrUtil = __webpack_require__(4);
+	    var arrayPush = Array.prototype.push;
+	    var componentUtil = __webpack_require__(70);
+	    var clazzUtil = __webpack_require__(13);
+	    var layout = __webpack_require__(71);
+
+	    /**
+	     * @alias module:echarts/model/Component
+	     * @constructor
+	     * @param {Object} option
+	     * @param {module:echarts/model/Model} parentModel
+	     * @param {module:echarts/model/Model} ecModel
+	     */
+	    var ComponentModel = Model.extend({
+
+	        type: 'component',
+
+	        /**
+	         * @readOnly
+	         * @type {string}
+	         */
+	        id: '',
+
+	        /**
+	         * @readOnly
+	         */
+	        name: '',
+
+	        /**
+	         * @readOnly
+	         * @type {string}
+	         */
+	        mainType: '',
+
+	        /**
+	         * @readOnly
+	         * @type {string}
+	         */
+	        subType: '',
+
+	        /**
+	         * @readOnly
+	         * @type {number}
+	         */
+	        componentIndex: 0,
+
+	        /**
+	         * @type {Object}
+	         * @protected
+	         */
+	        defaultOption: null,
+
+	        /**
+	         * @type {module:echarts/model/Global}
+	         * @readOnly
+	         */
+	        ecModel: null,
+
+	        /**
+	         * key: componentType
+	         * value:  Component model list, can not be null.
+	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
+	         * @readOnly
+	         */
+	        dependentModels: [],
+
+	        /**
+	         * @type {string}
+	         * @readOnly
+	         */
+	        uid: null,
+
+	        /**
+	         * Support merge layout params.
+	         * Only support 'box' now (left/right/top/bottom/width/height).
+	         * @type {string|Object} Object can be {ignoreSize: true}
+	         * @readOnly
+	         */
+	        layoutMode: null,
+
+	        $constructor: function (option, parentModel, ecModel, extraOpt) {
+	            Model.call(this, option, parentModel, ecModel, extraOpt);
+
+	            this.uid = componentUtil.getUID('componentModel');
+	        },
+
+
+	        init: function (option, parentModel, ecModel, extraOpt) {
+	            this.mergeDefaultAndTheme(option, ecModel);
+	        },
+
+	        mergeDefaultAndTheme: function (option, ecModel) {
+	            var layoutMode = this.layoutMode;
+	            var inputPositionParams = layoutMode
+	                ? layout.getLayoutParams(option) : {};
+
+	            var themeModel = ecModel.getTheme();
+	            zrUtil.merge(option, themeModel.get(this.mainType));
+	            zrUtil.merge(option, this.getDefaultOption());
+
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
+	            }
+	        },
+
+	        mergeOption: function (option, extraOpt) {
+	            zrUtil.merge(this.option, option, true);
+
+	            var layoutMode = this.layoutMode;
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(this.option, option, layoutMode);
+	            }
+	        },
+
+	        // Hooker after init or mergeOption
+	        optionUpdated: function (newCptOption, isInit) {},
+
+	        getDefaultOption: function () {
+	            if (!clazzUtil.hasOwn(this, '__defaultOption')) {
+	                var optList = [];
+	                var Class = this.constructor;
+	                while (Class) {
+	                    var opt = Class.prototype.defaultOption;
+	                    opt && optList.push(opt);
+	                    Class = Class.superClass;
+	                }
+
+	                var defaultOption = {};
+	                for (var i = optList.length - 1; i >= 0; i--) {
+	                    defaultOption = zrUtil.merge(defaultOption, optList[i], true);
+	                }
+	                clazzUtil.set(this, '__defaultOption', defaultOption);
+	            }
+	            return clazzUtil.get(this, '__defaultOption');
+	        },
+
+	        getReferringComponents: function (mainType) {
+	            return this.ecModel.queryComponents({
+	                mainType: mainType,
+	                index: this.get(mainType + 'Index', true),
+	                id: this.get(mainType + 'Id', true)
+	            });
+	        }
+
+	    });
+
+	    // Reset ComponentModel.extend, add preConstruct.
+	    // clazzUtil.enableClassExtend(
+	    //     ComponentModel,
+	    //     function (option, parentModel, ecModel, extraOpt) {
+	    //         // Set dependentModels, componentIndex, name, id, mainType, subType.
+	    //         zrUtil.extend(this, extraOpt);
+
+	    //         this.uid = componentUtil.getUID('componentModel');
+
+	    //         // this.setReadOnly([
+	    //         //     'type', 'id', 'uid', 'name', 'mainType', 'subType',
+	    //         //     'dependentModels', 'componentIndex'
+	    //         // ]);
+	    //     }
+	    // );
+
+	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+	    clazzUtil.enableClassManagement(
+	        ComponentModel, {registerWhenExtend: true}
+	    );
+	    componentUtil.enableSubTypeDefaulter(ComponentModel);
+
+	    // Add capability of ComponentModel.topologicalTravel.
+	    componentUtil.enableTopologicalTravel(ComponentModel, getDependencies);
+
+	    function getDependencies(componentType) {
+	        var deps = [];
+	        zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
+	            arrayPush.apply(deps, Clazz.prototype.dependencies || []);
+	        });
+	        // Ensure main type
+	        return zrUtil.map(deps, function (type) {
+	            return clazzUtil.parseClassType(type).main;
+	        });
+	    }
+
+	    zrUtil.mixin(ComponentModel, __webpack_require__(72));
+
+	    module.exports = ComponentModel;
+
+
+/***/ },
+/* 70 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var zrUtil = __webpack_require__(4);
+	    var clazz = __webpack_require__(13);
+
+	    var parseClassType = clazz.parseClassType;
+
+	    var base = 0;
+
+	    var componentUtil = {};
+
+	    var DELIMITER = '_';
+
+	    /**
+	     * @public
+	     * @param {string} type
+	     * @return {string}
+	     */
+	    componentUtil.getUID = function (type) {
+	        // Considering the case of crossing js context,
+	        // use Math.random to make id as unique as possible.
+	        return [(type || ''), base++, Math.random()].join(DELIMITER);
+	    };
+
+	    /**
+	     * @inner
+	     */
+	    componentUtil.enableSubTypeDefaulter = function (entity) {
+
+	        var subTypeDefaulters = {};
+
+	        entity.registerSubTypeDefaulter = function (componentType, defaulter) {
+	            componentType = parseClassType(componentType);
+	            subTypeDefaulters[componentType.main] = defaulter;
+	        };
+
+	        entity.determineSubType = function (componentType, option) {
+	            var type = option.type;
+	            if (!type) {
+	                var componentTypeMain = parseClassType(componentType).main;
+	                if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {
+	                    type = subTypeDefaulters[componentTypeMain](option);
+	                }
+	            }
+	            return type;
+	        };
+
+	        return entity;
+	    };
+
+	    /**
+	     * Topological travel on Activity Network (Activity On Vertices).
+	     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
+	     *
+	     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
+	     *
+	     * If there is circle dependencey, Error will be thrown.
+	     *
+	     */
+	    componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) {
+
+	        /**
+	         * @public
+	         * @param {Array.<string>} targetNameList Target Component type list.
+	         *                                           Can be ['aa', 'bb', 'aa.xx']
+	         * @param {Array.<string>} fullNameList By which we can build dependency graph.
+	         * @param {Function} callback Params: componentType, dependencies.
+	         * @param {Object} context Scope of callback.
+	         */
+	        entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {
+	            if (!targetNameList.length) {
+	                return;
+	            }
+
+	            var result = makeDepndencyGraph(fullNameList);
+	            var graph = result.graph;
+	            var stack = result.noEntryList;
+
+	            var targetNameSet = {};
+	            zrUtil.each(targetNameList, function (name) {
+	                targetNameSet[name] = true;
+	            });
+
+	            while (stack.length) {
+	                var currComponentType = stack.pop();
+	                var currVertex = graph[currComponentType];
+	                var isInTargetNameSet = !!targetNameSet[currComponentType];
+	                if (isInTargetNameSet) {
+	                    callback.call(context, currComponentType, currVertex.originalDeps.slice());
+	                    delete targetNameSet[currComponentType];
+	                }
+	                zrUtil.each(
+	                    currVertex.successor,
+	                    isInTargetNameSet ? removeEdgeAndAdd : removeEdge
+	                );
+	            }
+
+	            zrUtil.each(targetNameSet, function () {
+	                throw new Error('Circle dependency may exists');
+	            });
+
+	            function removeEdge(succComponentType) {
+	                graph[succComponentType].entryCount--;
+	                if (graph[succComponentType].entryCount === 0) {
+	                    stack.push(succComponentType);
+	                }
+	            }
+
+	            // Consider this case: legend depends on series, and we call
+	            // chart.setOption({series: [...]}), where only series is in option.
+	            // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will
+	            // not be called, but only sereis.mergeOption is called. Thus legend
+	            // have no chance to update its local record about series (like which
+	            // name of series is available in legend).
+	            function removeEdgeAndAdd(succComponentType) {
+	                targetNameSet[succComponentType] = true;
+	                removeEdge(succComponentType);
+	            }
+	        };
+
+	        /**
+	         * DepndencyGraph: {Object}
+	         * key: conponentType,
+	         * value: {
+	         *     successor: [conponentTypes...],
+	         *     originalDeps: [conponentTypes...],
+	         *     entryCount: {number}
+	         * }
+	         */
+	        function makeDepndencyGraph(fullNameList) {
+	            var graph = {};
+	            var noEntryList = [];
+
+	            zrUtil.each(fullNameList, function (name) {
+
+	                var thisItem = createDependencyGraphItem(graph, name);
+	                var originalDeps = thisItem.originalDeps = dependencyGetter(name);
+
+	                var availableDeps = getAvailableDependencies(originalDeps, fullNameList);
+	                thisItem.entryCount = availableDeps.length;
+	                if (thisItem.entryCount === 0) {
+	                    noEntryList.push(name);
+	                }
+
+	                zrUtil.each(availableDeps, function (dependentName) {
+	                    if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) {
+	                        thisItem.predecessor.push(dependentName);
+	                    }
+	                    var thatItem = createDependencyGraphItem(graph, dependentName);
+	                    if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) {
+	                        thatItem.successor.push(name);
+	                    }
+	                });
+	            });
+
+	            return {graph: graph, noEntryList: noEntryList};
+	        }
+
+	        function createDependencyGraphItem(graph, name) {
+	            if (!graph[name]) {
+	                graph[name] = {predecessor: [], successor: []};
+	            }
+	            return graph[name];
+	        }
+
+	        function getAvailableDependencies(originalDeps, fullNameList) {
+	            var availableDeps = [];
+	            zrUtil.each(originalDeps, function (dep) {
+	                zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);
+	            });
+	            return availableDeps;
+	        }
+	    };
+
+	    module.exports = componentUtil;
+
+
+/***/ },
+/* 71 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+	// Layout helpers for each component positioning
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var BoundingRect = __webpack_require__(9);
+	    var numberUtil = __webpack_require__(7);
+	    var formatUtil = __webpack_require__(6);
+	    var parsePercent = numberUtil.parsePercent;
+	    var each = zrUtil.each;
+
+	    var layout = {};
+
+	    /**
+	     * @public
+	     */
+	    var LOCATION_PARAMS = layout.LOCATION_PARAMS = [
+	        'left', 'right', 'top', 'bottom', 'width', 'height'
+	    ];
+
+	    /**
+	     * @public
+	     */
+	    var HV_NAMES = layout.HV_NAMES = [
+	        ['width', 'left', 'right'],
+	        ['height', 'top', 'bottom']
+	    ];
+
+	    function boxLayout(orient, group, gap, maxWidth, maxHeight) {
+	        var x = 0;
+	        var y = 0;
+	        if (maxWidth == null) {
+	            maxWidth = Infinity;
+	        }
+	        if (maxHeight == null) {
+	            maxHeight = Infinity;
+	        }
+	        var currentLineMaxSize = 0;
+	        group.eachChild(function (child, idx) {
+	            var position = child.position;
+	            var rect = child.getBoundingRect();
+	            var nextChild = group.childAt(idx + 1);
+	            var nextChildRect = nextChild && nextChild.getBoundingRect();
+	            var nextX;
+	            var nextY;
+	            if (orient === 'horizontal') {
+	                var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0);
+	                nextX = x + moveX;
+	                // Wrap when width exceeds maxWidth or meet a `newline` group
+	                if (nextX > maxWidth || child.newline) {
+	                    x = 0;
+	                    nextX = moveX;
+	                    y += currentLineMaxSize + gap;
+	                    currentLineMaxSize = rect.height;
+	                }
+	                else {
+	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);
+	                }
+	            }
+	            else {
+	                var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0);
+	                nextY = y + moveY;
+	                // Wrap when width exceeds maxHeight or meet a `newline` group
+	                if (nextY > maxHeight || child.newline) {
+	                    x += currentLineMaxSize + gap;
+	                    y = 0;
+	                    nextY = moveY;
+	                    currentLineMaxSize = rect.width;
+	                }
+	                else {
+	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);
+	                }
+	            }
+
+	            if (child.newline) {
+	                return;
+	            }
+
+	            position[0] = x;
+	            position[1] = y;
+
+	            orient === 'horizontal'
+	                ? (x = nextX + gap)
+	                : (y = nextY + gap);
+	        });
+	    }
+
+	    /**
+	     * VBox or HBox layouting
+	     * @param {string} orient
+	     * @param {module:zrender/container/Group} group
+	     * @param {number} gap
+	     * @param {number} [width=Infinity]
+	     * @param {number} [height=Infinity]
+	     */
+	    layout.box = boxLayout;
+
+	    /**
+	     * VBox layouting
+	     * @param {module:zrender/container/Group} group
+	     * @param {number} gap
+	     * @param {number} [width=Infinity]
+	     * @param {number} [height=Infinity]
+	     */
+	    layout.vbox = zrUtil.curry(boxLayout, 'vertical');
+
+	    /**
+	     * HBox layouting
+	     * @param {module:zrender/container/Group} group
+	     * @param {number} gap
+	     * @param {number} [width=Infinity]
+	     * @param {number} [height=Infinity]
+	     */
+	    layout.hbox = zrUtil.curry(boxLayout, 'horizontal');
+
+	    /**
+	     * If x or x2 is not specified or 'center' 'left' 'right',
+	     * the width would be as long as possible.
+	     * If y or y2 is not specified or 'middle' 'top' 'bottom',
+	     * the height would be as long as possible.
+	     *
+	     * @param {Object} positionInfo
+	     * @param {number|string} [positionInfo.x]
+	     * @param {number|string} [positionInfo.y]
+	     * @param {number|string} [positionInfo.x2]
+	     * @param {number|string} [positionInfo.y2]
+	     * @param {Object} containerRect
+	     * @param {string|number} margin
+	     * @return {Object} {width, height}
+	     */
+	    layout.getAvailableSize = function (positionInfo, containerRect, margin) {
+	        var containerWidth = containerRect.width;
+	        var containerHeight = containerRect.height;
+
+	        var x = parsePercent(positionInfo.x, containerWidth);
+	        var y = parsePercent(positionInfo.y, containerHeight);
+	        var x2 = parsePercent(positionInfo.x2, containerWidth);
+	        var y2 = parsePercent(positionInfo.y2, containerHeight);
+
+	        (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);
+	        (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);
+	        (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);
+	        (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);
+
+	        margin = formatUtil.normalizeCssArray(margin || 0);
+
+	        return {
+	            width: Math.max(x2 - x - margin[1] - margin[3], 0),
+	            height: Math.max(y2 - y - margin[0] - margin[2], 0)
+	        };
+	    };
+
+	    /**
+	     * Parse position info.
+	     *
+	     * @param {Object} positionInfo
+	     * @param {number|string} [positionInfo.left]
+	     * @param {number|string} [positionInfo.top]
+	     * @param {number|string} [positionInfo.right]
+	     * @param {number|string} [positionInfo.bottom]
+	     * @param {number|string} [positionInfo.width]
+	     * @param {number|string} [positionInfo.height]
+	     * @param {number|string} [positionInfo.aspect] Aspect is width / height
+	     * @param {Object} containerRect
+	     * @param {string|number} [margin]
+	     *
+	     * @return {module:zrender/core/BoundingRect}
+	     */
+	    layout.getLayoutRect = function (
+	        positionInfo, containerRect, margin
+	    ) {
+	        margin = formatUtil.normalizeCssArray(margin || 0);
+
+	        var containerWidth = containerRect.width;
+	        var containerHeight = containerRect.height;
+
+	        var left = parsePercent(positionInfo.left, containerWidth);
+	        var top = parsePercent(positionInfo.top, containerHeight);
+	        var right = parsePercent(positionInfo.right, containerWidth);
+	        var bottom = parsePercent(positionInfo.bottom, containerHeight);
+	        var width = parsePercent(positionInfo.width, containerWidth);
+	        var height = parsePercent(positionInfo.height, containerHeight);
+
+	        var verticalMargin = margin[2] + margin[0];
+	        var horizontalMargin = margin[1] + margin[3];
+	        var aspect = positionInfo.aspect;
+
+	        // If width is not specified, calculate width from left and right
+	        if (isNaN(width)) {
+	            width = containerWidth - right - horizontalMargin - left;
+	        }
+	        if (isNaN(height)) {
+	            height = containerHeight - bottom - verticalMargin - top;
+	        }
+
+	        // If width and height are not given
+	        // 1. Graph should not exceeds the container
+	        // 2. Aspect must be keeped
+	        // 3. Graph should take the space as more as possible
+	        if (isNaN(width) && isNaN(height)) {
+	            if (aspect > containerWidth / containerHeight) {
+	                width = containerWidth * 0.8;
+	            }
+	            else {
+	                height = containerHeight * 0.8;
+	            }
+	        }
+
+	        if (aspect != null) {
+	            // Calculate width or height with given aspect
+	            if (isNaN(width)) {
+	                width = aspect * height;
+	            }
+	            if (isNaN(height)) {
+	                height = width / aspect;
+	            }
+	        }
+
+	        // If left is not specified, calculate left from right and width
+	        if (isNaN(left)) {
+	            left = containerWidth - right - width - horizontalMargin;
+	        }
+	        if (isNaN(top)) {
+	            top = containerHeight - bottom - height - verticalMargin;
+	        }
+
+	        // Align left and top
+	        switch (positionInfo.left || positionInfo.right) {
+	            case 'center':
+	                left = containerWidth / 2 - width / 2 - margin[3];
+	                break;
+	            case 'right':
+	                left = containerWidth - width - horizontalMargin;
+	                break;
+	        }
+	        switch (positionInfo.top || positionInfo.bottom) {
+	            case 'middle':
+	            case 'center':
+	                top = containerHeight / 2 - height / 2 - margin[0];
+	                break;
+	            case 'bottom':
+	                top = containerHeight - height - verticalMargin;
+	                break;
+	        }
+	        // If something is wrong and left, top, width, height are calculated as NaN
+	        left = left || 0;
+	        top = top || 0;
+	        if (isNaN(width)) {
+	            // Width may be NaN if only one value is given except width
+	            width = containerWidth - left - (right || 0);
+	        }
+	        if (isNaN(height)) {
+	            // Height may be NaN if only one value is given except height
+	            height = containerHeight - top - (bottom || 0);
+	        }
+
+	        var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);
+	        rect.margin = margin;
+	        return rect;
+	    };
+
+
+	    /**
+	     * Position a zr element in viewport
+	     *  Group position is specified by either
+	     *  {left, top}, {right, bottom}
+	     *  If all properties exists, right and bottom will be igonred.
+	     *
+	     * Logic:
+	     *     1. Scale (against origin point in parent coord)
+	     *     2. Rotate (against origin point in parent coord)
+	     *     3. Traslate (with el.position by this method)
+	     * So this method only fixes the last step 'Traslate', which does not affect
+	     * scaling and rotating.
+	     *
+	     * If be called repeatly with the same input el, the same result will be gotten.
+	     *
+	     * @param {module:zrender/Element} el Should have `getBoundingRect` method.
+	     * @param {Object} positionInfo
+	     * @param {number|string} [positionInfo.left]
+	     * @param {number|string} [positionInfo.top]
+	     * @param {number|string} [positionInfo.right]
+	     * @param {number|string} [positionInfo.bottom]
+	     * @param {Object} containerRect
+	     * @param {string|number} margin
+	     * @param {Object} [opt]
+	     * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.
+	     * @param {Array.<number>} [opt.boundingMode='all']
+	     *        Specify how to calculate boundingRect when locating.
+	     *        'all': Position the boundingRect that is transformed and uioned
+	     *               both itself and its descendants.
+	     *               This mode simplies confine the elements in the bounding
+	     *               of their container (e.g., using 'right: 0').
+	     *        'raw': Position the boundingRect that is not transformed and only itself.
+	     *               This mode is useful when you want a element can overflow its
+	     *               container. (Consider a rotated circle needs to be located in a corner.)
+	     *               In this mode positionInfo.width/height can only be number.
+	     */
+	    layout.positionElement = function (el, positionInfo, containerRect, margin, opt) {
+	        var h = !opt || !opt.hv || opt.hv[0];
+	        var v = !opt || !opt.hv || opt.hv[1];
+	        var boundingMode = opt && opt.boundingMode || 'all';
+
+	        if (!h && !v) {
+	            return;
+	        }
+
+	        var rect;
+	        if (boundingMode === 'raw') {
+	            rect = el.type === 'group'
+	                ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0)
+	                : el.getBoundingRect();
+	        }
+	        else {
+	            rect = el.getBoundingRect();
+	            if (el.needLocalTransform()) {
+	                var transform = el.getLocalTransform();
+	                // Notice: raw rect may be inner object of el,
+	                // which should not be modified.
+	                rect = rect.clone();
+	                rect.applyTransform(transform);
+	            }
+	        }
+
+	        positionInfo = layout.getLayoutRect(
+	            zrUtil.defaults(
+	                {width: rect.width, height: rect.height},
+	                positionInfo
+	            ),
+	            containerRect,
+	            margin
+	        );
+
+	        // Because 'tranlate' is the last step in transform
+	        // (see zrender/core/Transformable#getLocalTransfrom),
+	        // we can just only modify el.position to get final result.
+	        var elPos = el.position;
+	        var dx = h ? positionInfo.x - rect.x : 0;
+	        var dy = v ? positionInfo.y - rect.y : 0;
+
+	        el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);
+	    };
+
+	    /**
+	     * @param {Object} option Contains some of the properties in HV_NAMES.
+	     * @param {number} hvIdx 0: horizontal; 1: vertical.
+	     */
+	    layout.sizeCalculable = function (option, hvIdx) {
+	        return option[HV_NAMES[hvIdx][0]] != null
+	            || (option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null);
+	    };
+
+	    /**
+	     * Consider Case:
+	     * When defulat option has {left: 0, width: 100}, and we set {right: 0}
+	     * through setOption or media query, using normal zrUtil.merge will cause
+	     * {right: 0} does not take effect.
+	     *
+	     * @example
+	     * ComponentModel.extend({
+	     *     init: function () {
+	     *         ...
+	     *         var inputPositionParams = layout.getLayoutParams(option);
+	     *         this.mergeOption(inputPositionParams);
+	     *     },
+	     *     mergeOption: function (newOption) {
+	     *         newOption && zrUtil.merge(thisOption, newOption, true);
+	     *         layout.mergeLayoutParam(thisOption, newOption);
+	     *     }
+	     * });
+	     *
+	     * @param {Object} targetOption
+	     * @param {Object} newOption
+	     * @param {Object|string} [opt]
+	     * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Some component must has width and height.
+	     */
+	    layout.mergeLayoutParam = function (targetOption, newOption, opt) {
+	        !zrUtil.isObject(opt) && (opt = {});
+
+	        var ignoreSize = opt.ignoreSize;
+	        !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);
+
+	        var hResult = merge(HV_NAMES[0], 0);
+	        var vResult = merge(HV_NAMES[1], 1);
+
+	        copy(HV_NAMES[0], targetOption, hResult);
+	        copy(HV_NAMES[1], targetOption, vResult);
+
+	        function merge(names, hvIdx) {
+	            var newParams = {};
+	            var newValueCount = 0;
+	            var merged = {};
+	            var mergedValueCount = 0;
+	            var enoughParamNumber = 2;
+
+	            each(names, function (name) {
+	                merged[name] = targetOption[name];
+	            });
+	            each(names, function (name) {
+	                // Consider case: newOption.width is null, which is
+	                // set by user for removing width setting.
+	                hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);
+	                hasValue(newParams, name) && newValueCount++;
+	                hasValue(merged, name) && mergedValueCount++;
+	            });
+
+	            if (ignoreSize[hvIdx]) {
+	                // Only one of left/right is premitted to exist.
+	                if (hasValue(newOption, names[1])) {
+	                    merged[names[2]] = null;
+	                }
+	                else if (hasValue(newOption, names[2])) {
+	                    merged[names[1]] = null;
+	                }
+	                return merged;
+	            }
+
+	            // Case: newOption: {width: ..., right: ...},
+	            // or targetOption: {right: ...} and newOption: {width: ...},
+	            // There is no conflict when merged only has params count
+	            // little than enoughParamNumber.
+	            if (mergedValueCount === enoughParamNumber || !newValueCount) {
+	                return merged;
+	            }
+	            // Case: newOption: {width: ..., right: ...},
+	            // Than we can make sure user only want those two, and ignore
+	            // all origin params in targetOption.
+	            else if (newValueCount >= enoughParamNumber) {
+	                return newParams;
+	            }
+	            else {
+	                // Chose another param from targetOption by priority.
+	                for (var i = 0; i < names.length; i++) {
+	                    var name = names[i];
+	                    if (!hasProp(newParams, name) && hasProp(targetOption, name)) {
+	                        newParams[name] = targetOption[name];
+	                        break;
+	                    }
+	                }
+	                return newParams;
+	            }
+	        }
+
+	        function hasProp(obj, name) {
+	            return obj.hasOwnProperty(name);
+	        }
+
+	        function hasValue(obj, name) {
+	            return obj[name] != null && obj[name] !== 'auto';
+	        }
+
+	        function copy(names, target, source) {
+	            each(names, function (name) {
+	                target[name] = source[name];
+	            });
+	        }
+	    };
+
+	    /**
+	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+	     * @param {Object} source
+	     * @return {Object} Result contains those props.
+	     */
+	    layout.getLayoutParams = function (source) {
+	        return layout.copyLayoutParams({}, source);
+	    };
+
+	    /**
+	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+	     * @param {Object} source
+	     * @return {Object} Result contains those props.
+	     */
+	    layout.copyLayoutParams = function (target, source) {
+	        source && target && each(LOCATION_PARAMS, function (name) {
+	            source.hasOwnProperty(name) && (target[name] = source[name]);
+	        });
+	        return target;
+	    };
+
+	    module.exports = layout;
+
+
+
+/***/ },
+/* 72 */
+/***/ function(module, exports) {
+
+	
+
+	    module.exports = {
+	        getBoxLayoutParams: function () {
+	            return {
+	                left: this.get('left'),
+	                top: this.get('top'),
+	                right: this.get('right'),
+	                bottom: this.get('bottom'),
+	                width: this.get('width'),
+	                height: this.get('height')
+	            };
+	        }
+	    };
+
+
+/***/ },
+/* 73 */
+/***/ function(module, exports) {
+
+	
+	    var platform = '';
+	    // Navigator not exists in node
+	    if (typeof navigator !== 'undefined') {
+	        platform = navigator.platform || '';
+	    }
+	    module.exports = {
+	        // 全图默认背景
+	        // backgroundColor: 'rgba(0,0,0,0)',
+
+	        // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization
+	        // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'],
+	        // 浅色
+	        // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'],
+	        // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'],
+	        // 深色
+	        color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83',  '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'],
+
+	        // 默认需要 Grid 配置项
+	        // grid: {},
+	        // 主题，主题
+	        textStyle: {
+	            // color: '#000',
+	            // decoration: 'none',
+	            // PENDING
+	            fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',
+	            // fontFamily: 'Arial, Verdana, sans-serif',
+	            fontSize: 12,
+	            fontStyle: 'normal',
+	            fontWeight: 'normal'
+	        },
+
+	        // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/
+	        // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
+	        // Default is source-over
+	        blendMode: null,
+
+	        animation: 'auto',
+	        animationDuration: 1000,
+	        animationDurationUpdate: 300,
+	        animationEasing: 'exponentialOut',
+	        animationEasingUpdate: 'cubicOut',
+
+	        animationThreshold: 2000,
+	        // Configuration for progressive/incremental rendering
+	        progressiveThreshold: 3000,
+	        progressive: 400,
+
+	        // Threshold of if use single hover layer to optimize.
+	        // It is recommended that `hoverLayerThreshold` is equivalent to or less than
+	        // `progressiveThreshold`, otherwise hover will cause restart of progressive,
+	        // which is unexpected.
+	        // see example <echarts/test/heatmap-large.html>.
+	        hoverLayerThreshold: 3000,
+
+	        // See: module:echarts/scale/Time
+	        useUTC: false
+	    };
+
+
+/***/ },
+/* 74 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var classUtil = __webpack_require__(13);
+	    var set = classUtil.set;
+	    var get = classUtil.get;
+
+	    module.exports = {
+	        clearColorPalette: function () {
+	            set(this, 'colorIdx', 0);
+	            set(this, 'colorNameMap', {});
+	        },
+
+	        getColorFromPalette: function (name, scope) {
+	            scope = scope || this;
+	            var colorIdx = get(scope, 'colorIdx') || 0;
+	            var colorNameMap = get(scope, 'colorNameMap') || set(scope, 'colorNameMap', {});
+	            // Use `hasOwnProperty` to avoid conflict with Object.prototype.
+	            if (colorNameMap.hasOwnProperty(name)) {
+	                return colorNameMap[name];
+	            }
+	            var colorPalette = this.get('color', true) || [];
+	            if (!colorPalette.length) {
+	                return;
+	            }
+
+	            var color = colorPalette[colorIdx];
+	            if (name) {
+	                colorNameMap[name] = color;
+	            }
+	            set(scope, 'colorIdx', (colorIdx + 1) % colorPalette.length);
+
+	            return color;
+	        }
+	    };
+
+
+/***/ },
+/* 75 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+
+	    var echartsAPIList = [
+	        'getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed',
+	        'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption',
+	        'getViewOfComponentModel', 'getViewOfSeriesModel'
+	    ];
+	    // And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js
+
+	    function ExtensionAPI(chartInstance) {
+	        zrUtil.each(echartsAPIList, function (name) {
+	            this[name] = zrUtil.bind(chartInstance[name], chartInstance);
+	        }, this);
+	    }
+
+	    module.exports = ExtensionAPI;
+
+
+/***/ },
+/* 76 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+
+	    var coordinateSystemCreators = {};
+
+	    function CoordinateSystemManager() {
+
+	        this._coordinateSystems = [];
+	    }
+
+	    CoordinateSystemManager.prototype = {
+
+	        constructor: CoordinateSystemManager,
+
+	        create: function (ecModel, api) {
+	            var coordinateSystems = [];
+	            zrUtil.each(coordinateSystemCreators, function (creater, type) {
+	                var list = creater.create(ecModel, api);
+	                coordinateSystems = coordinateSystems.concat(list || []);
+	            });
+
+	            this._coordinateSystems = coordinateSystems;
+	        },
+
+	        update: function (ecModel, api) {
+	            zrUtil.each(this._coordinateSystems, function (coordSys) {
+	                // FIXME MUST have
+	                coordSys.update && coordSys.update(ecModel, api);
+	            });
+	        },
+
+	        getCoordinateSystems: function () {
+	            return this._coordinateSystems.slice();
+	        }
+	    };
+
+	    CoordinateSystemManager.register = function (type, coordinateSystemCreator) {
+	        coordinateSystemCreators[type] = coordinateSystemCreator;
+	    };
+
+	    CoordinateSystemManager.get = function (type) {
+	        return coordinateSystemCreators[type];
+	    };
+
+	    module.exports = CoordinateSystemManager;
+
+
+/***/ },
+/* 77 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * ECharts option manager
+	 *
+	 * @module {echarts/model/OptionManager}
+	 */
+
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+	    var ComponentModel = __webpack_require__(69);
+	    var each = zrUtil.each;
+	    var clone = zrUtil.clone;
+	    var map = zrUtil.map;
+	    var merge = zrUtil.merge;
+
+	    var QUERY_REG = /^(min|max)?(.+)$/;
+
+	    /**
+	     * TERM EXPLANATIONS:
+	     *
+	     * [option]:
+	     *
+	     *     An object that contains definitions of components. For example:
+	     *     var option = {
+	     *         title: {...},
+	     *         legend: {...},
+	     *         visualMap: {...},
+	     *         series: [
+	     *             {data: [...]},
+	     *             {data: [...]},
+	     *             ...
+	     *         ]
+	     *     };
+	     *
+	     * [rawOption]:
+	     *
+	     *     An object input to echarts.setOption. 'rawOption' may be an
+	     *     'option', or may be an object contains multi-options. For example:
+	     *     var option = {
+	     *         baseOption: {
+	     *             title: {...},
+	     *             legend: {...},
+	     *             series: [
+	     *                 {data: [...]},
+	     *                 {data: [...]},
+	     *                 ...
+	     *             ]
+	     *         },
+	     *         timeline: {...},
+	     *         options: [
+	     *             {title: {...}, series: {data: [...]}},
+	     *             {title: {...}, series: {data: [...]}},
+	     *             ...
+	     *         ],
+	     *         media: [
+	     *             {
+	     *                 query: {maxWidth: 320},
+	     *                 option: {series: {x: 20}, visualMap: {show: false}}
+	     *             },
+	     *             {
+	     *                 query: {minWidth: 320, maxWidth: 720},
+	     *                 option: {series: {x: 500}, visualMap: {show: true}}
+	     *             },
+	     *             {
+	     *                 option: {series: {x: 1200}, visualMap: {show: true}}
+	     *             }
+	     *         ]
+	     *     };
+	     *
+	     * @alias module:echarts/model/OptionManager
+	     * @param {module:echarts/ExtensionAPI} api
+	     */
+	    function OptionManager(api) {
+
+	        /**
+	         * @private
+	         * @type {module:echarts/ExtensionAPI}
+	         */
+	        this._api = api;
+
+	        /**
+	         * @private
+	         * @type {Array.<number>}
+	         */
+	        this._timelineOptions = [];
+
+	        /**
+	         * @private
+	         * @type {Array.<Object>}
+	         */
+	        this._mediaList = [];
+
+	        /**
+	         * @private
+	         * @type {Object}
+	         */
+	        this._mediaDefault;
+
+	        /**
+	         * -1, means default.
+	         * empty means no media.
+	         * @private
+	         * @type {Array.<number>}
+	         */
+	        this._currentMediaIndices = [];
+
+	        /**
+	         * @private
+	         * @type {Object}
+	         */
+	        this._optionBackup;
+
+	        /**
+	         * @private
+	         * @type {Object}
+	         */
+	        this._newBaseOption;
+	    }
+
+	    // timeline.notMerge is not supported in ec3. Firstly there is rearly
+	    // case that notMerge is needed. Secondly supporting 'notMerge' requires
+	    // rawOption cloned and backuped when timeline changed, which does no
+	    // good to performance. What's more, that both timeline and setOption
+	    // method supply 'notMerge' brings complex and some problems.
+	    // Consider this case:
+	    // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);
+	    // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);
+
+	    OptionManager.prototype = {
+
+	        constructor: OptionManager,
+
+	        /**
+	         * @public
+	         * @param {Object} rawOption Raw option.
+	         * @param {module:echarts/model/Global} ecModel
+	         * @param {Array.<Function>} optionPreprocessorFuncs
+	         * @return {Object} Init option
+	         */
+	        setOption: function (rawOption, optionPreprocessorFuncs) {
+	            rawOption = clone(rawOption, true);
+
+	            // FIXME
+	            // 如果 timeline options 或者 media 中设置了某个属性，而baseOption中没有设置，则进行警告。
+
+	            var oldOptionBackup = this._optionBackup;
+	            var newParsedOption = parseRawOption.call(
+	                this, rawOption, optionPreprocessorFuncs, !oldOptionBackup
+	            );
+	            this._newBaseOption = newParsedOption.baseOption;
+
+	            // For setOption at second time (using merge mode);
+	            if (oldOptionBackup) {
+	                // Only baseOption can be merged.
+	                mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption);
+
+	                // For simplicity, timeline options and media options do not support merge,
+	                // that is, if you `setOption` twice and both has timeline options, the latter
+	                // timeline opitons will not be merged to the formers, but just substitude them.
+	                if (newParsedOption.timelineOptions.length) {
+	                    oldOptionBackup.timelineOptions = newParsedOption.timelineOptions;
+	                }
+	                if (newParsedOption.mediaList.length) {
+	                    oldOptionBackup.mediaList = newParsedOption.mediaList;
+	                }
+	                if (newParsedOption.mediaDefault) {
+	                    oldOptionBackup.mediaDefault = newParsedOption.mediaDefault;
+	                }
+	            }
+	            else {
+	                this._optionBackup = newParsedOption;
+	            }
+	        },
+
+	        /**
+	         * @param {boolean} isRecreate
+	         * @return {Object}
+	         */
+	        mountOption: function (isRecreate) {
+	            var optionBackup = this._optionBackup;
+
+	            // TODO
+	            // 如果没有reset功能则不clone。
+
+	            this._timelineOptions = map(optionBackup.timelineOptions, clone);
+	            this._mediaList = map(optionBackup.mediaList, clone);
+	            this._mediaDefault = clone(optionBackup.mediaDefault);
+	            this._currentMediaIndices = [];
+
+	            return clone(isRecreate
+	                // this._optionBackup.baseOption, which is created at the first `setOption`
+	                // called, and is merged into every new option by inner method `mergeOption`
+	                // each time `setOption` called, can be only used in `isRecreate`, because
+	                // its reliability is under suspicion. In other cases option merge is
+	                // performed by `model.mergeOption`.
+	                ? optionBackup.baseOption : this._newBaseOption
+	            );
+	        },
+
+	        /**
+	         * @param {module:echarts/model/Global} ecModel
+	         * @return {Object}
+	         */
+	        getTimelineOption: function (ecModel) {
+	            var option;
+	            var timelineOptions = this._timelineOptions;
+
+	            if (timelineOptions.length) {
+	                // getTimelineOption can only be called after ecModel inited,
+	                // so we can get currentIndex from timelineModel.
+	                var timelineModel = ecModel.getComponent('timeline');
+	                if (timelineModel) {
+	                    option = clone(
+	                        timelineOptions[timelineModel.getCurrentIndex()],
+	                        true
+	                    );
+	                }
+	            }
+
+	            return option;
+	        },
+
+	        /**
+	         * @param {module:echarts/model/Global} ecModel
+	         * @return {Array.<Object>}
+	         */
+	        getMediaOption: function (ecModel) {
+	            var ecWidth = this._api.getWidth();
+	            var ecHeight = this._api.getHeight();
+	            var mediaList = this._mediaList;
+	            var mediaDefault = this._mediaDefault;
+	            var indices = [];
+	            var result = [];
+
+	            // No media defined.
+	            if (!mediaList.length && !mediaDefault) {
+	                return result;
+	            }
+
+	            // Multi media may be applied, the latter defined media has higher priority.
+	            for (var i = 0, len = mediaList.length; i < len; i++) {
+	                if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {
+	                    indices.push(i);
+	                }
+	            }
+
+	            // FIXME
+	            // 是否mediaDefault应该强制用户设置，否则可能修改不能回归。
+	            if (!indices.length && mediaDefault) {
+	                indices = [-1];
+	            }
+
+	            if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {
+	                result = map(indices, function (index) {
+	                    return clone(
+	                        index === -1 ? mediaDefault.option : mediaList[index].option
+	                    );
+	                });
+	            }
+	            // Otherwise return nothing.
+
+	            this._currentMediaIndices = indices;
+
+	            return result;
+	        }
+	    };
+
+	    function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) {
+	        var timelineOptions = [];
+	        var mediaList = [];
+	        var mediaDefault;
+	        var baseOption;
+
+	        // Compatible with ec2.
+	        var timelineOpt = rawOption.timeline;
+
+	        if (rawOption.baseOption) {
+	            baseOption = rawOption.baseOption;
+	        }
+
+	        // For timeline
+	        if (timelineOpt || rawOption.options) {
+	            baseOption = baseOption || {};
+	            timelineOptions = (rawOption.options || []).slice();
+	        }
+
+	        // For media query
+	        if (rawOption.media) {
+	            baseOption = baseOption || {};
+	            var media = rawOption.media;
+	            each(media, function (singleMedia) {
+	                if (singleMedia && singleMedia.option) {
+	                    if (singleMedia.query) {
+	                        mediaList.push(singleMedia);
+	                    }
+	                    else if (!mediaDefault) {
+	                        // Use the first media default.
+	                        mediaDefault = singleMedia;
+	                    }
+	                }
+	            });
+	        }
+
+	        // For normal option
+	        if (!baseOption) {
+	            baseOption = rawOption;
+	        }
+
+	        // Set timelineOpt to baseOption in ec3,
+	        // which is convenient for merge option.
+	        if (!baseOption.timeline) {
+	            baseOption.timeline = timelineOpt;
+	        }
+
+	        // Preprocess.
+	        each([baseOption].concat(timelineOptions)
+	            .concat(zrUtil.map(mediaList, function (media) {
+	                return media.option;
+	            })),
+	            function (option) {
+	                each(optionPreprocessorFuncs, function (preProcess) {
+	                    preProcess(option, isNew);
+	                });
+	            }
+	        );
+
+	        return {
+	            baseOption: baseOption,
+	            timelineOptions: timelineOptions,
+	            mediaDefault: mediaDefault,
+	            mediaList: mediaList
+	        };
+	    }
+
+	    /**
+	     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
+	     * Support: width, height, aspectRatio
+	     * Can use max or min as prefix.
+	     */
+	    function applyMediaQuery(query, ecWidth, ecHeight) {
+	        var realMap = {
+	            width: ecWidth,
+	            height: ecHeight,
+	            aspectratio: ecWidth / ecHeight // lowser case for convenientce.
+	        };
+
+	        var applicatable = true;
+
+	        zrUtil.each(query, function (value, attr) {
+	            var matched = attr.match(QUERY_REG);
+
+	            if (!matched || !matched[1] || !matched[2]) {
+	                return;
+	            }
+
+	            var operator = matched[1];
+	            var realAttr = matched[2].toLowerCase();
+
+	            if (!compare(realMap[realAttr], value, operator)) {
+	                applicatable = false;
+	            }
+	        });
+
+	        return applicatable;
+	    }
+
+	    function compare(real, expect, operator) {
+	        if (operator === 'min') {
+	            return real >= expect;
+	        }
+	        else if (operator === 'max') {
+	            return real <= expect;
+	        }
+	        else { // Equals
+	            return real === expect;
+	        }
+	    }
+
+	    function indicesEquals(indices1, indices2) {
+	        // indices is always order by asc and has only finite number.
+	        return indices1.join(',') === indices2.join(',');
+	    }
+
+	    /**
+	     * Consider case:
+	     * `chart.setOption(opt1);`
+	     * Then user do some interaction like dataZoom, dataView changing.
+	     * `chart.setOption(opt2);`
+	     * Then user press 'reset button' in toolbox.
+	     *
+	     * After doing that all of the interaction effects should be reset, the
+	     * chart should be the same as the result of invoke
+	     * `chart.setOption(opt1); chart.setOption(opt2);`.
+	     *
+	     * Although it is not able ensure that
+	     * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to
+	     * `chart.setOption(merge(opt1, opt2));` exactly,
+	     * this might be the only simple way to implement that feature.
+	     *
+	     * MEMO: We've considered some other approaches:
+	     * 1. Each model handle its self restoration but not uniform treatment.
+	     *     (Too complex in logic and error-prone)
+	     * 2. Use a shadow ecModel. (Performace expensive)
+	     */
+	    function mergeOption(oldOption, newOption) {
+	        newOption = newOption || {};
+
+	        each(newOption, function (newCptOpt, mainType) {
+	            if (newCptOpt == null) {
+	                return;
+	            }
+
+	            var oldCptOpt = oldOption[mainType];
+
+	            if (!ComponentModel.hasClass(mainType)) {
+	                oldOption[mainType] = merge(oldCptOpt, newCptOpt, true);
+	            }
+	            else {
+	                newCptOpt = modelUtil.normalizeToArray(newCptOpt);
+	                oldCptOpt = modelUtil.normalizeToArray(oldCptOpt);
+
+	                var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt);
+
+	                oldOption[mainType] = map(mapResult, function (item) {
+	                    return (item.option && item.exist)
+	                        ? merge(item.exist, item.option, true)
+	                        : (item.exist || item.option);
+	                });
+	            }
+	        });
+	    }
+
+	    module.exports = OptionManager;
+
+
+/***/ },
+/* 78 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var formatUtil = __webpack_require__(6);
+	    var classUtil = __webpack_require__(13);
+	    var modelUtil = __webpack_require__(5);
+	    var ComponentModel = __webpack_require__(69);
+	    var colorPaletteMixin = __webpack_require__(74);
+	    var env = __webpack_require__(2);
+	    var layout = __webpack_require__(71);
+
+	    var set = classUtil.set;
+	    var get = classUtil.get;
+	    var encodeHTML = formatUtil.encodeHTML;
+	    var addCommas = formatUtil.addCommas;
+
+	    var SeriesModel = ComponentModel.extend({
+
+	        type: 'series.__base__',
+
+	        /**
+	         * @readOnly
+	         */
+	        seriesIndex: 0,
+
+	        // coodinateSystem will be injected in the echarts/CoordinateSystem
+	        coordinateSystem: null,
+
+	        /**
+	         * @type {Object}
+	         * @protected
+	         */
+	        defaultOption: null,
+
+	        /**
+	         * Data provided for legend
+	         * @type {Function}
+	         */
+	        // PENDING
+	        legendDataProvider: null,
+
+	        /**
+	         * Access path of color for visual
+	         */
+	        visualColorAccessPath: 'itemStyle.normal.color',
+
+	        /**
+	         * Support merge layout params.
+	         * Only support 'box' now (left/right/top/bottom/width/height).
+	         * @type {string|Object} Object can be {ignoreSize: true}
+	         * @readOnly
+	         */
+	        layoutMode: null,
+
+	        init: function (option, parentModel, ecModel, extraOpt) {
+
+	            /**
+	             * @type {number}
+	             * @readOnly
+	             */
+	            this.seriesIndex = this.componentIndex;
+
+	            this.mergeDefaultAndTheme(option, ecModel);
+
+	            var data = this.getInitialData(option, ecModel);
+	            if (true) {
+	                zrUtil.assert(data, 'getInitialData returned invalid data.');
+	            }
+	            /**
+	             * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph}
+	             * @private
+	             */
+	            set(this, 'dataBeforeProcessed', data);
+
+	            // If we reverse the order (make data firstly, and then make
+	            // dataBeforeProcessed by cloneShallow), cloneShallow will
+	            // cause data.graph.data !== data when using
+	            // module:echarts/data/Graph or module:echarts/data/Tree.
+	            // See module:echarts/data/helper/linkList
+	            this.restoreData();
+	        },
+
+	        /**
+	         * Util for merge default and theme to option
+	         * @param  {Object} option
+	         * @param  {module:echarts/model/Global} ecModel
+	         */
+	        mergeDefaultAndTheme: function (option, ecModel) {
+	            var layoutMode = this.layoutMode;
+	            var inputPositionParams = layoutMode
+	                ? layout.getLayoutParams(option) : {};
+
+	            zrUtil.merge(
+	                option,
+	                ecModel.getTheme().get(this.subType)
+	            );
+	            zrUtil.merge(option, this.getDefaultOption());
+
+	            // Default label emphasis `position` and `show`
+	            // FIXME Set label in mergeOption
+	            modelUtil.defaultEmphasis(option.label, modelUtil.LABEL_OPTIONS);
+
+	            this.fillDataTextStyle(option.data);
+
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
+	            }
+	        },
+
+	        mergeOption: function (newSeriesOption, ecModel) {
+	            newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);
+	            this.fillDataTextStyle(newSeriesOption.data);
+
+	            var layoutMode = this.layoutMode;
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(this.option, newSeriesOption, layoutMode);
+	            }
+
+	            var data = this.getInitialData(newSeriesOption, ecModel);
+	            // TODO Merge data?
+	            if (data) {
+	                set(this, 'data', data);
+	                set(this, 'dataBeforeProcessed', data.cloneShallow());
+	            }
+	        },
+
+	        fillDataTextStyle: function (data) {
+	            // Default data label emphasis `position` and `show`
+	            // FIXME Tree structure data ?
+	            // FIXME Performance ?
+	            if (data) {
+	                for (var i = 0; i < data.length; i++) {
+	                    if (data[i] && data[i].label) {
+	                        modelUtil.defaultEmphasis(data[i].label, modelUtil.LABEL_OPTIONS);
+	                    }
+	                }
+	            }
+	        },
+
+	        /**
+	         * Init a data structure from data related option in series
+	         * Must be overwritten
+	         */
+	        getInitialData: function () {},
+
+	        /**
+	         * @param {string} [dataType]
+	         * @return {module:echarts/data/List}
+	         */
+	        getData: function (dataType) {
+	            var data = get(this, 'data');
+	            return dataType == null ? data : data.getLinkedData(dataType);
+	        },
+
+	        /**
+	         * @param {module:echarts/data/List} data
+	         */
+	        setData: function (data) {
+	            set(this, 'data', data);
+	        },
+
+	        /**
+	         * Get data before processed
+	         * @return {module:echarts/data/List}
+	         */
+	        getRawData: function () {
+	            return get(this, 'dataBeforeProcessed');
+	        },
+
+	        /**
+	         * Coord dimension to data dimension.
+	         *
+	         * By default the result is the same as dimensions of series data.
+	         * But in some series data dimensions are different from coord dimensions (i.e.
+	         * candlestick and boxplot). Override this method to handle those cases.
+	         *
+	         * Coord dimension to data dimension can be one-to-many
+	         *
+	         * @param {string} coordDim
+	         * @return {Array.<string>} dimensions on the axis.
+	         */
+	        coordDimToDataDim: function (coordDim) {
+	            return modelUtil.coordDimToDataDim(this.getData(), coordDim);
+	        },
+
+	        /**
+	         * Convert data dimension to coord dimension.
+	         *
+	         * @param {string|number} dataDim
+	         * @return {string}
+	         */
+	        dataDimToCoordDim: function (dataDim) {
+	            return modelUtil.dataDimToCoordDim(this.getData(), dataDim);
+	        },
+
+	        /**
+	         * Get base axis if has coordinate system and has axis.
+	         * By default use coordSys.getBaseAxis();
+	         * Can be overrided for some chart.
+	         * @return {type} description
+	         */
+	        getBaseAxis: function () {
+	            var coordSys = this.coordinateSystem;
+	            return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
+	        },
+
+	        // FIXME
+	        /**
+	         * Default tooltip formatter
+	         *
+	         * @param {number} dataIndex
+	         * @param {boolean} [multipleSeries=false]
+	         * @param {number} [dataType]
+	         */
+	        formatTooltip: function (dataIndex, multipleSeries, dataType) {
+	            function formatArrayValue(value) {
+	                var vertially = zrUtil.reduce(value, function (vertially, val, idx) {
+	                    var dimItem = data.getDimensionInfo(idx);
+	                    return vertially |= dimItem.tooltip !== false && dimItem.tooltipName != null;
+	                }, 0);
+
+	                var result = [];
+	                var tooltipDims = modelUtil.otherDimToDataDim(data, 'tooltip');
+
+	                tooltipDims.length
+	                    ? zrUtil.each(tooltipDims, function (dimIdx) {
+	                        setEachItem(data.get(dimIdx, dataIndex), dimIdx);
+	                    })
+	                    // By default, all dims is used on tooltip.
+	                    : zrUtil.each(value, setEachItem);
+
+	                function setEachItem(val, dimIdx) {
+	                    var dimInfo = data.getDimensionInfo(dimIdx);
+	                    // If `dimInfo.tooltip` is not set, show tooltip.
+	                    if (!dimInfo || dimInfo.otherDims.tooltip === false) {
+	                        return;
+	                    }
+	                    var dimType = dimInfo.type;
+	                    var valStr = (vertially ? '- ' + (dimInfo.tooltipName || dimInfo.name) + ': ' : '')
+	                        + (dimType === 'ordinal'
+	                            ? val + ''
+	                            : dimType === 'time'
+	                            ? (multipleSeries ? '' : formatUtil.formatTime('yyyy/MM/dd hh:mm:ss', val))
+	                            : addCommas(val)
+	                        );
+	                    valStr && result.push(encodeHTML(valStr));
+	                }
+
+	                return (vertially ? '<br/>' : '') + result.join(vertially ? '<br/>' : ', ');
+	            }
+
+	            var data = get(this, 'data');
+
+	            var value = this.getRawValue(dataIndex);
+	            var formattedValue = zrUtil.isArray(value)
+	                ? formatArrayValue(value) : encodeHTML(addCommas(value));
+	            var name = data.getName(dataIndex);
+
+	            var color = data.getItemVisual(dataIndex, 'color');
+	            if (zrUtil.isObject(color) && color.colorStops) {
+	                color = (color.colorStops[0] || {}).color;
+	            }
+	            color = color || 'transparent';
+
+	            var colorEl = formatUtil.getTooltipMarker(color);
+
+	            var seriesName = this.name;
+	            // FIXME
+	            if (seriesName === '\0-') {
+	                // Not show '-'
+	                seriesName = '';
+	            }
+	            seriesName = seriesName
+	                ? encodeHTML(seriesName) + (!multipleSeries ? '<br/>' : ': ')
+	                : '';
+	            return !multipleSeries
+	                ? seriesName + colorEl
+	                    + (name
+	                        ? encodeHTML(name) + ': ' + formattedValue
+	                        : formattedValue
+	                    )
+	                : colorEl + seriesName + formattedValue;
+	        },
+
+	        /**
+	         * @return {boolean}
+	         */
+	        isAnimationEnabled: function () {
+	            if (env.node) {
+	                return false;
+	            }
+
+	            var animationEnabled = this.getShallow('animation');
+	            if (animationEnabled) {
+	                if (this.getData().count() > this.getShallow('animationThreshold')) {
+	                    animationEnabled = false;
+	                }
+	            }
+	            return animationEnabled;
+	        },
+
+	        restoreData: function () {
+	            set(this, 'data', get(this, 'dataBeforeProcessed').cloneShallow());
+	        },
+
+	        getColorFromPalette: function (name, scope) {
+	            var ecModel = this.ecModel;
+	            // PENDING
+	            var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope);
+	            if (!color) {
+	                color = ecModel.getColorFromPalette(name, scope);
+	            }
+	            return color;
+	        },
+
+	        /**
+	         * Get data indices for show tooltip content. See tooltip.
+	         * @abstract
+	         * @param {Array.<string>|string} dim
+	         * @param {Array.<number>} value
+	         * @param {module:echarts/coord/single/SingleAxis} baseAxis
+	         * @return {Object} {dataIndices, nestestValue}.
+	         */
+	        getAxisTooltipData: null,
+
+	        /**
+	         * See tooltip.
+	         * @abstract
+	         * @param {number} dataIndex
+	         * @return {Array.<number>} Point of tooltip. null/undefined can be returned.
+	         */
+	        getTooltipPosition: null
+	    });
+
+	    zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin);
+	    zrUtil.mixin(SeriesModel, colorPaletteMixin);
+
+	    module.exports = SeriesModel;
+
+
+/***/ },
+/* 79 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var Group = __webpack_require__(48);
+	    var componentUtil = __webpack_require__(70);
+	    var clazzUtil = __webpack_require__(13);
+
+	    var Component = function () {
+	        /**
+	         * @type {module:zrender/container/Group}
+	         * @readOnly
+	         */
+	        this.group = new Group();
+
+	        /**
+	         * @type {string}
+	         * @readOnly
+	         */
+	        this.uid = componentUtil.getUID('viewComponent');
+	    };
+
+	    Component.prototype = {
+
+	        constructor: Component,
+
+	        init: function (ecModel, api) {},
+
+	        render: function (componentModel, ecModel, api, payload) {},
+
+	        dispose: function () {}
+
+	    };
+
+	    var componentProto = Component.prototype;
+	    componentProto.updateView
+	        = componentProto.updateLayout
+	        = componentProto.updateVisual
+	        = function (seriesModel, ecModel, api, payload) {
+	            // Do nothing;
+	        };
+	    // Enable Component.extend.
+	    clazzUtil.enableClassExtend(Component);
+
+	    // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+	    clazzUtil.enableClassManagement(Component, {registerWhenExtend: true});
+
+	    module.exports = Component;
+
+
+/***/ },
+/* 80 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var Group = __webpack_require__(48);
+	    var componentUtil = __webpack_require__(70);
+	    var clazzUtil = __webpack_require__(13);
+	    var modelUtil = __webpack_require__(5);
+	    var zrUtil = __webpack_require__(4);
+
+	    function Chart() {
+
+	        /**
+	         * @type {module:zrender/container/Group}
+	         * @readOnly
+	         */
+	        this.group = new Group();
+
+	        /**
+	         * @type {string}
+	         * @readOnly
+	         */
+	        this.uid = componentUtil.getUID('viewChart');
+	    }
+
+	    Chart.prototype = {
+
+	        type: 'chart',
+
+	        /**
+	         * Init the chart
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         */
+	        init: function (ecModel, api) {},
+
+	        /**
+	         * Render the chart
+	         * @param  {module:echarts/model/Series} seriesModel
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         * @param  {Object} payload
+	         */
+	        render: function (seriesModel, ecModel, api, payload) {},
+
+	        /**
+	         * Highlight series or specified data item
+	         * @param  {module:echarts/model/Series} seriesModel
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         * @param  {Object} payload
+	         */
+	        highlight: function (seriesModel, ecModel, api, payload) {
+	            toggleHighlight(seriesModel.getData(), payload, 'emphasis');
+	        },
+
+	        /**
+	         * Downplay series or specified data item
+	         * @param  {module:echarts/model/Series} seriesModel
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         * @param  {Object} payload
+	         */
+	        downplay: function (seriesModel, ecModel, api, payload) {
+	            toggleHighlight(seriesModel.getData(), payload, 'normal');
+	        },
+
+	        /**
+	         * Remove self
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         */
+	        remove: function (ecModel, api) {
+	            this.group.removeAll();
+	        },
+
+	        /**
+	         * Dispose self
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         */
+	        dispose: function () {}
+
+	        /**
+	         * The view contains the given point.
+	         * @interface
+	         * @param {Array.<number>} point
+	         * @return {boolean}
+	         */
+	        // containPoint: function () {}
+
+	    };
+
+	    var chartProto = Chart.prototype;
+	    chartProto.updateView
+	        = chartProto.updateLayout
+	        = chartProto.updateVisual
+	        = function (seriesModel, ecModel, api, payload) {
+	            this.render(seriesModel, ecModel, api, payload);
+	        };
+
+	    /**
+	     * Set state of single element
+	     * @param  {module:zrender/Element} el
+	     * @param  {string} state
+	     */
+	    function elSetState(el, state) {
+	        if (el) {
+	            el.trigger(state);
+	            if (el.type === 'group') {
+	                for (var i = 0; i < el.childCount(); i++) {
+	                    elSetState(el.childAt(i), state);
+	                }
+	            }
+	        }
+	    }
+	    /**
+	     * @param  {module:echarts/data/List} data
+	     * @param  {Object} payload
+	     * @param  {string} state 'normal'|'emphasis'
+	     * @inner
+	     */
+	    function toggleHighlight(data, payload, state) {
+	        var dataIndex = modelUtil.queryDataIndex(data, payload);
+
+	        if (dataIndex != null) {
+	            zrUtil.each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {
+	                elSetState(data.getItemGraphicEl(dataIdx), state);
+	            });
+	        }
+	        else {
+	            data.eachItemGraphicEl(function (el) {
+	                elSetState(el, state);
+	            });
+	        }
+	    }
+
+	    // Enable Chart.extend.
+	    clazzUtil.enableClassExtend(Chart, ['dispose']);
+
+	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+	    clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true});
+
+	    module.exports = Chart;
+
+
+/***/ },
 /* 81 */
 /***/ function(module, exports) {
 
@@ -17842,7 +17982,7 @@
 	 */
 	// Global defines
 
-	    var guid = __webpack_require__(32);
+	    var guid = __webpack_require__(24);
 	    var env = __webpack_require__(2);
 	    var zrUtil = __webpack_require__(4);
 
@@ -17864,7 +18004,7 @@
 	    /**
 	     * @type {string}
 	     */
-	    zrender.version = '3.4.4';
+	    zrender.version = '3.5.0';
 
 	    /**
 	     * Initializing a zrender instance
@@ -18282,7 +18422,7 @@
 	    var util = __webpack_require__(4);
 	    var Draggable = __webpack_require__(84);
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 
 	    var SILENT = 'silent';
 
@@ -18567,6 +18707,8 @@
 	            var isSilent;
 	            while (el) {
 	                // If clipped by ancestor.
+	                // FIXME: If clipPath has neither stroke nor fill,
+	                // el.clipPath.contain(x, y) will always return false.
 	                if (el.clipPath && !el.clipPath.contain(x, y))  {
 	                    return false;
 	                }
@@ -18587,6 +18729,7 @@
 	    module.exports = Handler;
 
 
+
 /***/ },
 /* 84 */
 /***/ function(module, exports) {
@@ -18696,7 +18839,7 @@
 	    var util = __webpack_require__(4);
 	    var env = __webpack_require__(2);
 
-	    var Group = __webpack_require__(30);
+	    var Group = __webpack_require__(48);
 
 	    // Use timsort because in most case elements are partially sorted
 	    // https://jsfiddle.net/pissang/jr4x7mdm/8/
@@ -19639,7 +19782,7 @@
 
 	    var requestAnimationFrame = __webpack_require__(89);
 
-	    var Animator = __webpack_require__(36);
+	    var Animator = __webpack_require__(28);
 	    /**
 	     * @typedef {Object} IZRenderStage
 	     * @property {Function} update
@@ -19890,7 +20033,7 @@
 	 */
 
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var env = __webpack_require__(2);
 
 	    var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener;
@@ -20054,7 +20197,7 @@
 
 	    var eventTool = __webpack_require__(88);
 	    var zrUtil = __webpack_require__(4);
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var env = __webpack_require__(2);
 	    var GestureMgr = __webpack_require__(91);
 
@@ -20570,9 +20713,9 @@
 	 */
 	 
 
-	    var config = __webpack_require__(42);
+	    var config = __webpack_require__(34);
 	    var util = __webpack_require__(4);
-	    var log = __webpack_require__(41);
+	    var log = __webpack_require__(33);
 	    var BoundingRect = __webpack_require__(9);
 	    var timsort = __webpack_require__(86);
 
@@ -21533,11 +21676,41 @@
 	            var displayList = this.storage.getDisplayList(true);
 
 	            var scope = {};
+	            var zlevel;
+
+	            var self = this;
+	            function findAndDrawOtherLayer(smaller, larger) {
+	                var zlevelList = self._zlevelList;
+	                if (smaller == null) {
+	                    smaller = -Infinity;
+	                }
+	                var intermediateLayer;
+	                for (var i = 0; i < zlevelList.length; i++) {
+	                    var z = zlevelList[i];
+	                    var layer = self._layers[z];
+	                    if (!layer.__builtin__ && z > smaller && z < larger) {
+	                        intermediateLayer = layer;
+	                        break;
+	                    }
+	                }
+	                if (intermediateLayer && intermediateLayer.renderToCanvas) {
+	                    imageLayer.ctx.save();
+	                    intermediateLayer.renderToCanvas(imageLayer.ctx);
+	                    imageLayer.ctx.restore();
+	                }
+	            }
 	            for (var i = 0; i < displayList.length; i++) {
 	                var el = displayList[i];
+
+	                if (el.zlevel !== zlevel) {
+	                    findAndDrawOtherLayer(zlevel, el.zlevel);
+	                    zlevel = el.zlevel;
+	                }
 	                this._doPaintEl(el, imageLayer, true, scope);
 	            }
 
+	            findAndDrawOtherLayer(zlevel, Infinity);
+
 	            return imageLayer.dom;
 	        },
 	        /**
@@ -21614,7 +21787,7 @@
 	                path.brush(ctx);
 	            }
 
-	            var ImageShape = __webpack_require__(62);
+	            var ImageShape = __webpack_require__(49);
 	            var imgShape = new ImageShape({
 	                style: {
 	                    x: 0,
@@ -21654,9 +21827,9 @@
 
 
 	    var util = __webpack_require__(4);
-	    var config = __webpack_require__(42);
-	    var Style = __webpack_require__(48);
-	    var Pattern = __webpack_require__(60);
+	    var config = __webpack_require__(34);
+	    var Style = __webpack_require__(22);
+	    var Pattern = __webpack_require__(46);
 
 	    function returnFalse() {
 	        return false;
@@ -21883,7 +22056,7 @@
 /***/ function(module, exports, __webpack_require__) {
 
 	
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 	    module.exports = function (ecModel) {
 	        function encodeColor(seriesModel) {
 	            var colorAccessPath = (seriesModel.visualColorAccessPath || 'itemStyle.normal.color').split('.');
@@ -22115,7 +22288,7 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var PI = Math.PI;
 	    /**
@@ -22249,7 +22422,7 @@
 	        'stackedOn', 'hasItemOption', '_nameList', '_idList', '_rawData'
 	    ];
 
-	    var transferProperties = function (a, b) {
+	    function transferProperties(a, b) {
 	        zrUtil.each(TRANSFERABLE_PROPERTIES.concat(b.__wrappedMethods || []), function (propName) {
 	            if (b.hasOwnProperty(propName)) {
 	                a[propName] = b[propName];
@@ -22257,6 +22430,19 @@
 	        });
 
 	        a.__wrappedMethods = b.__wrappedMethods;
+	    }
+
+	    function DefaultDataProvider(dataArray) {
+	        this._array = dataArray || [];
+	    }
+
+	    DefaultDataProvider.prototype.pure = false;
+
+	    DefaultDataProvider.prototype.count = function () {
+	        return this._array.length;
+	    };
+	    DefaultDataProvider.prototype.getItem = function (idx) {
+	        return this._array[idx];
 	    };
 
 	    /**
@@ -22281,6 +22467,8 @@
 	                dimensionName = dimensions[i];
 	                dimensionInfo = {
 	                    name: dimensionName,
+	                    coordDim: dimensionName,
+	                    coordDimIndex: 0,
 	                    stackable: false,
 	                    // Type can be 'float', 'int', 'number'
 	                    // Default is number, Precision of float may not enough
@@ -22291,10 +22479,16 @@
 	                dimensionInfo = dimensions[i];
 	                dimensionName = dimensionInfo.name;
 	                dimensionInfo.type = dimensionInfo.type || 'number';
+	                if (!dimensionInfo.coordDim) {
+	                    dimensionInfo.coordDim = dimensionName;
+	                    dimensionInfo.coordDimIndex = 0;
+	                }
 	            }
+	            dimensionInfo.otherDims = dimensionInfo.otherDims || {};
 	            dimensionNames.push(dimensionName);
 	            dimensionInfos[dimensionName] = dimensionInfo;
 	        }
+
 	        /**
 	         * @readOnly
 	         * @type {Array.<string>}
@@ -22340,6 +22534,7 @@
 	         * @type {Array.<string>}
 	         */
 	        this._idList = [];
+
 	        /**
 	         * Models of data option is stored sparse for optimizing memory cost
 	         * @type {Array.<module:echarts/model/Model>}
@@ -22403,6 +22598,7 @@
 	    var listProto = List.prototype;
 
 	    listProto.type = 'list';
+
 	    /**
 	     * If each data item has it's own option
 	     * @type {boolean}
@@ -22422,6 +22618,7 @@
 	        }
 	        return dim;
 	    };
+
 	    /**
 	     * Get type and stackable info of particular dimension
 	     * @param {string|number} dim
@@ -22441,9 +22638,13 @@
 	    listProto.initData = function (data, nameList, dimValueGetter) {
 	        data = data || [];
 
+	        var isDataArray = zrUtil.isArray(data);
+	        if (isDataArray) {
+	            data = new DefaultDataProvider(data);
+	        }
 	        if (true) {
-	            if (!zrUtil.isArray(data)) {
-	                throw new Error('Invalid data.');
+	            if (!isDataArray && (typeof data.getItem != 'function' || typeof data.count != 'function')) {
+	                throw new Error('Inavlid data provider.');
 	            }
 	        }
 
@@ -22454,17 +22655,20 @@
 	        var indices = this.indices = [];
 
 	        var dimensions = this.dimensions;
-	        var size = data.length;
 	        var dimensionInfoMap = this._dimensionInfos;
 
+	        var size = data.count();
+
 	        var idList = [];
 	        var nameRepeatCount = {};
+	        var nameDimIdx;
 
 	        nameList = nameList || [];
 
 	        // Init storage
 	        for (var i = 0; i < dimensions.length; i++) {
 	            var dimInfo = dimensionInfoMap[dimensions[i]];
+	            dimInfo.otherDims.itemName === 0 && (nameDimIdx = i);
 	            var DataCtor = dataCtors[dimInfo.type];
 	            storage[dimensions[i]] = new DataCtor(size);
 	        }
@@ -22489,8 +22693,9 @@
 	            );
 	        };
 
-	        for (var idx = 0; idx < data.length; idx++) {
-	            var dataItem = data[idx];
+	        for (var i = 0; i < size; i++) {
+	            // NOTICE: Try not to write things into dataItem
+	            var dataItem = data.getItem(i);
 	            // Each data item is value
 	            // [1, 2]
 	            // 2
@@ -22503,22 +22708,26 @@
 	                var dim = dimensions[k];
 	                var dimStorage = storage[dim];
 	                // PENDING NULL is empty or zero
-	                dimStorage[idx] = dimValueGetter(dataItem, dim, idx, k);
+	                dimStorage[i] = dimValueGetter(dataItem, dim, i, k);
 	            }
 
-	            indices.push(idx);
+	            indices.push(i);
 	        }
 
 	        // Use the name in option and create id
-	        for (var i = 0; i < data.length; i++) {
-	            if (!nameList[i]) {
-	                if (data[i] && data[i].name != null) {
-	                    nameList[i] = data[i].name;
+	        for (var i = 0; i < size; i++) {
+	            var dataItem = data.getItem(i);
+	            if (!nameList[i] && dataItem) {
+	                if (dataItem.name != null) {
+	                    nameList[i] = dataItem.name;
+	                }
+	                else if (nameDimIdx != null) {
+	                    nameList[i] = storage[dimensions[nameDimIdx]][i];
 	                }
 	            }
 	            var name = nameList[i] || '';
 	            // Try using the id in option
-	            var id = data[i] && data[i].id;
+	            var id = dataItem && dataItem.id;
 
 	            if (!id && name) {
 	                // Use name as id and add counter to avoid same name
@@ -22555,11 +22764,11 @@
 	        var dataIndex = this.indices[idx];
 
 	        // If value not exists
-	        if (dataIndex == null) {
+	        if (dataIndex == null || !storage[dim]) {
 	            return NaN;
 	        }
 
-	        var value = storage[dim] && storage[dim][dataIndex];
+	        var value = storage[dim][dataIndex];
 	        // FIXME ordinal data type is not stackable
 	        if (stack) {
 	            var dimensionInfo = this._dimensionInfos[dim];
@@ -22816,7 +23025,7 @@
 	     * @return {number}
 	     */
 	    listProto.getRawDataItem = function (idx) {
-	        return this._rawData[this.getRawIndex(idx)];
+	        return this._rawData.getItem(this.getRawIndex(idx));
 	    };
 
 	    /**
@@ -22925,7 +23134,10 @@
 	        for (var i = 0; i < indices.length; i++) {
 	            var keep;
 	            // Simple optimization
-	            if (dimSize === 1) {
+	            if (!dimSize) {
+	                keep = cb.call(context, i);
+	            }
+	            else if (dimSize === 1) {
 	                keep = cb.call(
 	                    context, this.get(dimensions[0], i, stack), i
 	                );
@@ -23100,7 +23312,7 @@
 	    listProto.getItemModel = function (idx) {
 	        var hostModel = this.hostModel;
 	        idx = this.indices[idx];
-	        return new Model(this._rawData[idx], hostModel, hostModel && hostModel.ecModel);
+	        return new Model(this._rawData.getItem(idx), hostModel, hostModel && hostModel.ecModel);
 	    };
 
 	    /**
@@ -23217,7 +23429,7 @@
 	     * Get visual property of single data item
 	     * @param {number} idx
 	     * @param {string} key
-	     * @param {boolean} ignoreParent
+	     * @param {boolean} [ignoreParent=false]
 	     */
 	    listProto.getItemVisual = function (idx, key, ignoreParent) {
 	        var itemVisual = this._itemVisuals[idx];
@@ -23475,7 +23687,8 @@
 
 	    function initIndexMap(arr, map, keyArr, keyGetter) {
 	        for (var i = 0; i < arr.length; i++) {
-	            var key = keyGetter(arr[i], i);
+	            // Add prefix to avoid conflict with Object.prototype.
+	            var key = '_ec_' + keyGetter(arr[i], i);
 	            var existence = map[key];
 	            if (existence == null) {
 	                keyArr.push(key);
@@ -23502,6 +23715,7 @@
 	    var numberUtil = __webpack_require__(7);
 	    var linearMap = numberUtil.linearMap;
 	    var zrUtil = __webpack_require__(4);
+	    var axisHelper = __webpack_require__(101);
 
 	    function fixExtentWithBands(extent, nTick) {
 	        var size = extent[1] - extent[0];
@@ -23546,6 +23760,12 @@
 	         * @type {boolean}
 	         */
 	        this.onBand = false;
+
+	        /**
+	         * @private
+	         * @type {number}
+	         */
+	        this._labelInterval;
 	    };
 
 	    Axis.prototype = {
@@ -23578,8 +23798,7 @@
 	         * @return {Array.<number>}
 	         */
 	        getExtent: function () {
-	            var ret = this._extent.slice();
-	            return ret;
+	            return this._extent.slice();
 	        },
 
 	        /**
@@ -23723,6 +23942,32 @@
 	            var size = Math.abs(axisExtent[1] - axisExtent[0]);
 
 	            return Math.abs(size) / len;
+	        },
+
+	        /**
+	         * Get interval of the axis label.
+	         * @return {number}
+	         */
+	        getLabelInterval: function () {
+	            var labelInterval = this._labelInterval;
+	            if (!labelInterval) {
+	                var axisModel = this.model;
+	                var labelModel = axisModel.getModel('axisLabel');
+	                var interval = labelModel.get('interval');
+	                if (!(this.type === 'category' && interval === 'auto')) {
+	                    labelInterval = interval === 'auto' ? 0 : interval;
+	                }
+	                else if (this.isHorizontal){
+	                    labelInterval = axisHelper.getAxisLabelInterval(
+	                        zrUtil.map(this.scale.getTicks(), this.dataToCoord, this),
+	                        axisModel.getFormattedLabels(),
+	                        labelModel.getModel('textStyle').getFont(),
+	                        this.isHorizontal()
+	                    );
+	                }
+	                this._labelInterval = labelInterval;
+	            }
+	            return labelInterval;
 	        }
 
 	    };
@@ -23736,9 +23981,1238 @@
 
 	
 
-	    var createListFromArray = __webpack_require__(102);
-	    var symbolUtil = __webpack_require__(104);
-	    var axisHelper = __webpack_require__(105);
+	    var OrdinalScale = __webpack_require__(102);
+	    var IntervalScale = __webpack_require__(104);
+	    __webpack_require__(106);
+	    __webpack_require__(107);
+	    var Scale = __webpack_require__(103);
+
+	    var numberUtil = __webpack_require__(7);
+	    var zrUtil = __webpack_require__(4);
+	    var textContain = __webpack_require__(8);
+	    var axisHelper = {};
+
+	    /**
+	     * Get axis scale extent before niced.
+	     * Item of returned array can only be number (including Infinity and NaN).
+	     */
+	    axisHelper.getScaleExtent = function (scale, model) {
+	        var scaleType = scale.type;
+
+	        var min = model.getMin();
+	        var max = model.getMax();
+	        var fixMin = min != null;
+	        var fixMax = max != null;
+	        var originalExtent = scale.getExtent();
+
+	        var axisDataLen;
+	        var boundaryGap;
+	        var span;
+	        if (scaleType === 'ordinal') {
+	            axisDataLen = (model.get('data') || []).length;
+	        }
+	        else {
+	            boundaryGap = model.get('boundaryGap');
+	            if (!zrUtil.isArray(boundaryGap)) {
+	                boundaryGap = [boundaryGap || 0, boundaryGap || 0];
+	            }
+	            if (typeof boundaryGap[0] === 'boolean') {
+	                if (true) {
+	                    console.warn('Boolean type for boundaryGap is only '
+	                        + 'allowed for ordinal axis. Please use string in '
+	                        + 'percentage instead, e.g., "20%". Currently, '
+	                        + 'boundaryGap is set to be 0.');
+	                }
+	                boundaryGap = [0, 0];
+	            }
+	            boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1);
+	            boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1);
+	            span = (originalExtent[1] - originalExtent[0])
+	                || Math.abs(originalExtent[0]);
+	        }
+
+	        // Notice: When min/max is not set (that is, when there are null/undefined,
+	        // which is the most common case), these cases should be ensured:
+	        // (1) For 'ordinal', show all axis.data.
+	        // (2) For others:
+	        //      + `boundaryGap` is applied (if min/max set, boundaryGap is
+	        //      disabled).
+	        //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should
+	        //      be the result that originalExtent enlarged by boundaryGap.
+	        // (3) If no data, it should be ensured that `scale.setBlank` is set.
+
+	        // FIXME
+	        // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used?
+	        // (2) When `needCrossZero` and all data is positive/negative, should it be ensured
+	        // that the results processed by boundaryGap are positive/negative?
+
+	        if (min == null) {
+	            min = scaleType === 'ordinal'
+	                ? (axisDataLen ? 0 : NaN)
+	                : originalExtent[0] - boundaryGap[0] * span;
+	        }
+	        if (max == null) {
+	            max = scaleType === 'ordinal'
+	                ? (axisDataLen ? axisDataLen - 1 : NaN)
+	                : originalExtent[1] + boundaryGap[1] * span;
+	        }
+
+	        if (min === 'dataMin') {
+	            min = originalExtent[0];
+	        }
+	        if (max === 'dataMax') {
+	            max = originalExtent[1];
+	        }
+
+	        (min == null || !isFinite(min)) && (min = NaN);
+	        (max == null || !isFinite(max)) && (max = NaN);
+
+	        scale.setBlank(zrUtil.eqNaN(min) || zrUtil.eqNaN(max));
+
+	        // Evaluate if axis needs cross zero
+	        if (model.getNeedCrossZero()) {
+	            // Axis is over zero and min is not set
+	            if (min > 0 && max > 0 && !fixMin) {
+	                min = 0;
+	            }
+	            // Axis is under zero and max is not set
+	            if (min < 0 && max < 0 && !fixMax) {
+	                max = 0;
+	            }
+	        }
+
+	        return [min, max];
+	    };
+
+	    axisHelper.niceScaleExtent = function (scale, model) {
+	        var extent = axisHelper.getScaleExtent(scale, model);
+	        var fixMin = model.getMin() != null;
+	        var fixMax = model.getMax() != null;
+	        var splitNumber = model.get('splitNumber');
+
+	        if (scale.type === 'log') {
+	            scale.base = model.get('logBase');
+	        }
+
+	        scale.setExtent(extent[0], extent[1]);
+	        scale.niceExtent({
+	            splitNumber: splitNumber,
+	            fixMin: fixMin,
+	            fixMax: fixMax,
+	            minInterval: scale.type === 'interval' ? model.get('minInterval') : null
+	        });
+
+	        // If some one specified the min, max. And the default calculated interval
+	        // is not good enough. He can specify the interval. It is often appeared
+	        // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard
+	        // to be 60.
+	        // FIXME
+	        var interval = model.get('interval');
+	        if (interval != null) {
+	            scale.setInterval && scale.setInterval(interval);
+	        }
+	    };
+
+	    /**
+	     * @param {module:echarts/model/Model} model
+	     * @param {string} [axisType] Default retrieve from model.type
+	     * @return {module:echarts/scale/*}
+	     */
+	    axisHelper.createScaleByModel = function(model, axisType) {
+	        axisType = axisType || model.get('type');
+	        if (axisType) {
+	            switch (axisType) {
+	                // Buildin scale
+	                case 'category':
+	                    return new OrdinalScale(
+	                        model.getCategories(), [Infinity, -Infinity]
+	                    );
+	                case 'value':
+	                    return new IntervalScale();
+	                // Extended scale, like time and log
+	                default:
+	                    return (Scale.getClass(axisType) || IntervalScale).create(model);
+	            }
+	        }
+	    };
+
+	    /**
+	     * Check if the axis corss 0
+	     */
+	    axisHelper.ifAxisCrossZero = function (axis) {
+	        var dataExtent = axis.scale.getExtent();
+	        var min = dataExtent[0];
+	        var max = dataExtent[1];
+	        return !((min > 0 && max > 0) || (min < 0 && max < 0));
+	    };
+
+	    /**
+	     * @param {Array.<number>} tickCoords In axis self coordinate.
+	     * @param {Array.<string>} labels
+	     * @param {string} font
+	     * @param {boolean} isAxisHorizontal
+	     * @return {number}
+	     */
+	    axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) {
+	        // FIXME
+	        // 不同角的axis和label，不只是horizontal和vertical.
+
+	        var textSpaceTakenRect;
+	        var autoLabelInterval = 0;
+	        var accumulatedLabelInterval = 0;
+
+	        var step = 1;
+	        if (labels.length > 40) {
+	            // Simple optimization for large amount of labels
+	            step = Math.floor(labels.length / 40);
+	        }
+
+	        for (var i = 0; i < tickCoords.length; i += step) {
+	            var tickCoord = tickCoords[i];
+	            var rect = textContain.getBoundingRect(
+	                labels[i], font, 'center', 'top'
+	            );
+	            rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord;
+	            // FIXME Magic number 1.5
+	            rect[isAxisHorizontal ? 'width' : 'height'] *= 1.3;
+	            if (!textSpaceTakenRect) {
+	                textSpaceTakenRect = rect.clone();
+	            }
+	            // There is no space for current label;
+	            else if (textSpaceTakenRect.intersect(rect)) {
+	                accumulatedLabelInterval++;
+	                autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval);
+	            }
+	            else {
+	                textSpaceTakenRect.union(rect);
+	                // Reset
+	                accumulatedLabelInterval = 0;
+	            }
+	        }
+	        if (autoLabelInterval === 0 && step > 1) {
+	            return step;
+	        }
+	        return (autoLabelInterval + 1) * step - 1;
+	    };
+
+	    /**
+	     * @param {Object} axis
+	     * @param {Function} labelFormatter
+	     * @return {Array.<string>}
+	     */
+	    axisHelper.getFormattedLabels = function (axis, labelFormatter) {
+	        var scale = axis.scale;
+	        var labels = scale.getTicksLabels();
+	        var ticks = scale.getTicks();
+	        if (typeof labelFormatter === 'string') {
+	            labelFormatter = (function (tpl) {
+	                return function (val) {
+	                    return tpl.replace('{value}', val != null ? val : '');
+	                };
+	            })(labelFormatter);
+	            // Consider empty array
+	            return zrUtil.map(labels, labelFormatter);
+	        }
+	        else if (typeof labelFormatter === 'function') {
+	            return zrUtil.map(ticks, function (tick, idx) {
+	                return labelFormatter(
+	                    axisHelper.getAxisRawValue(axis, tick),
+	                    idx
+	                );
+	            }, this);
+	        }
+	        else {
+	            return labels;
+	        }
+	    };
+
+	    axisHelper.getAxisRawValue = function (axis, value) {
+	        // In category axis with data zoom, tick is not the original
+	        // index of axis.data. So tick should not be exposed to user
+	        // in category axis.
+	        return axis.type === 'category' ? axis.scale.getLabel(value) : value;
+	    };
+
+	    module.exports = axisHelper;
+
+
+/***/ },
+/* 102 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Linear continuous scale
+	 * @module echarts/coord/scale/Ordinal
+	 *
+	 * http://en.wikipedia.org/wiki/Level_of_measurement
+	 */
+
+	// FIXME only one data
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var Scale = __webpack_require__(103);
+
+	    var scaleProto = Scale.prototype;
+
+	    var OrdinalScale = Scale.extend({
+
+	        type: 'ordinal',
+
+	        init: function (data, extent) {
+	            this._data = data;
+	            this._extent = extent || [0, data.length - 1];
+	        },
+
+	        parse: function (val) {
+	            return typeof val === 'string'
+	                ? zrUtil.indexOf(this._data, val)
+	                // val might be float.
+	                : Math.round(val);
+	        },
+
+	        contain: function (rank) {
+	            rank = this.parse(rank);
+	            return scaleProto.contain.call(this, rank)
+	                && this._data[rank] != null;
+	        },
+
+	        /**
+	         * Normalize given rank or name to linear [0, 1]
+	         * @param {number|string} [val]
+	         * @return {number}
+	         */
+	        normalize: function (val) {
+	            return scaleProto.normalize.call(this, this.parse(val));
+	        },
+
+	        scale: function (val) {
+	            return Math.round(scaleProto.scale.call(this, val));
+	        },
+
+	        /**
+	         * @return {Array}
+	         */
+	        getTicks: function () {
+	            var ticks = [];
+	            var extent = this._extent;
+	            var rank = extent[0];
+
+	            while (rank <= extent[1]) {
+	                ticks.push(rank);
+	                rank++;
+	            }
+
+	            return ticks;
+	        },
+
+	        /**
+	         * Get item on rank n
+	         * @param {number} n
+	         * @return {string}
+	         */
+	        getLabel: function (n) {
+	            return this._data[n];
+	        },
+
+	        /**
+	         * @return {number}
+	         */
+	        count: function () {
+	            return this._extent[1] - this._extent[0] + 1;
+	        },
+
+	        /**
+	         * @override
+	         */
+	        unionExtentFromData: function (data, dim) {
+	            this.unionExtent(data.getDataExtent(dim, false));
+	        },
+
+	        niceTicks: zrUtil.noop,
+	        niceExtent: zrUtil.noop
+	    });
+
+	    /**
+	     * @return {module:echarts/scale/Time}
+	     */
+	    OrdinalScale.create = function () {
+	        return new OrdinalScale();
+	    };
+
+	    module.exports = OrdinalScale;
+
+
+/***/ },
+/* 103 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * // Scale class management
+	 * @module echarts/scale/Scale
+	 */
+
+
+	    var clazzUtil = __webpack_require__(13);
+
+	    /**
+	     * @param {Object} [setting]
+	     */
+	    function Scale(setting) {
+	        this._setting = setting || {};
+
+	        /**
+	         * Extent
+	         * @type {Array.<number>}
+	         * @protected
+	         */
+	        this._extent = [Infinity, -Infinity];
+
+	        /**
+	         * Step is calculated in adjustExtent
+	         * @type {Array.<number>}
+	         * @protected
+	         */
+	        this._interval = 0;
+
+	        this.init && this.init.apply(this, arguments);
+	    }
+
+	    var scaleProto = Scale.prototype;
+
+	    /**
+	     * Parse input val to valid inner number.
+	     * @param {*} val
+	     * @return {number}
+	     */
+	    scaleProto.parse = function (val) {
+	        // Notice: This would be a trap here, If the implementation
+	        // of this method depends on extent, and this method is used
+	        // before extent set (like in dataZoom), it would be wrong.
+	        // Nevertheless, parse does not depend on extent generally.
+	        return val;
+	    };
+
+	    scaleProto.getSetting = function (name) {
+	        return this._setting[name];
+	    };
+
+	    scaleProto.contain = function (val) {
+	        var extent = this._extent;
+	        return val >= extent[0] && val <= extent[1];
+	    };
+
+	    /**
+	     * Normalize value to linear [0, 1], return 0.5 if extent span is 0
+	     * @param {number} val
+	     * @return {number}
+	     */
+	    scaleProto.normalize = function (val) {
+	        var extent = this._extent;
+	        if (extent[1] === extent[0]) {
+	            return 0.5;
+	        }
+	        return (val - extent[0]) / (extent[1] - extent[0]);
+	    };
+
+	    /**
+	     * Scale normalized value
+	     * @param {number} val
+	     * @return {number}
+	     */
+	    scaleProto.scale = function (val) {
+	        var extent = this._extent;
+	        return val * (extent[1] - extent[0]) + extent[0];
+	    };
+
+	    /**
+	     * Set extent from data
+	     * @param {Array.<number>} other
+	     */
+	    scaleProto.unionExtent = function (other) {
+	        var extent = this._extent;
+	        other[0] < extent[0] && (extent[0] = other[0]);
+	        other[1] > extent[1] && (extent[1] = other[1]);
+	        // not setExtent because in log axis it may transformed to power
+	        // this.setExtent(extent[0], extent[1]);
+	    };
+
+	    /**
+	     * Set extent from data
+	     * @param {module:echarts/data/List} data
+	     * @param {string} dim
+	     */
+	    scaleProto.unionExtentFromData = function (data, dim) {
+	        this.unionExtent(data.getDataExtent(dim, true));
+	    };
+
+	    /**
+	     * Get extent
+	     * @return {Array.<number>}
+	     */
+	    scaleProto.getExtent = function () {
+	        return this._extent.slice();
+	    };
+
+	    /**
+	     * Set extent
+	     * @param {number} start
+	     * @param {number} end
+	     */
+	    scaleProto.setExtent = function (start, end) {
+	        var thisExtent = this._extent;
+	        if (!isNaN(start)) {
+	            thisExtent[0] = start;
+	        }
+	        if (!isNaN(end)) {
+	            thisExtent[1] = end;
+	        }
+	    };
+
+	    /**
+	     * @return {Array.<string>}
+	     */
+	    scaleProto.getTicksLabels = function () {
+	        var labels = [];
+	        var ticks = this.getTicks();
+	        for (var i = 0; i < ticks.length; i++) {
+	            labels.push(this.getLabel(ticks[i]));
+	        }
+	        return labels;
+	    };
+
+	    /**
+	     * When axis extent depends on data and no data exists,
+	     * axis ticks should not be drawn, which is named 'blank'.
+	     */
+	    scaleProto.isBlank = function () {
+	        return this._isBlank;
+	    },
+
+	    /**
+	     * When axis extent depends on data and no data exists,
+	     * axis ticks should not be drawn, which is named 'blank'.
+	     */
+	    scaleProto.setBlank = function (isBlank) {
+	        this._isBlank = isBlank;
+	    };
+
+
+	    clazzUtil.enableClassExtend(Scale);
+	    clazzUtil.enableClassManagement(Scale, {
+	        registerWhenExtend: true
+	    });
+
+	    module.exports = Scale;
+
+
+/***/ },
+/* 104 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Interval scale
+	 * @module echarts/scale/Interval
+	 */
+
+
+
+	    var numberUtil = __webpack_require__(7);
+	    var formatUtil = __webpack_require__(6);
+	    var Scale = __webpack_require__(103);
+	    var helper = __webpack_require__(105);
+
+	    var roundNumber = numberUtil.round;
+
+	    /**
+	     * @alias module:echarts/coord/scale/Interval
+	     * @constructor
+	     */
+	    var IntervalScale = Scale.extend({
+
+	        type: 'interval',
+
+	        _interval: 0,
+
+	        _intervalPrecision: 2,
+
+	        setExtent: function (start, end) {
+	            var thisExtent = this._extent;
+	            //start,end may be a Number like '25',so...
+	            if (!isNaN(start)) {
+	                thisExtent[0] = parseFloat(start);
+	            }
+	            if (!isNaN(end)) {
+	                thisExtent[1] = parseFloat(end);
+	            }
+	        },
+
+	        unionExtent: function (other) {
+	            var extent = this._extent;
+	            other[0] < extent[0] && (extent[0] = other[0]);
+	            other[1] > extent[1] && (extent[1] = other[1]);
+
+	            // unionExtent may called by it's sub classes
+	            IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]);
+	        },
+	        /**
+	         * Get interval
+	         */
+	        getInterval: function () {
+	            if (true) {
+	                if (this._interval == null) {
+	                    throw new Error('`nice` should be called firstly' );
+	                }
+	            }
+	            return this._interval;
+	        },
+
+	        /**
+	         * Set interval
+	         */
+	        setInterval: function (interval) {
+	            this._interval = interval;
+	            // Dropped auto calculated niceExtent and use user setted extent
+	            // We assume user wan't to set both interval, min, max to get a better result
+	            this._niceExtent = this._extent.slice();
+	        },
+
+	        /**
+	         * @return {Array.<number>}
+	         */
+	        getTicks: function () {
+	            if (true) {
+	                if (this._interval == null) {
+	                    throw new Error('`nice` should be called firstly' );
+	                }
+	            }
+	            return helper.intervalScaleGetTicks(
+	                this._interval, this._extent, this._niceExtent, this._intervalPrecision
+	            );
+	        },
+
+	        /**
+	         * @return {Array.<string>}
+	         */
+	        getTicksLabels: function () {
+	            var labels = [];
+	            var ticks = this.getTicks();
+	            for (var i = 0; i < ticks.length; i++) {
+	                labels.push(this.getLabel(ticks[i]));
+	            }
+	            return labels;
+	        },
+
+	        /**
+	         * @param {number} data
+	         * @param {Object} [opt]
+	         * @param {number|string} [opt.precision] If 'auto', use nice presision.
+	         * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2.
+	         * @return {string}
+	         */
+	        getLabel: function (data, opt) {
+	            if (data == null) {
+	                return '';
+	            }
+
+	            var precision = opt && opt.precision;
+
+	            if (precision == null) {
+	                precision = numberUtil.getPrecisionSafe(data) || 0;
+	            }
+	            else if (precision === 'auto') {
+	                // Should be more precise then tick.
+	                precision = this._intervalPrecision;
+	            }
+
+	            // (1) If `precision` is set, 12.005 should be display as '12.00500'.
+	            // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.
+	            data = roundNumber(data, precision, true);
+
+	            return formatUtil.addCommas(data);
+	        },
+
+	        /**
+	         * Update interval and extent of intervals for nice ticks
+	         *
+	         * @param {number} [splitNumber = 5] Desired number of ticks
+	         * @param {number} [minInterval]
+	         */
+	        niceTicks: function (splitNumber, minInterval) {
+	            splitNumber = splitNumber || 5;
+	            var extent = this._extent;
+	            var span = extent[1] - extent[0];
+	            if (!isFinite(span)) {
+	                return;
+	            }
+	            // User may set axis min 0 and data are all negative
+	            // FIXME If it needs to reverse ?
+	            if (span < 0) {
+	                span = -span;
+	                extent.reverse();
+	            }
+
+	            var result = helper.intervalScaleNiceTicks(extent, splitNumber, minInterval);
+
+	            this._intervalPrecision = result.intervalPrecision;
+	            this._interval = result.interval;
+	            this._niceExtent = result.niceTickExtent;
+	        },
+
+	        /**
+	         * Nice extent.
+	         * @param {Object} opt
+	         * @param {number} [opt.splitNumber = 5] Given approx tick number
+	         * @param {boolean} [opt.fixMin=false]
+	         * @param {boolean} [opt.fixMax=false]
+	         * @param {boolean} [opt.minInterval=false]
+	         */
+	        niceExtent: function (opt) {
+	            var extent = this._extent;
+	            // If extent start and end are same, expand them
+	            if (extent[0] === extent[1]) {
+	                if (extent[0] !== 0) {
+	                    // Expand extent
+	                    var expandSize = extent[0];
+	                    // In the fowllowing case
+	                    //      Axis has been fixed max 100
+	                    //      Plus data are all 100 and axis extent are [100, 100].
+	                    // Extend to the both side will cause expanded max is larger than fixed max.
+	                    // So only expand to the smaller side.
+	                    if (!opt.fixMax) {
+	                        extent[1] += expandSize / 2;
+	                        extent[0] -= expandSize / 2;
+	                    }
+	                    else {
+	                        extent[0] -= expandSize / 2;
+	                    }
+	                }
+	                else {
+	                    extent[1] = 1;
+	                }
+	            }
+	            var span = extent[1] - extent[0];
+	            // If there are no data and extent are [Infinity, -Infinity]
+	            if (!isFinite(span)) {
+	                extent[0] = 0;
+	                extent[1] = 1;
+	            }
+
+	            this.niceTicks(opt.splitNumber, opt.minInterval);
+
+	            // var extent = this._extent;
+	            var interval = this._interval;
+
+	            if (!opt.fixMin) {
+	                extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);
+	            }
+	            if (!opt.fixMax) {
+	                extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);
+	            }
+	        }
+	    });
+
+	    /**
+	     * @return {module:echarts/scale/Time}
+	     */
+	    IntervalScale.create = function () {
+	        return new IntervalScale();
+	    };
+
+	    module.exports = IntervalScale;
+
+
+
+/***/ },
+/* 105 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * For testable.
+	 */
+
+
+	    var numberUtil = __webpack_require__(7);
+
+	    var roundNumber = numberUtil.round;
+
+	    var helper = {};
+
+	    /**
+	     * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number.
+	     *                                Should be extent[0] < extent[1].
+	     * @param {number} splitNumber splitNumber should be >= 1.
+	     * @param {number} [minInterval]
+	     * @return {Object} {interval, intervalPrecision, niceTickExtent}
+	     */
+	    helper.intervalScaleNiceTicks = function (extent, splitNumber, minInterval) {
+	        var result = {};
+	        var span = extent[1] - extent[0];
+
+	        var interval = result.interval = numberUtil.nice(span / splitNumber, true);
+	        if (minInterval != null && interval < minInterval) {
+	            interval = result.interval = minInterval;
+	        }
+	        // Tow more digital for tick.
+	        var precision = result.intervalPrecision = numberUtil.getPrecisionSafe(interval) + 2;
+	        // Niced extent inside original extent
+	        var niceTickExtent = result.niceTickExtent = [
+	            roundNumber(Math.ceil(extent[0] / interval) * interval, precision),
+	            roundNumber(Math.floor(extent[1] / interval) * interval, precision)
+	        ];
+
+	        helper.fixExtent(niceTickExtent, extent);
+
+	        return result;
+	    };
+
+	    function clamp(niceTickExtent, idx, extent) {
+	        niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);
+	    }
+
+	    // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.
+	    helper.fixExtent = function (niceTickExtent, extent) {
+	        !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);
+	        !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);
+	        clamp(niceTickExtent, 0, extent);
+	        clamp(niceTickExtent, 1, extent);
+	        if (niceTickExtent[0] > niceTickExtent[1]) {
+	            niceTickExtent[0] = niceTickExtent[1];
+	        }
+	    };
+
+	    helper.intervalScaleGetTicks = function (interval, extent, niceTickExtent, intervalPrecision) {
+	        var ticks = [];
+
+	        // If interval is 0, return [];
+	        if (!interval) {
+	            return ticks;
+	        }
+
+	        // Consider this case: using dataZoom toolbox, zoom and zoom.
+	        var safeLimit = 10000;
+
+	        if (extent[0] < niceTickExtent[0]) {
+	            ticks.push(extent[0]);
+	        }
+	        var tick = niceTickExtent[0];
+
+	        while (tick <= niceTickExtent[1]) {
+	            ticks.push(tick);
+	            // Avoid rounding error
+	            tick = roundNumber(tick + interval, intervalPrecision);
+	            if (tick === ticks[ticks.length - 1]) {
+	                // Consider out of safe float point, e.g.,
+	                // -3711126.9907707 + 2e-10 === -3711126.9907707
+	                break;
+	            }
+	            if (ticks.length > safeLimit) {
+	                return [];
+	            }
+	        }
+	        // Consider this case: the last item of ticks is smaller
+	        // than niceTickExtent[1] and niceTickExtent[1] === extent[1].
+	        if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {
+	            ticks.push(extent[1]);
+	        }
+
+	        return ticks;
+	    };
+
+	    module.exports = helper;
+
+
+/***/ },
+/* 106 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Interval scale
+	 * @module echarts/coord/scale/Time
+	 */
+
+
+
+	    // [About UTC and local time zone]:
+	    // In most cases, `number.parseDate` will treat input data string as local time
+	    // (except time zone is specified in time string). And `format.formateTime` returns
+	    // local time by default. option.useUTC is false by default. This design have
+	    // concidered these common case:
+	    // (1) Time that is persistent in server is in UTC, but it is needed to be diplayed
+	    // in local time by default.
+	    // (2) By default, the input data string (e.g., '2011-01-02') should be displayed
+	    // as its original time, without any time difference.
+
+	    var zrUtil = __webpack_require__(4);
+	    var numberUtil = __webpack_require__(7);
+	    var formatUtil = __webpack_require__(6);
+	    var scaleHelper = __webpack_require__(105);
+
+	    var IntervalScale = __webpack_require__(104);
+
+	    var intervalScaleProto = IntervalScale.prototype;
+
+	    var mathCeil = Math.ceil;
+	    var mathFloor = Math.floor;
+	    var ONE_SECOND = 1000;
+	    var ONE_MINUTE = ONE_SECOND * 60;
+	    var ONE_HOUR = ONE_MINUTE * 60;
+	    var ONE_DAY = ONE_HOUR * 24;
+
+	    // FIXME 公用？
+	    var bisect = function (a, x, lo, hi) {
+	        while (lo < hi) {
+	            var mid = lo + hi >>> 1;
+	            if (a[mid][2] < x) {
+	                lo = mid + 1;
+	            }
+	            else {
+	                hi  = mid;
+	            }
+	        }
+	        return lo;
+	    };
+
+	    /**
+	     * @alias module:echarts/coord/scale/Time
+	     * @constructor
+	     */
+	    var TimeScale = IntervalScale.extend({
+	        type: 'time',
+
+	        /**
+	         * @override
+	         */
+	        getLabel: function (val) {
+	            var stepLvl = this._stepLvl;
+
+	            var date = new Date(val);
+
+	            return formatUtil.formatTime(stepLvl[0], date, this.getSetting('useUTC'));
+	        },
+
+	        /**
+	         * @override
+	         */
+	        niceExtent: function (opt) {
+	            var extent = this._extent;
+	            // If extent start and end are same, expand them
+	            if (extent[0] === extent[1]) {
+	                // Expand extent
+	                extent[0] -= ONE_DAY;
+	                extent[1] += ONE_DAY;
+	            }
+	            // If there are no data and extent are [Infinity, -Infinity]
+	            if (extent[1] === -Infinity && extent[0] === Infinity) {
+	                var d = new Date();
+	                extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate());
+	                extent[0] = extent[1] - ONE_DAY;
+	            }
+
+	            this.niceTicks(opt.splitNumber);
+
+	            // var extent = this._extent;
+	            var interval = this._interval;
+
+	            if (!opt.fixMin) {
+	                extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval);
+	            }
+	            if (!opt.fixMax) {
+	                extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval);
+	            }
+	        },
+
+	        /**
+	         * @override
+	         */
+	        niceTicks: function (approxTickNum) {
+	            var timezoneOffset = this.getSetting('useUTC')
+	                ? 0 : numberUtil.getTimezoneOffset() * 60 * 1000;
+	            approxTickNum = approxTickNum || 10;
+
+	            var extent = this._extent;
+	            var span = extent[1] - extent[0];
+	            var approxInterval = span / approxTickNum;
+	            var scaleLevelsLen = scaleLevels.length;
+	            var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen);
+
+	            var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)];
+	            var interval = level[2];
+	            // Same with interval scale if span is much larger than 1 year
+	            if (level[0] === 'year') {
+	                var yearSpan = span / interval;
+
+	                // From "Nice Numbers for Graph Labels" of Graphic Gems
+	                // var niceYearSpan = numberUtil.nice(yearSpan, false);
+	                var yearStep = numberUtil.nice(yearSpan / approxTickNum, true);
+
+	                interval *= yearStep;
+	            }
+
+	            var niceExtent = [
+	                Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset),
+	                Math.round(mathFloor((extent[1] - timezoneOffset)/ interval) * interval + timezoneOffset)
+	            ];
+
+	            scaleHelper.fixExtent(niceExtent, extent);
+
+	            this._stepLvl = level;
+	            // Interval will be used in getTicks
+	            this._interval = interval;
+	            this._niceExtent = niceExtent;
+	        },
+
+	        parse: function (val) {
+	            // val might be float.
+	            return +numberUtil.parseDate(val);
+	        }
+	    });
+
+	    zrUtil.each(['contain', 'normalize'], function (methodName) {
+	        TimeScale.prototype[methodName] = function (val) {
+	            return intervalScaleProto[methodName].call(this, this.parse(val));
+	        };
+	    });
+
+	    // Steps from d3
+	    var scaleLevels = [
+	        // Format       step    interval
+	        ['hh:mm:ss',    1,      ONE_SECOND],           // 1s
+	        ['hh:mm:ss',    5,      ONE_SECOND * 5],       // 5s
+	        ['hh:mm:ss',    10,     ONE_SECOND * 10],      // 10s
+	        ['hh:mm:ss',    15,     ONE_SECOND * 15],      // 15s
+	        ['hh:mm:ss',    30,     ONE_SECOND * 30],      // 30s
+	        ['hh:mm\nMM-dd',1,      ONE_MINUTE],          // 1m
+	        ['hh:mm\nMM-dd',5,      ONE_MINUTE * 5],      // 5m
+	        ['hh:mm\nMM-dd',10,     ONE_MINUTE * 10],     // 10m
+	        ['hh:mm\nMM-dd',15,     ONE_MINUTE * 15],     // 15m
+	        ['hh:mm\nMM-dd',30,     ONE_MINUTE * 30],     // 30m
+	        ['hh:mm\nMM-dd',1,      ONE_HOUR],        // 1h
+	        ['hh:mm\nMM-dd',2,      ONE_HOUR * 2],    // 2h
+	        ['hh:mm\nMM-dd',6,      ONE_HOUR * 6],    // 6h
+	        ['hh:mm\nMM-dd',12,     ONE_HOUR * 12],   // 12h
+	        ['MM-dd\nyyyy', 1,      ONE_DAY],   // 1d
+	        ['week',        7,      ONE_DAY * 7],        // 7d
+	        ['month',       1,      ONE_DAY * 31],       // 1M
+	        ['quarter',     3,      ONE_DAY * 380 / 4],  // 3M
+	        ['half-year',   6,      ONE_DAY * 380 / 2],  // 6M
+	        ['year',        1,      ONE_DAY * 380]       // 1Y
+	    ];
+
+	    /**
+	     * @param {module:echarts/model/Model}
+	     * @return {module:echarts/scale/Time}
+	     */
+	    TimeScale.create = function (model) {
+	        return new TimeScale({useUTC: model.ecModel.get('useUTC')});
+	    };
+
+	    module.exports = TimeScale;
+
+
+/***/ },
+/* 107 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Log scale
+	 * @module echarts/scale/Log
+	 */
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var Scale = __webpack_require__(103);
+	    var numberUtil = __webpack_require__(7);
+
+	    // Use some method of IntervalScale
+	    var IntervalScale = __webpack_require__(104);
+
+	    var scaleProto = Scale.prototype;
+	    var intervalScaleProto = IntervalScale.prototype;
+
+	    var getPrecisionSafe = numberUtil.getPrecisionSafe;
+	    var roundingErrorFix = numberUtil.round;
+
+	    var mathFloor = Math.floor;
+	    var mathCeil = Math.ceil;
+	    var mathPow = Math.pow;
+
+	    var mathLog = Math.log;
+
+	    var LogScale = Scale.extend({
+
+	        type: 'log',
+
+	        base: 10,
+
+	        $constructor: function () {
+	            Scale.apply(this, arguments);
+	            this._originalScale = new IntervalScale();
+	        },
+
+	        /**
+	         * @return {Array.<number>}
+	         */
+	        getTicks: function () {
+	            var originalScale = this._originalScale;
+	            var extent = this._extent;
+	            var originalExtent = originalScale.getExtent();
+
+	            return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) {
+	                var powVal = numberUtil.round(mathPow(this.base, val));
+
+	                // Fix #4158
+	                powVal = (val === extent[0] && originalScale.__fixMin)
+	                    ? fixRoundingError(powVal, originalExtent[0])
+	                    : powVal;
+	                powVal = (val === extent[1] && originalScale.__fixMax)
+	                    ? fixRoundingError(powVal, originalExtent[1])
+	                    : powVal;
+
+	                return powVal;
+	            }, this);
+	        },
+
+	        /**
+	         * @param {number} val
+	         * @return {string}
+	         */
+	        getLabel: intervalScaleProto.getLabel,
+
+	        /**
+	         * @param  {number} val
+	         * @return {number}
+	         */
+	        scale: function (val) {
+	            val = scaleProto.scale.call(this, val);
+	            return mathPow(this.base, val);
+	        },
+
+	        /**
+	         * @param {number} start
+	         * @param {number} end
+	         */
+	        setExtent: function (start, end) {
+	            var base = this.base;
+	            start = mathLog(start) / mathLog(base);
+	            end = mathLog(end) / mathLog(base);
+	            intervalScaleProto.setExtent.call(this, start, end);
+	        },
+
+	        /**
+	         * @return {number} end
+	         */
+	        getExtent: function () {
+	            var base = this.base;
+	            var extent = scaleProto.getExtent.call(this);
+	            extent[0] = mathPow(base, extent[0]);
+	            extent[1] = mathPow(base, extent[1]);
+
+	            // Fix #4158
+	            var originalScale = this._originalScale;
+	            var originalExtent = originalScale.getExtent();
+	            originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));
+	            originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));
+
+	            return extent;
+	        },
+
+	        /**
+	         * @param  {Array.<number>} extent
+	         */
+	        unionExtent: function (extent) {
+	            this._originalScale.unionExtent(extent);
+
+	            var base = this.base;
+	            extent[0] = mathLog(extent[0]) / mathLog(base);
+	            extent[1] = mathLog(extent[1]) / mathLog(base);
+	            scaleProto.unionExtent.call(this, extent);
+	        },
+
+	        /**
+	         * @override
+	         */
+	        unionExtentFromData: function (data, dim) {
+	            this.unionExtent(data.getDataExtent(dim, true, function (val) {
+	                return val > 0;
+	            }));
+	        },
+
+	        /**
+	         * Update interval and extent of intervals for nice ticks
+	         * @param  {number} [approxTickNum = 10] Given approx tick number
+	         */
+	        niceTicks: function (approxTickNum) {
+	            approxTickNum = approxTickNum || 10;
+	            var extent = this._extent;
+	            var span = extent[1] - extent[0];
+	            if (span === Infinity || span <= 0) {
+	                return;
+	            }
+
+	            var interval = numberUtil.quantity(span);
+	            var err = approxTickNum / span * interval;
+
+	            // Filter ticks to get closer to the desired count.
+	            if (err <= 0.5) {
+	                interval *= 10;
+	            }
+
+	            // Interval should be integer
+	            while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {
+	                interval *= 10;
+	            }
+
+	            var niceExtent = [
+	                numberUtil.round(mathCeil(extent[0] / interval) * interval),
+	                numberUtil.round(mathFloor(extent[1] / interval) * interval)
+	            ];
+
+	            this._interval = interval;
+	            this._niceExtent = niceExtent;
+	        },
+
+	        /**
+	         * Nice extent.
+	         * @override
+	         */
+	        niceExtent: function (opt) {
+	            intervalScaleProto.niceExtent.call(this, opt);
+
+	            var originalScale = this._originalScale;
+	            originalScale.__fixMin = opt.fixMin;
+	            originalScale.__fixMax = opt.fixMax;
+	        }
+
+	    });
+
+	    zrUtil.each(['contain', 'normalize'], function (methodName) {
+	        LogScale.prototype[methodName] = function (val) {
+	            val = mathLog(val) / mathLog(this.base);
+	            return scaleProto[methodName].call(this, val);
+	        };
+	    });
+
+	    LogScale.create = function () {
+	        return new LogScale();
+	    };
+
+	    function fixRoundingError(val, originalVal) {
+	        return roundingErrorFix(val, getPrecisionSafe(originalVal));
+	    }
+
+	    module.exports = LogScale;
+
+
+/***/ },
+/* 108 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var createListFromArray = __webpack_require__(109);
+	    var symbolUtil = __webpack_require__(111);
+	    var axisHelper = __webpack_require__(101);
 	    var axisModelCommonMixin = __webpack_require__(112);
 	    var Model = __webpack_require__(12);
 	    var util = __webpack_require__(4);
@@ -23755,16 +25229,9 @@
 	        },
 
 	        /**
-	         * Complete the dimensions array guessed from the data structure.
-	         * @param  {Array.<string>} dimensions Necessary dimensions, like ['x', 'y']
-	         * @param  {Array} data Data list. [[1, 2, 3], [2, 3, 4]]
-	         * @param  {Object} [opt]
-	         * @param  {Array.<string>} [opt.defaultNames] Default names to fill not necessary dimensions, like ['value']
-	         * @param  {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
-	         * @param  {number} [opt.dimCount] If not specified, guess by the first data item.
-	         * @return {Array.<string>}
+	         * @see {module:echarts/data/helper/completeDimensions}
 	         */
-	        completeDimensions: __webpack_require__(103),
+	        completeDimensions: __webpack_require__(110),
 
 	        /**
 	         * Create a symbol element with given symbol configuration: shape, x, y, width, height, color
@@ -23816,17 +25283,17 @@
 
 
 /***/ },
-/* 102 */
+/* 109 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var List = __webpack_require__(98);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
-	    var CoordinateSystem = __webpack_require__(26);
+	    var CoordinateSystem = __webpack_require__(76);
 	    var getDataItemValue = modelUtil.getDataItemValue;
 	    var converDataValue = modelUtil.converDataValue;
 
@@ -23859,8 +25326,13 @@
 	        var coordSysName = seriesModel.get('coordinateSystem');
 	        var creator = creators[coordSysName];
 	        var registeredCoordSys = CoordinateSystem.get(coordSysName);
+	        var completeDimOpt = {
+	            encodeDef: seriesModel.get('encode'),
+	            dimsDef: seriesModel.get('dimensions')
+	        };
+
 	        // FIXME
-	        var axesInfo = creator && creator(data, seriesModel, ecModel);
+	        var axesInfo = creator && creator(data, seriesModel, ecModel, completeDimOpt);
 	        var dimensions = axesInfo && axesInfo.dimensions;
 	        if (!dimensions) {
 	            // Get dimensions from registered coordinate system
@@ -23869,7 +25341,7 @@
 	                    ? registeredCoordSys.getDimensionsInfo()
 	                    : registeredCoordSys.dimensions.slice()
 	            )) || ['x', 'y'];
-	            dimensions = completeDimensions(dimensions, data, {defaultNames: dimensions.concat(['value'])});
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 	        }
 
 	        var categoryIndex = axesInfo ? axesInfo.categoryIndex : -1;
@@ -23939,7 +25411,7 @@
 	     */
 	    var creators = {
 
-	        cartesian2d: function (data, seriesModel, ecModel) {
+	        cartesian2d: function (data, seriesModel, ecModel, completeDimOpt) {
 
 	            var axesModels = zrUtil.map(['xAxis', 'yAxis'], function (name) {
 	                return ecModel.queryComponents({
@@ -23988,7 +25460,7 @@
 	            var isXAxisCateogry = xAxisType === 'category';
 	            var isYAxisCategory = yAxisType === 'category';
 
-	            completeDimensions(dimensions, data, {defaultNames: ['x', 'y', 'z']});
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 
 	            var categoryAxesModels = {};
 	            if (isXAxisCateogry) {
@@ -24004,7 +25476,7 @@
 	            };
 	        },
 
-	        singleAxis: function (data, seriesModel, ecModel) {
+	        singleAxis: function (data, seriesModel, ecModel, completeDimOpt) {
 
 	            var singleAxisModel = ecModel.queryComponents({
 	                mainType: 'singleAxis',
@@ -24027,7 +25499,7 @@
 	                stackable: isStackable(singleAxisType)
 	            }];
 
-	            completeDimensions(dimensions, data);
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 
 	            var categoryAxesModels = {};
 	            if (isCategory) {
@@ -24041,7 +25513,7 @@
 	            };
 	        },
 
-	        polar: function (data, seriesModel, ecModel) {
+	        polar: function (data, seriesModel, ecModel, completeDimOpt) {
 	            var polarModel = ecModel.queryComponents({
 	                mainType: 'polar',
 	                index: seriesModel.get('polarIndex'),
@@ -24078,7 +25550,7 @@
 	            var isAngleAxisCateogry = angleAxisType === 'category';
 	            var isRadiusAxisCateogry = radiusAxisType === 'category';
 
-	            completeDimensions(dimensions, data, {defaultNames: ['radius', 'angle', 'value']});
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 
 	            var categoryAxesModels = {};
 	            if (isRadiusAxisCateogry) {
@@ -24094,14 +25566,14 @@
 	            };
 	        },
 
-	        geo: function (data, seriesModel, ecModel) {
+	        geo: function (data, seriesModel, ecModel, completeDimOpt) {
 	            // TODO Region
 	            // 多个散点图系列在同一个地区的时候
 	            return {
 	                dimensions: completeDimensions([
 	                    {name: 'lng'},
 	                    {name: 'lat'}
-	                ], data, {defaultNames: ['lng', 'lat', 'value']})
+	                ], data, completeDimOpt)
 	            };
 	        }
 	    };
@@ -24144,7 +25616,7 @@
 
 
 /***/ },
-/* 103 */
+/* 110 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -24153,42 +25625,202 @@
 
 
 	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+	    var each = zrUtil.each;
+	    var isString = zrUtil.isString;
+	    var defaults = zrUtil.defaults;
+	    var normalizeToArray = modelUtil.normalizeToArray;
+
+	    var OTHER_DIMS = {tooltip: 1, label: 1, itemName: 1};
 
 	    /**
-	     * Complete the dimensions array guessed from the data structure.
-	     * @param  {Array.<string>} dimensions Necessary dimensions, like ['x', 'y']
-	     * @param  {Array} data Data list. [[1, 2, 3], [2, 3, 4]]
-	     * @param  {Object} [opt]
-	     * @param  {Array.<string>} [opt.defaultNames] Default names to fill not necessary dimensions, like ['value']
-	     * @param  {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
-	     * @param  {number} [opt.dimCount] If not specified, guess by the first data item.
-	     * @return {Array.<string>}
+	     * Complete the dimensions array, by user defined `dimension` and `encode`,
+	     * and guessing from the data structure.
+	     * If no 'value' dimension specified, the first no-named dimension will be
+	     * named as 'value'.
+	     *
+	     * @param {Array.<string>} sysDims Necessary dimensions, like ['x', 'y'], which
+	     *      provides not only dim template, but also default order.
+	     *      `name` of each item provides default coord name.
+	     *      [{dimsDef: []}, ...] can be specified to give names.
+	     * @param {Array} data Data list. [[1, 2, 3], [2, 3, 4]].
+	     * @param {Object} [opt]
+	     * @param {Array.<Object|string>} [opt.dimsDef] option.series.dimensions User defined dimensions
+	     *      For example: ['asdf', {name, type}, ...].
+	     * @param {Object} [opt.encodeDef] option.series.encode {x: 2, y: [3, 1], tooltip: [1, 2], label: 3}
+	     * @param {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
+	     * @param {string} [opt.extraFromZero] If specified, extra dim names will be:
+	     *                      extraPrefix + 0, extraPrefix + extraBaseIndex + 1 ...
+	     *                      If not specified, extra dim names will be:
+	     *                      extraPrefix, extraPrefix + 0, extraPrefix + 1 ...
+	     * @param {number} [opt.dimCount] If not specified, guess by the first data item.
+	     * @return {Array.<Object>} [{
+	     *      name: string mandatory,
+	     *      coordDim: string mandatory,
+	     *      coordDimIndex: number mandatory,
+	     *      type: string optional,
+	     *      tooltipName: string optional,
+	     *      otherDims: {
+	     *          tooltip: number optional,
+	     *          label: number optional
+	     *      },
+	     *      isExtraCoord: boolean true or undefined.
+	     *      other props ...
+	     * }]
 	     */
-	    function completeDimensions(dimensions, data, opt) {
-	        if (!data) {
-	            return dimensions;
-	        }
-
+	    function completeDimensions(sysDims, data, opt) {
+	        data = data || [];
 	        opt = opt || {};
+	        sysDims = (sysDims || []).slice();
+	        var dimsDef = (opt.dimsDef || []).slice();
+	        var encodeDef = zrUtil.createHashMap(opt.encodeDef);
+	        var dataDimNameMap = zrUtil.createHashMap();
+	        var coordDimNameMap = zrUtil.createHashMap();
+	        // var valueCandidate;
+	        var result = [];
 
 	        var dimCount = opt.dimCount;
 	        if (dimCount == null) {
 	            var value0 = retrieveValue(data[0]);
-	            dimCount = zrUtil.isArray(value0) && value0.length || 1;
+	            dimCount = Math.max(
+	                zrUtil.isArray(value0) && value0.length || 1,
+	                sysDims.length,
+	                dimsDef.length
+	            );
+	            each(sysDims, function (sysDimItem) {
+	                var sysDimItemDimsDef = sysDimItem.dimsDef;
+	                sysDimItemDimsDef && (dimCount = Math.max(dimCount, sysDimItemDimsDef.length));
+	            });
 	        }
 
-	        var defaultNames = opt.defaultNames || [];
-	        var extraPrefix = opt.extraPrefix || 'extra';
+	        // Apply user defined dims (`name` and `type`) and init result.
 	        for (var i = 0; i < dimCount; i++) {
-	            if (!dimensions[i]) {
-	                var name = defaultNames[i] || (extraPrefix + (i - defaultNames.length));
-	                dimensions[i] = guessOrdinal(data, i)
-	                    ? {type: 'ordinal', name: name}
-	                    : name;
+	            var dimDefItem = isString(dimsDef[i]) ? {name: dimsDef[i]} : (dimsDef[i] || {});
+	            var userDimName = dimDefItem.name;
+	            var resultItem = result[i] = {otherDims: {}};
+	            // Name will be applied later for avoiding duplication.
+	            if (userDimName != null && dataDimNameMap.get(userDimName) == null) {
+	                // Only if `series.dimensions` is defined in option, tooltipName
+	                // will be set, and dimension will be diplayed vertically in
+	                // tooltip by default.
+	                resultItem.name = resultItem.tooltipName = userDimName;
+	                dataDimNameMap.set(userDimName, i);
+	            }
+	            dimDefItem.type != null && (resultItem.type = dimDefItem.type);
+	        }
+
+	        // Set `coordDim` and `coordDimIndex` by `encodeDef` and normalize `encodeDef`.
+	        encodeDef.each(function (dataDims, coordDim) {
+	            dataDims = encodeDef.set(coordDim, normalizeToArray(dataDims).slice());
+	            each(dataDims, function (resultDimIdx, coordDimIndex) {
+	                // The input resultDimIdx can be dim name or index.
+	                isString(resultDimIdx) && (resultDimIdx = dataDimNameMap.get(resultDimIdx));
+	                if (resultDimIdx != null && resultDimIdx < dimCount) {
+	                    dataDims[coordDimIndex] = resultDimIdx;
+	                    applyDim(result[resultDimIdx], coordDim, coordDimIndex);
+	                    // coordDim === 'value' && valueCandidate == null && (valueCandidate = resultDimIdx);
+	                }
+	            });
+	        });
+
+	        // Apply templetes and default order from `sysDims`.
+	        var availDimIdx = 0;
+	        each(sysDims, function (sysDimItem, sysDimIndex) {
+	            var coordDim;
+	            var sysDimItem;
+	            var sysDimItemDimsDef;
+	            var sysDimItemOtherDims;
+	            if (isString(sysDimItem)) {
+	                coordDim = sysDimItem;
+	                sysDimItem = {};
+	            }
+	            else {
+	                coordDim = sysDimItem.name;
+	                sysDimItem = zrUtil.clone(sysDimItem);
+	                // `coordDimIndex` should not be set directly.
+	                sysDimItemDimsDef = sysDimItem.dimsDef;
+	                sysDimItemOtherDims = sysDimItem.otherDims;
+	                sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex
+	                    = sysDimItem.dimsDef = sysDimItem.otherDims = null;
+	            }
+
+	            var dataDims = normalizeToArray(encodeDef.get(coordDim));
+	            // dimensions provides default dim sequences.
+	            if (!dataDims.length) {
+	                for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) {
+	                    while (availDimIdx < result.length && result[availDimIdx].coordDim != null) {
+	                        availDimIdx++;
+	                    }
+	                    availDimIdx < result.length && dataDims.push(availDimIdx++);
+	                }
+	            }
+	            // Apply templates.
+	            each(dataDims, function (resultDimIdx, coordDimIndex) {
+	                var resultItem = result[resultDimIdx];
+	                applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex);
+	                // coordDim === 'value' && valueCandidate == null && (valueCandidate = resultDimIdx);
+	                if (resultItem.name == null && sysDimItemDimsDef) {
+	                    resultItem.name = resultItem.tooltipName = sysDimItemDimsDef[coordDimIndex];
+	                }
+	                sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims);
+	            });
+	        });
+
+	        // Make sure the first extra dim is 'value'.
+	        var extra = opt.extraPrefix || 'value';
+
+	        // Set dim `name` and other `coordDim` and other props.
+	        for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) {
+	            var resultItem = result[resultDimIdx] = result[resultDimIdx] || {};
+	            var coordDim = resultItem.coordDim;
+
+	            coordDim == null && (
+	                resultItem.coordDim = genName(extra, coordDimNameMap, opt.extraFromZero),
+	                resultItem.coordDimIndex = 0,
+	                resultItem.isExtraCoord = true
+	            );
+
+	            resultItem.name == null && (resultItem.name = genName(
+	                // Ensure At least one value dim.
+	                // (dataDimNameMap.get('value') == null
+	                //     && (valueCandidate == null || valueCandidate === resultDimIdx)
+	                //     // Try to set as 'value' only if coordDim is not set as 'extra'.
+	                //     && coordDim == null
+	                // )
+	                // ? 'value'
+	                // :
+	                resultItem.coordDim,
+	                dataDimNameMap
+	            ));
+
+	            resultItem.type == null && guessOrdinal(data, resultDimIdx)
+	                && (resultItem.type = 'ordinal');
+	        }
+
+	        return result;
+
+	        function applyDim(resultItem, coordDim, coordDimIndex) {
+	            if (OTHER_DIMS[coordDim]) {
+	                resultItem.otherDims[coordDim] = coordDimIndex;
+	            }
+	            else {
+	                resultItem.coordDim = coordDim;
+	                resultItem.coordDimIndex = coordDimIndex;
+	                coordDimNameMap.set(coordDim, true);
 	            }
 	        }
 
-	        return dimensions;
+	        function genName(name, map, fromZero) {
+	            if (fromZero || map.get(name) != null) {
+	                var i = 0;
+	                while (map.get(name + i) != null) {
+	                    i++;
+	                }
+	                name += i;
+	            }
+	            map.set(name, true);
+	            return name;
+	        }
 	    }
 
 	    // The rule should not be complex, otherwise user might not
@@ -24202,10 +25834,11 @@
 	            }
 
 	            var value = value[dimIndex];
+	            // Consider usage convenience, '1', '2' will be treated as "number".
 	            if (value != null && isFinite(value)) {
 	                return false;
 	            }
-	            else if (zrUtil.isString(value) && value !== '-') {
+	            else if (isString(value) && value !== '-') {
 	                return true;
 	            }
 	        }
@@ -24221,14 +25854,14 @@
 
 
 /***/ },
-/* 104 */
+/* 111 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	// Symbol factory
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var BoundingRect = __webpack_require__(9);
 
 	    /**
@@ -24583,1253 +26216,20 @@
 
 
 /***/ },
-/* 105 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var OrdinalScale = __webpack_require__(106);
-	    var IntervalScale = __webpack_require__(108);
-	    __webpack_require__(110);
-	    __webpack_require__(111);
-	    var Scale = __webpack_require__(107);
-
-	    var numberUtil = __webpack_require__(7);
-	    var zrUtil = __webpack_require__(4);
-	    var textContain = __webpack_require__(8);
-	    var axisHelper = {};
-
-	    /**
-	     * Get axis scale extent before niced.
-	     * Item of returned array can only be number (including Infinity and NaN).
-	     */
-	    axisHelper.getScaleExtent = function (scale, model) {
-	        var scaleType = scale.type;
-
-	        var min = model.getMin();
-	        var max = model.getMax();
-	        var fixMin = min != null;
-	        var fixMax = max != null;
-	        var originalExtent = scale.getExtent();
-
-	        var axisDataLen;
-	        var boundaryGap;
-	        var span;
-	        if (scaleType === 'ordinal') {
-	            axisDataLen = (model.get('data') || []).length;
-	        }
-	        else {
-	            boundaryGap = model.get('boundaryGap');
-	            if (!zrUtil.isArray(boundaryGap)) {
-	                boundaryGap = [boundaryGap || 0, boundaryGap || 0];
-	            }
-	            if (typeof boundaryGap[0] === 'boolean') {
-	                if (true) {
-	                    console.warn('Boolean type for boundaryGap is only '
-	                        + 'allowed for ordinal axis. Please use string in '
-	                        + 'percentage instead, e.g., "20%". Currently, '
-	                        + 'boundaryGap is set to be 0.');
-	                }
-	                boundaryGap = [0, 0];
-	            }
-	            boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1);
-	            boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1);
-	            span = (originalExtent[1] - originalExtent[0])
-	                || Math.abs(originalExtent[0]);
-	        }
-
-	        // Notice: When min/max is not set (that is, when there are null/undefined,
-	        // which is the most common case), these cases should be ensured:
-	        // (1) For 'ordinal', show all axis.data.
-	        // (2) For others:
-	        //      + `boundaryGap` is applied (if min/max set, boundaryGap is
-	        //      disabled).
-	        //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should
-	        //      be the result that originalExtent enlarged by boundaryGap.
-	        // (3) If no data, it should be ensured that `scale.setBlank` is set.
-
-	        // FIXME
-	        // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used?
-	        // (2) When `needCrossZero` and all data is positive/negative, should it be ensured
-	        // that the results processed by boundaryGap are positive/negative?
-
-	        if (min == null) {
-	            min = scaleType === 'ordinal'
-	                ? (axisDataLen ? 0 : NaN)
-	                : originalExtent[0] - boundaryGap[0] * span;
-	        }
-	        if (max == null) {
-	            max = scaleType === 'ordinal'
-	                ? (axisDataLen ? axisDataLen - 1 : NaN)
-	                : originalExtent[1] + boundaryGap[1] * span;
-	        }
-
-	        if (min === 'dataMin') {
-	            min = originalExtent[0];
-	        }
-	        if (max === 'dataMax') {
-	            max = originalExtent[1];
-	        }
-
-	        (min == null || !isFinite(min)) && (min = NaN);
-	        (max == null || !isFinite(max)) && (max = NaN);
-
-	        scale.setBlank(zrUtil.eqNaN(min) || zrUtil.eqNaN(max));
-
-	        // Evaluate if axis needs cross zero
-	        if (model.getNeedCrossZero()) {
-	            // Axis is over zero and min is not set
-	            if (min > 0 && max > 0 && !fixMin) {
-	                min = 0;
-	            }
-	            // Axis is under zero and max is not set
-	            if (min < 0 && max < 0 && !fixMax) {
-	                max = 0;
-	            }
-	        }
-
-	        return [min, max];
-	    };
-
-	    axisHelper.niceScaleExtent = function (scale, model) {
-	        var extent = axisHelper.getScaleExtent(scale, model);
-	        var fixMin = model.getMin() != null;
-	        var fixMax = model.getMax() != null;
-	        var splitNumber = model.get('splitNumber');
-
-	        if (scale.type === 'log') {
-	            scale.base = model.get('logBase');
-	        }
-
-	        scale.setExtent(extent[0], extent[1]);
-	        scale.niceExtent(splitNumber, fixMin, fixMax);
-
-	        // Use minInterval to constraint the calculated interval.
-	        // If calculated interval is less than minInterval. increase the interval quantity until
-	        // it is larger than minInterval.
-	        // For example:
-	        //  minInterval is 1, calculated interval is 0.2, so increase it to be 1. In this way we can get
-	        //  an integer axis.
-	        var minInterval = model.get('minInterval');
-	        if (isFinite(minInterval) && !fixMin && !fixMax && scale.type === 'interval') {
-	            var interval = scale.getInterval();
-	            var intervalScale = Math.max(Math.abs(interval), minInterval) / interval;
-	            // while (interval < minInterval) {
-	            //     var quantity = numberUtil.quantity(interval);
-	            //     interval = quantity * 10;
-	            //     scaleQuantity *= 10;
-	            // }
-	            extent = scale.getExtent();
-	            var origin = (extent[1] + extent[0]) / 2;
-	            scale.setExtent(
-	                intervalScale * (extent[0] - origin) + origin,
-	                intervalScale * (extent[1] - origin) + origin
-	            );
-	            scale.niceExtent(splitNumber);
-	        }
-
-	        // If some one specified the min, max. And the default calculated interval
-	        // is not good enough. He can specify the interval. It is often appeared
-	        // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard
-	        // to be 60.
-	        // FIXME
-	        var interval = model.get('interval');
-	        if (interval != null) {
-	            scale.setInterval && scale.setInterval(interval);
-	        }
-	    };
-
-	    /**
-	     * @param {module:echarts/model/Model} model
-	     * @param {string} [axisType] Default retrieve from model.type
-	     * @return {module:echarts/scale/*}
-	     */
-	    axisHelper.createScaleByModel = function(model, axisType) {
-	        axisType = axisType || model.get('type');
-	        if (axisType) {
-	            switch (axisType) {
-	                // Buildin scale
-	                case 'category':
-	                    return new OrdinalScale(
-	                        model.getCategories(), [Infinity, -Infinity]
-	                    );
-	                case 'value':
-	                    return new IntervalScale();
-	                // Extended scale, like time and log
-	                default:
-	                    return (Scale.getClass(axisType) || IntervalScale).create(model);
-	            }
-	        }
-	    };
-
-	    /**
-	     * Check if the axis corss 0
-	     */
-	    axisHelper.ifAxisCrossZero = function (axis) {
-	        var dataExtent = axis.scale.getExtent();
-	        var min = dataExtent[0];
-	        var max = dataExtent[1];
-	        return !((min > 0 && max > 0) || (min < 0 && max < 0));
-	    };
-
-	    /**
-	     * @param {Array.<number>} tickCoords In axis self coordinate.
-	     * @param {Array.<string>} labels
-	     * @param {string} font
-	     * @param {boolean} isAxisHorizontal
-	     * @return {number}
-	     */
-	    axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) {
-	        // FIXME
-	        // 不同角的axis和label，不只是horizontal和vertical.
-
-	        var textSpaceTakenRect;
-	        var autoLabelInterval = 0;
-	        var accumulatedLabelInterval = 0;
-
-	        var step = 1;
-	        if (labels.length > 40) {
-	            // Simple optimization for large amount of labels
-	            step = Math.floor(labels.length / 40);
-	        }
-
-	        for (var i = 0; i < tickCoords.length; i += step) {
-	            var tickCoord = tickCoords[i];
-	            var rect = textContain.getBoundingRect(
-	                labels[i], font, 'center', 'top'
-	            );
-	            rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord;
-	            // FIXME Magic number 1.5
-	            rect[isAxisHorizontal ? 'width' : 'height'] *= 1.3;
-	            if (!textSpaceTakenRect) {
-	                textSpaceTakenRect = rect.clone();
-	            }
-	            // There is no space for current label;
-	            else if (textSpaceTakenRect.intersect(rect)) {
-	                accumulatedLabelInterval++;
-	                autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval);
-	            }
-	            else {
-	                textSpaceTakenRect.union(rect);
-	                // Reset
-	                accumulatedLabelInterval = 0;
-	            }
-	        }
-	        if (autoLabelInterval === 0 && step > 1) {
-	            return step;
-	        }
-	        return (autoLabelInterval + 1) * step - 1;
-	    };
-
-	    /**
-	     * @param {Object} axis
-	     * @param {Function} labelFormatter
-	     * @return {Array.<string>}
-	     */
-	    axisHelper.getFormattedLabels = function (axis, labelFormatter) {
-	        var scale = axis.scale;
-	        var labels = scale.getTicksLabels();
-	        var ticks = scale.getTicks();
-	        if (typeof labelFormatter === 'string') {
-	            labelFormatter = (function (tpl) {
-	                return function (val) {
-	                    return tpl.replace('{value}', val != null ? val : '');
-	                };
-	            })(labelFormatter);
-	            // Consider empty array
-	            return zrUtil.map(labels, labelFormatter);
-	        }
-	        else if (typeof labelFormatter === 'function') {
-	            return zrUtil.map(ticks, function (tick, idx) {
-	                return labelFormatter(
-	                    axisHelper.getAxisRawValue(axis, tick),
-	                    idx
-	                );
-	            }, this);
-	        }
-	        else {
-	            return labels;
-	        }
-	    };
-
-	    axisHelper.getAxisRawValue = function (axis, value) {
-	        // In category axis with data zoom, tick is not the original
-	        // index of axis.data. So tick should not be exposed to user
-	        // in category axis.
-	        return axis.type === 'category' ? axis.scale.getLabel(value) : value;
-	    };
-
-	    module.exports = axisHelper;
-
-
-/***/ },
-/* 106 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Linear continuous scale
-	 * @module echarts/coord/scale/Ordinal
-	 *
-	 * http://en.wikipedia.org/wiki/Level_of_measurement
-	 */
-
-	// FIXME only one data
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var Scale = __webpack_require__(107);
-
-	    var scaleProto = Scale.prototype;
-
-	    var OrdinalScale = Scale.extend({
-
-	        type: 'ordinal',
-
-	        init: function (data, extent) {
-	            this._data = data;
-	            this._extent = extent || [0, data.length - 1];
-	        },
-
-	        parse: function (val) {
-	            return typeof val === 'string'
-	                ? zrUtil.indexOf(this._data, val)
-	                // val might be float.
-	                : Math.round(val);
-	        },
-
-	        contain: function (rank) {
-	            rank = this.parse(rank);
-	            return scaleProto.contain.call(this, rank)
-	                && this._data[rank] != null;
-	        },
-
-	        /**
-	         * Normalize given rank or name to linear [0, 1]
-	         * @param {number|string} [val]
-	         * @return {number}
-	         */
-	        normalize: function (val) {
-	            return scaleProto.normalize.call(this, this.parse(val));
-	        },
-
-	        scale: function (val) {
-	            return Math.round(scaleProto.scale.call(this, val));
-	        },
-
-	        /**
-	         * @return {Array}
-	         */
-	        getTicks: function () {
-	            var ticks = [];
-	            var extent = this._extent;
-	            var rank = extent[0];
-
-	            while (rank <= extent[1]) {
-	                ticks.push(rank);
-	                rank++;
-	            }
-
-	            return ticks;
-	        },
-
-	        /**
-	         * Get item on rank n
-	         * @param {number} n
-	         * @return {string}
-	         */
-	        getLabel: function (n) {
-	            return this._data[n];
-	        },
-
-	        /**
-	         * @return {number}
-	         */
-	        count: function () {
-	            return this._extent[1] - this._extent[0] + 1;
-	        },
-
-	        /**
-	         * @override
-	         */
-	        unionExtentFromData: function (data, dim) {
-	            this.unionExtent(data.getDataExtent(dim, false));
-	        },
-
-	        niceTicks: zrUtil.noop,
-	        niceExtent: zrUtil.noop
-	    });
-
-	    /**
-	     * @return {module:echarts/scale/Time}
-	     */
-	    OrdinalScale.create = function () {
-	        return new OrdinalScale();
-	    };
-
-	    module.exports = OrdinalScale;
-
-
-/***/ },
-/* 107 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * // Scale class management
-	 * @module echarts/scale/Scale
-	 */
-
-
-	    var clazzUtil = __webpack_require__(13);
-
-	    /**
-	     * @param {Object} [setting]
-	     */
-	    function Scale(setting) {
-	        this._setting = setting || {};
-
-	        /**
-	         * Extent
-	         * @type {Array.<number>}
-	         * @protected
-	         */
-	        this._extent = [Infinity, -Infinity];
-
-	        /**
-	         * Step is calculated in adjustExtent
-	         * @type {Array.<number>}
-	         * @protected
-	         */
-	        this._interval = 0;
-
-	        this.init && this.init.apply(this, arguments);
-	    }
-
-	    var scaleProto = Scale.prototype;
-
-	    /**
-	     * Parse input val to valid inner number.
-	     * @param {*} val
-	     * @return {number}
-	     */
-	    scaleProto.parse = function (val) {
-	        // Notice: This would be a trap here, If the implementation
-	        // of this method depends on extent, and this method is used
-	        // before extent set (like in dataZoom), it would be wrong.
-	        // Nevertheless, parse does not depend on extent generally.
-	        return val;
-	    };
-
-	    scaleProto.getSetting = function (name) {
-	        return this._setting[name];
-	    };
-
-	    scaleProto.contain = function (val) {
-	        var extent = this._extent;
-	        return val >= extent[0] && val <= extent[1];
-	    };
-
-	    /**
-	     * Normalize value to linear [0, 1], return 0.5 if extent span is 0
-	     * @param {number} val
-	     * @return {number}
-	     */
-	    scaleProto.normalize = function (val) {
-	        var extent = this._extent;
-	        if (extent[1] === extent[0]) {
-	            return 0.5;
-	        }
-	        return (val - extent[0]) / (extent[1] - extent[0]);
-	    };
-
-	    /**
-	     * Scale normalized value
-	     * @param {number} val
-	     * @return {number}
-	     */
-	    scaleProto.scale = function (val) {
-	        var extent = this._extent;
-	        return val * (extent[1] - extent[0]) + extent[0];
-	    };
-
-	    /**
-	     * Set extent from data
-	     * @param {Array.<number>} other
-	     */
-	    scaleProto.unionExtent = function (other) {
-	        var extent = this._extent;
-	        other[0] < extent[0] && (extent[0] = other[0]);
-	        other[1] > extent[1] && (extent[1] = other[1]);
-	        // not setExtent because in log axis it may transformed to power
-	        // this.setExtent(extent[0], extent[1]);
-	    };
-
-	    /**
-	     * Set extent from data
-	     * @param {module:echarts/data/List} data
-	     * @param {string} dim
-	     */
-	    scaleProto.unionExtentFromData = function (data, dim) {
-	        this.unionExtent(data.getDataExtent(dim, true));
-	    };
-
-	    /**
-	     * Get extent
-	     * @return {Array.<number>}
-	     */
-	    scaleProto.getExtent = function () {
-	        return this._extent.slice();
-	    };
-
-	    /**
-	     * Set extent
-	     * @param {number} start
-	     * @param {number} end
-	     */
-	    scaleProto.setExtent = function (start, end) {
-	        var thisExtent = this._extent;
-	        if (!isNaN(start)) {
-	            thisExtent[0] = start;
-	        }
-	        if (!isNaN(end)) {
-	            thisExtent[1] = end;
-	        }
-	    };
-
-	    /**
-	     * @return {Array.<string>}
-	     */
-	    scaleProto.getTicksLabels = function () {
-	        var labels = [];
-	        var ticks = this.getTicks();
-	        for (var i = 0; i < ticks.length; i++) {
-	            labels.push(this.getLabel(ticks[i]));
-	        }
-	        return labels;
-	    };
-
-	    /**
-	     * When axis extent depends on data and no data exists,
-	     * axis ticks should not be drawn, which is named 'blank'.
-	     */
-	    scaleProto.isBlank = function () {
-	        return this._isBlank;
-	    },
-
-	    /**
-	     * When axis extent depends on data and no data exists,
-	     * axis ticks should not be drawn, which is named 'blank'.
-	     */
-	    scaleProto.setBlank = function (isBlank) {
-	        this._isBlank = isBlank;
-	    };
-
-
-	    clazzUtil.enableClassExtend(Scale);
-	    clazzUtil.enableClassManagement(Scale, {
-	        registerWhenExtend: true
-	    });
-
-	    module.exports = Scale;
-
-
-/***/ },
-/* 108 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Interval scale
-	 * @module echarts/scale/Interval
-	 */
-
-
-
-	    var numberUtil = __webpack_require__(7);
-	    var formatUtil = __webpack_require__(6);
-	    var Scale = __webpack_require__(107);
-	    var helper = __webpack_require__(109);
-
-	    var roundNumber = numberUtil.round;
-
-	    /**
-	     * @alias module:echarts/coord/scale/Interval
-	     * @constructor
-	     */
-	    var IntervalScale = Scale.extend({
-
-	        type: 'interval',
-
-	        _interval: 0,
-
-	        _intervalPrecision: 2,
-
-	        setExtent: function (start, end) {
-	            var thisExtent = this._extent;
-	            //start,end may be a Number like '25',so...
-	            if (!isNaN(start)) {
-	                thisExtent[0] = parseFloat(start);
-	            }
-	            if (!isNaN(end)) {
-	                thisExtent[1] = parseFloat(end);
-	            }
-	        },
-
-	        unionExtent: function (other) {
-	            var extent = this._extent;
-	            other[0] < extent[0] && (extent[0] = other[0]);
-	            other[1] > extent[1] && (extent[1] = other[1]);
-
-	            // unionExtent may called by it's sub classes
-	            IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]);
-	        },
-	        /**
-	         * Get interval
-	         */
-	        getInterval: function () {
-	            if (!this._interval) {
-	                this.niceTicks();
-	            }
-	            return this._interval;
-	        },
-
-	        /**
-	         * Set interval
-	         */
-	        setInterval: function (interval) {
-	            this._interval = interval;
-	            // Dropped auto calculated niceExtent and use user setted extent
-	            // We assume user wan't to set both interval, min, max to get a better result
-	            this._niceExtent = this._extent.slice();
-	        },
-
-	        /**
-	         * @return {Array.<number>}
-	         */
-	        getTicks: function () {
-	            if (!this._interval) {
-	                this.niceTicks();
-	            }
-	            return helper.intervalScaleGetTicks(
-	                this._interval, this._extent, this._niceExtent, this._intervalPrecision
-	            );
-	        },
-
-	        /**
-	         * @return {Array.<string>}
-	         */
-	        getTicksLabels: function () {
-	            var labels = [];
-	            var ticks = this.getTicks();
-	            for (var i = 0; i < ticks.length; i++) {
-	                labels.push(this.getLabel(ticks[i]));
-	            }
-	            return labels;
-	        },
-
-	        /**
-	         * @param {number} data
-	         * @param {Object} [opt]
-	         * @param {number|string} [opt.precision] If 'auto', use nice presision.
-	         * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2.
-	         * @return {string}
-	         */
-	        getLabel: function (data, opt) {
-	            if (data == null) {
-	                return '';
-	            }
-
-	            var precision = opt && opt.precision;
-
-	            if (precision == null) {
-	                precision = numberUtil.getPrecisionSafe(data) || 0;
-	            }
-	            else if (precision === 'auto') {
-	                // Should be more precise then tick.
-	                precision = this._intervalPrecision;
-	            }
-
-	            // (1) If `precision` is set, 12.005 should be display as '12.00500'.
-	            // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.
-	            data = roundNumber(data, precision, true);
-
-	            return formatUtil.addCommas(data);
-	        },
-
-	        /**
-	         * Update interval and extent of intervals for nice ticks
-	         *
-	         * @param {number} [splitNumber = 5] Desired number of ticks
-	         */
-	        niceTicks: function (splitNumber) {
-	            splitNumber = splitNumber || 5;
-	            var extent = this._extent;
-	            var span = extent[1] - extent[0];
-	            if (!isFinite(span)) {
-	                return;
-	            }
-	            // User may set axis min 0 and data are all negative
-	            // FIXME If it needs to reverse ?
-	            if (span < 0) {
-	                span = -span;
-	                extent.reverse();
-	            }
-
-	            var result = helper.intervalScaleNiceTicks(extent, splitNumber);
-
-	            this._intervalPrecision = result.intervalPrecision;
-	            this._interval = result.interval;
-	            this._niceExtent = result.niceTickExtent;
-	        },
-
-	        /**
-	         * Nice extent.
-	         * @param {number} [splitNumber = 5] Given approx tick number
-	         * @param {boolean} [fixMin=false]
-	         * @param {boolean} [fixMax=false]
-	         */
-	        niceExtent: function (splitNumber, fixMin, fixMax) {
-	            var extent = this._extent;
-	            // If extent start and end are same, expand them
-	            if (extent[0] === extent[1]) {
-	                if (extent[0] !== 0) {
-	                    // Expand extent
-	                    var expandSize = extent[0];
-	                    // In the fowllowing case
-	                    //      Axis has been fixed max 100
-	                    //      Plus data are all 100 and axis extent are [100, 100].
-	                    // Extend to the both side will cause expanded max is larger than fixed max.
-	                    // So only expand to the smaller side.
-	                    if (!fixMax) {
-	                        extent[1] += expandSize / 2;
-	                        extent[0] -= expandSize / 2;
-	                    }
-	                    else {
-	                        extent[0] -= expandSize / 2;
-	                    }
-	                }
-	                else {
-	                    extent[1] = 1;
-	                }
-	            }
-	            var span = extent[1] - extent[0];
-	            // If there are no data and extent are [Infinity, -Infinity]
-	            if (!isFinite(span)) {
-	                extent[0] = 0;
-	                extent[1] = 1;
-	            }
-
-	            this.niceTicks(splitNumber);
-
-	            // var extent = this._extent;
-	            var interval = this._interval;
-
-	            if (!fixMin) {
-	                extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);
-	            }
-	            if (!fixMax) {
-	                extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);
-	            }
-	        }
-	    });
-
-	    /**
-	     * @return {module:echarts/scale/Time}
-	     */
-	    IntervalScale.create = function () {
-	        return new IntervalScale();
-	    };
-
-	    module.exports = IntervalScale;
-
-
-
-/***/ },
-/* 109 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * For testable.
-	 */
-
-
-	    var numberUtil = __webpack_require__(7);
-
-	    var roundNumber = numberUtil.round;
-
-	    var helper = {};
-
-	    /**
-	     * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number.
-	     *                                Should be extent[0] < extent[1].
-	     * @param {number} splitNumber splitNumber should be >= 1.
-	     * @return {Object} {interval, intervalPrecision, niceTickExtent}
-	     */
-	    helper.intervalScaleNiceTicks = function (extent, splitNumber) {
-	        var result = {};
-	        var span = extent[1] - extent[0];
-
-	        var interval = result.interval = numberUtil.nice(span / splitNumber, true);
-	        // Tow more digital for tick.
-	        var precision = result.intervalPrecision = numberUtil.getPrecisionSafe(interval) + 2;
-	        // Niced extent inside original extent
-	        var niceTickExtent = result.niceTickExtent = [
-	            roundNumber(Math.ceil(extent[0] / interval) * interval, precision),
-	            roundNumber(Math.floor(extent[1] / interval) * interval, precision)
-	        ];
-
-	        helper.fixExtent(niceTickExtent, extent);
-
-	        return result;
-	    };
-
-	    function clamp(niceTickExtent, idx, extent) {
-	        niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);
-	    }
-
-	    // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.
-	    helper.fixExtent = function (niceTickExtent, extent) {
-	        !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);
-	        !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);
-	        clamp(niceTickExtent, 0, extent);
-	        clamp(niceTickExtent, 1, extent);
-	        if (niceTickExtent[0] > niceTickExtent[1]) {
-	            niceTickExtent[0] = niceTickExtent[1];
-	        }
-	    };
-
-	    helper.intervalScaleGetTicks = function (interval, extent, niceTickExtent, intervalPrecision) {
-	        var ticks = [];
-
-	        // If interval is 0, return [];
-	        if (!interval) {
-	            return ticks;
-	        }
-
-	        // Consider this case: using dataZoom toolbox, zoom and zoom.
-	        var safeLimit = 10000;
-
-	        if (extent[0] < niceTickExtent[0]) {
-	            ticks.push(extent[0]);
-	        }
-	        var tick = niceTickExtent[0];
-
-	        while (tick <= niceTickExtent[1]) {
-	            ticks.push(tick);
-	            // Avoid rounding error
-	            tick = roundNumber(tick + interval, intervalPrecision);
-	            if (tick === ticks[ticks.length - 1]) {
-	                // Consider out of safe float point, e.g.,
-	                // -3711126.9907707 + 2e-10 === -3711126.9907707
-	                break;
-	            }
-	            if (ticks.length > safeLimit) {
-	                return [];
-	            }
-	        }
-	        // Consider this case: the last item of ticks is smaller
-	        // than niceTickExtent[1] and niceTickExtent[1] === extent[1].
-	        if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {
-	            ticks.push(extent[1]);
-	        }
-
-	        return ticks;
-	    };
-
-	    module.exports = helper;
-
-
-/***/ },
-/* 110 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Interval scale
-	 * @module echarts/coord/scale/Time
-	 */
-
-
-
-	    // [About UTC and local time zone]:
-	    // In most cases, `number.parseDate` will treat input data string as local time
-	    // (except time zone is specified in time string). And `format.formateTime` returns
-	    // local time by default. option.useUTC is false by default. This design have
-	    // concidered these common case:
-	    // (1) Time that is persistent in server is in UTC, but it is needed to be diplayed
-	    // in local time by default.
-	    // (2) By default, the input data string (e.g., '2011-01-02') should be displayed
-	    // as its original time, without any time difference.
-
-	    var zrUtil = __webpack_require__(4);
-	    var numberUtil = __webpack_require__(7);
-	    var formatUtil = __webpack_require__(6);
-	    var scaleHelper = __webpack_require__(109);
-
-	    var IntervalScale = __webpack_require__(108);
-
-	    var intervalScaleProto = IntervalScale.prototype;
-
-	    var mathCeil = Math.ceil;
-	    var mathFloor = Math.floor;
-	    var ONE_SECOND = 1000;
-	    var ONE_MINUTE = ONE_SECOND * 60;
-	    var ONE_HOUR = ONE_MINUTE * 60;
-	    var ONE_DAY = ONE_HOUR * 24;
-
-	    // FIXME 公用？
-	    var bisect = function (a, x, lo, hi) {
-	        while (lo < hi) {
-	            var mid = lo + hi >>> 1;
-	            if (a[mid][2] < x) {
-	                lo = mid + 1;
-	            }
-	            else {
-	                hi  = mid;
-	            }
-	        }
-	        return lo;
-	    };
-
-	    /**
-	     * @alias module:echarts/coord/scale/Time
-	     * @constructor
-	     */
-	    var TimeScale = IntervalScale.extend({
-	        type: 'time',
-
-	        // Overwrite
-	        getLabel: function (val) {
-	            var stepLvl = this._stepLvl;
-
-	            var date = new Date(val);
-
-	            return formatUtil.formatTime(stepLvl[0], date, this.getSetting('useUTC'));
-	        },
-
-	        // Overwrite
-	        niceExtent: function (approxTickNum, fixMin, fixMax) {
-	            var extent = this._extent;
-	            // If extent start and end are same, expand them
-	            if (extent[0] === extent[1]) {
-	                // Expand extent
-	                extent[0] -= ONE_DAY;
-	                extent[1] += ONE_DAY;
-	            }
-	            // If there are no data and extent are [Infinity, -Infinity]
-	            if (extent[1] === -Infinity && extent[0] === Infinity) {
-	                var d = new Date();
-	                extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate());
-	                extent[0] = extent[1] - ONE_DAY;
-	            }
-
-	            this.niceTicks(approxTickNum);
-
-	            // var extent = this._extent;
-	            var interval = this._interval;
-
-	            if (!fixMin) {
-	                extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval);
-	            }
-	            if (!fixMax) {
-	                extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval);
-	            }
-	        },
-
-	        // Overwrite
-	        niceTicks: function (approxTickNum) {
-	            var timezoneOffset = this.getSetting('useUTC')
-	                ? 0 : numberUtil.getTimezoneOffset() * 60 * 1000;
-	            approxTickNum = approxTickNum || 10;
-
-	            var extent = this._extent;
-	            var span = extent[1] - extent[0];
-	            var approxInterval = span / approxTickNum;
-	            var scaleLevelsLen = scaleLevels.length;
-	            var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen);
-
-	            var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)];
-	            var interval = level[2];
-	            // Same with interval scale if span is much larger than 1 year
-	            if (level[0] === 'year') {
-	                var yearSpan = span / interval;
-
-	                // From "Nice Numbers for Graph Labels" of Graphic Gems
-	                // var niceYearSpan = numberUtil.nice(yearSpan, false);
-	                var yearStep = numberUtil.nice(yearSpan / approxTickNum, true);
-
-	                interval *= yearStep;
-	            }
-
-	            var niceExtent = [
-	                Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset),
-	                Math.round(mathFloor((extent[1] - timezoneOffset)/ interval) * interval + timezoneOffset)
-	            ];
-
-	            scaleHelper.fixExtent(niceExtent, extent);
-
-	            this._stepLvl = level;
-	            // Interval will be used in getTicks
-	            this._interval = interval;
-	            this._niceExtent = niceExtent;
-	        },
-
-	        parse: function (val) {
-	            // val might be float.
-	            return +numberUtil.parseDate(val);
-	        }
-	    });
-
-	    zrUtil.each(['contain', 'normalize'], function (methodName) {
-	        TimeScale.prototype[methodName] = function (val) {
-	            return intervalScaleProto[methodName].call(this, this.parse(val));
-	        };
-	    });
-
-	    // Steps from d3
-	    var scaleLevels = [
-	        // Format       step    interval
-	        ['hh:mm:ss',    1,      ONE_SECOND],           // 1s
-	        ['hh:mm:ss',    5,      ONE_SECOND * 5],       // 5s
-	        ['hh:mm:ss',    10,     ONE_SECOND * 10],      // 10s
-	        ['hh:mm:ss',    15,     ONE_SECOND * 15],      // 15s
-	        ['hh:mm:ss',    30,     ONE_SECOND * 30],      // 30s
-	        ['hh:mm\nMM-dd',1,      ONE_MINUTE],          // 1m
-	        ['hh:mm\nMM-dd',5,      ONE_MINUTE * 5],      // 5m
-	        ['hh:mm\nMM-dd',10,     ONE_MINUTE * 10],     // 10m
-	        ['hh:mm\nMM-dd',15,     ONE_MINUTE * 15],     // 15m
-	        ['hh:mm\nMM-dd',30,     ONE_MINUTE * 30],     // 30m
-	        ['hh:mm\nMM-dd',1,      ONE_HOUR],        // 1h
-	        ['hh:mm\nMM-dd',2,      ONE_HOUR * 2],    // 2h
-	        ['hh:mm\nMM-dd',6,      ONE_HOUR * 6],    // 6h
-	        ['hh:mm\nMM-dd',12,     ONE_HOUR * 12],   // 12h
-	        ['MM-dd\nyyyy', 1,      ONE_DAY],   // 1d
-	        ['week',        7,      ONE_DAY * 7],        // 7d
-	        ['month',       1,      ONE_DAY * 31],       // 1M
-	        ['quarter',     3,      ONE_DAY * 380 / 4],  // 3M
-	        ['half-year',   6,      ONE_DAY * 380 / 2],  // 6M
-	        ['year',        1,      ONE_DAY * 380]       // 1Y
-	    ];
-
-	    /**
-	     * @param {module:echarts/model/Model}
-	     * @return {module:echarts/scale/Time}
-	     */
-	    TimeScale.create = function (model) {
-	        return new TimeScale({useUTC: model.ecModel.get('useUTC')});
-	    };
-
-	    module.exports = TimeScale;
-
-
-/***/ },
-/* 111 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Log scale
-	 * @module echarts/scale/Log
-	 */
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var Scale = __webpack_require__(107);
-	    var numberUtil = __webpack_require__(7);
-
-	    // Use some method of IntervalScale
-	    var IntervalScale = __webpack_require__(108);
-
-	    var scaleProto = Scale.prototype;
-	    var intervalScaleProto = IntervalScale.prototype;
-
-	    var getPrecisionSafe = numberUtil.getPrecisionSafe;
-	    var roundingErrorFix = numberUtil.round;
-
-	    var mathFloor = Math.floor;
-	    var mathCeil = Math.ceil;
-	    var mathPow = Math.pow;
-
-	    var mathLog = Math.log;
-
-	    var LogScale = Scale.extend({
-
-	        type: 'log',
-
-	        base: 10,
-
-	        $constructor: function () {
-	            Scale.apply(this, arguments);
-	            this._originalScale = new IntervalScale();
-	        },
-
-	        /**
-	         * @return {Array.<number>}
-	         */
-	        getTicks: function () {
-	            var originalScale = this._originalScale;
-	            var extent = this._extent;
-	            var originalExtent = originalScale.getExtent();
-
-	            return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) {
-	                var powVal = numberUtil.round(mathPow(this.base, val));
-
-	                // Fix #4158
-	                powVal = (val === extent[0] && originalScale.__fixMin)
-	                    ? fixRoundingError(powVal, originalExtent[0])
-	                    : powVal;
-	                powVal = (val === extent[1] && originalScale.__fixMax)
-	                    ? fixRoundingError(powVal, originalExtent[1])
-	                    : powVal;
-
-	                return powVal;
-	            }, this);
-	        },
-
-	        /**
-	         * @param {number} val
-	         * @return {string}
-	         */
-	        getLabel: intervalScaleProto.getLabel,
-
-	        /**
-	         * @param  {number} val
-	         * @return {number}
-	         */
-	        scale: function (val) {
-	            val = scaleProto.scale.call(this, val);
-	            return mathPow(this.base, val);
-	        },
-
-	        /**
-	         * @param {number} start
-	         * @param {number} end
-	         */
-	        setExtent: function (start, end) {
-	            var base = this.base;
-	            start = mathLog(start) / mathLog(base);
-	            end = mathLog(end) / mathLog(base);
-	            intervalScaleProto.setExtent.call(this, start, end);
-	        },
-
-	        /**
-	         * @return {number} end
-	         */
-	        getExtent: function () {
-	            var base = this.base;
-	            var extent = scaleProto.getExtent.call(this);
-	            extent[0] = mathPow(base, extent[0]);
-	            extent[1] = mathPow(base, extent[1]);
-
-	            // Fix #4158
-	            var originalScale = this._originalScale;
-	            var originalExtent = originalScale.getExtent();
-	            originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));
-	            originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));
-
-	            return extent;
-	        },
-
-	        /**
-	         * @param  {Array.<number>} extent
-	         */
-	        unionExtent: function (extent) {
-	            this._originalScale.unionExtent(extent);
-
-	            var base = this.base;
-	            extent[0] = mathLog(extent[0]) / mathLog(base);
-	            extent[1] = mathLog(extent[1]) / mathLog(base);
-	            scaleProto.unionExtent.call(this, extent);
-	        },
-
-	        /**
-	         * @override
-	         */
-	        unionExtentFromData: function (data, dim) {
-	            this.unionExtent(data.getDataExtent(dim, true, function (val) {
-	                return val > 0;
-	            }));
-	        },
-
-	        /**
-	         * Update interval and extent of intervals for nice ticks
-	         * @param  {number} [approxTickNum = 10] Given approx tick number
-	         */
-	        niceTicks: function (approxTickNum) {
-	            approxTickNum = approxTickNum || 10;
-	            var extent = this._extent;
-	            var span = extent[1] - extent[0];
-	            if (span === Infinity || span <= 0) {
-	                return;
-	            }
-
-	            var interval = numberUtil.quantity(span);
-	            var err = approxTickNum / span * interval;
-
-	            // Filter ticks to get closer to the desired count.
-	            if (err <= 0.5) {
-	                interval *= 10;
-	            }
-
-	            // Interval should be integer
-	            while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {
-	                interval *= 10;
-	            }
-
-	            var niceExtent = [
-	                numberUtil.round(mathCeil(extent[0] / interval) * interval),
-	                numberUtil.round(mathFloor(extent[1] / interval) * interval)
-	            ];
-
-	            this._interval = interval;
-	            this._niceExtent = niceExtent;
-	        },
-
-	        /**
-	         * Nice extent.
-	         * @param {number} [approxTickNum = 10] Given approx tick number
-	         * @param {boolean} [fixMin=false]
-	         * @param {boolean} [fixMax=false]
-	         */
-	        niceExtent: function (splitNumber, fixMin, fixMax) {
-	            intervalScaleProto.niceExtent.call(this, splitNumber, fixMin, fixMax);
-
-	            var originalScale = this._originalScale;
-	            originalScale.__fixMin = fixMin;
-	            originalScale.__fixMax = fixMax;
-	        }
-
-	    });
-
-	    zrUtil.each(['contain', 'normalize'], function (methodName) {
-	        LogScale.prototype[methodName] = function (val) {
-	            val = mathLog(val) / mathLog(this.base);
-	            return scaleProto[methodName].call(this, val);
-	        };
-	    });
-
-	    LogScale.create = function () {
-	        return new LogScale();
-	    };
-
-	    function fixRoundingError(val, originalVal) {
-	        return roundingErrorFix(val, getPrecisionSafe(originalVal));
-	    }
-
-	    module.exports = LogScale;
-
-
-/***/ },
 /* 112 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 
 	    function getName(obj) {
 	        if (zrUtil.isObject(obj) && obj.value != null) {
 	            return obj.value;
 	        }
 	        else {
-	            return obj;
+	            return obj + '';
 	        }
 	    }
 
@@ -25932,19 +26332,19 @@
 	    __webpack_require__(115);
 
 	    echarts.registerVisual(zrUtil.curry(
-	        __webpack_require__(120), 'line', 'circle', 'line'
+	        __webpack_require__(121), 'line', 'circle', 'line'
 	    ));
 	    echarts.registerLayout(zrUtil.curry(
-	        __webpack_require__(121), 'line'
+	        __webpack_require__(122), 'line'
 	    ));
 
 	    // Down sample after filter
 	    echarts.registerProcessor(PRIORITY.PROCESSOR.STATISTIC, zrUtil.curry(
-	        __webpack_require__(122), 'line'
+	        __webpack_require__(123), 'line'
 	    ));
 
 	    // In case developer forget to include grid component
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 
 /***/ },
@@ -25954,8 +26354,8 @@
 	'use strict';
 
 
-	    var createListFromArray = __webpack_require__(102);
-	    var SeriesModel = __webpack_require__(28);
+	    var createListFromArray = __webpack_require__(109);
+	    var SeriesModel = __webpack_require__(78);
 
 	    module.exports = SeriesModel.extend({
 
@@ -26049,11 +26449,11 @@
 	    var zrUtil = __webpack_require__(4);
 	    var SymbolDraw = __webpack_require__(116);
 	    var Symbol = __webpack_require__(117);
-	    var lineAnimationDiff = __webpack_require__(118);
-	    var graphic = __webpack_require__(44);
+	    var lineAnimationDiff = __webpack_require__(119);
+	    var graphic = __webpack_require__(18);
 	    var modelUtil = __webpack_require__(5);
-	    var polyHelper = __webpack_require__(119);
-	    var ChartView = __webpack_require__(43);
+	    var polyHelper = __webpack_require__(120);
+	    var ChartView = __webpack_require__(80);
 
 	    function isPointsSame(points1, points2) {
 	        if (points1.length !== points2.length) {
@@ -26755,7 +27155,7 @@
 	 */
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Symbol = __webpack_require__(117);
 
 	    /**
@@ -26888,9 +27288,10 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var symbolUtil = __webpack_require__(104);
-	    var graphic = __webpack_require__(44);
+	    var symbolUtil = __webpack_require__(111);
+	    var graphic = __webpack_require__(18);
 	    var numberUtil = __webpack_require__(7);
+	    var labelHelper = __webpack_require__(118);
 
 	    function getSymbolSize(data, idx) {
 	        var symbolSize = data.getItemVisual(idx, 'symbolSize');
@@ -27102,37 +27503,13 @@
 	            elStyle.opacity = opacity;
 	        }
 
-	        // Get last value dim
-	        var dimensions = data.dimensions.slice();
-	        var valueDim;
-	        var dataType;
-	        while (dimensions.length && (
-	            valueDim = dimensions.pop(),
-	            dataType = data.getDimensionInfo(valueDim).type,
-	            dataType === 'ordinal' || dataType === 'time'
-	        )) {} // jshint ignore:line
-
-	        if (valueDim != null && labelModel.getShallow('show')) {
-	            graphic.setText(elStyle, labelModel, color);
-	            elStyle.text = zrUtil.retrieve(
-	                seriesModel.getFormattedLabel(idx, 'normal'),
-	                data.get(valueDim, idx)
-	            );
-	        }
-	        else {
-	            elStyle.text = '';
-	        }
-
-	        if (valueDim != null && hoverLabelModel.getShallow('show')) {
-	            graphic.setText(hoverItemStyle, hoverLabelModel, color);
-	            hoverItemStyle.text = zrUtil.retrieve(
-	                seriesModel.getFormattedLabel(idx, 'emphasis'),
-	                data.get(valueDim, idx)
-	            );
-	        }
-	        else {
-	            hoverItemStyle.text = '';
-	        }
+	        var valueDim = labelHelper.findLabelValueDim(data);
+	        labelHelper.setTextToStyle(
+	            data, idx, valueDim, elStyle, seriesModel, labelModel, color
+	        );
+	        labelHelper.setTextToStyle(
+	            data, idx, valueDim, hoverItemStyle, seriesModel, hoverLabelModel, color
+	        );
 
 	        symbolPath.off('mouseover')
 	            .off('mouseout')
@@ -27185,6 +27562,60 @@
 
 /***/ },
 /* 118 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * @module echarts/chart/helper/Symbol
+	 */
+
+
+	    var graphic = __webpack_require__(18);
+	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+
+	    var helper = {};
+
+	    helper.findLabelValueDim = function (data) {
+	        var valueDim;
+	        var labelDims = modelUtil.otherDimToDataDim(data, 'label');
+
+	        if (labelDims.length) {
+	            valueDim = labelDims[0];
+	        }
+	        else {
+	            // Get last value dim
+	            var dimensions = data.dimensions.slice();
+	            var dataType;
+	            while (dimensions.length && (
+	                valueDim = dimensions.pop(),
+	                dataType = data.getDimensionInfo(valueDim).type,
+	                dataType === 'ordinal' || dataType === 'time'
+	            )) {} // jshint ignore:line
+	        }
+
+	        return valueDim;
+	    };
+
+	    helper.setTextToStyle = function (
+	        data, dataIndex, valueDim, elStyle, seriesModel, labelModel, color
+	    ) {
+	        if (valueDim != null && labelModel.getShallow('show')) {
+	            graphic.setText(elStyle, labelModel, color);
+	            elStyle.text = zrUtil.retrieve(
+	                seriesModel.getFormattedLabel(dataIndex, 'normal'),
+	                data.get(valueDim, dataIndex)
+	            );
+	        }
+	        else {
+	            elStyle.text = '';
+	        }
+	    };
+
+	    module.exports = helper;
+
+
+/***/ },
+/* 119 */
 /***/ function(module, exports) {
 
 	
@@ -27398,13 +27829,13 @@
 
 
 /***/ },
-/* 119 */
+/* 120 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// Poly path support NaN point
 
 
-	    var Path = __webpack_require__(46);
+	    var Path = __webpack_require__(20);
 	    var vec2 = __webpack_require__(10);
 
 	    var vec2Min = vec2.min;
@@ -27653,7 +28084,7 @@
 
 
 /***/ },
-/* 120 */
+/* 121 */
 /***/ function(module, exports) {
 
 	
@@ -27702,7 +28133,7 @@
 
 
 /***/ },
-/* 121 */
+/* 122 */
 /***/ function(module, exports) {
 
 	
@@ -27712,23 +28143,29 @@
 	            var data = seriesModel.getData();
 	            var coordSys = seriesModel.coordinateSystem;
 
-	            if (coordSys) {
-	                var dims = coordSys.dimensions;
+	            if (!coordSys) {
+	                return;
+	            }
 
-	                if (dims.length === 1) {
-	                    data.each(dims[0], function (x, idx) {
-	                        // Also {Array.<number>}, not undefined to avoid if...else... statement
-	                        data.setItemLayout(idx, isNaN(x) ? [NaN, NaN] : coordSys.dataToPoint(x));
-	                    });
-	                }
-	                else if (dims.length === 2) {
-	                    data.each(dims, function (x, y, idx) {
-	                        // Also {Array.<number>}, not undefined to avoid if...else... statement
-	                        data.setItemLayout(
-	                            idx, (isNaN(x) || isNaN(y)) ? [NaN, NaN] : coordSys.dataToPoint([x, y])
-	                        );
-	                    }, true);
-	                }
+	            var dims = [];
+	            var coordDims = coordSys.dimensions;
+	            for (var i = 0; i < coordDims.length; i++) {
+	                dims.push(seriesModel.coordDimToDataDim(coordSys.dimensions[i])[0]);
+	            }
+
+	            if (dims.length === 1) {
+	                data.each(dims[0], function (x, idx) {
+	                    // Also {Array.<number>}, not undefined to avoid if...else... statement
+	                    data.setItemLayout(idx, isNaN(x) ? [NaN, NaN] : coordSys.dataToPoint(x));
+	                });
+	            }
+	            else if (dims.length === 2) {
+	                data.each(dims, function (x, y, idx) {
+	                    // Also {Array.<number>}, not undefined to avoid if...else... statement
+	                    data.setItemLayout(
+	                        idx, (isNaN(x) || isNaN(y)) ? [NaN, NaN] : coordSys.dataToPoint([x, y])
+	                    );
+	                }, true);
 	            }
 	        });
 	    };
@@ -27736,7 +28173,7 @@
 
 
 /***/ },
-/* 122 */
+/* 123 */
 /***/ function(module, exports) {
 
 	
@@ -27819,17 +28256,17 @@
 
 
 /***/ },
-/* 123 */
+/* 124 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var echarts = __webpack_require__(1);
 
-	    __webpack_require__(124);
+	    __webpack_require__(125);
 
 	    __webpack_require__(133);
 
@@ -27863,7 +28300,7 @@
 
 
 /***/ },
-/* 124 */
+/* 125 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -27873,12 +28310,12 @@
 	 */
 	var factory = exports;
 
-	    var layout = __webpack_require__(21);
-	    var axisHelper = __webpack_require__(105);
+	    var layout = __webpack_require__(71);
+	    var axisHelper = __webpack_require__(101);
 
 	    var zrUtil = __webpack_require__(4);
-	    var Cartesian2D = __webpack_require__(125);
-	    var Axis2D = __webpack_require__(127);
+	    var Cartesian2D = __webpack_require__(126);
+	    var Axis2D = __webpack_require__(128);
 
 	    var each = zrUtil.each;
 
@@ -27968,7 +28405,9 @@
 	            for (var idx in axes) {
 	                if (axes.hasOwnProperty(idx)) {
 	                    var axis = axes[idx];
-	                    if (axis && (axis.type === 'category' || !ifAxisCrossZero(axis))) {
+	                    if (axis && (
+	                        axis.type === 'category' || axis.type === 'time' || !ifAxisCrossZero(axis)
+	                    )) {
 	                        return true;
 	                    }
 	                }
@@ -28423,7 +28862,8 @@
 	        ecModel.eachComponent('grid', function (gridModel, idx) {
 	            var grid = new Grid(gridModel, ecModel, api);
 	            grid.name = 'grid_' + idx;
-	            grid.resize(gridModel, api);
+	            // Postpone `resize` to `update`.
+	            // grid.resize(gridModel, api);
 
 	            gridModel.coordinateSystem = grid;
 
@@ -28470,20 +28910,20 @@
 	    // For deciding which dimensions to use when creating list data
 	    Grid.dimensions = Grid.prototype.dimensions = Cartesian2D.prototype.dimensions;
 
-	    __webpack_require__(26).register('cartesian2d', Grid);
+	    __webpack_require__(76).register('cartesian2d', Grid);
 
 	    module.exports = Grid;
 
 
 /***/ },
-/* 125 */
+/* 126 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var Cartesian = __webpack_require__(126);
+	    var Cartesian = __webpack_require__(127);
 
 	    function Cartesian2D(name) {
 
@@ -28584,6 +29024,7 @@
 	        getOtherAxis: function (axis) {
 	            return this.getAxis(axis.dim === 'x' ? 'y' : 'x');
 	        }
+
 	    };
 
 	    zrUtil.inherits(Cartesian2D, Cartesian);
@@ -28592,7 +29033,7 @@
 
 
 /***/ },
-/* 126 */
+/* 127 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -28710,14 +29151,13 @@
 
 
 /***/ },
-/* 127 */
+/* 128 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
 	    var Axis = __webpack_require__(100);
-	    var axisLabelInterval = __webpack_require__(128);
 
 	    /**
 	     * Extend axis 2d
@@ -28797,17 +29237,6 @@
 	        },
 
 	        /**
-	         * @return {number}
-	         */
-	        getLabelInterval: function () {
-	            var labelInterval = this._labelInterval;
-	            if (!labelInterval) {
-	                labelInterval = this._labelInterval = axisLabelInterval(this);
-	            }
-	            return labelInterval;
-	        },
-
-	        /**
 	         * If label is ignored.
 	         * Automatically used when axis is category and label can not be all shown
 	         * @param  {number}  idx
@@ -28852,37 +29281,6 @@
 
 
 /***/ },
-/* 128 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-	/**
-	 * Helper function for axisLabelInterval calculation
-	 */
-
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var axisHelper = __webpack_require__(105);
-
-	    module.exports = function (axis) {
-	        var axisModel = axis.model;
-	        var labelModel = axisModel.getModel('axisLabel');
-	        var labelInterval = labelModel.get('interval');
-	        if (!(axis.type === 'category' && labelInterval === 'auto')) {
-	            return labelInterval === 'auto' ? 0 : labelInterval;
-	        }
-
-	        return axisHelper.getAxisLabelInterval(
-	            zrUtil.map(axis.scale.getTicks(), axis.dataToCoord, axis),
-	            axisModel.getFormattedLabels(),
-	            labelModel.getModel('textStyle').getFont(),
-	            axis.isHorizontal()
-	        );
-	    };
-
-
-/***/ },
 /* 129 */
 /***/ function(module, exports, __webpack_require__) {
 
@@ -28893,7 +29291,7 @@
 
 	    __webpack_require__(130);
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 
 	    module.exports = ComponentModel.extend({
 
@@ -28934,7 +29332,7 @@
 	'use strict';
 
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 	    var zrUtil = __webpack_require__(4);
 	    var axisModelCreator = __webpack_require__(131);
 
@@ -29014,8 +29412,8 @@
 
 	    var axisDefault = __webpack_require__(132);
 	    var zrUtil = __webpack_require__(4);
-	    var ComponentModel = __webpack_require__(19);
-	    var layout = __webpack_require__(21);
+	    var ComponentModel = __webpack_require__(69);
+	    var layout = __webpack_require__(71);
 
 	    // FIXME axisType is fixed ?
 	    var AXIS_TYPES = ['value', 'category', 'time', 'log'];
@@ -29217,10 +29615,11 @@
 	        min: 'dataMin',
 	        max: 'dataMax'
 	    }, valueAxis);
+
 	    var logAxis = zrUtil.defaults({
+	        scale: true,
 	        logBase: 10
 	    }, valueAxis);
-	    logAxis.scale = true;
 
 	    module.exports = {
 	        categoryAxis: categoryAxis,
@@ -29250,7 +29649,7 @@
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var AxisBuilder = __webpack_require__(135);
 	    var AxisView = __webpack_require__(136);
 	    var cartesianAxisHelper = __webpack_require__(138);
@@ -29486,7 +29885,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var formatUtil = __webpack_require__(6);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Model = __webpack_require__(12);
 	    var numberUtil = __webpack_require__(7);
 	    var remRadian = numberUtil.remRadian;
@@ -30657,7 +31056,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    __webpack_require__(124);
+	    __webpack_require__(125);
 
 	    __webpack_require__(140);
 	    __webpack_require__(142);
@@ -30666,6 +31065,7 @@
 	    var echarts = __webpack_require__(1);
 
 	    echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'bar'));
+
 	    // Visual coding for legend
 	    echarts.registerVisual(function (ecModel) {
 	        ecModel.eachSeriesByType('bar', function (seriesModel) {
@@ -30675,7 +31075,7 @@
 	    });
 
 	    // In case developer forget to include grid component
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 
 /***/ },
@@ -30701,20 +31101,14 @@
 	'use strict';
 
 
-	    var SeriesModel = __webpack_require__(28);
-	    var createListFromArray = __webpack_require__(102);
+	    var SeriesModel = __webpack_require__(78);
+	    var createListFromArray = __webpack_require__(109);
 
 	    module.exports = SeriesModel.extend({
 
 	        type: 'series.__base_bar__',
 
 	        getInitialData: function (option, ecModel) {
-	            if (true) {
-	                var coordSys = option.coordinateSystem;
-	                if (coordSys !== 'cartesian2d') {
-	                    throw new Error('Bar only support cartesian2d coordinateSystem');
-	                }
-	            }
 	            return createListFromArray(option.data, this, ecModel);
 	        },
 
@@ -30746,6 +31140,8 @@
 
 	            // 最小高度改为0
 	            barMinHeight: 0,
+	            // 最小角度为0，仅对极坐标系下的柱状图有效
+	            barMinAngle: 0,
 
 	            // barMaxWidth: null,
 	            // 默认自适应
@@ -30777,7 +31173,7 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var helper = __webpack_require__(143);
 
 	    var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'normal', 'barBorderWidth'];
@@ -30793,8 +31189,13 @@
 	        render: function (seriesModel, ecModel, api) {
 	            var coordinateSystemType = seriesModel.get('coordinateSystem');
 
-	            if (coordinateSystemType === 'cartesian2d') {
-	                this._renderOnCartesian(seriesModel, ecModel, api);
+	            if (coordinateSystemType === 'cartesian2d'
+	                || coordinateSystemType === 'polar'
+	            ) {
+	                this._render(seriesModel, ecModel, api);
+	            }
+	            else if (true) {
+	                console.warn('Only cartesian2d and polar supported for bar.');
 	            }
 
 	            return this.group;
@@ -30802,14 +31203,22 @@
 
 	        dispose: zrUtil.noop,
 
-	        _renderOnCartesian: function (seriesModel, ecModel, api) {
+	        _render: function (seriesModel, ecModel, api) {
 	            var group = this.group;
 	            var data = seriesModel.getData();
 	            var oldData = this._data;
 
-	            var cartesian = seriesModel.coordinateSystem;
-	            var baseAxis = cartesian.getBaseAxis();
-	            var isHorizontal = baseAxis.isHorizontal();
+	            var coord = seriesModel.coordinateSystem;
+	            var baseAxis = coord.getBaseAxis();
+	            var isHorizontalOrRadial;
+
+	            if (coord.type === 'cartesian2d') {
+	                isHorizontalOrRadial = baseAxis.isHorizontal();
+	            }
+	            else if (coord.type === 'polar') {
+	                isHorizontalOrRadial = baseAxis.dim === 'angle';
+	            }
+
 	            var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;
 
 	            data.diff(oldData)
@@ -30819,12 +31228,17 @@
 	                    }
 
 	                    var itemModel = data.getItemModel(dataIndex);
-	                    var layout = getRectItemLayout(data, dataIndex, itemModel);
-	                    var el = createRect(data, dataIndex, itemModel, layout, isHorizontal, animationModel);
+	                    var layout = getLayout[coord.type](data, dataIndex, itemModel);
+	                    var el = elementCreator[coord.type](
+	                        data, dataIndex, itemModel, layout, isHorizontalOrRadial, animationModel
+	                    );
 	                    data.setItemGraphicEl(dataIndex, el);
 	                    group.add(el);
 
-	                    updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal);
+	                    updateStyle(
+	                        el, data, dataIndex, itemModel, layout,
+	                        seriesModel, isHorizontalOrRadial, coord.type === 'polar'
+	                    );
 	                })
 	                .update(function (newIndex, oldIndex) {
 	                    var el = oldData.getItemGraphicEl(oldIndex);
@@ -30835,24 +31249,34 @@
 	                    }
 
 	                    var itemModel = data.getItemModel(newIndex);
-	                    var layout = getRectItemLayout(data, newIndex, itemModel);
+	                    var layout = getLayout[coord.type](data, newIndex, itemModel);
 
 	                    if (el) {
 	                        graphic.updateProps(el, {shape: layout}, animationModel, newIndex);
 	                    }
 	                    else {
-	                        el = createRect(data, newIndex, itemModel, layout, isHorizontal, animationModel, true);
+	                        el = elementCreator[coord.type](
+	                            data, newIndex, itemModel, layout, isHorizontalOrRadial, animationModel, true
+	                        );
 	                    }
 
 	                    data.setItemGraphicEl(newIndex, el);
 	                    // Add back
 	                    group.add(el);
 
-	                    updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontal);
+	                    updateStyle(
+	                        el, data, newIndex, itemModel, layout,
+	                        seriesModel, isHorizontalOrRadial, coord.type === 'polar'
+	                    );
 	                })
 	                .remove(function (dataIndex) {
 	                    var el = oldData.getItemGraphicEl(dataIndex);
-	                    el && removeRect(dataIndex, animationModel, el);
+	                    if (coord.type === 'cartesian2d') {
+	                        el && removeRect(dataIndex, animationModel, el);
+	                    }
+	                    else {
+	                        el && removeSector(dataIndex, animationModel, el);
+	                    }
 	                })
 	                .execute();
 
@@ -30865,7 +31289,12 @@
 	            if (ecModel.get('animation')) {
 	                if (data) {
 	                    data.eachItemGraphicEl(function (el) {
-	                        removeRect(el.dataIndex, ecModel, el);
+	                        if (el.type === 'sector') {
+	                            removeSector(el.dataIndex, ecModel, el);
+	                        }
+	                        else {
+	                            removeRect(el.dataIndex, ecModel, el);
+	                        }
 	                    });
 	                }
 	            }
@@ -30875,23 +31304,50 @@
 	        }
 	    });
 
-	    function createRect(data, dataIndex, itemModel, layout, isHorizontal, animationModel, isUpdate) {
-	        var rect = new graphic.Rect({shape: zrUtil.extend({}, layout)});
+	    var elementCreator = {
 
-	        // Animation
-	        if (animationModel) {
-	            var rectShape = rect.shape;
-	            var animateProperty = isHorizontal ? 'height' : 'width';
-	            var animateTarget = {};
-	            rectShape[animateProperty] = 0;
-	            animateTarget[animateProperty] = layout[animateProperty];
-	            graphic[isUpdate ? 'updateProps' : 'initProps'](rect, {
-	                shape: animateTarget
-	            }, animationModel, dataIndex);
+	        cartesian2d: function (
+	            data, dataIndex, itemModel, layout, isHorizontal,
+	            animationModel, isUpdate
+	        ) {
+	            var rect = new graphic.Rect({shape: zrUtil.extend({}, layout)});
+
+	            // Animation
+	            if (animationModel) {
+	                var rectShape = rect.shape;
+	                var animateProperty = isHorizontal ? 'height' : 'width';
+	                var animateTarget = {};
+	                rectShape[animateProperty] = 0;
+	                animateTarget[animateProperty] = layout[animateProperty];
+	                graphic[isUpdate ? 'updateProps' : 'initProps'](rect, {
+	                    shape: animateTarget
+	                }, animationModel, dataIndex);
+	            }
+
+	            return rect;
+	        },
+
+	        polar: function (
+	            data, dataIndex, itemModel, layout, isRadial,
+	            animationModel, isUpdate
+	        ) {
+	            var sector = new graphic.Sector({shape: zrUtil.extend({}, layout)});
+
+	            // Animation
+	            if (animationModel) {
+	                var sectorShape = sector.shape;
+	                var animateProperty = isRadial ? 'r' : 'endAngle';
+	                var animateTarget = {};
+	                sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle;
+	                animateTarget[animateProperty] = layout[animateProperty];
+	                graphic[isUpdate ? 'updateProps' : 'initProps'](sector, {
+	                    shape: animateTarget
+	                }, animationModel, dataIndex);
+	            }
+
+	            return sector;
 	        }
-
-	        return rect;
-	    }
+	    };
 
 	    function removeRect(dataIndex, animationModel, el) {
 	        // Not show text when animating
@@ -30905,28 +31361,58 @@
 	        });
 	    }
 
-	    function getRectItemLayout(data, dataIndex, itemModel) {
-	        var layout = data.getItemLayout(dataIndex);
-	        var fixedLineWidth = getLineWidth(itemModel, layout);
-
-	        // fix layout with lineWidth
-	        var signX = layout.width > 0 ? 1 : -1;
-	        var signY = layout.height > 0 ? 1 : -1;
-	        return {
-	            x: layout.x + signX * fixedLineWidth / 2,
-	            y: layout.y + signY * fixedLineWidth / 2,
-	            width: layout.width - signX * fixedLineWidth,
-	            height: layout.height - signY * fixedLineWidth
-	        };
+	    function removeSector(dataIndex, animationModel, el) {
+	        // Not show text when animating
+	        el.style.text = '';
+	        graphic.updateProps(el, {
+	            shape: {
+	                r: el.shape.r0
+	            }
+	        }, animationModel, dataIndex, function () {
+	            el.parent && el.parent.remove(el);
+	        });
 	    }
 
-	    function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal) {
+	    var getLayout = {
+	        cartesian2d: function (data, dataIndex, itemModel) {
+	            var layout = data.getItemLayout(dataIndex);
+	            var fixedLineWidth = getLineWidth(itemModel, layout);
+
+	            // fix layout with lineWidth
+	            var signX = layout.width > 0 ? 1 : -1;
+	            var signY = layout.height > 0 ? 1 : -1;
+	            return {
+	                x: layout.x + signX * fixedLineWidth / 2,
+	                y: layout.y + signY * fixedLineWidth / 2,
+	                width: layout.width - signX * fixedLineWidth,
+	                height: layout.height - signY * fixedLineWidth
+	            };
+	        },
+
+	        polar: function (data, dataIndex, itemModel) {
+	            var layout = data.getItemLayout(dataIndex);
+	            return {
+	                cx: layout.cx,
+	                cy: layout.cy,
+	                r0: layout.r0,
+	                r: layout.r,
+	                startAngle: layout.startAngle,
+	                endAngle: layout.endAngle
+	            };
+	        }
+	    };
+
+	    function updateStyle(
+	        el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal, isPolar
+	    ) {
 	        var color = data.getItemVisual(dataIndex, 'color');
 	        var opacity = data.getItemVisual(dataIndex, 'opacity');
 	        var itemStyleModel = itemModel.getModel('itemStyle.normal');
 	        var hoverStyle = itemModel.getModel('itemStyle.emphasis').getBarItemStyle();
 
-	        el.setShape('r', itemStyleModel.get('barBorderRadius') || 0);
+	        if (!isPolar && isHorizontal) {
+	            el.setShape('r', itemStyleModel.get('barBorderRadius') || 0);
+	        }
 
 	        el.useStyle(zrUtil.defaults(
 	            {
@@ -30940,10 +31426,12 @@
 	            ? (layout.height > 0 ? 'bottom' : 'top')
 	            : (layout.width > 0 ? 'left' : 'right');
 
-	        helper.setLabel(
-	            el.style, hoverStyle, itemModel, color,
-	            seriesModel, dataIndex, labelPositionOutside
-	        );
+	        if (!isPolar) {
+	            helper.setLabel(
+	                el.style, hoverStyle, itemModel, color,
+	                seriesModel, dataIndex, labelPositionOutside
+	            );
+	        }
 
 	        graphic.setHoverStyle(el, hoverStyle);
 	    }
@@ -30964,7 +31452,7 @@
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 
 	    var helper = {};
 
@@ -31059,49 +31547,65 @@
 	    var numberUtil = __webpack_require__(7);
 	    var parsePercent = numberUtil.parsePercent;
 
+	    var STACK_PREFIX = '__ec_stack_';
+
 	    function getSeriesStackId(seriesModel) {
-	        return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex;
+	        return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex;
 	    }
 
 	    function getAxisKey(axis) {
 	        return axis.dim + axis.index;
 	    }
 
-	    function calBarWidthAndOffset(barSeries, api) {
-	        // Columns info on each category axis. Key is cartesian name
-	        var columnsMap = {};
+	    /**
+	     * @param {Object} opt
+	     * @param {module:echarts/coord/Axis} opt.axis Only support category axis currently.
+	     * @param {number} opt.count Positive interger.
+	     * @param {number} [opt.barWidth]
+	     * @param {number} [opt.barMaxWidth]
+	     * @param {number} [opt.barGap]
+	     * @param {number} [opt.barCategoryGap]
+	     * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined.
+	     */
+	    function getLayoutOnAxis(opt, api) {
+	        var params = [];
+	        var baseAxis = opt.axis;
+	        var axisKey = 'axis0';
 
-	        zrUtil.each(barSeries, function (seriesModel, idx) {
+	        if (baseAxis.type !== 'category') {
+	            return;
+	        }
+	        var bandWidth = baseAxis.getBandWidth();
+
+	        for (var i = 0; i < opt.count || 0; i++) {
+	            params.push(zrUtil.defaults({
+	                bandWidth: bandWidth,
+	                axisKey: axisKey,
+	                stackId: STACK_PREFIX + i
+	            }, opt));
+	        }
+	        var widthAndOffsets = doCalBarWidthAndOffset(params, api);
+
+	        var result = [];
+	        for (var i = 0; i < opt.count; i++) {
+	            var item = widthAndOffsets[axisKey][STACK_PREFIX + i];
+	            item.offsetCenter = item.offset + item.width / 2;
+	            result.push(item);
+	        }
+
+	        return result;
+	    }
+
+	    function calBarWidthAndOffset(barSeries, api) {
+	        var seriesInfoList = zrUtil.map(barSeries, function (seriesModel) {
 	            var data = seriesModel.getData();
 	            var cartesian = seriesModel.coordinateSystem;
-
 	            var baseAxis = cartesian.getBaseAxis();
 	            var axisExtent = baseAxis.getExtent();
 	            var bandWidth = baseAxis.type === 'category'
 	                ? baseAxis.getBandWidth()
 	                : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count());
 
-	            var columnsOnAxis = columnsMap[getAxisKey(baseAxis)] || {
-	                bandWidth: bandWidth,
-	                remainedWidth: bandWidth,
-	                autoWidthCount: 0,
-	                categoryGap: '20%',
-	                gap: '30%',
-	                stacks: {}
-	            };
-	            var stacks = columnsOnAxis.stacks;
-	            columnsMap[getAxisKey(baseAxis)] = columnsOnAxis;
-
-	            var stackId = getSeriesStackId(seriesModel);
-
-	            if (!stacks[stackId]) {
-	                columnsOnAxis.autoWidthCount++;
-	            }
-	            stacks[stackId] = stacks[stackId] || {
-	                width: 0,
-	                maxWidth: 0
-	            };
-
 	            var barWidth = parsePercent(
 	                seriesModel.get('barWidth'), bandWidth
 	            );
@@ -31111,20 +31615,66 @@
 	            var barGap = seriesModel.get('barGap');
 	            var barCategoryGap = seriesModel.get('barCategoryGap');
 
+	            return {
+	                bandWidth: bandWidth,
+	                barWidth: barWidth,
+	                barMaxWidth: barMaxWidth,
+	                barGap: barGap,
+	                barCategoryGap: barCategoryGap,
+	                axisKey: getAxisKey(baseAxis),
+	                stackId: getSeriesStackId(seriesModel)
+	            };
+	        });
+
+	        return doCalBarWidthAndOffset(seriesInfoList, api);
+	    }
+
+	    function doCalBarWidthAndOffset(seriesInfoList, api) {
+	        // Columns info on each category axis. Key is cartesian name
+	        var columnsMap = {};
+
+	        zrUtil.each(seriesInfoList, function (seriesInfo, idx) {
+	            var axisKey = seriesInfo.axisKey;
+	            var bandWidth = seriesInfo.bandWidth;
+	            var columnsOnAxis = columnsMap[axisKey] || {
+	                bandWidth: bandWidth,
+	                remainedWidth: bandWidth,
+	                autoWidthCount: 0,
+	                categoryGap: '20%',
+	                gap: '30%',
+	                stacks: {}
+	            };
+	            var stacks = columnsOnAxis.stacks;
+	            columnsMap[axisKey] = columnsOnAxis;
+
+	            var stackId = seriesInfo.stackId;
+
+	            if (!stacks[stackId]) {
+	                columnsOnAxis.autoWidthCount++;
+	            }
+	            stacks[stackId] = stacks[stackId] || {
+	                width: 0,
+	                maxWidth: 0
+	            };
+
 	            // Caution: In a single coordinate system, these barGrid attributes
 	            // will be shared by series. Consider that they have default values,
 	            // only the attributes set on the last series will work.
 	            // Do not change this fact unless there will be a break change.
 
 	            // TODO
+	            var barWidth = seriesInfo.barWidth;
 	            if (barWidth && !stacks[stackId].width) {
 	                barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);
 	                stacks[stackId].width = barWidth;
 	                columnsOnAxis.remainedWidth -= barWidth;
 	            }
 
+	            var barMaxWidth = seriesInfo.barMaxWidth;
 	            barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);
+	            var barGap = seriesInfo.barGap;
 	            (barGap != null) && (columnsOnAxis.gap = barGap);
+	            var barCategoryGap = seriesInfo.barCategoryGap;
 	            (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap);
 	        });
 
@@ -31214,6 +31764,11 @@
 
 	        ecModel.eachSeriesByType(seriesType, function (seriesModel) {
 
+	            // Check series coordinate, do layout for cartesian2d only
+	            if (seriesModel.coordinateSystem.type !== 'cartesian2d') {
+	                return;
+	            }
+
 	            var data = seriesModel.getData();
 	            var cartesian = seriesModel.coordinateSystem;
 	            var baseAxis = cartesian.getBaseAxis();
@@ -31300,6 +31855,8 @@
 	        }, this);
 	    }
 
+	    barLayoutGrid.getLayoutOnAxis = getLayoutOnAxis;
+
 	    module.exports = barLayoutGrid;
 
 
@@ -31348,7 +31905,7 @@
 	    var List = __webpack_require__(98);
 	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 
 	    var dataSelectableMixin = __webpack_require__(148);
 
@@ -31507,9 +32064,9 @@
 
 	        updateSelectedMap: function (targetList) {
 	            this._selectTargetMap = zrUtil.reduce(targetList || [], function (targetMap, target) {
-	                targetMap[target.name] = target;
+	                targetMap.set(target.name, target);
 	                return targetMap;
-	            }, {});
+	            }, zrUtil.createHashMap());
 	        },
 	        /**
 	         * @param {string} name
@@ -31517,10 +32074,10 @@
 	        // PENGING If selectedMode is null ?
 	        select: function (name) {
 	            var targetMap = this._selectTargetMap;
-	            var target = targetMap[name];
+	            var target = targetMap.get(name);
 	            var selectedMode = this.get('selectedMode');
 	            if (selectedMode === 'single') {
-	                zrUtil.each(targetMap, function (target) {
+	                targetMap.each(function (target) {
 	                    target.selected = false;
 	                });
 	            }
@@ -31531,7 +32088,7 @@
 	         * @param {string} name
 	         */
 	        unSelect: function (name) {
-	            var target = this._selectTargetMap[name];
+	            var target = this._selectTargetMap.get(name);
 	            // var selectedMode = this.get('selectedMode');
 	            // selectedMode !== 'single' && target && (target.selected = false);
 	            target && (target.selected = false);
@@ -31541,7 +32098,7 @@
 	         * @param {string} name
 	         */
 	        toggleSelected: function (name) {
-	            var target = this._selectTargetMap[name];
+	            var target = this._selectTargetMap.get(name);
 	            if (target != null) {
 	                this[target.selected ? 'unSelect' : 'select'](name);
 	                return target.selected;
@@ -31552,7 +32109,7 @@
 	         * @param {string} name
 	         */
 	        isSelected: function (name) {
-	            var target = this._selectTargetMap[name];
+	            var target = this._selectTargetMap.get(name);
 	            return target && target.selected;
 	        }
 	    };
@@ -31564,7 +32121,7 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 
 	    /**
@@ -31842,7 +32399,7 @@
 
 
 	    // Pie view
-	    var Pie = __webpack_require__(43).extend({
+	    var Pie = __webpack_require__(80).extend({
 
 	        type: 'pie',
 
@@ -32059,9 +32616,7 @@
 /* 152 */
 /***/ function(module, exports, __webpack_require__) {
 
-	// TODO minAngle
-
-
+	
 
 	    var numberUtil = __webpack_require__(7);
 	    var parsePercent = numberUtil.parsePercent;
@@ -32097,9 +32652,14 @@
 
 	            var minAngle = seriesModel.get('minAngle') * RADIAN;
 
+	            var validDataCount = 0;
+	            data.each('value', function (value) {
+	                !isNaN(value) && validDataCount++;
+	            });
+
 	            var sum = data.getSum('value');
 	            // Sum may be 0
-	            var unitRadian = Math.PI / (sum || data.count()) * 2;
+	            var unitRadian = Math.PI / (sum || validDataCount) * 2;
 
 	            var clockwise = seriesModel.get('clockwise');
 
@@ -32115,8 +32675,8 @@
 	            var valueSumLargerThanMinAngle = 0;
 
 	            var currentAngle = startAngle;
-
 	            var dir = clockwise ? 1 : -1;
+
 	            data.each('value', function (value, idx) {
 	                var angle;
 	                if (isNaN(value)) {
@@ -32141,7 +32701,7 @@
 	                        ? unitRadian : (value * unitRadian);
 	                }
 	                else {
-	                    angle = PI2 / (data.count() || 1);
+	                    angle = PI2 / validDataCount;
 	                }
 
 	                if (angle < minAngle) {
@@ -32171,27 +32731,32 @@
 
 	            // Some sector is constrained by minAngle
 	            // Rest sectors needs recalculate angle
-	            if (restAngle < PI2) {
+	            if (restAngle < PI2 && validDataCount) {
 	                // Average the angle if rest angle is not enough after all angles is
 	                // Constrained by minAngle
 	                if (restAngle <= 1e-3) {
-	                    var angle = PI2 / data.count();
-	                    data.each(function (idx) {
-	                        var layout = data.getItemLayout(idx);
-	                        layout.startAngle = startAngle + dir * idx * angle;
-	                        layout.endAngle = startAngle + dir * (idx + 1) * angle;
+	                    var angle = PI2 / validDataCount;
+	                    data.each('value', function (value, idx) {
+	                        if (!isNaN(value)) {
+	                            var layout = data.getItemLayout(idx);
+	                            layout.angle = angle;
+	                            layout.startAngle = startAngle + dir * idx * angle;
+	                            layout.endAngle = startAngle + dir * (idx + 1) * angle;
+	                        }
 	                    });
 	                }
 	                else {
 	                    unitRadian = restAngle / valueSumLargerThanMinAngle;
 	                    currentAngle = startAngle;
 	                    data.each('value', function (value, idx) {
-	                        var layout = data.getItemLayout(idx);
-	                        var angle = layout.angle === minAngle
-	                            ? minAngle : value * unitRadian;
-	                        layout.startAngle = currentAngle;
-	                        layout.endAngle = currentAngle + dir * angle;
-	                        currentAngle += dir * angle;
+	                        if (!isNaN(value)) {
+	                            var layout = data.getItemLayout(idx);
+	                            var angle = layout.angle === minAngle
+	                                ? minAngle : value * unitRadian;
+	                            layout.startAngle = currentAngle;
+	                            layout.endAngle = currentAngle + dir * angle;
+	                            currentAngle += dir * angle;
+	                        }
 	                    });
 	                }
 	            }
@@ -32473,14 +33038,14 @@
 	    __webpack_require__(157);
 
 	    echarts.registerVisual(zrUtil.curry(
-	        __webpack_require__(120), 'scatter', 'circle', null
+	        __webpack_require__(121), 'scatter', 'circle', null
 	    ));
 	    echarts.registerLayout(zrUtil.curry(
-	        __webpack_require__(121), 'scatter'
+	        __webpack_require__(122), 'scatter'
 	    ));
 
 	    // In case developer forget to include grid component
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 
 /***/ },
@@ -32490,18 +33055,17 @@
 	'use strict';
 
 
-	    var createListFromArray = __webpack_require__(102);
-	    var SeriesModel = __webpack_require__(28);
+	    var createListFromArray = __webpack_require__(109);
+	    var SeriesModel = __webpack_require__(78);
 
 	    module.exports = SeriesModel.extend({
 
 	        type: 'series.scatter',
 
-	        dependencies: ['grid', 'polar', 'geo', 'singleAxis'],
+	        dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'],
 
 	        getInitialData: function (option, ecModel) {
-	            var list = createListFromArray(option.data, this, ecModel);
-	            return list;
+	            return createListFromArray(option.data, this, ecModel);
 	        },
 
 	        brushSelector: 'point',
@@ -32609,8 +33173,8 @@
 
 
 
-	    var graphic = __webpack_require__(44);
-	    var symbolUtil = __webpack_require__(104);
+	    var graphic = __webpack_require__(18);
+	    var symbolUtil = __webpack_require__(111);
 
 	    var LargeSymbolPath = graphic.extendShape({
 
@@ -32784,7 +33348,7 @@
 	 */
 
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var zrUtil = __webpack_require__(4);
 	    var eventTool = __webpack_require__(88);
 	    var interactionMutex = __webpack_require__(183);
@@ -32808,6 +33372,11 @@
 	         */
 	        this._zr = zr;
 
+	        /**
+	         * @type {Object}
+	         */
+	        this._opt = {};
+
 	        // Avoid two roamController bind the same handler
 	        var bind = zrUtil.bind;
 	        var mousedownHandler = bind(mousedown, this);
@@ -32835,11 +33404,22 @@
 	         * @param  {boolean|string} [controlType=true] Specify the control type,
 	         *                          which can be null/undefined or true/false
 	         *                          or 'pan/move' or 'zoom'/'scale'
+	         * @param {Object} [opt]
+	         * @param {Object} [opt.zoomOnMouseWheel=true]
+	         * @param {Object} [opt.moveOnMouseMove=true]
+	         * @param {Object} [opt.preventDefaultMouseMove=true] When pan.
 	         */
-	        this.enable = function (controlType) {
+	        this.enable = function (controlType, opt) {
+
 	            // Disable previous first
 	            this.disable();
 
+	            this._opt = zrUtil.defaults(zrUtil.clone(opt) || {}, {
+	                zoomOnMouseWheel: true,
+	                moveOnMouseMove: true,
+	                preventDefaultMouseMove: true
+	            });
+
 	            if (controlType == null) {
 	                controlType = true;
 	            }
@@ -32895,33 +33475,33 @@
 	    }
 
 	    function mousemove(e) {
-	        if (!this._dragging) {
+	        if (!checkKeyBinding(this, 'moveOnMouseMove', e) || !this._dragging) {
 	            return;
 	        }
 
-	        eventTool.stop(e.event);
-
-	        if (e.gestureEvent !== 'pinch') {
-
-	            if (interactionMutex.isTaken(this._zr, 'globalPan')) {
-	                return;
-	            }
-
-	            var x = e.offsetX;
-	            var y = e.offsetY;
-
-	            var oldX = this._x;
-	            var oldY = this._y;
-
-	            var dx = x - oldX;
-	            var dy = y - oldY;
-
-	            this._x = x;
-	            this._y = y;
-
-	            eventTool.stop(e.event);
-	            this.trigger('pan', dx, dy, oldX, oldY, x, y);
+	        if (e.gestureEvent === 'pinch') {
+	            return;
 	        }
+
+	        if (interactionMutex.isTaken(this._zr, 'globalPan')) {
+	            return;
+	        }
+
+	        var x = e.offsetX;
+	        var y = e.offsetY;
+
+	        var oldX = this._x;
+	        var oldY = this._y;
+
+	        var dx = x - oldX;
+	        var dy = y - oldY;
+
+	        this._x = x;
+	        this._y = y;
+
+	        this._opt.preventDefaultMouseMove && eventTool.stop(e.event);
+
+	        this.trigger('pan', dx, dy, oldX, oldY, x, y);
 	    }
 
 	    function mouseup(e) {
@@ -32930,9 +33510,10 @@
 
 	    function mousewheel(e) {
 	        // wheelDelta maybe -0 in chrome mac.
-	        if (e.wheelDelta === 0) {
+	        if (!checkKeyBinding(this, 'zoomOnMouseWheel', e) || e.wheelDelta === 0) {
 	            return;
 	        }
+
 	        // Convenience:
 	        // Mac and VM Windows on Mac: scroll up: zoom out.
 	        // Windows: scroll up: zoom in.
@@ -32951,7 +33532,7 @@
 	    function zoom(e, zoomDelta, zoomX, zoomY) {
 	        if (this.pointerChecker && this.pointerChecker(e, zoomX, zoomY)) {
 	            // When mouse is out of roamController rect,
-	            // default befavoius should be be disabled, otherwise
+	            // default befavoius should not be be disabled, otherwise
 	            // page sliding is disabled, contrary to expectation.
 	            eventTool.stop(e.event);
 
@@ -32959,6 +33540,12 @@
 	        }
 	    }
 
+	    function checkKeyBinding(roamController, prop, e) {
+	        var setting = roamController._opt[prop];
+	        return setting
+	            && (!zrUtil.isString(setting) || e.event[setting + 'Key']);
+	    }
+
 	    module.exports = RoamController;
 
 
@@ -33070,7 +33657,7 @@
 	 */
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var LineGroup = __webpack_require__(210);
 
 
@@ -33169,11 +33756,11 @@
 	 */
 
 
-	    var symbolUtil = __webpack_require__(104);
+	    var symbolUtil = __webpack_require__(111);
 	    var vector = __webpack_require__(10);
 	    // var matrix = require('zrender/lib/core/matrix');
 	    var LinePath = __webpack_require__(211);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var numberUtil = __webpack_require__(7);
 
@@ -33540,7 +34127,7 @@
 	 * Line path for bezier and straight line draw
 	 */
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var vec2 = __webpack_require__(10);
 
 	    var straightLineProto = graphic.Line.prototype;
@@ -33623,56 +34210,85 @@
 
 	    /**
 	     * Calculate slider move result.
+	     * Usage:
+	     * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as
+	     * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`.
+	     * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`.
 	     *
 	     * @param {number} delta Move length.
-	     * @param {Array.<number>} handleEnds handleEnds[0] and be bigger then handleEnds[1].
-	     *                                    handleEnds will be modified in this method.
+	     * @param {Array.<number>} handleEnds handleEnds[0] can be bigger then handleEnds[1].
+	     *              handleEnds will be modified in this method.
 	     * @param {Array.<number>} extent handleEnds is restricted by extent.
-	     *                                extent[0] should less or equals than extent[1].
-	     * @param {string} mode 'rigid': Math.abs(handleEnds[0] - handleEnds[1]) remain unchanged,
-	     *                      'cross' handleEnds[0] can be bigger then handleEnds[1],
-	     *                      'push' handleEnds[0] can not be bigger then handleEnds[1],
-	     *                              when they touch, one push other.
-	     * @param {number} handleIndex If mode is 'rigid', handleIndex is not required.
+	     *              extent[0] should less or equals than extent[1].
+	     * @param {number|string} handleIndex Can be 'all', means that both move the two handleEnds,
+	     *              where the input minSpan and maxSpan will not work.
+	     * @param {number} [minSpan] The range of dataZoom can not be smaller than that.
+	     *              If not set, handle0 and cross handle1. If set as a non-negative
+	     *              number (including `0`), handles will push each other when reaching
+	     *              the minSpan.
+	     * @param {number} [maxSpan] The range of dataZoom can not be larger than that.
 	     * @return {Array.<number>} The input handleEnds.
 	     */
-	    module.exports = function (delta, handleEnds, extent, mode, handleIndex) {
-	        if (!delta) {
-	            return handleEnds;
+	    module.exports = function (delta, handleEnds, extent, handleIndex, minSpan, maxSpan) {
+	        // Normalize firstly.
+	        handleEnds[0] = restrict(handleEnds[0], extent);
+	        handleEnds[1] = restrict(handleEnds[1], extent);
+
+	        delta = delta || 0;
+
+	        var extentSpan = extent[1] - extent[0];
+
+	        // Notice maxSpan and minSpan can be null/undefined.
+	        if (minSpan != null) {
+	            minSpan = restrict(minSpan, [0, extentSpan]);
+	        }
+	        if (maxSpan != null) {
+	            maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0);
+	        }
+	        if (handleIndex === 'all') {
+	            minSpan = maxSpan = Math.abs(handleEnds[1] - handleEnds[0]);
+	            handleIndex = 0;
 	        }
 
-	        if (mode === 'rigid') {
-	            delta = getRealDelta(delta, handleEnds, extent);
-	            handleEnds[0] += delta;
-	            handleEnds[1] += delta;
-	        }
-	        else {
-	            delta = getRealDelta(delta, handleEnds[handleIndex], extent);
-	            handleEnds[handleIndex] += delta;
+	        var originalDistSign = getSpanSign(handleEnds, handleIndex);
 
-	            if (mode === 'push' && handleEnds[0] > handleEnds[1]) {
-	                handleEnds[1 - handleIndex] = handleEnds[handleIndex];
-	            }
+	        handleEnds[handleIndex] += delta;
+
+	        // Restrict in extent.
+	        var extentMinSpan = minSpan || 0;
+	        var realExtent = extent.slice();
+	        originalDistSign.sign < 0 ? (realExtent[0] += extentMinSpan) : (realExtent[1] -= extentMinSpan);
+	        handleEnds[handleIndex] = restrict(handleEnds[handleIndex], realExtent);
+
+	        // Expand span.
+	        var currDistSign = getSpanSign(handleEnds, handleIndex);
+	        if (minSpan != null && (
+	            currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan
+	        )) {
+	            // If minSpan exists, 'cross' is forbinden.
+	            handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan;
+	        }
+
+	        // Shrink span.
+	        var currDistSign = getSpanSign(handleEnds, handleIndex);
+	        if (maxSpan != null && currDistSign.span > maxSpan) {
+	            handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan;
 	        }
 
 	        return handleEnds;
-
-	        function getRealDelta(delta, handleEnds, extent) {
-	            var handleMinMax = !handleEnds.length
-	                ? [handleEnds, handleEnds]
-	                : handleEnds.slice();
-	            handleEnds[0] > handleEnds[1] && handleMinMax.reverse();
-
-	            if (delta < 0 && handleMinMax[0] + delta < extent[0]) {
-	                delta = extent[0] - handleMinMax[0];
-	            }
-	            if (delta > 0 && handleMinMax[1] + delta > extent[1]) {
-	                delta = extent[1] - handleMinMax[1];
-	            }
-	            return delta;
-	        }
 	    };
 
+	    function getSpanSign(handleEnds, handleIndex) {
+	        var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex];
+	        // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0]
+	        // is at left of handleEnds[1] for non-cross case.
+	        return {span: Math.abs(dist), sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1};
+	    }
+
+	    function restrict(value, extend) {
+	        return Math.min(extend[1], Math.max(extend[0], value));
+	    }
+
 
 /***/ },
 /* 239 */,
@@ -33691,9 +34307,9 @@
 
 
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var interactionMutex = __webpack_require__(183);
 	    var DataDiffer = __webpack_require__(99);
 
@@ -34684,27 +35300,16 @@
 
 	
 
-	    var zrUtil = __webpack_require__(4);
 	    var cursorHelper = __webpack_require__(185);
 	    var BoundingRect = __webpack_require__(9);
-
-	    var mathMax = Math.max;
-	    var mathMin = Math.min;
+	    var graphicUtil = __webpack_require__(18);
 
 	    var helper = {};
 
 	    helper.makeRectPanelClipPath = function (rect) {
 	        rect = normalizeRect(rect);
 	        return function (localPoints, transform) {
-	            return zrUtil.map(localPoints, function (localPoint) {
-	                var x = localPoint[0];
-	                x = mathMax(x, rect.x);
-	                x = mathMin(x, rect.x + rect.width);
-	                var y = localPoint[1];
-	                y = mathMax(y, rect.y);
-	                y = mathMin(y, rect.y + rect.height);
-	                return [x, y];
-	            });
+	            return graphicUtil.clipPointsByRect(localPoints, rect);
 	        };
 	    };
 
@@ -34844,8 +35449,7 @@
 	            payload.dispatchAction || zrUtil.bind(api.dispatchAction, api),
 	            ecModel,
 	            api,
-	            payload.tooltipOption,
-	            payload.highDownKey
+	            payload.tooltipOption
 	        );
 
 	        return outputFinder;
@@ -34876,20 +35480,26 @@
 	     * @param {string} [currTrigger] 'click' | 'mousemove' | 'leave'
 	     * @param {Array.<number>} [point] x and y, which are mandatory, specify a point to
 	     *              tigger axisPointer and tooltip.
-	     * @param {Object} [finder] {xAxisId: ...[], yAxisName: ...[], angleAxisIndex: ...[]}
+	     * @param {Object} [finder] {
+	     *                  seriesIndex, dataIndex,
+	     *                  axesInfo: [{
+	     *                      axisDim: 'x'|'y'|'angle'|..., axisIndex: ..., value: ...
+	     *                  }, ...]
+	     *              }
 	     *              These properties, which are optional, restrict target axes.
 	     * @param {Function} dispatchAction
 	     * @param {module:echarts/ExtensionAPI} api
 	     * @param {Object} [tooltipOption]
-	     * @param {string} [highDownKey]
 	     * @return {Object} content of event obj for echarts.connect.
 	     */
 	    function axisTrigger(
 	        coordSysAxesInfo, currTrigger, point, finder, dispatchAction,
-	        ecModel, api, tooltipOption, highDownKey
+	        ecModel, api, tooltipOption
 	    ) {
 	        finder = finder || {};
-	        if (!point || point[0] == null || point[1] == null) {
+	        if (illegalPoint(point)) {
+	            // Used in the default behavior of `connection`: use the sample seriesIndex
+	            // and dataIndex. And also used in the tooltipView trigger.
 	            point = findPointFromSeries({
 	                seriesIndex: finder.seriesIndex,
 	                // Do not use dataIndexInside from other ec instance.
@@ -34897,6 +35507,13 @@
 	                dataIndex: finder.dataIndex
 	            }, ecModel).point;
 	        }
+	        var isIllegalPoint = illegalPoint(point);
+
+	        // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}).
+	        // Notice: In this case, it is difficult to get the `point` (which is necessary to show
+	        // tooltip, so if point is not given, we just use the point found by sample seriesIndex
+	        // and dataIndex.
+	        var inputAxesInfo = finder.axesInfo;
 
 	        var axesInfo = coordSysAxesInfo.axesInfo;
 	        var shouldHide = currTrigger === 'leave' || illegalPoint(point);
@@ -34904,21 +35521,26 @@
 
 	        var showValueMap = {};
 	        var dataByCoordSys = {list: [], map: {}};
-	        var highlightBatch = [];
 	        var updaters = {
 	            showPointer: curry(showPointer, showValueMap),
-	            showTooltip: curry(showTooltip, dataByCoordSys),
-	            highlight: curry(highlight, highlightBatch)
+	            showTooltip: curry(showTooltip, dataByCoordSys)
 	        };
 
 	        // Process for triggered axes.
 	        each(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) {
-	            var coordSysContainsPoint = coordSys.containPoint(point);
+	            // If a point given, it must be contained by the coordinate system.
+	            var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point);
 
 	            each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) {
 	                var axis = axisInfo.axis;
-	                if (!shouldHide && coordSysContainsPoint && !notTargetAxis(finder, axis)) {
-	                    processOnAxis(axisInfo, axis.pointToData(point), updaters, false, outputFinder);
+	                var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo);
+	                // If no inputAxesInfo, no axis is restricted.
+	                if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) {
+	                    var val = inputAxisInfo && inputAxisInfo.value;
+	                    if (val == null && !isIllegalPoint) {
+	                        val = axis.pointToData(point);
+	                    }
+	                    val != null && processOnAxis(axisInfo, val, updaters, false, outputFinder);
 	                }
 	            });
 	        });
@@ -34947,9 +35569,9 @@
 	            processOnAxis(axesInfo[tarKey], val, updaters, true, outputFinder);
 	        });
 
-	        updateModelActually(showValueMap, axesInfo);
+	        updateModelActually(showValueMap, axesInfo, outputFinder);
 	        dispatchTooltipActually(dataByCoordSys, point, tooltipOption, dispatchAction);
-	        dispatchHighDownActually(highlightBatch, dispatchAction, api, highDownKey);
+	        dispatchHighDownActually(axesInfo, dispatchAction, api);
 
 	        return outputFinder;
 	    }
@@ -34985,8 +35607,7 @@
 	            }
 	        }
 
-	        updaters.highlight('highlight', payloadBatch);
-	        updaters.showPointer(axisInfo, newValue, payloadBatch);
+	        updaters.showPointer(axisInfo, newValue, payloadBatch, outputFinder);
 	        // Tooltip should always be snapToValue, otherwise there will be
 	        // incorrect "axis value ~ series value" mapping displayed in tooltip.
 	        updaters.showTooltip(axisInfo, payloadInfo, snapToValue);
@@ -35102,11 +35723,8 @@
 	        });
 	    }
 
-	    function highlight(highlightBatch, actionType, batch) {
-	        highlightBatch.push.apply(highlightBatch, batch);
-	    }
-
-	    function updateModelActually(showValueMap, axesInfo) {
+	    function updateModelActually(showValueMap, axesInfo, outputFinder) {
+	        var outputAxesInfo = outputFinder.axesInfo = [];
 	        // Basic logic: If no 'show' required, 'hide' this axisPointer.
 	        each(axesInfo, function (axisInfo, key) {
 	            var option = axisInfo.axisPointerModel.option;
@@ -35115,7 +35733,7 @@
 	            if (valItem) {
 	                !axisInfo.useHandle && (option.status = 'show');
 	                option.value = valItem.value;
-	                // For label formatter param.
+	                // For label formatter param and highlight.
 	                option.seriesDataIndices = (valItem.payloadBatch || []).slice();
 	            }
 	            // When always show (e.g., handle used), remain
@@ -35125,6 +35743,13 @@
 	                // click legend to toggle axis blank.
 	                !axisInfo.useHandle && (option.status = 'hide');
 	            }
+
+	            // If status is 'hide', should be no info in payload.
+	            option.status === 'show' && outputAxesInfo.push({
+	                axisDim: axisInfo.axis.dim,
+	                axisIndex: axisInfo.axis.model.componentIndex,
+	                value: option.value
+	            });
 	        });
 	    }
 
@@ -35154,28 +35779,24 @@
 	        });
 	    }
 
-	    function dispatchHighDownActually(highlightBatch, dispatchAction, api, highDownKey) {
-	        // Basic logic: If nothing highlighted, should downplay all highlighted items.
-	        // This case will occur when mouse leave coordSys.
-
+	    function dispatchHighDownActually(axesInfo, dispatchAction, api) {
 	        // FIXME
-	        // (1) highlight status shoule be managemented in series.getData()?
-	        // (2) If axisPointer A triggerOn 'handle' and axisPointer B triggerOn
-	        // 'mousemove', items highlighted by A will be downplayed by B.
-	        // It will not be fixed until someone requires this scenario.
+	        // highlight status modification shoule be a stage of main process?
+	        // (Consider confilct (e.g., legend and axisPointer) and setOption)
 
-	        // Consider items area hightlighted by 'handle', and globalListener may
-	        // downplay all items (including just highlighted ones) when mousemove.
-	        // So we use a highDownKey to separate them as a temporary solution.
 	        var zr = api.getZr();
-	        highDownKey = 'lastHighlights' + (highDownKey || '');
+	        var highDownKey = 'axisPointerLastHighlights';
 	        var lastHighlights = get(zr)[highDownKey] || {};
 	        var newHighlights = get(zr)[highDownKey] = {};
 
+	        // Update highlight/downplay status according to axisPointer model.
 	        // Build hash map and remove duplicate incidentally.
-	        zrUtil.each(highlightBatch, function (batchItem) {
-	            var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex;
-	            newHighlights[key] = batchItem;
+	        each(axesInfo, function (axisInfo, key) {
+	            var option = axisInfo.axisPointerModel.option;
+	            option.status === 'show' && each(option.seriesDataIndices, function (batchItem) {
+	                var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex;
+	                newHighlights[key] = batchItem;
+	            });
 	        });
 
 	        // Diff.
@@ -35196,21 +35817,15 @@
 	        });
 	    }
 
-	    function notTargetAxis(finder, axis) {
-	        var isTarget = 1;
-	        // If none of xxxAxisId and xxxAxisName and xxxAxisIndex exists in finder,
-	        // no axis is not target axis.
-	        each(finder, function (value, propName) {
-	            isTarget &= !(/^.+(AxisId|AxisName|AxisIndex)$/.test(propName));
-	        });
-	        !isTarget && each(
-	            [['AxisId', 'id'], ['AxisIndex', 'componentIndex'], ['AxisName', 'name']],
-	            function (prop) {
-	                var vals = modelUtil.normalizeToArray(finder[axis.dim + prop[0]]);
-	                isTarget |= zrUtil.indexOf(vals, axis.model[prop[1]]) >= 0;
+	    function findInputAxisInfo(inputAxesInfo, axisInfo) {
+	        for (var i = 0; i < (inputAxesInfo || []).length; i++) {
+	            var inputAxisInfo = inputAxesInfo[i];
+	            if (axisInfo.axis.dim === inputAxisInfo.axisDim
+	                && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex
+	            ) {
+	                return inputAxisInfo;
 	            }
-	        );
-	        return !isTarget;
+	        }
 	    }
 
 	    function makeMapperParam(axisInfo) {
@@ -35224,7 +35839,7 @@
 	    }
 
 	    function illegalPoint(point) {
-	        return point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]);
+	        return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]);
 	    }
 
 	    module.exports = axisTrigger;
@@ -35591,7 +36206,7 @@
 	'use strict';
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var BaseAxisPointer = __webpack_require__(304);
 	    var viewHelper = __webpack_require__(305);
 	    var cartesianAxisHelper = __webpack_require__(138);
@@ -35727,7 +36342,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var clazzUtil = __webpack_require__(13);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var get = __webpack_require__(5).makeGetter();
 	    var axisPointerModelHelper = __webpack_require__(137);
 	    var eventTool = __webpack_require__(88);
@@ -36082,16 +36697,17 @@
 	            }
 
 	            var payloadInfo = this._payloadInfo;
-	            var payload = {
+	            var axisModel = this._axisModel;
+	            this._api.dispatchAction({
 	                type: 'updateAxisPointer',
 	                x: payloadInfo.cursorPoint[0],
 	                y: payloadInfo.cursorPoint[1],
 	                tooltipOption: payloadInfo.tooltipOption,
-	                highDownKey: 'axisPointerHandle'
-	            };
-	            var axis = this._axisModel.axis;
-	            payload[axis.dim + 'AxisId'] = this._axisModel.id;
-	            this._api.dispatchAction(payload);
+	                axesInfo: [{
+	                    axisDim: axisModel.axis.dim,
+	                    axisIndex: axisModel.componentIndex
+	                }]
+	            });
 	        },
 
 	        /**
@@ -36273,11 +36889,11 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var textContain = __webpack_require__(8);
 	    var formatUtil = __webpack_require__(6);
 	    var matrix = __webpack_require__(11);
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 	    var AxisBuilder = __webpack_require__(135);
 
 	    var helper = {};
@@ -36685,7 +37301,13 @@
 /***/ },
 /* 310 */,
 /* 311 */,
-/* 312 */
+/* 312 */,
+/* 313 */,
+/* 314 */,
+/* 315 */,
+/* 316 */,
+/* 317 */,
+/* 318 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -36693,8 +37315,8 @@
 	    var echarts = __webpack_require__(1);
 	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
-	    var graphicUtil = __webpack_require__(44);
-	    var layoutUtil = __webpack_require__(21);
+	    var graphicUtil = __webpack_require__(18);
+	    var layoutUtil = __webpack_require__(71);
 
 	    // -------------
 	    // Preprocessor
@@ -36904,9 +37526,9 @@
 
 	            /**
 	             * @private
-	             * @type {Object}
+	             * @type {module:zrender/core/util.HashMap}
 	             */
-	            this._elMap = {};
+	            this._elMap = zrUtil.createHashMap();
 
 	            /**
 	             * @private
@@ -36960,9 +37582,9 @@
 	            zrUtil.each(elOptionsToUpdate, function (elOption) {
 	                var $action = elOption.$action;
 	                var id = elOption.id;
-	                var existEl = elMap[id];
+	                var existEl = elMap.get(id);
 	                var parentId = elOption.parentId;
-	                var targetElParent = parentId != null ? elMap[parentId] : rootGroup;
+	                var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup;
 
 	                // In top/bottom mode, textVertical should not be used. And textBaseline
 	                // should not be 'alphabetic', which cause inaccurately locating.
@@ -36995,9 +37617,10 @@
 	                    removeEl(existEl, elMap);
 	                }
 
-	                if (elMap[id]) {
-	                    elMap[id].__ecGraphicWidth = elOption.width;
-	                    elMap[id].__ecGraphicHeight = elOption.height;
+	                var el = elMap.get(id);
+	                if (el) {
+	                    el.__ecGraphicWidth = elOption.width;
+	                    el.__ecGraphicHeight = elOption.height;
 	                }
 	            });
 	        },
@@ -37017,7 +37640,7 @@
 	            // Bottom-up tranvese all elements (consider ec resize) to locate elements.
 	            for (var i = elOptions.length - 1; i >= 0; i--) {
 	                var elOption = elOptions[i];
-	                var el = elMap[elOption.id];
+	                var el = elMap.get(elOption.id);
 
 	                if (!el) {
 	                    continue;
@@ -37048,10 +37671,10 @@
 	         */
 	        _clear: function () {
 	            var elMap = this._elMap;
-	            zrUtil.each(elMap, function (el) {
+	            elMap.each(function (el) {
 	                removeEl(el, elMap);
 	            });
-	            this._elMap = {};
+	            this._elMap = zrUtil.createHashMap();
 	        },
 
 	        /**
@@ -37077,7 +37700,7 @@
 
 	        var el = new Clz(elOption);
 	        targetElParent.add(el);
-	        elMap[id] = el;
+	        elMap.set(id, el);
 	        el.__ecGraphicId = id;
 	    }
 
@@ -37087,7 +37710,7 @@
 	            existEl.type === 'group' && existEl.traverse(function (el) {
 	                removeEl(el, elMap);
 	            });
-	            delete elMap[existEl.__ecGraphicId];
+	            elMap.removeKey(existEl.__ecGraphicId);
 	            existElParent.remove(existEl);
 	        }
 	    }
@@ -37192,12 +37815,12 @@
 
 
 /***/ },
-/* 313 */
+/* 319 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 	    __webpack_require__(303);
 
@@ -37206,7 +37829,7 @@
 
 
 /***/ },
-/* 314 */
+/* 320 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -37214,17 +37837,17 @@
 	 */
 
 
-	    __webpack_require__(315);
-	    __webpack_require__(316);
-	    __webpack_require__(317);
+	    __webpack_require__(321);
+	    __webpack_require__(322);
+	    __webpack_require__(323);
 
 	    var echarts = __webpack_require__(1);
 	    // Series Filter
-	    echarts.registerProcessor(__webpack_require__(319));
+	    echarts.registerProcessor(__webpack_require__(325));
 
 
 /***/ },
-/* 315 */
+/* 321 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -37421,7 +38044,7 @@
 
 
 /***/ },
-/* 316 */
+/* 322 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -37457,7 +38080,7 @@
 	                    return;
 	                }
 	                var isItemSelected = legendModel.isSelected(name);
-	                if (name in selectedMap) {
+	                if (selectedMap.hasOwnProperty(name)) {
 	                    // Unselected if any legend is unselected
 	                    selectedMap[name] = selectedMap[name] && isItemSelected;
 	                }
@@ -37508,15 +38131,15 @@
 
 
 /***/ },
-/* 317 */
+/* 323 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var symbolCreator = __webpack_require__(104);
-	    var graphic = __webpack_require__(44);
-	    var listComponentHelper = __webpack_require__(318);
+	    var symbolCreator = __webpack_require__(111);
+	    var graphic = __webpack_require__(18);
+	    var listComponentHelper = __webpack_require__(324);
 
 	    var curry = zrUtil.curry;
 
@@ -37576,7 +38199,7 @@
 	                    ? 'right' : 'left';
 	            }
 
-	            var legendDrawedMap = {};
+	            var legendDrawedMap = zrUtil.createHashMap();
 
 	            zrUtil.each(legendModel.getData(), function (itemModel) {
 	                var name = itemModel.get('name');
@@ -37591,7 +38214,7 @@
 
 	                var seriesModel = ecModel.getSeriesByName(name)[0];
 
-	                if (legendDrawedMap[name]) {
+	                if (legendDrawedMap.get(name)) {
 	                    // Have been drawed
 	                    return;
 	                }
@@ -37622,13 +38245,13 @@
 	                        .on('mouseover', curry(dispatchHighlightAction, seriesModel, null, api))
 	                        .on('mouseout', curry(dispatchDownplayAction, seriesModel, null, api));
 
-	                    legendDrawedMap[name] = true;
+	                    legendDrawedMap.set(name, true);
 	                }
 	                else {
 	                    // Data legend of pie, funnel
 	                    ecModel.eachRawSeries(function (seriesModel) {
 	                        // In case multiple series has same data name
-	                        if (legendDrawedMap[name]) {
+	                        if (legendDrawedMap.get(name)) {
 	                            return;
 	                        }
 	                        if (seriesModel.legendDataProvider) {
@@ -37654,13 +38277,13 @@
 	                                .on('mouseover', curry(dispatchHighlightAction, seriesModel, name, api))
 	                                .on('mouseout', curry(dispatchDownplayAction, seriesModel, name, api));
 
-	                            legendDrawedMap[name] = true;
+	                            legendDrawedMap.set(name, true);
 	                        }
 	                    }, this);
 	                }
 
 	                if (true) {
-	                    if (!legendDrawedMap[name]) {
+	                    if (!legendDrawedMap.get(name)) {
 	                        console.warn(name + ' series not exists. Legend data should be same with series name or data name.');
 	                    }
 	                }
@@ -37778,14 +38401,14 @@
 
 
 /***/ },
-/* 318 */
+/* 324 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 	    // List layout
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var formatUtil = __webpack_require__(6);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 
 	    function positionGroup(group, model, api) {
 	        layout.positionElement(
@@ -37848,7 +38471,7 @@
 
 
 /***/ },
-/* 319 */
+/* 325 */
 /***/ function(module, exports) {
 
 	
@@ -37872,7 +38495,7 @@
 
 
 /***/ },
-/* 320 */
+/* 326 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// FIXME Better way to pack data in graphic element
@@ -37880,9 +38503,9 @@
 
 	    __webpack_require__(297);
 
-	    __webpack_require__(321);
+	    __webpack_require__(327);
 
-	    __webpack_require__(322);
+	    __webpack_require__(328);
 
 
 	    // Show tip action
@@ -37916,7 +38539,7 @@
 
 
 /***/ },
-/* 321 */
+/* 327 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -38026,22 +38649,22 @@
 
 
 /***/ },
-/* 322 */
+/* 328 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var TooltipContent = __webpack_require__(323);
+	    var TooltipContent = __webpack_require__(329);
 	    var zrUtil = __webpack_require__(4);
 	    var formatUtil = __webpack_require__(6);
 	    var numberUtil = __webpack_require__(7);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var findPointFromSeries = __webpack_require__(299);
-	    var layoutUtil = __webpack_require__(21);
+	    var layoutUtil = __webpack_require__(71);
 	    var env = __webpack_require__(2);
 	    var Model = __webpack_require__(12);
 	    var globalListener = __webpack_require__(302);
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 	    var axisPointerViewHelper = __webpack_require__(305);
 
 	    var bind = zrUtil.bind;
@@ -38644,13 +39267,13 @@
 	            var contentNotChanged = !!lastCoordSys
 	                && lastCoordSys.length === dataByCoordSys.length;
 
-	            each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) {
+	            contentNotChanged && each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) {
 	                var lastDataByAxis = lastItemCoordSys.dataByAxis || {};
 	                var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {};
 	                var thisDataByAxis = thisItemCoordSys.dataByAxis || [];
 	                contentNotChanged &= lastDataByAxis.length === thisDataByAxis.length;
 
-	                each(lastDataByAxis, function (lastItem, indexAxis) {
+	                contentNotChanged && each(lastDataByAxis, function (lastItem, indexAxis) {
 	                    var thisItem = thisDataByAxis[indexAxis] || {};
 	                    var lastIndices = lastItem.seriesDataIndices || [];
 	                    var newIndices = thisItem.seriesDataIndices || [];
@@ -38661,7 +39284,7 @@
 	                        && lastItem.axisId === thisItem.axisId
 	                        && lastIndices.length === newIndices.length;
 
-	                    each(lastIndices, function (lastIdxItem, j) {
+	                    contentNotChanged && each(lastIndices, function (lastIdxItem, j) {
 	                        var newIdxItem = newIndices[j];
 	                        contentNotChanged &=
 	                            lastIdxItem.seriesIndex === newIdxItem.seriesIndex
@@ -38802,7 +39425,7 @@
 
 
 /***/ },
-/* 323 */
+/* 329 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -38811,7 +39434,7 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var zrColor = __webpack_require__(39);
+	    var zrColor = __webpack_require__(31);
 	    var eventUtil = __webpack_require__(88);
 	    var formatUtil = __webpack_require__(6);
 	    var each = zrUtil.each;
@@ -39068,12 +39691,6 @@
 
 
 /***/ },
-/* 324 */,
-/* 325 */,
-/* 326 */,
-/* 327 */,
-/* 328 */,
-/* 329 */,
 /* 330 */,
 /* 331 */,
 /* 332 */,
@@ -39088,13 +39705,20 @@
 /* 341 */,
 /* 342 */,
 /* 343 */,
-/* 344 */
+/* 344 */,
+/* 345 */,
+/* 346 */,
+/* 347 */,
+/* 348 */,
+/* 349 */,
+/* 350 */,
+/* 351 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var modelUtil = __webpack_require__(5);
 	    var brushHelper = __webpack_require__(245);
 
@@ -39337,7 +39961,7 @@
 	            var yAxisModels = foundCpts.yAxisModels;
 	            var gridModels = foundCpts.gridModels;
 	            // Remove duplicated.
-	            var gridModelMap = {};
+	            var gridModelMap = zrUtil.createHashMap();
 	            var xAxesHas = {};
 	            var yAxesHas = {};
 
@@ -39347,21 +39971,21 @@
 
 	            each(xAxisModels, function (axisModel) {
 	                var gridModel = axisModel.axis.grid.model;
-	                gridModelMap[gridModel.id] = gridModel;
+	                gridModelMap.set(gridModel.id, gridModel);
 	                xAxesHas[gridModel.id] = true;
 	            });
 	            each(yAxisModels, function (axisModel) {
 	                var gridModel = axisModel.axis.grid.model;
-	                gridModelMap[gridModel.id] = gridModel;
+	                gridModelMap.set(gridModel.id, gridModel);
 	                yAxesHas[gridModel.id] = true;
 	            });
 	            each(gridModels, function (gridModel) {
-	                gridModelMap[gridModel.id] = gridModel;
+	                gridModelMap.set(gridModel.id, gridModel);
 	                xAxesHas[gridModel.id] = true;
 	                yAxesHas[gridModel.id] = true;
 	            });
 
-	            each(gridModelMap, function (gridModel) {
+	            gridModelMap.each(function (gridModel) {
 	                var grid = gridModel.coordinateSystem;
 	                var cartesians = [];
 
@@ -39536,11 +40160,11 @@
 
 
 /***/ },
-/* 345 */,
-/* 346 */,
-/* 347 */,
-/* 348 */,
-/* 349 */
+/* 352 */,
+/* 353 */,
+/* 354 */,
+/* 355 */,
+/* 356 */
 /***/ function(module, exports) {
 
 	'use strict';
@@ -39560,19 +40184,19 @@
 
 
 /***/ },
-/* 350 */,
-/* 351 */,
-/* 352 */,
-/* 353 */,
-/* 354 */
+/* 357 */,
+/* 358 */,
+/* 359 */,
+/* 360 */,
+/* 361 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var echarts = __webpack_require__(1);
-	    var graphic = __webpack_require__(44);
-	    var layout = __webpack_require__(21);
+	    var graphic = __webpack_require__(18);
+	    var layout = __webpack_require__(71);
 
 	    // Model
 	    echarts.extendComponentModel({
@@ -39778,7 +40402,7 @@
 
 
 /***/ },
-/* 355 */
+/* 362 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -39786,29 +40410,29 @@
 	 */
 
 
-	    __webpack_require__(356);
-
-	    __webpack_require__(357);
-	    __webpack_require__(360);
-
-	    __webpack_require__(361);
-	    __webpack_require__(362);
-
 	    __webpack_require__(363);
-	    __webpack_require__(364);
 
-	    __webpack_require__(366);
+	    __webpack_require__(364);
 	    __webpack_require__(367);
 
+	    __webpack_require__(368);
+	    __webpack_require__(369);
+
+	    __webpack_require__(370);
+	    __webpack_require__(371);
+
+	    __webpack_require__(373);
+	    __webpack_require__(374);
+
 
 
 /***/ },
-/* 356 */
+/* 363 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(19).registerSubTypeDefaulter('dataZoom', function (option) {
+	    __webpack_require__(69).registerSubTypeDefaulter('dataZoom', function (option) {
 	        // Default 'slider' when no type specified.
 	        return 'slider';
 	    });
@@ -39816,7 +40440,7 @@
 
 
 /***/ },
-/* 357 */
+/* 364 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -39828,8 +40452,8 @@
 	    var env = __webpack_require__(2);
 	    var echarts = __webpack_require__(1);
 	    var modelUtil = __webpack_require__(5);
-	    var helper = __webpack_require__(358);
-	    var AxisProxy = __webpack_require__(359);
+	    var helper = __webpack_require__(365);
+	    var AxisProxy = __webpack_require__(366);
 	    var each = zrUtil.each;
 	    var eachAxisDim = helper.eachAxisDim;
 
@@ -39851,12 +40475,18 @@
 	            xAxisIndex: null,       // Default the first horizontal category axis.
 	            yAxisIndex: null,       // Default the first vertical category axis.
 
-	            filterMode: 'filter',   // Possible values: 'filter' or 'empty'.
-	                                    // 'filter': data items which are out of window will be removed.
-	                                    //           This option is applicable when filtering outliers.
+	            filterMode: 'filter',   // Possible values: 'filter' or 'empty' or 'weakFilter'.
+	                                    // 'filter': data items which are out of window will be removed. This option is
+	                                    //          applicable when filtering outliers. For each data item, it will be
+	                                    //          filtered if one of the relevant dimensions is out of the window.
+	                                    // 'weakFilter': data items which are out of window will be removed. This option
+	                                    //          is applicable when filtering outliers. For each data item, it will be
+	                                    //          filtered only if all  of the relevant dimensions are out of the same
+	                                    //          side of the window.
 	                                    // 'empty': data items which are out of window will be set to empty.
 	                                    //          This option is applicable when user should not neglect
 	                                    //          that there are some data items out of window.
+	                                    // 'none': Do not filter.
 	                                    // Taking line chart as an example, line will be broken in
 	                                    // the filtered points when filterModel is set to 'empty', but
 	                                    // be connected when set to 'filter'.
@@ -39868,7 +40498,11 @@
 	            start: 0,               // Start percent. 0 ~ 100
 	            end: 100,               // End percent. 0 ~ 100
 	            startValue: null,       // Start value. If startValue specified, start is ignored.
-	            endValue: null          // End value. If endValue specified, end is ignored.
+	            endValue: null,         // End value. If endValue specified, end is ignored.
+	            minSpan: null,          // 0 ~ 100
+	            maxSpan: null,          // 0 ~ 100
+	            minValueSpan: null,     // The range of dataZoom can not be smaller than that.
+	            maxValueSpan: null      // The range of dataZoom can not be larger than that.
 	        },
 
 	        /**
@@ -40290,9 +40924,15 @@
 
 	        /**
 	         * @public
+	         * @param {module:echarts/model/Model} [axisModel] If axisModel given, find axisProxy
+	         *      corresponding to the axisModel
 	         * @return {module:echarts/component/dataZoom/AxisProxy}
 	         */
-	        findRepresentativeAxisProxy: function () {
+	        findRepresentativeAxisProxy: function (axisModel) {
+	            if (axisModel) {
+	                return axisModel.__dzAxisProxy;
+	            }
+
 	            // Find the first hosted axisProxy
 	            var axisProxies = this._axisProxies;
 	            for (var key in axisProxies) {
@@ -40350,7 +40990,7 @@
 
 
 /***/ },
-/* 358 */
+/* 365 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -40488,7 +41128,7 @@
 
 
 /***/ },
-/* 359 */
+/* 366 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -40498,7 +41138,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var numberUtil = __webpack_require__(7);
-	    var helper = __webpack_require__(358);
+	    var helper = __webpack_require__(365);
 	    var each = zrUtil.each;
 	    var asc = numberUtil.asc;
 
@@ -40543,6 +41183,13 @@
 	        this._dataExtent;
 
 	        /**
+	         * {minSpan, maxSpan, minValueSpan, maxValueSpan}
+	         * @private
+	         * @type {Object}
+	         */
+	        this._minMaxSpan;
+
+	        /**
 	         * @readOnly
 	         * @type {module: echarts/model/Global}
 	         */
@@ -40640,6 +41287,10 @@
 	            return foundOtherAxisModel;
 	        },
 
+	        getMinMaxSpan: function () {
+	            return zrUtil.clone(this._minMaxSpan);
+	        },
+
 	        /**
 	         * Only calculate by given range and this._dataExtent, do not change anything.
 	         *
@@ -40734,6 +41385,8 @@
 	            this._valueWindow = dataWindow.valueWindow;
 	            this._percentWindow = dataWindow.percentWindow;
 
+	            setMinMaxSpan(this);
+
 	            // Update axis setting then.
 	            setAxisModel(this);
 	        },
@@ -40763,6 +41416,10 @@
 	            var filterMode = dataZoomModel.get('filterMode');
 	            var valueWindow = this._valueWindow;
 
+	            if (filterMode === 'none') {
+	                return;
+	            }
+
 	            // FIXME
 	            // Toolbox may has dataZoom injected. And if there are stacked bar chart
 	            // with NaN data, NaN will be filtered and stack will be wrong.
@@ -40782,19 +41439,43 @@
 	            // Process series data
 	            each(seriesModels, function (seriesModel) {
 	                var seriesData = seriesModel.getData();
+	                var dataDims = seriesModel.coordDimToDataDim(axisDim);
 
-	                seriesData && each(seriesModel.coordDimToDataDim(axisDim), function (dim) {
-	                    if (filterMode === 'empty') {
-	                        seriesModel.setData(
-	                            seriesData.map(dim, function (value) {
-	                                return !isInWindow(value) ? NaN : value;
-	                            })
-	                        );
-	                    }
-	                    else {
-	                        seriesData.filterSelf(dim, isInWindow);
-	                    }
-	                });
+	                if (filterMode === 'weakFilter') {
+	                    seriesData && seriesData.filterSelf(function (dataIndex) {
+	                        var leftOut;
+	                        var rightOut;
+	                        var hasValue;
+	                        for (var i = 0; i < dataDims.length; i++) {
+	                            var value = seriesData.get(dataDims[i], dataIndex);
+	                            var thisHasValue = !isNaN(value);
+	                            var thisLeftOut = value < valueWindow[0];
+	                            var thisRightOut = value > valueWindow[1];
+	                            if (thisHasValue && !thisLeftOut && !thisRightOut) {
+	                                return true;
+	                            }
+	                            thisHasValue && (hasValue = true);
+	                            thisLeftOut && (leftOut = true);
+	                            thisRightOut && (rightOut = true);
+	                        }
+	                        // If both left out and right out, do not filter.
+	                        return hasValue && leftOut && rightOut;
+	                    });
+	                }
+	                else {
+	                    seriesData && each(dataDims, function (dim) {
+	                        if (filterMode === 'empty') {
+	                            seriesModel.setData(
+	                                seriesData.map(dim, function (value) {
+	                                    return !isInWindow(value) ? NaN : value;
+	                                })
+	                            );
+	                        }
+	                        else {
+	                            seriesData.filterSelf(dim, isInWindow);
+	                        }
+	                    });
+	                }
 	            });
 
 	            function isInWindow(value) {
@@ -40893,17 +41574,39 @@
 	        );
 	    }
 
+	    function setMinMaxSpan(axisProxy) {
+	        var minMaxSpan = axisProxy._minMaxSpan = {};
+	        var dataZoomModel = axisProxy._dataZoomModel;
+
+	        each(['min', 'max'], function (minMax) {
+	            minMaxSpan[minMax + 'Span'] = dataZoomModel.get(minMax + 'Span');
+
+	            // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan
+	            var valueSpan = dataZoomModel.get(minMax + 'ValueSpan');
+	            if (valueSpan != null) {
+	                minMaxSpan[minMax + 'ValueSpan'] = valueSpan;
+
+	                valueSpan = axisProxy.getAxisModel().axis.scale.parse(valueSpan);
+	                if (valueSpan != null) {
+	                    minMaxSpan[minMax + 'Span'] = numberUtil.linearMap(
+	                        valueSpan, axisProxy._dataExtent, [0, 100], true
+	                    );
+	                }
+	            }
+	        });
+	    }
+
 	    module.exports = AxisProxy;
 
 
 
 /***/ },
-/* 360 */
+/* 367 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var ComponentView = __webpack_require__(29);
+	    var ComponentView = __webpack_require__(79);
 
 	    module.exports = ComponentView.extend({
 
@@ -40975,7 +41678,7 @@
 
 
 /***/ },
-/* 361 */
+/* 368 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -40983,7 +41686,7 @@
 	 */
 
 
-	    var DataZoomModel = __webpack_require__(357);
+	    var DataZoomModel = __webpack_require__(364);
 
 	    var SliderZoomModel = DataZoomModel.extend({
 
@@ -41054,19 +41757,19 @@
 
 
 /***/ },
-/* 362 */
+/* 369 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var throttle = __webpack_require__(81);
-	    var DataZoomView = __webpack_require__(360);
+	    var DataZoomView = __webpack_require__(367);
 	    var Rect = graphic.Rect;
 	    var numberUtil = __webpack_require__(7);
 	    var linearMap = numberUtil.linearMap;
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var sliderMove = __webpack_require__(238);
 	    var eventTool = __webpack_require__(88);
 
@@ -41307,11 +42010,12 @@
 	            return [0, this._size[0]];
 	        },
 
-	        _renderBackground : function () {
+	        _renderBackground: function () {
 	            var dataZoomModel = this.dataZoomModel;
 	            var size = this._size;
+	            var barGroup = this._displayables.barGroup;
 
-	            this._displayables.barGroup.add(new Rect({
+	            barGroup.add(new Rect({
 	                silent: true,
 	                shape: {
 	                    x: 0, y: 0, width: size[0], height: size[1]
@@ -41321,6 +42025,18 @@
 	                },
 	                z2: -40
 	            }));
+
+	            // Click panel, over shadow, below handles.
+	            barGroup.add(new Rect({
+	                shape: {
+	                    x: 0, y: 0, width: size[0], height: size[1]
+	                },
+	                style: {
+	                    fill: 'transparent'
+	                },
+	                z2: 0,
+	                onclick: zrUtil.bind(this._onClickPanelClick, this)
+	            }));
 	        },
 
 	        _renderDataShadow: function () {
@@ -41509,7 +42225,7 @@
 
 	            var iconStr = dataZoomModel.get('handleIcon');
 	            each([0, 1], function (handleIndex) {
-	                var path = graphic.makePath(iconStr, {
+	                var iconOpt = {
 	                    style: {
 	                        strokeNoScale: true
 	                    },
@@ -41524,12 +42240,21 @@
 	                    ondragend: bind(this._onDragEnd, this),
 	                    onmouseover: bind(this._showDataInfo, this, true),
 	                    onmouseout: bind(this._showDataInfo, this, false)
-	                }, {
-	                    x: -0.5,
-	                    y: 0,
-	                    width: 1,
-	                    height: 1
-	                }, 'center');
+	                };
+	                var iconStyle = {x: -1, y: 0, width: 2, height: 2};
+
+	                var path = iconStr.indexOf('image://') === 0
+	                    ? (
+	                        iconStyle.image = iconStr.slice(8),
+	                        iconOpt.style = iconStyle,
+	                        new graphic.Image(iconOpt)
+	                    )
+	                    : graphic.makePath(
+	                        iconStr.replace('path://', ''),
+	                        iconOpt,
+	                        iconStyle,
+	                        'center'
+	                    );
 
 	                var bRect = path.getBoundingRect();
 	                this._handleHeight = numberUtil.parsePercent(dataZoomModel.get('handleSize'), this._size[1]);
@@ -41579,25 +42304,29 @@
 	        /**
 	         * @private
 	         * @param {(number|string)} handleIndex 0 or 1 or 'all'
-	         * @param {number} dx
-	         * @param {number} dy
+	         * @param {number} delta
 	         */
 	        _updateInterval: function (handleIndex, delta) {
+	            var dataZoomModel = this.dataZoomModel;
 	            var handleEnds = this._handleEnds;
 	            var viewExtend = this._getViewExtent();
+	            var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();
+	            var percentExtent = [0, 100];
 
 	            sliderMove(
 	                delta,
 	                handleEnds,
 	                viewExtend,
-	                (handleIndex === 'all' || this.dataZoomModel.get('zoomLock'))
-	                    ? 'rigid' : 'cross',
-	                handleIndex
+	                dataZoomModel.get('zoomLock') ? 'all' : handleIndex,
+	                minMaxSpan.minSpan != null
+	                    ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null,
+	                minMaxSpan.maxSpan != null
+	                    ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null
 	            );
 
 	            this._range = asc([
-	                linearMap(handleEnds[0], viewExtend, [0, 100], true),
-	                linearMap(handleEnds[1], viewExtend, [0, 100], true)
+	                linearMap(handleEnds[0], viewExtend, percentExtent, true),
+	                linearMap(handleEnds[1], viewExtend, percentExtent, true)
 	            ]);
 	        },
 
@@ -41615,7 +42344,7 @@
 	                var handle = displaybles.handles[handleIndex];
 	                var handleHeight = this._handleHeight;
 	                handle.attr({
-	                    scale: [handleHeight, handleHeight],
+	                    scale: [handleHeight / 2, handleHeight / 2],
 	                    position: [handleEnds[handleIndex], size[1] / 2 - handleHeight / 2]
 	                });
 	            }, this);
@@ -41741,7 +42470,8 @@
 	            this._dragging = true;
 
 	            // Transform dx, dy to bar coordination.
-	            var vertex = this._applyBarTransform([dx, dy], true);
+	            var barTransform = this._displayables.barGroup.getLocalTransform();
+	            var vertex = graphic.applyTransform([dx, dy], barTransform, true);
 
 	            this._updateInterval(handleIndex, vertex[0]);
 
@@ -41760,6 +42490,24 @@
 	            this._dispatchZoomAction();
 	        },
 
+	        _onClickPanelClick: function (e) {
+	            var size = this._size;
+	            var localPoint = this._displayables.barGroup.transformCoordToLocal(e.offsetX, e.offsetY);
+
+	            if (localPoint[0] < 0 || localPoint[0] > size[0]
+	                || localPoint[1] < 0 || localPoint[1] > size[1]
+	            ) {
+	                return;
+	            }
+
+	            var handleEnds = this._handleEnds;
+	            var center = (handleEnds[0] + handleEnds[1]) / 2;
+
+	            this._updateInterval('all', localPoint[0] - center);
+	            this._updateView();
+	            this._dispatchZoomAction();
+	        },
+
 	        /**
 	         * This action will be throttled.
 	         * @private
@@ -41779,14 +42527,6 @@
 	        /**
 	         * @private
 	         */
-	        _applyBarTransform: function (vertex, inverse) {
-	            var barTransform = this._displayables.barGroup.getLocalTransform();
-	            return graphic.applyTransform(vertex, barTransform, inverse);
-	        },
-
-	        /**
-	         * @private
-	         */
 	        _findCoordRect: function () {
 	            // Find the grid coresponding to the first axis referred by dataZoom.
 	            var rect;
@@ -41824,7 +42564,7 @@
 
 
 /***/ },
-/* 363 */
+/* 370 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -41832,7 +42572,7 @@
 	 */
 
 
-	    module.exports = __webpack_require__(357).extend({
+	    module.exports = __webpack_require__(364).extend({
 
 	        type: 'dataZoom.inside',
 
@@ -41841,21 +42581,24 @@
 	         */
 	        defaultOption: {
 	            disabled: false,   // Whether disable this inside zoom.
-	            zoomLock: false  // Whether disable zoom but only pan.
+	            zoomLock: false,   // Whether disable zoom but only pan.
+	            zoomOnMouseWheel: true, // Can be: true / false / 'shift' / 'ctrl' / 'alt'.
+	            moveOnMouseMove: true,   // Can be: true / false / 'shift' / 'ctrl' / 'alt'.
+	            preventDefaultMouseMove: true
 	        }
 	    });
 
 
 /***/ },
-/* 364 */
+/* 371 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var DataZoomView = __webpack_require__(360);
+	    var DataZoomView = __webpack_require__(367);
 	    var zrUtil = __webpack_require__(4);
 	    var sliderMove = __webpack_require__(238);
-	    var roams = __webpack_require__(365);
+	    var roams = __webpack_require__(372);
 	    var bind = zrUtil.bind;
 
 	    var InsideZoomView = DataZoomView.extend({
@@ -41897,6 +42640,7 @@
 
 	                zrUtil.each(coordInfoList, function (coordInfo) {
 	                    var coordModel = coordInfo.model;
+	                    var dataZoomOption = dataZoomModel.option;
 
 	                    roams.register(
 	                        api,
@@ -41909,7 +42653,14 @@
 	                            dataZoomId: dataZoomModel.id,
 	                            throttleRate: dataZoomModel.get('throttle', true),
 	                            panGetRange: bind(this._onPan, this, coordInfo, coordSysName),
-	                            zoomGetRange: bind(this._onZoom, this, coordInfo, coordSysName)
+	                            zoomGetRange: bind(this._onZoom, this, coordInfo, coordSysName),
+	                            zoomLock: dataZoomOption.zoomLock,
+	                            disabled: dataZoomOption.disabled,
+	                            roamControllerOpt: {
+	                                zoomOnMouseWheel: dataZoomOption.zoomOnMouseWheel,
+	                                moveOnMouseMove: dataZoomOption.moveOnMouseMove,
+	                                preventDefaultMouseMove: dataZoomOption.preventDefaultMouseMove
+	                            }
 	                        }
 	                    );
 	                }, this);
@@ -41930,10 +42681,6 @@
 	         * @private
 	         */
 	        _onPan: function (coordInfo, coordSysName, controller, dx, dy, oldX, oldY, newX, newY) {
-	            if (this.dataZoomModel.option.disabled) {
-	                return this._range;
-	            }
-
 	            var range = this._range.slice();
 
 	            // Calculate transform by the first axis.
@@ -41950,7 +42697,7 @@
 	                * (range[1] - range[0])
 	                * directionInfo.pixel / directionInfo.pixelLength;
 
-	            sliderMove(percentDelta, range, [0, 100], 'rigid');
+	            sliderMove(percentDelta, range, [0, 100], 'all');
 
 	            return (this._range = range);
 	        },
@@ -41959,12 +42706,6 @@
 	         * @private
 	         */
 	        _onZoom: function (coordInfo, coordSysName, controller, scale, mouseX, mouseY) {
-	            var option = this.dataZoomModel.option;
-
-	            if (option.disabled || option.zoomLock) {
-	                return this._range;
-	            }
-
 	            var range = this._range.slice();
 
 	            // Calculate transform by the first axis.
@@ -41983,7 +42724,12 @@
 	            scale = Math.max(1 / scale, 0);
 	            range[0] = (range[0] - percentPoint) * scale + percentPoint;
 	            range[1] = (range[1] - percentPoint) * scale + percentPoint;
-	            return (this._range = fixRange(range));
+
+	            // Restrict range.
+	            var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();
+	            sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan);
+
+	            return (this._range = range);
 	        }
 
 	    });
@@ -42066,24 +42812,11 @@
 	        }
 	    };
 
-	    function fixRange(range) {
-	        // Clamp, using !(<= or >=) to handle NaN.
-	        // jshint ignore:start
-	        var bound = [0, 100];
-	        !(range[0] <= bound[1]) && (range[0] = bound[1]);
-	        !(range[1] <= bound[1]) && (range[1] = bound[1]);
-	        !(range[0] >= bound[0]) && (range[0] = bound[0]);
-	        !(range[1] >= bound[0]) && (range[1] = bound[0]);
-	        // jshint ignore:end
-
-	        return range;
-	    }
-
 	    module.exports = InsideZoomView;
 
 
 /***/ },
-/* 365 */
+/* 372 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -42117,6 +42850,8 @@
 	         * @param {number} dataZoomInfo.throttleRate
 	         * @param {Function} dataZoomInfo.panGetRange
 	         * @param {Function} dataZoomInfo.zoomGetRange
+	         * @param {boolean} [dataZoomInfo.zoomLock]
+	         * @param {boolean} [dataZoomInfo.disabled]
 	         */
 	        register: function (api, dataZoomInfo) {
 	            var store = giveStore(api);
@@ -42145,9 +42880,13 @@
 	                    dataZoomInfos: {},
 	                    count: 0
 	                };
-	                record.controller = createController(api, dataZoomInfo, record);
+	                record.controller = createController(api, record);
 	                record.dispatchAction = zrUtil.curry(dispatchAction, api);
 	            }
+	            record.controller.enable(
+	                dataZoomInfo.disabled ? false : dataZoomInfo.zoomLock ? 'move' : true,
+	                dataZoomInfo.roamControllerOpt
+	            );
 
 	            // Consider resize, area should be always updated.
 	            record.controller.setPointerChecker(dataZoomInfo.containsPoint);
@@ -42218,9 +42957,8 @@
 	        return zr[ATTR] || (zr[ATTR] = {});
 	    }
 
-	    function createController(api, dataZoomInfo, newRecord) {
+	    function createController(api, newRecord) {
 	        var controller = new RoamController(api.getZr());
-	        controller.enable();
 	        controller.on('pan', curry(onPan, newRecord));
 	        controller.on('zoom', curry(onZoom, newRecord));
 
@@ -42278,7 +43016,7 @@
 
 
 /***/ },
-/* 366 */
+/* 373 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -42341,7 +43079,7 @@
 
 
 /***/ },
-/* 367 */
+/* 374 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -42350,7 +43088,7 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var helper = __webpack_require__(358);
+	    var helper = __webpack_require__(365);
 	    var echarts = __webpack_require__(1);
 
 
@@ -42389,13 +43127,6 @@
 
 
 /***/ },
-/* 368 */,
-/* 369 */,
-/* 370 */,
-/* 371 */,
-/* 372 */,
-/* 373 */,
-/* 374 */,
 /* 375 */,
 /* 376 */,
 /* 377 */,
@@ -42404,14 +43135,21 @@
 /* 380 */,
 /* 381 */,
 /* 382 */,
-/* 383 */
+/* 383 */,
+/* 384 */,
+/* 385 */,
+/* 386 */,
+/* 387 */,
+/* 388 */,
+/* 389 */,
+/* 390 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// HINT Markpoint can't be used too much
 
 
-	    __webpack_require__(384);
-	    __webpack_require__(386);
+	    __webpack_require__(391);
+	    __webpack_require__(393);
 
 	    __webpack_require__(1).registerPreprocessor(function (opt) {
 	        // Make sure markPoint component is enabled
@@ -42420,12 +43158,12 @@
 
 
 /***/ },
-/* 384 */
+/* 391 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    module.exports = __webpack_require__(385).extend({
+	    module.exports = __webpack_require__(392).extend({
 
 	        type: 'markPoint',
 
@@ -42458,7 +43196,7 @@
 
 
 /***/ },
-/* 385 */
+/* 392 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -42596,7 +43334,7 @@
 
 
 /***/ },
-/* 386 */
+/* 393 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -42607,7 +43345,7 @@
 
 	    var List = __webpack_require__(98);
 
-	    var markerHelper = __webpack_require__(387);
+	    var markerHelper = __webpack_require__(394);
 
 	    function updateMarkerLayout(mpData, seriesModel, api) {
 	        var coordSys = seriesModel.coordinateSystem;
@@ -42645,7 +43383,7 @@
 	        });
 	    }
 
-	    __webpack_require__(388).extend({
+	    __webpack_require__(395).extend({
 
 	        type: 'markPoint',
 
@@ -42654,7 +43392,7 @@
 	                var mpModel = seriesModel.markPointModel;
 	                if (mpModel) {
 	                    updateMarkerLayout(mpModel.getData(), seriesModel, api);
-	                    this.markerGroupMap[seriesModel.name].updateLayout(mpModel);
+	                    this.markerGroupMap.get(seriesModel.name).updateLayout(mpModel);
 	                }
 	            }, this);
 	        },
@@ -42665,10 +43403,8 @@
 	            var seriesData = seriesModel.getData();
 
 	            var symbolDrawMap = this.markerGroupMap;
-	            var symbolDraw = symbolDrawMap[seriesName];
-	            if (!symbolDraw) {
-	                symbolDraw = symbolDrawMap[seriesName] = new SymbolDraw();
-	            }
+	            var symbolDraw = symbolDrawMap.get(seriesName)
+	                || symbolDrawMap.set(seriesName, new SymbolDraw());
 
 	            var mpData = createList(coordSys, seriesModel, mpModel);
 
@@ -42757,7 +43493,7 @@
 
 
 /***/ },
-/* 387 */
+/* 394 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -42961,11 +43697,13 @@
 
 
 /***/ },
-/* 388 */
+/* 395 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
+	    var zrUtil = __webpack_require__(4);
+
 	    module.exports = __webpack_require__(1).extendComponentView({
 
 	        type: 'marker',
@@ -42974,18 +43712,16 @@
 	            /**
 	             * Markline grouped by series
 	             * @private
-	             * @type {Object}
+	             * @type {module:zrender/core/util.HashMap}
 	             */
-	            this.markerGroupMap = {};
+	            this.markerGroupMap = zrUtil.createHashMap();
 	        },
 
 	        render: function (markerModel, ecModel, api) {
 	            var markerGroupMap = this.markerGroupMap;
-	            for (var name in markerGroupMap) {
-	                if (markerGroupMap.hasOwnProperty(name)) {
-	                    markerGroupMap[name].__keep = false;
-	                }
-	            }
+	            markerGroupMap.each(function (item) {
+	                item.__keep = false;
+	            });
 
 	            var markerModelKey = this.type + 'Model';
 	            ecModel.eachSeries(function (seriesModel) {
@@ -42993,11 +43729,9 @@
 	                markerModel && this.renderSeries(seriesModel, markerModel, ecModel, api);
 	            }, this);
 
-	            for (var name in markerGroupMap) {
-	                if (markerGroupMap.hasOwnProperty(name) && !markerGroupMap[name].__keep) {
-	                    this.group.remove(markerGroupMap[name].group);
-	                }
-	            }
+	            markerGroupMap.each(function (item) {
+	                !item.__keep && this.group.remove(item.group);
+	            }, this);
 	        },
 
 	        renderSeries: function () {}
@@ -43005,13 +43739,13 @@
 
 
 /***/ },
-/* 389 */
+/* 396 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(390);
-	    __webpack_require__(391);
+	    __webpack_require__(397);
+	    __webpack_require__(398);
 
 	    __webpack_require__(1).registerPreprocessor(function (opt) {
 	        // Make sure markLine component is enabled
@@ -43020,12 +43754,12 @@
 
 
 /***/ },
-/* 390 */
+/* 397 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    module.exports = __webpack_require__(385).extend({
+	    module.exports = __webpack_require__(392).extend({
 
 	        type: 'markLine',
 
@@ -43065,7 +43799,7 @@
 
 
 /***/ },
-/* 391 */
+/* 398 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -43074,7 +43808,7 @@
 	    var List = __webpack_require__(98);
 	    var numberUtil = __webpack_require__(7);
 
-	    var markerHelper = __webpack_require__(387);
+	    var markerHelper = __webpack_require__(394);
 
 	    var LineDraw = __webpack_require__(209);
 
@@ -43246,7 +43980,7 @@
 	        data.setItemLayout(idx, point);
 	    }
 
-	    __webpack_require__(388).extend({
+	    __webpack_require__(395).extend({
 
 	        type: 'markLine',
 
@@ -43270,7 +44004,7 @@
 	                        ]);
 	                    });
 
-	                    this.markerGroupMap[seriesModel.name].updateLayout();
+	                    this.markerGroupMap.get(seriesModel.name).updateLayout();
 
 	                }
 	            }, this);
@@ -43282,10 +44016,8 @@
 	            var seriesData = seriesModel.getData();
 
 	            var lineDrawMap = this.markerGroupMap;
-	            var lineDraw = lineDrawMap[seriesName];
-	            if (!lineDraw) {
-	                lineDraw = lineDrawMap[seriesName] = new LineDraw();
-	            }
+	            var lineDraw = lineDrawMap.get(seriesName)
+	                || lineDrawMap.set(seriesName, new LineDraw());
 	            this.group.add(lineDraw.group);
 
 	            var mlData = createList(coordSys, seriesModel, mlModel);
@@ -43425,13 +44157,13 @@
 
 
 /***/ },
-/* 392 */
+/* 399 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(393);
-	    __webpack_require__(394);
+	    __webpack_require__(400);
+	    __webpack_require__(401);
 
 	    __webpack_require__(1).registerPreprocessor(function (opt) {
 	        // Make sure markArea component is enabled
@@ -43440,12 +44172,12 @@
 
 
 /***/ },
-/* 393 */
+/* 400 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    module.exports = __webpack_require__(385).extend({
+	    module.exports = __webpack_require__(392).extend({
 
 	        type: 'markArea',
 
@@ -43481,7 +44213,7 @@
 
 
 /***/ },
-/* 394 */
+/* 401 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// TODO Better on polar
@@ -43490,10 +44222,10 @@
 	    var zrUtil = __webpack_require__(4);
 	    var List = __webpack_require__(98);
 	    var numberUtil = __webpack_require__(7);
-	    var graphic = __webpack_require__(44);
-	    var colorUtil = __webpack_require__(39);
+	    var graphic = __webpack_require__(18);
+	    var colorUtil = __webpack_require__(31);
 
-	    var markerHelper = __webpack_require__(387);
+	    var markerHelper = __webpack_require__(394);
 
 	    var markAreaTransform = function (seriesModel, coordSys, maModel, item) {
 	        var lt = markerHelper.dataTransform(seriesModel, item[0]);
@@ -43613,7 +44345,7 @@
 
 	    var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']];
 
-	    __webpack_require__(388).extend({
+	    __webpack_require__(395).extend({
 
 	        type: 'markArea',
 
@@ -43641,12 +44373,9 @@
 	            var seriesData = seriesModel.getData();
 
 	            var areaGroupMap = this.markerGroupMap;
-	            var polygonGroup = areaGroupMap[seriesName];
-	            if (!polygonGroup) {
-	                polygonGroup = areaGroupMap[seriesName] = {
-	                    group: new graphic.Group()
-	                };
-	            }
+	            var polygonGroup = areaGroupMap.get(seriesName)
+	                || areaGroupMap.set(seriesName, {group: new graphic.Group()});
+
 	            this.group.add(polygonGroup.group);
 	            polygonGroup.__keep = true;
 
@@ -43803,37 +44532,37 @@
 
 
 /***/ },
-/* 395 */,
-/* 396 */,
-/* 397 */,
-/* 398 */,
-/* 399 */,
-/* 400 */,
-/* 401 */,
 /* 402 */,
 /* 403 */,
-/* 404 */
+/* 404 */,
+/* 405 */,
+/* 406 */,
+/* 407 */,
+/* 408 */,
+/* 409 */,
+/* 410 */,
+/* 411 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(405);
-	    __webpack_require__(406);
+	    __webpack_require__(412);
+	    __webpack_require__(413);
 
-	    __webpack_require__(407);
-	    __webpack_require__(408);
-	    __webpack_require__(409);
-	    __webpack_require__(410);
+	    __webpack_require__(414);
 	    __webpack_require__(415);
+	    __webpack_require__(416);
+	    __webpack_require__(417);
+	    __webpack_require__(422);
 
 
 /***/ },
-/* 405 */
+/* 412 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var featureManager = __webpack_require__(349);
+	    var featureManager = __webpack_require__(356);
 	    var zrUtil = __webpack_require__(4);
 
 	    var ToolboxModel = __webpack_require__(1).extendComponentModel({
@@ -43904,17 +44633,17 @@
 
 
 /***/ },
-/* 406 */
+/* 413 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/* WEBPACK VAR INJECTION */(function(process) {
 
-	    var featureManager = __webpack_require__(349);
+	    var featureManager = __webpack_require__(356);
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Model = __webpack_require__(12);
 	    var DataDiffer = __webpack_require__(99);
-	    var listComponentHelper = __webpack_require__(318);
+	    var listComponentHelper = __webpack_require__(324);
 	    var textContain = __webpack_require__(8);
 
 	    module.exports = __webpack_require__(1).extendComponentView({
@@ -44159,7 +44888,7 @@
 	/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(309)))
 
 /***/ },
-/* 407 */
+/* 414 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -44223,7 +44952,7 @@
 	        }
 	    };
 
-	    __webpack_require__(349).register(
+	    __webpack_require__(356).register(
 	        'saveAsImage', SaveAsImage
 	    );
 
@@ -44231,7 +44960,7 @@
 
 
 /***/ },
-/* 408 */
+/* 415 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -44405,13 +45134,13 @@
 	        ecModel.mergeOption(payload.newOption);
 	    });
 
-	    __webpack_require__(349).register('magicType', MagicType);
+	    __webpack_require__(356).register('magicType', MagicType);
 
 	    module.exports = MagicType;
 
 
 /***/ },
-/* 409 */
+/* 416 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -44858,7 +45587,7 @@
 	        });
 	    }
 
-	    __webpack_require__(349).register('dataView', DataView);
+	    __webpack_require__(356).register('dataView', DataView);
 
 	    __webpack_require__(1).registerAction({
 	        type: 'changeDataView',
@@ -44894,7 +45623,7 @@
 
 
 /***/ },
-/* 410 */
+/* 417 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -44902,13 +45631,14 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var BrushController = __webpack_require__(244);
-	    var BrushTargetManager = __webpack_require__(344);
-	    var history = __webpack_require__(411);
+	    var BrushTargetManager = __webpack_require__(351);
+	    var history = __webpack_require__(418);
+	    var sliderMove = __webpack_require__(238);
 
 	    var each = zrUtil.each;
 
 	    // Use dataZoomSelect
-	    __webpack_require__(412);
+	    __webpack_require__(419);
 
 	    // Spectial component id start with \0ec\0, see echarts/model/Global.js~hasInnerId
 	    var DATA_ZOOM_ID_BASE = '\0_ec_\0toolbox-dataZoom_';
@@ -45021,7 +45751,19 @@
 	        this._dispatchZoomAction(snapshot);
 
 	        function setBatch(dimName, coordSys, minMax) {
-	            var dataZoomModel = findDataZoom(dimName, coordSys.getAxis(dimName).model, ecModel);
+	            var axis = coordSys.getAxis(dimName);
+	            var axisModel = axis.model;
+	            var dataZoomModel = findDataZoom(dimName, axisModel, ecModel);
+
+	            // Restrict range.
+	            var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan();
+	            if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) {
+	                minMax = sliderMove(
+	                    0, minMax.slice(), axis.scale.getExtent(), 0,
+	                    minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan
+	                );
+	            }
+
 	            dataZoomModel && (snapshot[dataZoomModel.id] = {
 	                dataZoomId: dataZoomModel.id,
 	                startValue: minMax[0],
@@ -45114,7 +45856,7 @@
 	    }
 
 
-	    __webpack_require__(349).register('dataZoom', DataZoom);
+	    __webpack_require__(356).register('dataZoom', DataZoom);
 
 
 	    // Create special dataZoom option for select
@@ -45190,7 +45932,7 @@
 
 
 /***/ },
-/* 411 */
+/* 418 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -45304,7 +46046,7 @@
 
 
 /***/ },
-/* 412 */
+/* 419 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -45312,21 +46054,21 @@
 	 */
 
 
-	    __webpack_require__(356);
+	    __webpack_require__(363);
 
-	    __webpack_require__(357);
-	    __webpack_require__(360);
-
-	    __webpack_require__(413);
-	    __webpack_require__(414);
-
-	    __webpack_require__(366);
+	    __webpack_require__(364);
 	    __webpack_require__(367);
 
+	    __webpack_require__(420);
+	    __webpack_require__(421);
+
+	    __webpack_require__(373);
+	    __webpack_require__(374);
+
 
 
 /***/ },
-/* 413 */
+/* 420 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -45334,7 +46076,7 @@
 	 */
 
 
-	    var DataZoomModel = __webpack_require__(357);
+	    var DataZoomModel = __webpack_require__(364);
 
 	    module.exports = DataZoomModel.extend({
 
@@ -45345,12 +46087,12 @@
 
 
 /***/ },
-/* 414 */
+/* 421 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    module.exports = __webpack_require__(360).extend({
+	    module.exports = __webpack_require__(367).extend({
 
 	        type: 'dataZoom.select'
 
@@ -45359,13 +46101,13 @@
 
 
 /***/ },
-/* 415 */
+/* 422 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var history = __webpack_require__(411);
+	    var history = __webpack_require__(418);
 
 	    function Restore(model) {
 	        this.model = model;
@@ -45389,7 +46131,7 @@
 	    };
 
 
-	    __webpack_require__(349).register('restore', Restore);
+	    __webpack_require__(356).register('restore', Restore);
 
 
 	    __webpack_require__(1).registerAction(
@@ -45403,16 +46145,16 @@
 
 
 /***/ },
-/* 416 */
+/* 423 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
-	    __webpack_require__(417);
-	    __webpack_require__(82).registerPainter('vml', __webpack_require__(419));
+	    __webpack_require__(424);
+	    __webpack_require__(82).registerPainter('vml', __webpack_require__(426));
 
 
 /***/ },
-/* 417 */
+/* 424 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// http://www.w3.org/TR/NOTE-VML
@@ -45422,19 +46164,19 @@
 	if (!__webpack_require__(2).canvasSupported) {
 	    var vec2 = __webpack_require__(10);
 	    var BoundingRect = __webpack_require__(9);
-	    var CMD = __webpack_require__(50).CMD;
-	    var colorTool = __webpack_require__(39);
+	    var CMD = __webpack_require__(36).CMD;
+	    var colorTool = __webpack_require__(31);
 	    var textContain = __webpack_require__(8);
-	    var RectText = __webpack_require__(49);
-	    var Displayable = __webpack_require__(47);
-	    var ZImage = __webpack_require__(62);
-	    var Text = __webpack_require__(63);
-	    var Path = __webpack_require__(46);
-	    var PathProxy = __webpack_require__(50);
+	    var RectText = __webpack_require__(35);
+	    var Displayable = __webpack_require__(21);
+	    var ZImage = __webpack_require__(49);
+	    var Text = __webpack_require__(50);
+	    var Path = __webpack_require__(20);
+	    var PathProxy = __webpack_require__(36);
 
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 
-	    var vmlCore = __webpack_require__(418);
+	    var vmlCore = __webpack_require__(425);
 
 	    var round = Math.round;
 	    var sqrt = Math.sqrt;
@@ -46473,7 +47215,7 @@
 
 
 /***/ },
-/* 418 */
+/* 425 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -46526,7 +47268,7 @@
 
 
 /***/ },
-/* 419 */
+/* 426 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -46537,8 +47279,8 @@
 
 
 
-	    var zrLog = __webpack_require__(41);
-	    var vmlCore = __webpack_require__(418);
+	    var zrLog = __webpack_require__(33);
+	    var vmlCore = __webpack_require__(425);
 
 	    function parseInt10(val) {
 	        return parseInt(val, 10);
diff --git a/dist/echarts.common.min.js b/dist/echarts.common.min.js
index f0dc2eb..9cc1708 100644
--- a/dist/echarts.common.min.js
+++ b/dist/echarts.common.min.js
@@ -1,4 +1,4 @@
-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={exports:{},id:i,loaded:!1};return t[i].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){t.exports=n(2),n(107),n(101),n(111),n(191),n(207),n(232),n(55),n(209),n(208),n(223),n(216),n(215),n(214),n(197),n(224),n(239)},function(t,e){function n(t){if(null==t||"object"!=typeof t)return t;var e=t,i=R.call(t);if("[object Array]"===i){e=[];for(var r=0,o=t.length;r<o;r++)e[r]=n(t[r])}else if(N[i])e=t.constructor.from(t);else if(!z[i]&&!L(t)&&!T(t)){e={};for(var a in t)t.hasOwnProperty(a)&&(e[a]=n(t[a]))}return e}function i(t,e,r){if(!M(e)||!M(t))return r?n(e):t;for(var o in e)if(e.hasOwnProperty(o)){var a=t[o],s=e[o];!M(s)||!M(a)||_(s)||_(a)||T(s)||T(a)||S(s)||S(a)||L(s)||L(a)?!r&&o in t||(t[o]=n(e[o],!0)):i(a,s,r)}return t}function r(t,e){for(var n=t[0],r=1,o=t.length;r<o;r++)n=i(n,t[r],e);return n}function o(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function a(t,e,n){for(var i in e)e.hasOwnProperty(i)&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i]);return t}function s(){return document.createElement("canvas")}function l(){return E||(E=U.createCanvas().getContext("2d")),E}function u(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function h(t,e){function n(){}var i=t.prototype;n.prototype=e.prototype,t.prototype=new n;for(var r in i)t.prototype[r]=i[r];t.prototype.constructor=t,t.superClass=e}function c(t,e,n){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,a(t,e,n)}function d(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function f(t,e,n){if(t&&e)if(t.forEach&&t.forEach===V)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(n,t[o],o,t)}function p(t,e,n){if(t&&e){if(t.map&&t.map===H)return t.map(e,n);for(var i=[],r=0,o=t.length;r<o;r++)i.push(e.call(n,t[r],r,t));return i}}function g(t,e,n,i){if(t&&e){if(t.reduce&&t.reduce===W)return t.reduce(e,n,i);for(var r=0,o=t.length;r<o;r++)n=e.call(i,n,t[r],r,t);return n}}function v(t,e,n){if(t&&e){if(t.filter&&t.filter===F)return t.filter(e,n);for(var i=[],r=0,o=t.length;r<o;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}}function m(t,e,n){if(t&&e)for(var i=0,r=t.length;i<r;i++)if(e.call(n,t[i],i,t))return t[i]}function y(t,e){var n=G.call(arguments,2);return function(){return t.apply(e,n.concat(G.call(arguments)))}}function x(t){var e=G.call(arguments,1);return function(){return t.apply(this,e.concat(G.call(arguments)))}}function _(t){return"[object Array]"===R.call(t)}function b(t){return"function"==typeof t}function w(t){return"[object String]"===R.call(t)}function M(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function S(t){return!!z[R.call(t)]}function T(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function A(t){return t!==t}function I(t){for(var e=0,n=arguments.length;e<n;e++)if(null!=arguments[e])return arguments[e]}function C(){return Function.call.apply(G,arguments)}function P(t,e){if(!t)throw new Error(e)}function k(t){t[Z]=!0}function L(t){return t[Z]}function D(t){t&&o(this,t)}function O(){return new D}var E,z={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},N={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},R=Object.prototype.toString,B=Array.prototype,V=B.forEach,F=B.filter,G=B.slice,H=B.map,W=B.reduce,Z="__ec_primitive__",q="_ec_",j=4;D.prototype={constructor:D,get:function(t){return this[q+t]},set:function(t,e){return this[q+t]=e,e},each:function(t,e){void 0!==e&&(t=y(t,e));for(var n in this)this.hasOwnProperty(n)&&t(this[n],n.slice(j))},removeKey:function(t){delete this[t]}};var U={inherits:h,mixin:c,clone:n,merge:i,mergeAll:r,extend:o,defaults:a,getContext:l,createCanvas:s,indexOf:u,slice:C,find:m,isArrayLike:d,each:f,map:p,reduce:g,filter:v,bind:y,curry:x,isArray:_,isString:w,isObject:M,isFunction:b,isBuiltInObject:S,isDom:T,eqNaN:A,retrieve:I,assert:P,setAsPrimitive:k,createHashMap:O,noop:function(){}};t.exports=U},function(t,e,n){function i(t){return function(e,n,i){e=e&&e.toLowerCase(),B.prototype[t].call(this,e,n,i)}}function r(){B.call(this)}function o(t,e,n){function i(t,e){return t.prio-e.prio}n=n||{},"string"==typeof e&&(e=lt[e]),this.id,this.group,this._dom=t;var o=this._zr=z.init(t,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.width,height:n.height});this._throttledZrFlush=E.throttle(N.bind(o.flush,o),17),this._theme=N.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new A,this._api=b(this),B.call(this),this._messageCenter=new r,this._initEvents(),this.resize=N.bind(this.resize,this),this._pendingActions=[],V(st,i),V(rt,i),o.animation.on("frame",this._onframe,this),N.setAsPrimitive(this)}function a(t,e,n){var i,r=this._model,o=this._coordSysMgr.getCoordinateSystems();e=O.parseFinder(r,e);for(var a=0;a<o.length;a++){var s=o[a];if(s[t]&&null!=(i=s[t](r,e,n)))return i}}function s(t,e,n,i,r){function o(i){i&&i.__alive&&i[e]&&i[e](i.__model,a,t._api,n)}var a=t._model;if(!i)return void F(t._componentsViews.concat(t._chartsViews),o);var s={};s[i+"Id"]=n[i+"Id"],s[i+"Index"]=n[i+"Index"],s[i+"Name"]=n[i+"Name"];var l={mainType:i,query:s};r&&(l.subType=r),a&&a.eachComponent(l,function(e,n){o(t["series"===i?"_chartsMap":"_componentsMap"][e.__viewId])},t)}function l(t,e){var n=t.type,i=t.escapeConnect,r=nt[n],o=r.actionInfo,a=(o.update||"update").split(":"),l=a.pop();a=null!=a[0]&&G(a[0]),this[Y]=!0;var u=[t],h=!1;t.batch&&(h=!0,u=N.map(t.batch,function(e){return e=N.defaults(N.extend({},e),t),e.batch=null,e}));var c,d=[],f="highlight"===n||"downplay"===n;F(u,function(t){c=r.action(t,this._model,this._api),c=c||N.extend({},t),c.type=o.event||c.type,d.push(c),f?s(this,l,t,"series"):a&&s(this,l,t,a.main,a.sub)},this),"none"===l||f||a||(this[K]?(tt.prepareAndUpdate.call(this,t),this[K]=!1):tt[l].call(this,t)),c=h?{type:o.event||n,escapeConnect:i,batch:d}:d[0],this[Y]=!1,!e&&this._messageCenter.trigger(c.type,c)}function u(t){for(var e=this._pendingActions;e.length;){var n=e.shift();l.call(this,n,t)}}function h(t){!t&&this.trigger("updated")}function c(t,e,n){var i=this._api;F(this._componentsViews,function(r){var o=r.__model;r[t](o,e,i,n),_(o,r)},this),e.eachSeries(function(r,o){var a=this._chartsMap[r.__viewId];a[t](r,e,i,n),_(r,a),x(r,a)},this),y(this._zr,e),F(at,function(t){t(e,i)})}function d(t,e){for(var n="component"===t,i=n?this._componentsViews:this._chartsViews,r=n?this._componentsMap:this._chartsMap,o=this._zr,a=0;a<i.length;a++)i[a].__alive=!1;e[n?"eachComponent":"eachSeries"](function(t,a){if(n){if("series"===t)return}else a=t;var s=a.id+"_"+a.type,l=r[s];if(!l){var u=G(a.type),h=n?k.getClass(u.main,u.sub):L.getClass(u.sub);if(!h)return;l=new h,l.init(e,this._api),r[s]=l,i.push(l),o.add(l.group)}a.__viewId=l.__id=s,l.__alive=!0,l.__model=a,l.group.__ecComponentInfo={mainType:a.mainType,index:a.componentIndex}},this);for(var a=0;a<i.length;){var s=i[a];s.__alive?a++:(o.remove(s.group),s.dispose(e,this._api),i.splice(a,1),delete r[s.__id],s.__id=s.group.__ecComponentInfo=null)}}function f(t,e){F(rt,function(n){n.func(t,e)})}function p(t){var e={};t.eachSeries(function(t){var n=t.get("stack"),i=t.getData();if(n&&"list"===i.type){var r=e[n];r&&(i.stackedOn=r),e[n]=i}})}function g(t,e){var n=this._api;F(st,function(i){i.isLayout&&i.func(t,n,e)})}function v(t,e,n){var i=this._api;t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()}),F(st,function(r){(!n||!r.isLayout)&&r.func(t,i,e)})}function m(t,e){var n=this._api;F(this._componentsViews,function(i){var r=i.__model;i.render(r,t,n,e),_(r,i)},this),F(this._chartsViews,function(t){t.__alive=!1},this),t.eachSeries(function(i,r){var o=this._chartsMap[i.__viewId];o.__alive=!0,o.render(i,t,n,e),o.group.silent=!!i.get("silent"),_(i,o),x(i,o)},this),y(this._zr,t),F(this._chartsViews,function(e){e.__alive||e.remove(t,n)},this)}function y(t,e){var n=t.storage,i=0;n.traverse(function(t){t.isGroup||i++}),i>e.get("hoverLayerThreshold")&&!M.node&&n.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function x(t,e){var n=0;e.group.traverse(function(t){"group"===t.type||t.ignore||n++});var i=+t.get("progressive"),r=n>t.get("progressiveThreshold")&&i&&!M.node;r&&e.group.traverse(function(t){t.isGroup||(t.progressive=r?Math.floor(n++/i):-1,r&&t.stopAnimation(!0))});var o=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.setStyle("blend",o)})}function _(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function b(t){var e=t._coordSysMgr;return N.extend(new T(t),{getCoordinateSystems:N.bind(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}}})}function w(t){function e(t,e){for(var n=0;n<t.length;n++){var i=t[n];i[o]=e}}var n=0,i=1,r=2,o="__connectUpdateStatus";N.each(it,function(a,s){t._messageCenter.on(s,function(a){if(ct[t.group]&&t[o]!==n){if(a&&a.escapeConnect)return;var s=t.makeActionFromEvent(a),l=[];N.each(ht,function(e){e!==t&&e.group===t.group&&l.push(e)}),e(l,n),F(l,function(t){t[o]!==i&&t.dispatchAction(s)}),e(l,r)}})})}/*!
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={exports:{},id:i,loaded:!1};return t[i].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){t.exports=n(2),n(108),n(102),n(112),n(191),n(207),n(232),n(55),n(209),n(208),n(223),n(216),n(215),n(214),n(197),n(224),n(239)},function(t,e){function n(t){if(null==t||"object"!=typeof t)return t;var e=t,i=R.call(t);if("[object Array]"===i){e=[];for(var r=0,o=t.length;r<o;r++)e[r]=n(t[r])}else if(N[i])e=t.constructor.from(t);else if(!E[i]&&!k(t)&&!T(t)){e={};for(var a in t)t.hasOwnProperty(a)&&(e[a]=n(t[a]))}return e}function i(t,e,r){if(!M(e)||!M(t))return r?n(e):t;for(var o in e)if(e.hasOwnProperty(o)){var a=t[o],s=e[o];!M(s)||!M(a)||_(s)||_(a)||T(s)||T(a)||S(s)||S(a)||k(s)||k(a)?!r&&o in t||(t[o]=n(e[o],!0)):i(a,s,r)}return t}function r(t,e){for(var n=t[0],r=1,o=t.length;r<o;r++)n=i(n,t[r],e);return n}function o(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function a(t,e,n){for(var i in e)e.hasOwnProperty(i)&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i]);return t}function s(){return document.createElement("canvas")}function l(){return z||(z=U.createCanvas().getContext("2d")),z}function u(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function h(t,e){function n(){}var i=t.prototype;n.prototype=e.prototype,t.prototype=new n;for(var r in i)t.prototype[r]=i[r];t.prototype.constructor=t,t.superClass=e}function c(t,e,n){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,a(t,e,n)}function d(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function f(t,e,n){if(t&&e)if(t.forEach&&t.forEach===V)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(n,t[o],o,t)}function p(t,e,n){if(t&&e){if(t.map&&t.map===H)return t.map(e,n);for(var i=[],r=0,o=t.length;r<o;r++)i.push(e.call(n,t[r],r,t));return i}}function g(t,e,n,i){if(t&&e){if(t.reduce&&t.reduce===W)return t.reduce(e,n,i);for(var r=0,o=t.length;r<o;r++)n=e.call(i,n,t[r],r,t);return n}}function m(t,e,n){if(t&&e){if(t.filter&&t.filter===F)return t.filter(e,n);for(var i=[],r=0,o=t.length;r<o;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}}function v(t,e,n){if(t&&e)for(var i=0,r=t.length;i<r;i++)if(e.call(n,t[i],i,t))return t[i]}function y(t,e){var n=G.call(arguments,2);return function(){return t.apply(e,n.concat(G.call(arguments)))}}function x(t){var e=G.call(arguments,1);return function(){return t.apply(this,e.concat(G.call(arguments)))}}function _(t){return"[object Array]"===R.call(t)}function b(t){return"function"==typeof t}function w(t){return"[object String]"===R.call(t)}function M(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function S(t){return!!E[R.call(t)]}function T(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function A(t){return t!==t}function I(t){for(var e=0,n=arguments.length;e<n;e++)if(null!=arguments[e])return arguments[e]}function C(){return Function.call.apply(G,arguments)}function P(t,e){if(!t)throw new Error(e)}function D(t){t[Z]=!0}function k(t){return t[Z]}function L(t){t&&f(t,function(t,e){this.set(e,t)},this)}function O(t){return new L(t)}var z,E={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},N={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},R=Object.prototype.toString,B=Array.prototype,V=B.forEach,F=B.filter,G=B.slice,H=B.map,W=B.reduce,Z="__ec_primitive__",q="_ec_",j=4;L.prototype={constructor:L,get:function(t){return this[q+t]},set:function(t,e){return this[q+t]=e,e},each:function(t,e){void 0!==e&&(t=y(t,e));for(var n in this)this.hasOwnProperty(n)&&t(this[n],n.slice(j))},removeKey:function(t){delete this[t]}};var U={inherits:h,mixin:c,clone:n,merge:i,mergeAll:r,extend:o,defaults:a,getContext:l,createCanvas:s,indexOf:u,slice:C,find:v,isArrayLike:d,each:f,map:p,reduce:g,filter:m,bind:y,curry:x,isArray:_,isString:w,isObject:M,isFunction:b,isBuiltInObject:S,isDom:T,eqNaN:A,retrieve:I,assert:P,setAsPrimitive:D,createHashMap:O,noop:function(){}};t.exports=U},function(t,e,n){function i(t){return function(e,n,i){e=e&&e.toLowerCase(),B.prototype[t].call(this,e,n,i)}}function r(){B.call(this)}function o(t,e,n){function i(t,e){return t.prio-e.prio}n=n||{},"string"==typeof e&&(e=lt[e]),this.id,this.group,this._dom=t;var o=this._zr=E.init(t,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.width,height:n.height});this._throttledZrFlush=z.throttle(N.bind(o.flush,o),17),this._theme=N.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new A,this._api=b(this),B.call(this),this._messageCenter=new r,this._initEvents(),this.resize=N.bind(this.resize,this),this._pendingActions=[],V(st,i),V(rt,i),o.animation.on("frame",this._onframe,this),N.setAsPrimitive(this)}function a(t,e,n){var i,r=this._model,o=this._coordSysMgr.getCoordinateSystems();e=O.parseFinder(r,e);for(var a=0;a<o.length;a++){var s=o[a];if(s[t]&&null!=(i=s[t](r,e,n)))return i}}function s(t,e,n,i,r){function o(i){i&&i.__alive&&i[e]&&i[e](i.__model,a,t._api,n)}var a=t._model;if(!i)return void F(t._componentsViews.concat(t._chartsViews),o);var s={};s[i+"Id"]=n[i+"Id"],s[i+"Index"]=n[i+"Index"],s[i+"Name"]=n[i+"Name"];var l={mainType:i,query:s};r&&(l.subType=r),a&&a.eachComponent(l,function(e,n){o(t["series"===i?"_chartsMap":"_componentsMap"][e.__viewId])},t)}function l(t,e){var n=t.type,i=t.escapeConnect,r=nt[n],o=r.actionInfo,a=(o.update||"update").split(":"),l=a.pop();a=null!=a[0]&&G(a[0]),this[Y]=!0;var u=[t],h=!1;t.batch&&(h=!0,u=N.map(t.batch,function(e){return e=N.defaults(N.extend({},e),t),e.batch=null,e}));var c,d=[],f="highlight"===n||"downplay"===n;F(u,function(t){c=r.action(t,this._model,this._api),c=c||N.extend({},t),c.type=o.event||c.type,d.push(c),f?s(this,l,t,"series"):a&&s(this,l,t,a.main,a.sub)},this),"none"===l||f||a||(this[K]?(tt.prepareAndUpdate.call(this,t),this[K]=!1):tt[l].call(this,t)),c=h?{type:o.event||n,escapeConnect:i,batch:d}:d[0],this[Y]=!1,!e&&this._messageCenter.trigger(c.type,c)}function u(t){for(var e=this._pendingActions;e.length;){var n=e.shift();l.call(this,n,t)}}function h(t){!t&&this.trigger("updated")}function c(t,e,n){var i=this._api;F(this._componentsViews,function(r){var o=r.__model;r[t](o,e,i,n),_(o,r)},this),e.eachSeries(function(r,o){var a=this._chartsMap[r.__viewId];a[t](r,e,i,n),_(r,a),x(r,a)},this),y(this._zr,e),F(at,function(t){t(e,i)})}function d(t,e){for(var n="component"===t,i=n?this._componentsViews:this._chartsViews,r=n?this._componentsMap:this._chartsMap,o=this._zr,a=0;a<i.length;a++)i[a].__alive=!1;e[n?"eachComponent":"eachSeries"](function(t,a){if(n){if("series"===t)return}else a=t;var s="_ec_"+a.id+"_"+a.type,l=r[s];if(!l){var u=G(a.type),h=n?D.getClass(u.main,u.sub):k.getClass(u.sub);if(!h)return;l=new h,l.init(e,this._api),r[s]=l,i.push(l),o.add(l.group)}a.__viewId=l.__id=s,l.__alive=!0,l.__model=a,l.group.__ecComponentInfo={mainType:a.mainType,index:a.componentIndex}},this);for(var a=0;a<i.length;){var s=i[a];s.__alive?a++:(o.remove(s.group),s.dispose(e,this._api),i.splice(a,1),delete r[s.__id],s.__id=s.group.__ecComponentInfo=null)}}function f(t,e){F(rt,function(n){n.func(t,e)})}function p(t){var e={};t.eachSeries(function(t){var n=t.get("stack"),i=t.getData();if(n&&"list"===i.type){var r=e[n];e.hasOwnProperty(n)&&r&&(i.stackedOn=r),e[n]=i}})}function g(t,e){var n=this._api;F(st,function(i){i.isLayout&&i.func(t,n,e)})}function m(t,e,n){var i=this._api;t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()}),F(st,function(r){(!n||!r.isLayout)&&r.func(t,i,e)})}function v(t,e){var n=this._api;F(this._componentsViews,function(i){var r=i.__model;i.render(r,t,n,e),_(r,i)},this),F(this._chartsViews,function(t){t.__alive=!1},this),t.eachSeries(function(i,r){var o=this._chartsMap[i.__viewId];o.__alive=!0,o.render(i,t,n,e),o.group.silent=!!i.get("silent"),_(i,o),x(i,o)},this),y(this._zr,t),F(this._chartsViews,function(e){e.__alive||e.remove(t,n)},this)}function y(t,e){var n=t.storage,i=0;n.traverse(function(t){t.isGroup||i++}),i>e.get("hoverLayerThreshold")&&!M.node&&n.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function x(t,e){var n=0;e.group.traverse(function(t){"group"===t.type||t.ignore||n++});var i=+t.get("progressive"),r=n>t.get("progressiveThreshold")&&i&&!M.node;r&&e.group.traverse(function(t){t.isGroup||(t.progressive=r?Math.floor(n++/i):-1,r&&t.stopAnimation(!0))});var o=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.setStyle("blend",o)})}function _(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function b(t){var e=t._coordSysMgr;return N.extend(new T(t),{getCoordinateSystems:N.bind(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}}})}function w(t){function e(t,e){for(var n=0;n<t.length;n++){var i=t[n];i[o]=e}}var n=0,i=1,r=2,o="__connectUpdateStatus";N.each(it,function(a,s){t._messageCenter.on(s,function(a){if(ct[t.group]&&t[o]!==n){if(a&&a.escapeConnect)return;var s=t.makeActionFromEvent(a),l=[];N.each(ht,function(e){e!==t&&e.group===t.group&&l.push(e)}),e(l,n),F(l,function(t){t[o]!==i&&t.dispatchAction(s)}),e(l,r)}})})}/*!
 	 * ECharts, a javascript interactive chart library.
 	 *
 	 * Copyright (c) 2015, Baidu Inc.
@@ -7,11 +7,11 @@
 	 * LICENSE
 	 * https://github.com/ecomfe/echarts/blob/master/LICENSE.txt
 	 */
-var M=n(9),S=n(137),T=n(100),A=n(26),I=n(138),C=n(13),P=n(18),k=n(64),L=n(30),D=n(3),O=n(6),E=n(37),z=n(87),N=n(1),R=n(22),B=n(23),V=n(51),F=N.each,G=C.parseClassType,H=1e3,W=5e3,Z=1e3,q=2e3,j=3e3,U=4e3,X=5e3,Y="__flagInMainProcess",$="__hasGradientOrPatternBg",K="__optionUpdated",Q=/^[a-zA-Z0-9_]+$/;r.prototype.on=i("on"),r.prototype.off=i("off"),r.prototype.one=i("one"),N.mixin(r,B);var J=o.prototype;J._onframe=function(){if(this[K]){var t=this[K].silent;this[Y]=!0,tt.prepareAndUpdate.call(this),this[Y]=!1,this[K]=!1,u.call(this,t),h.call(this,t)}},J.getDom=function(){return this._dom},J.getZr=function(){return this._zr},J.setOption=function(t,e,n){var i;if(N.isObject(e)&&(n=e.lazyUpdate,i=e.silent,e=e.notMerge),this[Y]=!0,!this._model||e){var r=new I(this._api),o=this._theme,a=this._model=new S(null,null,o,r);a.init(null,null,o,r)}this.__lastOnlyGraphic=!(!t||!t.graphic),N.each(t,function(t,e){"graphic"!==e&&(this.__lastOnlyGraphic=!1)},this),this._model.setOption(t,ot,this.__lastOnlyGraphic),n?(this[K]={silent:i},this[Y]=!1):(tt.prepareAndUpdate.call(this),this._zr.flush(),this[K]=!1,this[Y]=!1,u.call(this,i),h.call(this,i))},J.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},J.getModel=function(){return this._model},J.getOption=function(){return this._model&&this._model.getOption()},J.getWidth=function(){return this._zr.getWidth()},J.getHeight=function(){return this._zr.getHeight()},J.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},J.getRenderedCanvas=function(t){if(M.canvasSupported){t=t||{},t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr,n=e.storage.getDisplayList();return N.each(n,function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},J.getDataURL=function(t){t=t||{};var e=t.excludeComponents,n=this._model,i=[],r=this;F(e,function(t){n.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)})});var o=this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return F(i,function(t){t.group.ignore=!1}),o},J.getConnectedDataURL=function(t){if(M.canvasSupported){var e=this.group,n=Math.min,i=Math.max,r=1/0;if(ct[e]){var o=r,a=r,s=-r,l=-r,u=[],h=t&&t.pixelRatio||1;N.each(ht,function(r,h){if(r.group===e){var c=r.getRenderedCanvas(N.clone(t)),d=r.getDom().getBoundingClientRect();o=n(d.left,o),a=n(d.top,a),s=i(d.right,s),l=i(d.bottom,l),u.push({dom:c,left:d.left,top:d.top})}}),o*=h,a*=h,s*=h,l*=h;var c=s-o,d=l-a,f=N.createCanvas();f.width=c,f.height=d;var p=z.init(f);return F(u,function(t){var e=new D.Image({style:{x:t.left*h-o,y:t.top*h-a,image:t.dom}});p.add(e)}),p.refreshImmediately(),f.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},J.convertToPixel=N.curry(a,"convertToPixel"),J.convertFromPixel=N.curry(a,"convertFromPixel"),J.containPixel=function(t,e){var n,i=this._model;return t=O.parseFinder(i,t),N.each(t,function(t,i){i.indexOf("Models")>=0&&N.each(t,function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n|=!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n|=o.containPoint(e,t))}},this)},this),!!n},J.getVisual=function(t,e){var n=this._model;t=O.parseFinder(n,t,{defaultMainType:"series"});var i=t.seriesModel,r=i.getData(),o=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?r.indexOfRawIndex(t.dataIndex):null;return null!=o?r.getItemVisual(o,e):r.getVisual(e)},J.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},J.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var tt={update:function(t){var e=this._model,n=this._api,i=this._coordSysMgr,r=this._zr;if(e){e.restoreData(),i.create(this._model,this._api),f.call(this,e,n),p.call(this,e),i.update(e,n),v.call(this,e,t),m.call(this,e,t);var o=e.get("backgroundColor")||"transparent",a=r.painter;if(a.isSingleCanvas&&a.isSingleCanvas())r.configLayer(0,{clearColor:o});else{if(!M.canvasSupported){var s=R.parse(o);o=R.stringify(s,"rgb"),0===s[3]&&(o="transparent")}o.colorStops||o.image?(r.configLayer(0,{clearColor:o}),this[$]=!0,this._dom.style.background="transparent"):(this[$]&&r.configLayer(0,{clearColor:null}),this[$]=!1,this._dom.style.background=o)}F(at,function(t){t(e,n)})}},updateView:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),v.call(this,e,t),c.call(this,"updateView",e,t))},updateVisual:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),v.call(this,e,t,!0),c.call(this,"updateVisual",e,t))},updateLayout:function(t){var e=this._model;e&&(g.call(this,e,t),c.call(this,"updateLayout",e,t))},prepareAndUpdate:function(t){var e=this._model;d.call(this,"component",e),d.call(this,"chart",e),this.__lastOnlyGraphic?(F(this._componentsViews,function(n){var i=n.__model;i&&"graphic"===i.mainType&&(n.render(i,e,this._api,t),_(i,n))},this),this.__lastOnlyGraphic=!1):tt.update.call(this,t)}};J.resize=function(t){this[Y]=!0,this._zr.resize(t);var e=this._model&&this._model.resetOption("media"),n=e?"prepareAndUpdate":"update";tt[n].call(this),this._loadingFX&&this._loadingFX.resize(),this[Y]=!1;var i=t&&t.silent;u.call(this,i),h.call(this,i)},J.showLoading=function(t,e){if(N.isObject(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),ut[t]){var n=ut[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},J.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},J.makeActionFromEvent=function(t){var e=N.extend({},t);return e.type=it[t.type],e},J.dispatchAction=function(t,e){if(N.isObject(e)||(e={silent:!!e}),nt[t.type]){if(this[Y])return void this._pendingActions.push(t);l.call(this,t,e.silent),e.flush?this._zr.flush(!0):e.flush!==!1&&M.browser.weChat&&this._throttledZrFlush(),u.call(this,e.silent),h.call(this,e.silent)}},J.on=i("on"),J.off=i("off"),J.one=i("one");var et=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];J._initEvents=function(){F(et,function(t){this._zr.on(t,function(e){var n,i=this.getModel(),r=e.target;if("globalout"===t)n={};else if(r&&null!=r.dataIndex){var o=r.dataModel||i.getSeriesByIndex(r.seriesIndex);n=o&&o.getDataParams(r.dataIndex,r.dataType)||{}}else r&&r.eventData&&(n=N.extend({},r.eventData));n&&(n.event=e,n.type=t,this.trigger(t,n))},this)},this),F(it,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},J.isDisposed=function(){return this._disposed},J.clear=function(){this.setOption({series:[]},!0)},J.dispose=function(){if(!this._disposed){this._disposed=!0;var t=this._api,e=this._model;F(this._componentsViews,function(n){n.dispose(e,t)}),F(this._chartsViews,function(n){n.dispose(e,t)}),this._zr.dispose(),delete ht[this.id]}},N.mixin(o,B);var nt={},it={},rt=[],ot=[],at=[],st=[],lt={},ut={},ht={},ct={},dt=new Date-0,ft=new Date-0,pt="_echarts_instance_",gt={version:"3.5.4",dependencies:{zrender:"3.4.4"}};gt.init=function(t,e,n){var i=new o(t,e,n);return i.id="ec_"+dt++,ht[i.id]=i,t.setAttribute&&t.setAttribute(pt,i.id),w(i),i},gt.connect=function(t){if(N.isArray(t)){var e=t;t=null,N.each(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+ft++,N.each(e,function(e){e.group=t})}return ct[t]=!0,t},gt.disConnect=function(t){ct[t]=!1},gt.disconnect=gt.disConnect,gt.dispose=function(t){N.isDom(t)?t=gt.getInstanceByDom(t):"string"==typeof t&&(t=ht[t]),t instanceof o&&!t.isDisposed()&&t.dispose()},gt.getInstanceByDom=function(t){var e=t.getAttribute(pt);return ht[e]},gt.getInstanceById=function(t){return ht[t]},gt.registerTheme=function(t,e){lt[t]=e},gt.registerPreprocessor=function(t){ot.push(t)},gt.registerProcessor=function(t,e){"function"==typeof t&&(e=t,t=H),rt.push({prio:t,func:e})},gt.registerPostUpdate=function(t){at.push(t)},gt.registerAction=function(t,e,n){"function"==typeof e&&(n=e,e="");var i=N.isObject(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,N.assert(Q.test(i)&&Q.test(e)),nt[i]||(nt[i]={action:n,actionInfo:t}),it[e]=i},gt.registerCoordinateSystem=function(t,e){A.register(t,e)},gt.registerLayout=function(t,e){"function"==typeof t&&(e=t,t=Z),st.push({prio:t,func:e,isLayout:!0})},gt.registerVisual=function(t,e){"function"==typeof t&&(e=t,t=j),st.push({prio:t,func:e})},gt.registerLoading=function(t,e){ut[t]=e},gt.extendComponentModel=function(t){return C.extend(t)},gt.extendComponentView=function(t){return k.extend(t)},gt.extendSeriesModel=function(t){return P.extend(t)},gt.extendChartView=function(t){return L.extend(t)},gt.setCanvasCreator=function(t){N.createCanvas=t},gt.registerVisual(q,n(151)),gt.registerPreprocessor(n(145)),gt.registerLoading("default",n(136)),gt.registerAction({type:"highlight",event:"highlight",update:"highlight"},N.noop),gt.registerAction({type:"downplay",event:"downplay",update:"downplay"},N.noop),gt.zrender=z,gt.List=n(14),gt.Model=n(10),gt.Axis=n(33),gt.graphic=n(3),gt.number=n(4),gt.format=n(7),gt.throttle=E.throttle,gt.matrix=n(19),gt.vector=n(5),gt.color=n(22),gt.util={},F(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){gt.util[t]=N[t]}),gt.helper=n(135),gt.PRIORITY={PROCESSOR:{FILTER:H,STATISTIC:W},VISUAL:{LAYOUT:Z,GLOBAL:q,CHART:j,COMPONENT:U,BRUSH:X}},t.exports=gt},function(t,e,n){"use strict";function i(t){return null!=t&&"none"!=t}function r(t){return"string"==typeof t?_.lift(t,-.1):t}function o(t){if(t.__hoverStlDirty){var e=t.style.stroke,n=t.style.fill,o=t.__hoverStl;o.fill=o.fill||(i(n)?r(n):null),o.stroke=o.stroke||(i(e)?r(e):null);var a={};for(var s in o)o.hasOwnProperty(s)&&(a[s]=t.style[s]);t.__normalStl=a,t.__hoverStlDirty=!1}}function a(t){t.__isHover||(o(t),t.useHoverLayer?t.__zr&&t.__zr.addHover(t,t.__hoverStl):(t.setStyle(t.__hoverStl),t.z2+=1),t.__isHover=!0)}function s(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function l(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&a(t)}):a(t)}function u(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&s(t)}):s(t)}function h(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&o(t)}function c(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&l(this)}function d(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&u(this)}function f(){this.__isEmphasis=!0,l(this)}function p(){this.__isEmphasis=!1,u(this)}function g(t,e,n,i,r,o){"function"==typeof r&&(o=r,r=null);var a=i&&i.isAnimationEnabled();if(a){var s=t?"Update":"",l=i.getShallow("animationDuration"+s),u=i.getShallow("animationEasing"+s),h=i.getShallow("animationDelay"+s);"function"==typeof h&&(h=h(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof l&&(l=l(r)),l>0?e.animateTo(n,l,h||0,u,o):(e.stopAnimation(),e.attr(n),o&&o())}else e.stopAnimation(),e.attr(n),o&&o()}var v=n(1),m=n(180),y=Math.round,x=n(8),_=n(22),b=n(19),w=n(5),M=n(57),S=n(11),T={};T.Group=n(36),T.Image=n(53),T.Text=n(85),T.Circle=n(171),T.Sector=n(177),T.Ring=n(176),T.Polygon=n(173),T.Polyline=n(174),T.Rect=n(175),T.Line=n(172),T.BezierCurve=n(170),T.Arc=n(169),T.CompoundPath=n(164),T.LinearGradient=n(99),T.RadialGradient=n(165),T.BoundingRect=S,T.extendShape=function(t){return x.extend(t)},T.extendPath=function(t,e){return m.extendFromString(t,e)},T.makePath=function(t,e,n,i){var r=m.createFromString(t,e),o=r.getBoundingRect();if(n){var a=o.width/o.height;if("center"===i){var s,l=n.height*a;l<=n.width?s=n.height:(l=n.width,s=l/a);var u=n.x+n.width/2,h=n.y+n.height/2;n.x=u-l/2,n.y=h-s/2,n.width=l,n.height=s}T.resizePath(r,n)}return r},T.mergePath=m.mergePath,T.resizePath=function(t,e){if(t.applyTransform){var n=t.getBoundingRect(),i=n.calculateTransform(e);t.applyTransform(i)}},T.subPixelOptimizeLine=function(t){var e=T.subPixelOptimize,n=t.shape,i=t.style.lineWidth;return y(2*n.x1)===y(2*n.x2)&&(n.x1=n.x2=e(n.x1,i,!0)),y(2*n.y1)===y(2*n.y2)&&(n.y1=n.y2=e(n.y1,i,!0)),t},T.subPixelOptimizeRect=function(t){var e=T.subPixelOptimize,n=t.shape,i=t.style.lineWidth,r=n.x,o=n.y,a=n.width,s=n.height;return n.x=e(n.x,i,!0),n.y=e(n.y,i,!0),n.width=Math.max(e(r+a,i,!1)-n.x,0===a?0:1),n.height=Math.max(e(o+s,i,!1)-n.y,0===s?0:1),t},T.subPixelOptimize=function(t,e,n){var i=y(2*t);return(i+y(e))%2===0?i/2:(i+(n?1:-1))/2},T.setHoverStyle=function(t,e,n){t.__hoverSilentOnTouch=n&&n.hoverSilentOnTouch,"group"===t.type?t.traverse(function(t){"group"!==t.type&&h(t,e)}):h(t,e),t.on("mouseover",c).on("mouseout",d),t.on("emphasis",f).on("normal",p)},T.setText=function(t,e,n){var i=e.getShallow("position")||"inside",r=e.getShallow("offset"),o=i.indexOf("inside")>=0?"white":n,a=e.getModel("textStyle");v.extend(t,{textDistance:e.getShallow("distance")||5,textFont:a.getFont(),textPosition:i,textOffset:r,textFill:a.getTextColor()||o})},T.updateProps=function(t,e,n,i,r){g(!0,t,e,n,i,r)},T.initProps=function(t,e,n,i,r){g(!1,t,e,n,i,r)},T.getTransform=function(t,e){for(var n=b.identity([]);t&&t!==e;)b.mul(n,t.getLocalTransform(),n),t=t.parent;return n},T.applyTransform=function(t,e,n){return e&&!v.isArrayLike(e)&&(e=M.getLocalTransform(e)),n&&(e=b.invert([],e)),w.applyTransform([],t,e)},T.transformDirection=function(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return o=T.applyTransform(o,e,n),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"},T.groupTransition=function(t,e,n,i){function r(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}function o(t){var e={position:w.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=v.extend({},t.shape)),e}if(t&&e){var a=r(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var i=o(t);t.attr(o(e)),T.updateProps(t,i,n,t.dataIndex)}}})}},t.exports=T},function(t,e){function n(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function i(t){return Math.floor(Math.log(t)/Math.LN10)}var r={},o=1e-4;r.linearMap=function(t,e,n,i){var r=e[1]-e[0],o=n[1]-n[0];if(0===r)return 0===o?n[0]:(n[0]+n[1])/2;if(i)if(r>0){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*o+n[0]},r.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?n(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},r.round=function(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t},r.asc=function(t){return t.sort(function(t,e){return t-e}),t},r.getPrecision=function(t){if(t=+t,isNaN(t))return 0;for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n},r.getPrecisionSafe=function(t){var e=t.toString(),n=e.indexOf("e");if(n>0){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r},r.getPixelPrecision=function(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20},r.MAX_SAFE_INTEGER=9007199254740991,r.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},r.isRadianAroundZero=function(t){return t>-o&&t<o};var a=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;r.getTimezoneOffset=function(){return(new Date).getTimezoneOffset()},r.parseDate=function(t){if(t instanceof Date)return t;if("string"==typeof t){var e=a.exec(t);if(!e)return new Date(NaN);var n=r.getTimezoneOffset(),i=e[8]?"Z"===e[8].toUpperCase()?n:60*+e[8].slice(0,3)+n:0;return new Date((+e[1]),+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0)-i,+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))},r.quantity=function(t){return Math.pow(10,i(t))},r.nice=function(t,e){var n,r=i(t),o=Math.pow(10,r),a=t/o;return n=e?a<1.5?1:a<2.5?2:a<4?3:a<7?5:10:a<1?1:a<2?2:a<3?3:a<5?5:10,t=n*o,r>=-20?+t.toFixed(r<0?-r:0):t},r.reformIntervals=function(t){function e(t,n,i){return t.interval[i]<n.interval[i]||t.interval[i]===n.interval[i]&&(t.close[i]-n.close[i]===(i?-1:1)||!i&&e(t,n,1))}t.sort(function(t,n){return e(t,n,0)?-1:1});for(var n=-(1/0),i=1,r=0;r<t.length;){for(var o=t[r].interval,a=t[r].close,s=0;s<2;s++)o[s]<=n&&(o[s]=n,a[s]=s?1:1-i),n=o[s],i=a[s];o[0]===o[1]&&a[0]*a[1]!==1?t.splice(r,1):r++}return t},r.isNumeric=function(t){return t-parseFloat(t)>=0},t.exports=r},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(t,e){var i=new n(2);return null==t&&(t=0),null==e&&(e=0),i[0]=t,i[1]=e,i},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new n(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,n){return t[0]=e,t[1]=n,t},add:function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t},scaleAndAdd:function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},sub:function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t},normalize:function(t,e){var n=i.len(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t},applyTransform:function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t},min:function(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t},max:function(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}};i.length=i.len,i.lengthSquare=i.lenSquare,i.dist=i.distance,i.distSquare=i.distanceSquare,t.exports=i},function(t,e,n){function i(t,e){return t&&t.hasOwnProperty(e)}var r=n(7),o=n(4),a=n(10),s=n(1),l=s.each,u=s.isObject,h={};h.normalizeToArray=function(t){return t instanceof Array?t:null==t?[]:[t]},h.defaultEmphasis=function(t,e){if(t){var n=t.emphasis=t.emphasis||{},i=t.normal=t.normal||{};l(e,function(t){var e=s.retrieve(n[t],i[t]);null!=e&&(n[t]=e)})}},h.LABEL_OPTIONS=["position","offset","show","textStyle","distance","formatter"],h.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},h.isDataItemOption=function(t){return u(t)&&!(t instanceof Array)},h.converDataValue=function(t,e){var n=e&&e.type;return"ordinal"===n?t:("time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+o.parseDate(t)),null==t||""===t?NaN:+t)},h.createDataFormatModel=function(t,e){var n=new a;return s.mixin(n,h.dataFormatMixin),n.seriesIndex=e.seriesIndex,n.name=e.name||"",n.mainType=e.mainType,n.subType=e.subType,n.getData=function(){return t},n},h.dataFormatMixin={getDataParams:function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),o=n.getName(t,!0),a=n.getRawDataItem(t);return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:this.seriesIndex,seriesId:this.id,seriesName:this.name,name:o,dataIndex:r,data:a,dataType:e,value:i,color:n.getItemVisual(t,"color"),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,n,i){e=e||"normal";var o=this.getData(n),a=o.getItemModel(t),s=this.getDataParams(t,n);null!=i&&s.value instanceof Array&&(s.value=s.value[i]);var l=a.get(["label",e,"formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?r.formatTpl(l,s):void 0},getRawValue:function(t,e){var n=this.getData(e),i=n.getRawDataItem(t);if(null!=i)return!u(i)||i instanceof Array?i:i.value},formatTooltip:s.noop},h.mappingToExists=function(t,e){e=(e||[]).slice();var n=s.map(t||[],function(t,e){return{exist:t}});return l(e,function(t,i){if(u(t)){for(var r=0;r<n.length;r++)if(!n[r].option&&null!=t.id&&n[r].exist.id===t.id+"")return n[r].option=t,void(e[i]=null);for(var r=0;r<n.length;r++){var o=n[r].exist;if(!(n[r].option||null!=o.id&&null!=t.id||null==t.name||h.isIdInner(t)||h.isIdInner(o)||o.name!==t.name+""))return n[r].option=t,void(e[i]=null)}}}),l(e,function(t,e){if(u(t)){for(var i=0;i<n.length;i++){var r=n[i].exist;if(!n[i].option&&!h.isIdInner(r)&&null==t.id){n[i].option=t;break}}i>=n.length&&n.push({option:t})}}),n},h.makeIdAndName=function(t){var e={};l(t,function(t,n){var i=t.exist;i&&(e[i.id]=t)}),l(t,function(t,n){var i=t.option;s.assert(!i||null==i.id||!e[i.id]||e[i.id]===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&(e[i.id]=t),!t.keyInfo&&(t.keyInfo={})}),l(t,function(t,n){var i=t.exist,r=t.option,o=t.keyInfo;if(u(r)){if(o.name=null!=r.name?r.name+"":i?i.name:"\0-",i)o.id=i.id;else if(null!=r.id)o.id=r.id+"";else{var a=0;do o.id="\0"+o.name+"\0"+a++;while(e[o.id])}e[o.id]=t}})},h.isIdInner=function(t){return u(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")},h.compressBatches=function(t,e){function n(t,e,n){for(var i=0,r=t.length;i<r;i++)for(var o=t[i].seriesId,a=h.normalizeToArray(t[i].dataIndex),s=n&&n[o],l=0,u=a.length;l<u;l++){var c=a[l];s&&s[c]?s[c]=null:(e[o]||(e[o]={}))[c]=1}}function i(t,e){var n=[];for(var r in t)if(t.hasOwnProperty(r)&&null!=t[r])if(e)n.push(+r);else{var o=i(t[r],!0);o.length&&n.push({seriesId:r,dataIndex:o})}return n}var r={},o={};return n(t||[],r),n(e||[],o,r),[i(r),i(o)]},h.queryDataIndex=function(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?s.isArray(e.dataIndex)?s.map(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?s.isArray(e.name)?s.map(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0},h.makeGetter=function(){var t=0;return function(){var e="\0__ec_prop_getter_"+t++;return function(t){return t[e]||(t[e]={})}}}(),h.parseFinder=function(t,e,n){if(s.isString(e)){var r={};r[e+"Index"]=0,e=r}var o=n&&n.defaultMainType;!o||i(e,o+"Index")||i(e,o+"Id")||i(e,o+"Name")||(e[o+"Index"]=0);var a={};return l(e,function(i,r){var i=e[r];if("dataIndex"===r||"dataIndexInside"===r)return void(a[r]=i);var o=r.match(/^(\w+)(Index|Id|Name)$/)||[],l=o[1],u=(o[2]||"").toLowerCase();if(!(!l||!u||null==i||"index"===u&&"none"===i||n&&n.includeMainTypes&&s.indexOf(n.includeMainTypes,l)<0)){var h={mainType:l};"index"===u&&"all"===i||(h[u]=i);var c=t.queryComponents(h);a[l+"Models"]=c,a[l+"Model"]=c[0]}}),a},t.exports=h},function(t,e,n){var i=n(1),r=n(4),o=n(16),a={};a.addCommas=function(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))},a.toCamelCase=function(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t},a.normalizeCssArray=function(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t};var s=a.encodeHTML=function(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")},l=["a","b","c","d","e","f","g"],u=function(t,e){return"{"+t+(null==e?"":e)+"}"};a.formatTpl=function(t,e,n){i.isArray(e)||(e=[e]);var r=e.length;if(!r)return"";for(var o=e[0].$vars||[],a=0;a<o.length;a++){var h=l[a],c=u(h,0);t=t.replace(u(h),n?s(c):c)}for(var d=0;d<r;d++)for(var f=0;f<o.length;f++){var c=e[d][o[f]];t=t.replace(u(l[f],d),n?s(c):c)}return t},a.formatTplSimple=function(t,e,n){return i.each(e,function(e,i){t=t.replace("{"+i+"}",n?s(e):e)}),t};var h=function(t){return t<10?"0"+t:t};a.formatTime=function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=r.parseDate(e),o=n?"UTC":"",a=i["get"+o+"FullYear"](),s=i["get"+o+"Month"]()+1,l=i["get"+o+"Date"](),u=i["get"+o+"Hours"](),c=i["get"+o+"Minutes"](),d=i["get"+o+"Seconds"]();return t=t.replace("MM",h(s)).toLowerCase().replace("yyyy",a).replace("yy",a%100).replace("dd",h(l)).replace("d",l).replace("hh",h(u)).replace("h",u).replace("mm",h(c)).replace("m",c).replace("ss",h(d)).replace("s",d)},a.capitalFirst=function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},a.truncateText=o.truncateText,t.exports=a},function(t,e,n){function i(t){r.call(this,t),this.path=null}var r=n(38),o=n(1),a=n(27),s=n(161),l=n(71),u=l.prototype.getCanvasPattern,h=Math.abs,c=new a((!0));i.prototype={constructor:i,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var n=this.style,i=this.path||c,r=n.hasStroke(),o=n.hasFill(),a=n.fill,s=n.stroke,l=o&&!!a.colorStops,h=r&&!!s.colorStops,d=o&&!!a.image,f=r&&!!s.image;if(n.bind(t,this,e),this.setTransform(t),this.__dirty){var p;l&&(p=p||this.getBoundingRect(),this._fillGradient=n.getGradient(t,a,p)),h&&(p=p||this.getBoundingRect(),this._strokeGradient=n.getGradient(t,s,p))}l?t.fillStyle=this._fillGradient:d&&(t.fillStyle=u.call(a,t)),h?t.strokeStyle=this._strokeGradient:f&&(t.strokeStyle=u.call(s,t));var g=n.lineDash,v=n.lineDashOffset,m=!!t.setLineDash,y=this.getGlobalScale();i.setScale(y[0],y[1]),this.__dirtyPath||g&&!m&&r?(i.beginPath(t),g&&!m&&(i.setLineDash(g),i.setLineDashOffset(v)),this.buildPath(i,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),o&&i.fill(t),g&&m&&(t.setLineDash(g),t.lineDashOffset=v),r&&i.stroke(t),g&&m&&t.setLineDash([]),this.restoreTransform(t),null!=n.text&&this.drawRectText(t,this.getBoundingRect())},buildPath:function(t,e,n){},createPathProxy:function(){this.path=new a},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var i=this.path;i||(i=this.path=new a),this.__dirtyPath&&(i.beginPath(),this.buildPath(i,this.shape,!1)),t=i.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){r.copy(t);var o=e.lineWidth,s=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(o=Math.max(o,this.strokeContainThreshold||4)),s>1e-10&&(r.width+=o/s,r.height+=o/s,r.x-=o/s/2,r.y-=o/s/2)}return r}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path.data;if(r.hasStroke()){var a=r.lineWidth,l=r.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(r.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),s.containStroke(o,a/l,t,e)))return!0}if(r.hasFill())return s.contain(o,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):r.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(o.isObject(t))for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&h(t[0]-1)>1e-10&&h(t[3]-1)>1e-10?Math.sqrt(h(t[0]*t[3]-t[2]*t[1])):1}},i.extend=function(t){var e=function(e){i.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var n=t.shape;if(n){this.shape=this.shape||{};var r=this.shape;for(var o in n)!r.hasOwnProperty(o)&&n.hasOwnProperty(o)&&(r[o]=n[o])}t.init&&t.init.call(this,e)};o.inherits(e,i);for(var n in t)"style"!==n&&"shape"!==n&&(e.prototype[n]=t[n]);return e},o.inherits(i,r),t.exports=i},function(t,e){function n(t){var e={},n={},i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge\/([\d.]+)/),a=/micromessenger/i.test(t);return i&&(n.firefox=!0,n.version=i[1]),r&&(n.ie=!0,n.version=r[1]),o&&(n.edge=!0,n.version=o[1]),a&&(n.weChat=!0),{browser:n,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!n.ie&&!n.edge,pointerEventsSupported:"onpointerdown"in window&&(n.edge||n.ie&&n.version>=11)}}var i={};i="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:n(navigator.userAgent),t.exports=i},function(t,e,n){function i(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}function r(t,e,n){for(var i=0;i<e.length&&(!e[i]||(t=t&&"object"==typeof t?t[e[i]]:null,null!=t));i++);return null==t&&n&&(t=n.get(e)),t}function o(t,e){var n=s.get(t,"getParent");return n?n.call(t,e):t.parentModel}var a=n(1),s=n(15),l=n(9);i.prototype={constructor:i,init:null,mergeOption:function(t){a.merge(this.option,t,!0)},get:function(t,e){return null==t?this.option:r(this.option,this.parsePath(t),!e&&o(this,t))},getShallow:function(t,e){var n=this.option,i=null==n?n:n[t],r=!e&&o(this,t);return null==i&&r&&(i=r.getShallow(t)),i},getModel:function(t,e){var n,a=null==t?this.option:r(this.option,t=this.parsePath(t));return e=e||(n=o(this,t))&&n.getModel(t),new i(a,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){var t=this.constructor;return new t(a.clone(this.option))},setReadOnly:function(t){s.setReadOnly(this,t)},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){s.set(this,"getParent",t)},isAnimationEnabled:function(){if(!l.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},s.enableClassExtend(i);var u=a.mixin;u(i,n(143)),u(i,n(140)),u(i,n(144)),u(i,n(142)),t.exports=i},function(t,e,n){"use strict";function i(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}var r=n(5),o=n(19),a=r.applyTransform,s=Math.min,l=Math.max;i.prototype={constructor:i,union:function(t){var e=s(t.x,this.x),n=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-n,this.x=e,this.y=n},applyTransform:function(){var t=[],e=[],n=[],i=[];return function(r){if(r){t[0]=n[0]=this.x,t[1]=i[1]=this.y,e[0]=i[0]=this.x+this.width,e[1]=n[1]=this.y+this.height,a(t,t,r),a(e,e,r),a(n,n,r),a(i,i,r),this.x=s(t[0],e[0],n[0],i[0]),this.y=s(t[1],e[1],n[1],i[1]);var o=l(t[0],e[0],n[0],i[0]),u=l(t[1],e[1],n[1],i[1]);this.width=o-this.x,this.height=u-this.y}}}(),calculateTransform:function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=o.create();return o.translate(r,r,[-e.x,-e.y]),o.scale(r,r,[n,i]),o.translate(r,r,[t.x,t.y]),r},intersect:function(t){if(!t)return!1;t instanceof i||(t=i.create(t));var e=this,n=e.x,r=e.x+e.width,o=e.y,a=e.y+e.height,s=t.x,l=t.x+t.width,u=t.y,h=t.y+t.height;return!(r<s||l<n||a<u||h<o)},contain:function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new i(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},i.create=function(t){return new i(t.x,t.y,t.width,t.height)},t.exports=i},function(t,e,n){"use strict";function i(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,u){var h,c,d=l.position,f=l.getBoundingRect(),p=e.childAt(u+1),g=p&&p.getBoundingRect();if("horizontal"===t){var v=f.width+(g?-g.x+f.x:0);h=o+v,h>i||l.newline?(o=0,h=v,a+=s+n,s=f.height):s=Math.max(s,f.height)}else{var m=f.height+(g?-g.y+f.y:0);c=a+m,c>r||l.newline?(o+=s+n,a=0,c=m,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=o,d[1]=a,"horizontal"===t?o=h+n:a=c+n)})}var r=n(1),o=n(11),a=n(4),s=n(7),l=a.parsePercent,u=r.each,h={},c=h.LOCATION_PARAMS=["left","right","top","bottom","width","height"],d=h.HV_NAMES=[["width","left","right"],["height","top","bottom"]];
-h.box=i,h.vbox=r.curry(i,"vertical"),h.hbox=r.curry(i,"horizontal"),h.getAvailableSize=function(t,e,n){var i=e.width,r=e.height,o=l(t.x,i),a=l(t.y,r),u=l(t.x2,i),h=l(t.y2,r);return(isNaN(o)||isNaN(parseFloat(t.x)))&&(o=0),(isNaN(u)||isNaN(parseFloat(t.x2)))&&(u=i),(isNaN(a)||isNaN(parseFloat(t.y)))&&(a=0),(isNaN(h)||isNaN(parseFloat(t.y2)))&&(h=r),n=s.normalizeCssArray(n||0),{width:Math.max(u-o-n[1]-n[3],0),height:Math.max(h-a-n[0]-n[2],0)}},h.getLayoutRect=function(t,e,n){n=s.normalizeCssArray(n||0);var i=e.width,r=e.height,a=l(t.left,i),u=l(t.top,r),h=l(t.right,i),c=l(t.bottom,r),d=l(t.width,i),f=l(t.height,r),p=n[2]+n[0],g=n[1]+n[3],v=t.aspect;switch(isNaN(d)&&(d=i-h-g-a),isNaN(f)&&(f=r-c-p-u),isNaN(d)&&isNaN(f)&&(v>i/r?d=.8*i:f=.8*r),null!=v&&(isNaN(d)&&(d=v*f),isNaN(f)&&(f=d/v)),isNaN(a)&&(a=i-h-d-g),isNaN(u)&&(u=r-c-f-p),t.left||t.right){case"center":a=i/2-d/2-n[3];break;case"right":a=i-d-g}switch(t.top||t.bottom){case"middle":case"center":u=r/2-f/2-n[0];break;case"bottom":u=r-f-p}a=a||0,u=u||0,isNaN(d)&&(d=i-a-(h||0)),isNaN(f)&&(f=r-u-(c||0));var m=new o(a+n[3],u+n[0],d,f);return m.margin=n,m},h.positionElement=function(t,e,n,i,a){var s=!a||!a.hv||a.hv[0],l=!a||!a.hv||a.hv[1],u=a&&a.boundingMode||"all";if(s||l){var c;if("raw"===u)c="group"===t.type?new o(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(c=t.getBoundingRect(),t.needLocalTransform()){var d=t.getLocalTransform();c=c.clone(),c.applyTransform(d)}e=h.getLayoutRect(r.defaults({width:c.width,height:c.height},e),n,i);var f=t.position,p=s?e.x-c.x:0,g=l?e.y-c.y:0;t.attr("position","raw"===u?[p,g]:[f[0]+p,f[1]+g])}},h.sizeCalculable=function(t,e){return null!=t[d[e][0]]||null!=t[d[e][1]]&&null!=t[d[e][2]]},h.mergeLayoutParam=function(t,e,n){function i(n,i){var r={},s=0,h={},c=0,d=2;if(u(n,function(e){h[e]=t[e]}),u(n,function(t){o(e,t)&&(r[t]=h[t]=e[t]),a(r,t)&&s++,a(h,t)&&c++}),l[i])return a(e,n[1])?h[n[2]]=null:a(e,n[2])&&(h[n[1]]=null),h;if(c!==d&&s){if(s>=d)return r;for(var f=0;f<n.length;f++){var p=n[f];if(!o(r,p)&&o(t,p)){r[p]=t[p];break}}return r}return h}function o(t,e){return t.hasOwnProperty(e)}function a(t,e){return null!=t[e]&&"auto"!==t[e]}function s(t,e,n){u(t,function(t){e[t]=n[t]})}!r.isObject(n)&&(n={});var l=n.ignoreSize;!r.isArray(l)&&(l=[l,l]);var h=i(d[0],0),c=i(d[1],1);s(d[0],t,h),s(d[1],t,c)},h.getLayoutParams=function(t){return h.copyLayoutParams({},t)},h.copyLayoutParams=function(t,e){return e&&t&&u(c,function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t},t.exports=h},function(t,e,n){function i(t){var e=[];return o.each(h.getClassesByMainType(t),function(t){a.apply(e,t.prototype.dependencies||[])}),o.map(e,function(t){return l.parseClassType(t).main})}var r=n(10),o=n(1),a=Array.prototype.push,s=n(49),l=n(15),u=n(12),h=r.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,n,i){r.call(this,t,e,n,i),this.uid=s.getUID("componentModel")},init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?u.getLayoutParams(t):{},r=e.getTheme();o.merge(t,r.get(this.mainType)),o.merge(t,this.getDefaultOption()),n&&u.mergeLayoutParam(t,i,n)},mergeOption:function(t,e){o.merge(this.option,t,!0);var n=this.layoutMode;n&&u.mergeLayoutParam(this.option,t,n)},optionUpdated:function(t,e){},getDefaultOption:function(){if(!l.hasOwn(this,"__defaultOption")){for(var t=[],e=this.constructor;e;){var n=e.prototype.defaultOption;n&&t.push(n),e=e.superClass}for(var i={},r=t.length-1;r>=0;r--)i=o.merge(i,t[r],!0);l.set(this,"__defaultOption",i)}return l.get(this,"__defaultOption")},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});l.enableClassManagement(h,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(h),s.enableTopologicalTravel(h,i),o.mixin(h,n(141)),t.exports=h},function(t,e,n){(function(e){function i(t){return d.isArray(t)||(t=[t]),t}function r(t,e){var n=t.dimensions,i=new m(d.map(n,t.getDimensionInfo,t),t.hostModel);v(i,t);for(var r=i._storage={},o=t._storage,a=0;a<n.length;a++){var s=n[a],l=o[s];d.indexOf(e,s)>=0?r[s]=new l.constructor(o[s].length):r[s]=o[s]}return i}var o="undefined",a="undefined"==typeof window?e:window,s=typeof a.Float64Array===o?Array:a.Float64Array,l=typeof a.Int32Array===o?Array:a.Int32Array,u={"float":s,"int":l,ordinal:Array,number:Array,time:Array},h=n(10),c=n(48),d=n(1),f=n(6),p=d.isObject,g=["stackedOn","hasItemOption","_nameList","_idList","_rawData"],v=function(t,e){d.each(g.concat(e.__wrappedMethods||[]),function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t.__wrappedMethods=e.__wrappedMethods},m=function(t,e){t=t||["x","y"];for(var n={},i=[],r=0;r<t.length;r++){var o,a={};"string"==typeof t[r]?(o=t[r],a={name:o,stackable:!1,type:"number"}):(a=t[r],o=a.name,a.type=a.type||"number"),i.push(o),n[o]=a}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this.dataType,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData,this._extent},y=m.prototype;y.type="list",y.hasItemOption=!0,y.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},y.getDimensionInfo=function(t){return d.clone(this._dimensionInfos[this.getDimension(t)])},y.initData=function(t,e,n){t=t||[],this._rawData=t;var i=this._storage={},r=this.indices=[],o=this.dimensions,a=t.length,s=this._dimensionInfos,l=[],h={};e=e||[];for(var c=0;c<o.length;c++){var d=s[o[c]],p=u[d.type];i[o[c]]=new p(a)}var g=this;n||(g.hasItemOption=!1),n=n||function(t,e,n,i){var r=f.getDataItemValue(t);return f.isDataItemOption(t)&&(g.hasItemOption=!0),f.converDataValue(r instanceof Array?r[i]:r,s[e])};for(var v=0;v<t.length;v++){for(var m=t[v],y=0;y<o.length;y++){var x=o[y],_=i[x];_[v]=n(m,x,v,y)}r.push(v)}for(var c=0;c<t.length;c++){e[c]||t[c]&&null!=t[c].name&&(e[c]=t[c].name);var b=e[c]||"",w=t[c]&&t[c].id;!w&&b&&(h[b]=h[b]||0,w=b,h[b]>0&&(w+="__ec__"+h[b]),h[b]++),w&&(l[c]=w)}this._nameList=e,this._idList=l},y.count=function(){return this.indices.length},y.get=function(t,e,n){var i=this._storage,r=this.indices[e];if(null==r)return NaN;var o=i[t]&&i[t][r];if(n){var a=this._dimensionInfos[t];if(a&&a.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(o>=0&&l>0||o<=0&&l<0)&&(o+=l),s=s.stackedOn}}return o},y.getValues=function(t,e,n){var i=[];d.isArray(t)||(n=e,e=t,t=this.dimensions);for(var r=0,o=t.length;r<o;r++)i.push(this.get(t[r],e,n));return i},y.hasValue=function(t){for(var e=this.dimensions,n=this._dimensionInfos,i=0,r=e.length;i<r;i++)if("ordinal"!==n[e[i]].type&&isNaN(this.get(e[i],t)))return!1;return!0},y.getDataExtent=function(t,e,n){t=this.getDimension(t);var i=this._storage[t],r=this.getDimensionInfo(t);e=r&&r.stackable&&e;var o,a=(this._extent||(this._extent={}))[t+!!e];if(a)return a;if(i){for(var s=1/0,l=-(1/0),u=0,h=this.count();u<h;u++)o=this.get(t,u,e),n&&!n(o,t,u)||(o<s&&(s=o),o>l&&(l=o));return this._extent[t+!!e]=[s,l]}return[1/0,-(1/0)]},y.getSum=function(t,e){var n=this._storage[t],i=0;if(n)for(var r=0,o=this.count();r<o;r++){var a=this.get(t,r,e);isNaN(a)||(i+=a)}return i},y.indexOf=function(t,e){var n=this._storage,i=n[t],r=this.indices;if(i)for(var o=0,a=r.length;o<a;o++){var s=r[o];if(i[s]===e)return o}return-1},y.indexOfName=function(t){for(var e=this.indices,n=this._nameList,i=0,r=e.length;i<r;i++){var o=e[i];if(n[o]===t)return i}return-1},y.indexOfRawIndex=function(t){var e=this.indices,n=e[t];if(null!=n&&n===t)return t;for(var i=0,r=e.length-1;i<=r;){var o=(i+r)/2|0;if(e[o]<t)i=o+1;else{if(!(e[o]>t))return o;r=o-1}}return-1},y.indicesOfNearest=function(t,e,n,i){var r=this._storage,o=r[t],a=[];if(!o)return a;null==i&&(i=1/0);for(var s=Number.MAX_VALUE,l=-1,u=0,h=this.count();u<h;u++){var c=e-this.get(t,u,n),d=Math.abs(c);c<=i&&d<=s&&((d<s||c>=0&&l<0)&&(s=d,l=c,a.length=0),a.push(u))}return a},y.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},y.getRawDataItem=function(t){return this._rawData[this.getRawIndex(t)]},y.getName=function(t){return this._nameList[this.indices[t]]||""},y.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},y.each=function(t,e,n,r){"function"==typeof t&&(r=n,n=e,e=t,t=[]),t=d.map(i(t),this.getDimension,this);var o=[],a=t.length,s=this.indices;r=r||this;for(var l=0;l<s.length;l++)switch(a){case 0:e.call(r,l);break;case 1:e.call(r,this.get(t[0],l,n),l);break;case 2:e.call(r,this.get(t[0],l,n),this.get(t[1],l,n),l);break;default:for(var u=0;u<a;u++)o[u]=this.get(t[u],l,n);o[u]=l,e.apply(r,o)}},y.filterSelf=function(t,e,n,r){"function"==typeof t&&(r=n,n=e,e=t,t=[]),t=d.map(i(t),this.getDimension,this);var o=[],a=[],s=t.length,l=this.indices;r=r||this;for(var u=0;u<l.length;u++){var h;if(1===s)h=e.call(r,this.get(t[0],u,n),u);else{for(var c=0;c<s;c++)a[c]=this.get(t[c],u,n);a[c]=u,h=e.apply(r,a)}h&&o.push(l[u])}return this.indices=o,this._extent={},this},y.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n,i),r},y.map=function(t,e,n,o){t=d.map(i(t),this.getDimension,this);var a=r(this,t),s=a.indices=this.indices,l=a._storage,u=[];return this.each(t,function(){var n=arguments[arguments.length-1],i=e&&e.apply(this,arguments);if(null!=i){"number"==typeof i&&(u[0]=i,i=u);for(var r=0;r<i.length;r++){var o=t[r],a=l[o],h=s[n];a&&(a[h]=i[r])}}},n,o),a},y.downSample=function(t,e,n,i){for(var o=r(this,[t]),a=this._storage,s=o._storage,l=this.indices,u=o.indices=[],h=[],c=[],d=Math.floor(1/e),f=s[t],p=this.count(),g=0;g<a[t].length;g++)s[t][g]=a[t][g];for(var g=0;g<p;g+=d){d>p-g&&(d=p-g,h.length=d);for(var v=0;v<d;v++){var m=l[g+v];h[v]=f[m],c[v]=m}var y=n(h),m=c[i(h,y)||0];f[m]=y,u.push(m)}return o},y.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new h(this._rawData[t],e,e&&e.ecModel)},y.diff=function(t){var e,n=this._idList,i=t&&t._idList,r="e\0\0";return new c(t?t.indices:[],this.indices,function(t){return null!=(e=i[t])?e:r+t},function(t){return null!=(e=n[t])?e:r+t})},y.getVisual=function(t){var e=this._visual;return e&&e[t]},y.setVisual=function(t,e){if(p(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},y.setLayout=function(t,e){if(p(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},y.getLayout=function(t){return this._layout[t]},y.getItemLayout=function(t){return this._itemLayouts[t]},y.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?d.extend(this._itemLayouts[t]||{},e):e},y.clearItemLayouts=function(){this._itemLayouts.length=0},y.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},y.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};if(this._itemVisuals[t]=i,p(e))for(var r in e)e.hasOwnProperty(r)&&(i[r]=e[r]);else i[e]=n},y.clearAllVisual=function(){this._visual={},this._itemVisuals=[]};var x=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};y.setItemGraphicEl=function(t,e){var n=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(x,e)),this._graphicEls[t]=e},y.getItemGraphicEl=function(t){return this._graphicEls[t]},y.eachItemGraphicEl=function(t,e){d.each(this._graphicEls,function(n,i){n&&t&&t.call(e,n,i)})},y.cloneShallow=function(){var t=d.map(this.dimensions,this.getDimensionInfo,this),e=new m(t,this.hostModel);return e._storage=this._storage,v(e,this),e.indices=this.indices.slice(),this._extent&&(e._extent=d.extend({},this._extent)),e},y.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(d.slice(arguments)))})},y.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],y.CHANGABLE_METHODS=["filterSelf"],t.exports=m}).call(e,function(){return this}())},function(t,e,n){function i(t){a.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function r(t,e){var n=a.slice(arguments,2);return this.superClass.prototype[e].apply(t,n)}function o(t,e,n){return this.superClass.prototype[e].apply(t,n)}var a=n(1),s={},l=".",u="___EC__COMPONENT__CONTAINER___",h="\0ec_\0";s.set=function(t,e,n){return t[h+e]=n},s.get=function(t,e){return t[h+e]},s.hasOwn=function(t,e){return t.hasOwnProperty(h+e)};var c=s.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(l),e.main=t[0]||"",e.sub=t[1]||""),e};s.enableClassExtend=function(t,e){t.$constructor=t,t.extend=function(t){var e=this,n=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return a.extend(n.prototype,t),n.extend=this.extend,n.superCall=r,n.superApply=o,a.inherits(n,this),n.superClass=e,n}},s.enableClassManagement=function(t,e){function n(t){var e=r[t.main];return e&&e[u]||(e=r[t.main]={},e[u]=!0),e}e=e||{};var r={};if(t.registerClass=function(t,e){if(e)if(i(e),e=c(e),e.sub){if(e.sub!==u){var o=n(e);o[e.sub]=t}}else r[e.main]=t;return t},t.getClass=function(t,e,n){var i=r[t];if(i&&i[u]&&(i=e?i[e]:null),n&&!i)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return i},t.getClassesByMainType=function(t){t=c(t);var e=[],n=r[t.main];return n&&n[u]?a.each(n,function(t,n){n!==u&&e.push(t)}):e.push(n),e},t.hasClass=function(t){return t=c(t),!!r[t.main]},t.getAllClassMainTypes=function(){var t=[];return a.each(r,function(e,n){t.push(n)}),t},t.hasSubTypes=function(t){t=c(t);var e=r[t.main];return e&&e[u]},t.parseClassType=c,e.registerWhenExtend){var o=t.extend;o&&(t.extend=function(e){var n=o.call(this,e);return t.registerClass(n,e.type)})}return t},s.setReadOnly=function(t,e){},t.exports=s},function(t,e,n){function i(t,e){var n=t+":"+e;if(l[n])return l[n];for(var i=(t+"").split("\n"),r=0,o=0,a=i.length;o<a;o++)r=Math.max(p.measureText(i[o],e).width,r);return u>h&&(u=0,l={}),u++,l[n]=r,r}function r(t,e,n,r){var o=((t||"")+"").split("\n").length,a=i(t,e),s=i("国",e),l=o*s,u=new d(0,0,a,l);switch(u.lineHeight=s,r){case"bottom":case"alphabetic":u.y-=s;break;case"middle":u.y-=s/2}switch(n){case"end":case"right":u.x-=u.width;break;case"center":u.x-=u.width/2}return u}function o(t,e,n,i){var r=e.x,o=e.y,a=e.height,s=e.width,l=n.height,u=n.lineHeight,h=a/2-l/2+u,c="left";switch(t){case"left":r-=i,o+=h,c="right";break;case"right":r+=i+s,o+=h,c="left";break;case"top":r+=s/2,o-=i+l-u,c="center";break;case"bottom":r+=s/2,o+=a+i+u,c="center";break;case"inside":r+=s/2,o+=h,c="center";break;case"insideLeft":r+=i,o+=h,c="left";break;case"insideRight":r+=s-i,o+=h,c="right";break;case"insideTop":r+=s/2,o+=i+u,c="center";break;case"insideBottom":r+=s/2,o+=a-l-i+u,c="center";break;case"insideTopLeft":r+=i,o+=i+u,c="left";break;case"insideTopRight":r+=s-i,o+=i+u,c="right";break;case"insideBottomLeft":r+=i,o+=a-l-i+u;break;case"insideBottomRight":r+=s-i,o+=a-l-i+u,c="right"}return{x:r,y:o,textAlign:c,textBaseline:"alphabetic"}}function a(t,e,n,r,o){if(!e)return"";o=o||{},r=f(r,"...");for(var a=f(o.maxIterations,2),l=f(o.minChar,0),u=i("国",n),h=i("a",n),c=f(o.placeholder,""),d=e=Math.max(0,e-1),p=0;p<l&&d>=h;p++)d-=h;var g=i(r);g>d&&(r="",g=0),d=e-g;for(var v=(t+"").split("\n"),p=0,m=v.length;p<m;p++){var y=v[p],x=i(y,n);if(!(x<=e)){for(var _=0;;_++){if(x<=d||_>=a){y+=r;break}var b=0===_?s(y,d,h,u):x>0?Math.floor(y.length*d/x):0;y=y.substr(0,b),x=i(y,n)}""===y&&(y=c),v[p]=y}}return v.join("\n")}function s(t,e,n,i){for(var r=0,o=0,a=t.length;o<a&&r<e;o++){var s=t.charCodeAt(o);r+=0<=s&&s<=127?n:i}return o}var l={},u=0,h=5e3,c=n(1),d=n(11),f=c.retrieve,p={getWidth:i,getBoundingRect:r,adjustTextPositionOnRect:o,truncateText:a,measureText:function(t,e){var n=c.getContext();return n.font=e||"12px sans-serif",n.measureText(t)}};t.exports=p},function(t,e,n){var i=n(149),r=n(43);n(150),n(148);var o=n(34),a=n(4),s=n(1),l=n(16),u={};u.getScaleExtent=function(t,e){var n,i,r,o=t.type,l=e.getMin(),u=e.getMax(),h=null!=l,c=null!=u,d=t.getExtent();return"ordinal"===o?n=(e.get("data")||[]).length:(i=e.get("boundaryGap"),s.isArray(i)||(i=[i||0,i||0]),"boolean"==typeof i[0]&&(i=[0,0]),i[0]=a.parsePercent(i[0],1),i[1]=a.parsePercent(i[1],1),r=d[1]-d[0]||Math.abs(d[0])),null==l&&(l="ordinal"===o?n?0:NaN:d[0]-i[0]*r),null==u&&(u="ordinal"===o?n?n-1:NaN:d[1]+i[1]*r),"dataMin"===l&&(l=d[0]),"dataMax"===u&&(u=d[1]),(null==l||!isFinite(l))&&(l=NaN),(null==u||!isFinite(u))&&(u=NaN),t.setBlank(s.eqNaN(l)||s.eqNaN(u)),e.getNeedCrossZero()&&(l>0&&u>0&&!h&&(l=0),l<0&&u<0&&!c&&(u=0)),[l,u]},u.niceScaleExtent=function(t,e){var n=u.getScaleExtent(t,e),i=null!=e.getMin(),r=null!=e.getMax(),o=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase")),t.setExtent(n[0],n[1]),t.niceExtent(o,i,r);var a=e.get("minInterval");if(isFinite(a)&&!i&&!r&&"interval"===t.type){var s=t.getInterval(),l=Math.max(Math.abs(s),a)/s;n=t.getExtent();var h=(n[1]+n[0])/2;t.setExtent(l*(n[0]-h)+h,l*(n[1]-h)+h),t.niceExtent(o)}var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)},u.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new i(t.getCategories(),[1/0,-(1/0)]);case"value":return new r;default:return(o.getClass(e)||r).create(t)}},u.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)},u.getAxisLabelInterval=function(t,e,n,i){var r,o=0,a=0,s=1;e.length>40&&(s=Math.floor(e.length/40));for(var u=0;u<t.length;u+=s){var h=t[u],c=l.getBoundingRect(e[u],n,"center","top");c[i?"x":"y"]+=h,c[i?"width":"height"]*=1.3,r?r.intersect(c)?(a++,o=Math.max(o,a)):(r.union(c),a=0):r=c.clone()}return 0===o&&s>1?s:(o+1)*s-1},u.getFormattedLabels=function(t,e){var n=t.scale,i=n.getTicksLabels(),r=n.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),s.map(i,e)):"function"==typeof e?s.map(r,function(n,i){return e(u.getAxisRawValue(t,n),i)},this):i},u.getAxisRawValue=function(t,e){return"category"===t.type?t.scale.getLabel(e):e},t.exports=u},function(t,e,n){"use strict";var i=n(1),r=n(7),o=n(15),a=n(6),s=n(13),l=n(61),u=n(9),h=n(12),c=o.set,d=o.get,f=r.encodeHTML,p=r.addCommas,g=s.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.normal.color",layoutMode:null,init:function(t,e,n,i){this.seriesIndex=this.componentIndex,this.mergeDefaultAndTheme(t,n);var r=this.getInitialData(t,n);c(this,"dataBeforeProcessed",r),this.restoreData()},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,r=n?h.getLayoutParams(t):{};i.merge(t,e.getTheme().get(this.subType)),i.merge(t,this.getDefaultOption()),a.defaultEmphasis(t.label,a.LABEL_OPTIONS),this.fillDataTextStyle(t.data),n&&h.mergeLayoutParam(t,r,n)},mergeOption:function(t,e){t=i.merge(this.option,t,!0),this.fillDataTextStyle(t.data);var n=this.layoutMode;n&&h.mergeLayoutParam(this.option,t,n);var r=this.getInitialData(t,e);r&&(c(this,"data",r),c(this,"dataBeforeProcessed",r.cloneShallow()))},fillDataTextStyle:function(t){if(t)for(var e=0;e<t.length;e++)t[e]&&t[e].label&&a.defaultEmphasis(t[e].label,a.LABEL_OPTIONS)},getInitialData:function(){},getData:function(t){var e=d(this,"data");return null==t?e:e.getLinkedData(t)},setData:function(t){c(this,"data",t)},getRawData:function(){return d(this,"dataBeforeProcessed")},coordDimToDataDim:function(t){return[t]},dataDimToCoordDim:function(t){return t},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,n){function o(t){var n=[];return i.each(t,function(t,i){var o,s=a.getDimensionInfo(i),l=s&&s.type;o="ordinal"===l?t+"":"time"===l?e?"":r.formatTime("yyyy/MM/dd hh:mm:ss",t):p(t),o&&n.push(o)}),n.join(", ")}var a=d(this,"data"),s=this.getRawValue(t),l=f(i.isArray(s)?o(s):p(s)),u=a.getName(t),h=a.getItemVisual(t,"color");i.isObject(h)&&h.colorStops&&(h=(h.colorStops[0]||{}).color),h=h||"transparent";var c='<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+f(h)+'"></span>',g=this.name;return"\0-"===g&&(g=""),e?c+f(this.name)+" : "+l:(g&&f(g)+"<br />")+c+(u?f(u)+" : "+l:l)},isAnimationEnabled:function(){if(u.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){c(this,"data",d(this,"dataBeforeProcessed").cloneShallow())},getColorFromPalette:function(t,e){var n=this.ecModel,i=l.getColorFromPalette.call(this,t,e);return i||(i=n.getColorFromPalette(t,e)),i},getAxisTooltipData:null,getTooltipPosition:null});i.mixin(g,a.dataFormatMixin),i.mixin(g,l),t.exports=g},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(){var t=new n(6);return i.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t},translate:function(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t},rotate:function(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t},scale:function(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t},invert:function(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}};t.exports=i},function(t,e,n){"use strict";function i(t){return t>-w&&t<w}function r(t){return t>w||t<-w}function o(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function a(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function s(t,e,n,r,o,a){var s=r+3*(e-n)-t,l=3*(n-2*e+t),u=3*(e-t),h=t-o,c=l*l-3*s*u,d=l*u-9*s*h,f=u*u-3*l*h,p=0;if(i(c)&&i(d))if(i(l))a[0]=0;else{var g=-u/l;g>=0&&g<=1&&(a[p++]=g)}else{var v=d*d-4*c*f;if(i(v)){var m=d/c,g=-l/s+m,y=-m/2;g>=0&&g<=1&&(a[p++]=g),y>=0&&y<=1&&(a[p++]=y)}else if(v>0){var x=b(v),w=c*l+1.5*s*(-d+x),M=c*l+1.5*s*(-d-x);w=w<0?-_(-w,T):_(w,T),M=M<0?-_(-M,T):_(M,T);var g=(-l-(w+M))/(3*s);g>=0&&g<=1&&(a[p++]=g)}else{var A=(2*c*l-3*s*d)/(2*b(c*c*c)),I=Math.acos(A)/3,C=b(c),P=Math.cos(I),g=(-l-2*C*P)/(3*s),y=(-l+C*(P+S*Math.sin(I)))/(3*s),k=(-l+C*(P-S*Math.sin(I)))/(3*s);g>=0&&g<=1&&(a[p++]=g),y>=0&&y<=1&&(a[p++]=y),k>=0&&k<=1&&(a[p++]=k)}}return p}function l(t,e,n,o,a){var s=6*n-12*e+6*t,l=9*e+3*o-3*t-9*n,u=3*e-3*t,h=0;if(i(l)){if(r(s)){var c=-u/s;c>=0&&c<=1&&(a[h++]=c)}}else{var d=s*s-4*l*u;if(i(d))a[0]=-s/(2*l);else if(d>0){var f=b(d),c=(-s+f)/(2*l),p=(-s-f)/(2*l);c>=0&&c<=1&&(a[h++]=c),p>=0&&p<=1&&(a[h++]=p)}}return h}function u(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function h(t,e,n,i,r,a,s,l,u,h,c){var d,f,p,g,v,m=.005,y=1/0;A[0]=u,A[1]=h;for(var _=0;_<1;_+=.05)I[0]=o(t,n,r,s,_),I[1]=o(e,i,a,l,_),g=x(A,I),g<y&&(d=_,y=g);y=1/0;for(var w=0;w<32&&!(m<M);w++)f=d-m,p=d+m,I[0]=o(t,n,r,s,f),I[1]=o(e,i,a,l,f),g=x(I,A),f>=0&&g<y?(d=f,y=g):(C[0]=o(t,n,r,s,p),C[1]=o(e,i,a,l,p),v=x(C,A),p<=1&&v<y?(d=p,y=v):m*=.5);return c&&(c[0]=o(t,n,r,s,d),c[1]=o(e,i,a,l,d)),b(y)}function c(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function d(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function f(t,e,n,o,a){var s=t-2*e+n,l=2*(e-t),u=t-o,h=0;if(i(s)){if(r(l)){var c=-u/l;c>=0&&c<=1&&(a[h++]=c)}}else{var d=l*l-4*s*u;if(i(d)){var c=-l/(2*s);c>=0&&c<=1&&(a[h++]=c)}else if(d>0){var f=b(d),c=(-l+f)/(2*s),p=(-l-f)/(2*s);c>=0&&c<=1&&(a[h++]=c),p>=0&&p<=1&&(a[h++]=p)}}return h}function p(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function g(t,e,n,i,r){var o=(e-t)*i+t,a=(n-e)*i+e,s=(a-o)*i+o;r[0]=t,r[1]=o,r[2]=s,r[3]=s,r[4]=a,r[5]=n}function v(t,e,n,i,r,o,a,s,l){var u,h=.005,d=1/0;A[0]=a,A[1]=s;for(var f=0;f<1;f+=.05){I[0]=c(t,n,r,f),I[1]=c(e,i,o,f);var p=x(A,I);p<d&&(u=f,d=p)}d=1/0;for(var g=0;g<32&&!(h<M);g++){var v=u-h,m=u+h;I[0]=c(t,n,r,v),I[1]=c(e,i,o,v);var p=x(I,A);if(v>=0&&p<d)u=v,d=p;else{C[0]=c(t,n,r,m),C[1]=c(e,i,o,m);var y=x(C,A);m<=1&&y<d?(u=m,d=y):h*=.5}}return l&&(l[0]=c(t,n,r,u),l[1]=c(e,i,o,u)),b(d)}var m=n(5),y=m.create,x=m.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,M=1e-4,S=b(3),T=1/3,A=y(),I=y(),C=y();t.exports={cubicAt:o,cubicDerivativeAt:a,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:u,cubicProjectPoint:h,quadraticAt:c,quadraticDerivativeAt:d,quadraticRootAt:f,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:v}},function(t,e,n){"use strict";function i(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function r(t,e,n,i){return n=n||{},i||!h.canvasSupported?o(t,e,n):h.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):o(t,e,n),n}function o(t,e,n){var r=i(t);n.zrX=e.clientX-r.left,n.zrY=e.clientY-r.top}function a(t,e,n){if(e=e||window.event,null!=e.zrX)return e;var i=e.type,o=i&&i.indexOf("touch")>=0;if(o){var a="touchend"!=i?e.targetTouches[0]:e.changedTouches[0];a&&r(t,a,e,n)}else r(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;return e}function s(t,e,n){c?t.addEventListener(e,n):t.attachEvent("on"+e,n)}function l(t,e,n){c?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}var u=n(23),h=n(9),c="undefined"!=typeof window&&!!window.addEventListener,d=c?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={clientToLocal:r,normalizeEvent:a,addEventListener:s,removeEventListener:l,stop:d,Dispatcher:u}},function(t,e,n){function i(t){return t=Math.round(t),t<0?0:t>255?255:t}function r(t){return t=Math.round(t),t<0?0:t>360?360:t}function o(t){return t<0?0:t>1?1:t}function a(t){return i(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function s(t){return o(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function l(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function u(t,e,n){return t+(e-t)*n}function h(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function c(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function d(t,e){A&&c(A,e),A=T.put(t,A||e.slice())}function f(t,e){if(t){e=e||[];var n=T.get(t);if(n)return c(e,n);t+="";var i=t.replace(/ /g,"").toLowerCase();if(i in S)return c(e,S[i]),d(t,e),e;if("#"!==i.charAt(0)){var r=i.indexOf("("),o=i.indexOf(")");if(r!==-1&&o+1===i.length){var l=i.substr(0,r),u=i.substr(r+1,o-(r+1)).split(","),f=1;switch(l){case"rgba":if(4!==u.length)return void h(e,0,0,0,1);f=s(u.pop());case"rgb":return 3!==u.length?void h(e,0,0,0,1):(h(e,a(u[0]),a(u[1]),a(u[2]),f),d(t,e),e);case"hsla":return 4!==u.length?void h(e,0,0,0,1):(u[3]=s(u[3]),p(u,e),d(t,e),e);case"hsl":return 3!==u.length?void h(e,0,0,0,1):(p(u,e),d(t,e),e);default:return}}h(e,0,0,0,1)}else{if(4===i.length){var g=parseInt(i.substr(1),16);return g>=0&&g<=4095?(h(e,(3840&g)>>4|(3840&g)>>8,240&g|(240&g)>>4,15&g|(15&g)<<4,1),d(t,e),e):void h(e,0,0,0,1)}if(7===i.length){var g=parseInt(i.substr(1),16);return g>=0&&g<=16777215?(h(e,(16711680&g)>>16,(65280&g)>>8,255&g,1),d(t,e),e):void h(e,0,0,0,1)}}}}function p(t,e){var n=(parseFloat(t[0])%360+360)%360/360,r=s(t[1]),o=s(t[2]),a=o<=.5?o*(r+1):o+r-o*r,u=2*o-a;return e=e||[],h(e,i(255*l(u,a,n+1/3)),i(255*l(u,a,n)),i(255*l(u,a,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function g(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,d=((s-o)/6+l/2)/l;i===s?e=d-c:r===s?e=1/3+h-d:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var f=[360*e,n,u];return null!=t[3]&&f.push(t[3]),f}}function v(t,e){var n=f(t);if(n){for(var i=0;i<3;i++)e<0?n[i]=n[i]*(1-e)|0:n[i]=(255-n[i])*e+n[i]|0;return w(n,4===n.length?"rgba":"rgb")}}function m(t,e){var n=f(t);if(n)return((1<<24)+(n[0]<<16)+(n[1]<<8)+ +n[2]).toString(16).slice(1)}function y(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var r=t*(e.length-1),a=Math.floor(r),s=Math.ceil(r),l=e[a],h=e[s],c=r-a;return n[0]=i(u(l[0],h[0],c)),n[1]=i(u(l[1],h[1],c)),n[2]=i(u(l[2],h[2],c)),n[3]=o(u(l[3],h[3],c)),n}}function x(t,e,n){if(e&&e.length&&t>=0&&t<=1){var r=t*(e.length-1),a=Math.floor(r),s=Math.ceil(r),l=f(e[a]),h=f(e[s]),c=r-a,d=w([i(u(l[0],h[0],c)),i(u(l[1],h[1],c)),i(u(l[2],h[2],c)),o(u(l[3],h[3],c))],"rgba");return n?{color:d,leftIndex:a,rightIndex:s,value:r}:d}}function _(t,e,n,i){if(t=f(t))return t=g(t),null!=e&&(t[0]=r(e)),null!=n&&(t[1]=s(n)),null!=i&&(t[2]=s(i)),w(p(t),"rgba")}function b(t,e){if(t=f(t),t&&null!=e)return t[3]=o(e),w(t,"rgba")}function w(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}var M=n(69),S={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],
-mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},T=new M(20),A=null;t.exports={parse:f,lift:v,toHex:m,fastMapToColor:y,mapToColor:x,modifyHSL:_,modifyAlpha:b,stringify:w}},function(t,e){var n=Array.prototype.slice,i=function(){this._$handlers={}};i.prototype={constructor:i,one:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!0,ctx:n||this}),this},on:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!1,ctx:n||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var n=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,o=n[t].length;r<o;r++)n[t][r].h!=e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>3&&(e=n.call(e,1));for(var r=this._$handlers[t],o=r.length,a=0;a<o;){switch(i){case 1:r[a].h.call(r[a].ctx);break;case 2:r[a].h.call(r[a].ctx,e[1]);break;case 3:r[a].h.call(r[a].ctx,e[1],e[2]);break;default:r[a].h.apply(r[a].ctx,e)}r[a].one?(r.splice(a,1),o--):a++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>4&&(e=n.call(e,1,e.length-1));for(var r=e[e.length-1],o=this._$handlers[t],a=o.length,s=0;s<a;){switch(i){case 1:o[s].h.call(r);break;case 2:o[s].h.call(r,e[1]);break;case 3:o[s].h.call(r,e[1],e[2]);break;default:o[s].h.apply(r,e)}o[s].one?(o.splice(s,1),a--):s++}}return this}},t.exports=i},function(t,e,n){"use strict";var i=n(3),r=n(11),o=i.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i+o),t.lineTo(n-r,i+o),t.closePath()}}),a=i.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i),t.lineTo(n,i+o),t.lineTo(n-r,i),t.closePath()}}),s=i.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=i-o+a+s,u=Math.asin(s/a),h=Math.cos(u)*a,c=Math.sin(u),d=Math.cos(u);t.arc(n,l,a,Math.PI-u,2*Math.PI+u);var f=.6*a,p=.7*a;t.bezierCurveTo(n+h-c*f,l+s+d*f,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-h+c*f,l+s+d*f,n-h,l+s),t.closePath()}}),l=i.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,o=e.y,a=i/3*2;t.moveTo(r,o),t.lineTo(r+a,o+n),t.lineTo(r,o+n/4*3),t.lineTo(r-a,o+n),t.lineTo(r,o),t.closePath()}}),u={line:i.Line,rect:i.Rect,roundRect:i.Rect,square:i.Rect,circle:i.Circle,diamond:a,pin:s,arrow:l,triangle:o},h={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var o=Math.min(n,i);r.x=t,r.y=e,r.width=o,r.height=o},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},c={};for(var d in u)u.hasOwnProperty(d)&&(c[d]=new u[d]);var f=i.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,n){var i=e.symbolType,r=c[i];"none"!==e.symbolType&&(r||(i="rect",r=c[i]),h[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n))}}),p=function(t){if("image"!==this.type){var e=this.style,n=this.shape;n&&"line"===n.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty(!1)}},g={createSymbol:function(t,e,n,o,a,s){var l=0===t.indexOf("empty");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var u;return u=0===t.indexOf("image://")?new i.Image({style:{image:t.slice(8),x:e,y:n,width:o,height:a}}):0===t.indexOf("path://")?i.makePath(t.slice(7),{},new r(e,n,o,a)):new f({shape:{symbolType:t,x:e,y:n,width:o,height:a}}),u.__isEmptyBrush=l,u.setColor=p,u.setColor(s),u}};t.exports=g},function(t,e,n){function i(t,e,n){if(!e)return t;n=n||{};var i=n.dimCount;if(null==i){var s=r(e[0]);i=o.isArray(s)&&s.length||1}for(var l=n.defaultNames||[],u=n.extraPrefix||"extra",h=0;h<i;h++)if(!t[h]){var c=l[h]||u+(h-l.length);t[h]=a(e,h)?{type:"ordinal",name:c}:c}return t}function r(t){return o.isArray(t)?t:o.isObject(t)?t.value:t}var o=n(1),a=i.guessOrdinal=function(t,e){for(var n=0,i=t.length;n<i;n++){var a=r(t[n]);if(!o.isArray(a))return!1;var a=a[e];if(null!=a&&isFinite(a))return!1;if(o.isString(a)&&"-"!==a)return!0}return!1};t.exports=i},function(t,e,n){"use strict";function i(){this._coordinateSystems=[]}var r=n(1),o={};i.prototype={constructor:i,create:function(t,e){var n=[];r.each(o,function(i,r){var o=i.create(t,e);n=n.concat(o||[])}),this._coordinateSystems=n},update:function(t,e){r.each(this._coordinateSystems,function(n){n.update&&n.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},i.register=function(t,e){o[t]=e},i.get=function(t){return o[t]},t.exports=i},function(t,e,n){"use strict";var i=n(20),r=n(5),o=n(84),a=n(11),s=n(35).devicePixelRatio,l={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},u=[],h=[],c=[],d=[],f=Math.min,p=Math.max,g=Math.cos,v=Math.sin,m=Math.sqrt,y=Math.abs,x="undefined"!=typeof Float32Array,_=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};_.prototype={constructor:_,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=y(1/s/t)||0,this._uy=y(1/s/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(l.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var n=y(t-this._xi)>this._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(l.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,o){return this.addData(l.C,t,e,n,i,r,o),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,o):this._ctx.bezierCurveTo(t,e,n,i,r,o)),this._xi=r,this._yi=o,this},quadraticCurveTo:function(t,e,n,i){return this.addData(l.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,o){return this.addData(l.A,t,e,n,n,i,r-i,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=g(r)*n+t,this._yi=v(r)*n+t,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(l.R,t,e,n,i),this},closePath:function(){this.addData(l.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!x||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();x&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(var r=0;r<e;r++)for(var o=t[r].data,a=0;a<o.length;a++)this.data[i++]=o[a];this._len=i},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var n=0;n<arguments.length;n++)e[this._len++]=arguments[n];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var n,i,r=this._dashSum,o=this._dashOffset,a=this._lineDash,s=this._ctx,l=this._xi,u=this._yi,h=t-l,c=e-u,d=m(h*h+c*c),g=l,v=u,y=a.length;for(h/=d,c/=d,o<0&&(o=r+o),o%=r,g-=o*h,v-=o*c;h>0&&g<=t||h<0&&g>=t||0==h&&(c>0&&v<=e||c<0&&v>=e);)i=this._dashIdx,n=a[i],g+=h*n,v+=c*n,this._dashIdx=(i+1)%y,h>0&&g<l||h<0&&g>l||c>0&&v<u||c<0&&v>u||s[i%2?"moveTo":"lineTo"](h>=0?f(g,t):p(g,t),c>=0?f(v,e):p(v,e));h=g-t,c=v-e,this._dashOffset=-m(h*h+c*c)},_dashedBezierTo:function(t,e,n,r,o,a){var s,l,u,h,c,d=this._dashSum,f=this._dashOffset,p=this._lineDash,g=this._ctx,v=this._xi,y=this._yi,x=i.cubicAt,_=0,b=this._dashIdx,w=p.length,M=0;for(f<0&&(f=d+f),f%=d,s=0;s<1;s+=.1)l=x(v,t,n,o,s+.1)-x(v,t,n,o,s),u=x(y,e,r,a,s+.1)-x(y,e,r,a,s),_+=m(l*l+u*u);for(;b<w&&(M+=p[b],!(M>f));b++);for(s=(M-f)/_;s<=1;)h=x(v,t,n,o,s),c=x(y,e,r,a,s),b%2?g.moveTo(h,c):g.lineTo(h,c),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(o,a),l=o-h,u=a-c,this._dashOffset=-m(l*l+u*u)},_dashedQuadraticTo:function(t,e,n,i){var r=n,o=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,o)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,x&&(this.data=new Float32Array(t)))},getBoundingRect:function(){u[0]=u[1]=c[0]=c[1]=Number.MAX_VALUE,h[0]=h[1]=d[0]=d[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,n=0,i=0,s=0,f=0;f<t.length;){var p=t[f++];switch(1==f&&(e=t[f],n=t[f+1],i=e,s=n),p){case l.M:i=t[f++],s=t[f++],e=i,n=s,c[0]=i,c[1]=s,d[0]=i,d[1]=s;break;case l.L:o.fromLine(e,n,t[f],t[f+1],c,d),e=t[f++],n=t[f++];break;case l.C:o.fromCubic(e,n,t[f++],t[f++],t[f++],t[f++],t[f],t[f+1],c,d),e=t[f++],n=t[f++];break;case l.Q:o.fromQuadratic(e,n,t[f++],t[f++],t[f],t[f+1],c,d),e=t[f++],n=t[f++];break;case l.A:var m=t[f++],y=t[f++],x=t[f++],_=t[f++],b=t[f++],w=t[f++]+b,M=(t[f++],1-t[f++]);1==f&&(i=g(b)*x+m,s=v(b)*_+y),o.fromArc(m,y,x,_,b,w,M,c,d),e=g(w)*x+m,n=v(w)*_+y;break;case l.R:i=e=t[f++],s=n=t[f++];var S=t[f++],T=t[f++];o.fromLine(i,s,i+S,s+T,c,d);break;case l.Z:e=i,n=s}r.min(u,u,c),r.max(h,h,d)}return 0===f&&(u[0]=u[1]=h[0]=h[1]=0),new a(u[0],u[1],h[0]-u[0],h[1]-u[1])},rebuildPath:function(t){for(var e,n,i,r,o,a,s=this.data,u=this._ux,h=this._uy,c=this._len,d=0;d<c;){var f=s[d++];switch(1==d&&(i=s[d],r=s[d+1],e=i,n=r),f){case l.M:e=i=s[d++],n=r=s[d++],t.moveTo(i,r);break;case l.L:o=s[d++],a=s[d++],(y(o-i)>u||y(a-r)>h||d===c-1)&&(t.lineTo(o,a),i=o,r=a);break;case l.C:t.bezierCurveTo(s[d++],s[d++],s[d++],s[d++],s[d++],s[d++]),i=s[d-2],r=s[d-1];break;case l.Q:t.quadraticCurveTo(s[d++],s[d++],s[d++],s[d++]),i=s[d-2],r=s[d-1];break;case l.A:var p=s[d++],m=s[d++],x=s[d++],_=s[d++],b=s[d++],w=s[d++],M=s[d++],S=s[d++],T=x>_?x:_,A=x>_?1:x/_,I=x>_?_/x:1,C=Math.abs(x-_)>.001,P=b+w;C?(t.translate(p,m),t.rotate(M),t.scale(A,I),t.arc(0,0,T,b,P,1-S),t.scale(1/A,1/I),t.rotate(-M),t.translate(-p,-m)):t.arc(p,m,T,b,P,1-S),1==d&&(e=g(b)*x+p,n=v(b)*_+m),i=g(P)*x+p,r=v(P)*_+m;break;case l.R:e=i=s[d],n=r=s[d+1],t.rect(s[d++],s[d++],s[d++],s[d++]);break;case l.Z:t.closePath(),i=e,r=n}}}},_.CMD=l,t.exports=_},function(t,e,n){"use strict";function i(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function r(t){var e=i(t);return null!=e&&!c.isArray(p(e))}function o(t,e,n){t=t||[];var i=e.get("coordinateSystem"),o=v[i],a=f.get(i),s=o&&o(t,e,n),m=s&&s.dimensions;m||(m=a&&(a.getDimensionsInfo?a.getDimensionsInfo():a.dimensions.slice())||["x","y"],m=h(m,t,{defaultNames:m.concat(["value"])}));var y=s?s.categoryIndex:-1,x=new u(m,e),_=l(s,t),b={},w=y>=0&&r(t)?function(t,e,n,i){return d.isDataItemOption(t)&&(x.hasItemOption=!0),i===y?n:g(p(t),m[i])}:function(t,e,n,i){var r=p(t),o=g(r&&r[i],m[i]);d.isDataItemOption(t)&&(x.hasItemOption=!0);var a=s&&s.categoryAxesModels;return a&&a[e]&&"string"==typeof o&&(b[e]=b[e]||a[e].getCategories(),o=c.indexOf(b[e],o),o<0&&!isNaN(o)&&(o=+o)),o};return x.hasItemOption=!1,x.initData(t,_,w),x}function a(t){return"category"!==t&&"time"!==t}function s(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function l(t,e){var n,i=[],r=t&&t.dimensions[t.categoryIndex];if(r&&(n=t.categoryAxesModels[r.name]),n){var o=n.getCategories();if(o){var a=e.length;if(c.isArray(e[0])&&e[0].length>1){i=[];for(var s=0;s<a;s++)i[s]=o[e[s][t.categoryIndex||0]]}else i=o.slice(0)}}return i}var u=n(14),h=n(25),c=n(1),d=n(6),f=n(26),p=d.getDataItemValue,g=d.converDataValue,v={cartesian2d:function(t,e,n){var i=c.map(["xAxis","yAxis"],function(t){return n.queryComponents({mainType:t,index:e.get(t+"Index"),id:e.get(t+"Id")})[0]}),r=i[0],o=i[1],l=r.get("type"),u=o.get("type"),d=[{name:"x",type:s(l),stackable:a(l)},{name:"y",type:s(u),stackable:a(u)}],f="category"===l,p="category"===u;h(d,t,{defaultNames:["x","y","z"]});var g={};return f&&(g.x=r),p&&(g.y=o),{dimensions:d,categoryIndex:f?0:p?1:-1,categoryAxesModels:g}},singleAxis:function(t,e,n){var i=n.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0],r=i.get("type"),o="category"===r,l=[{name:"single",type:s(r),stackable:a(r)}];h(l,t);var u={};return o&&(u.single=i),{dimensions:l,categoryIndex:o?0:-1,categoryAxesModels:u}},polar:function(t,e,n){var i=n.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0],r=i.findAxisModel("angleAxis"),o=i.findAxisModel("radiusAxis"),l=o.get("type"),u=r.get("type"),c=[{name:"radius",type:s(l),stackable:a(l)},{name:"angle",type:s(u),stackable:a(u)}],d="category"===u,f="category"===l;h(c,t,{defaultNames:["radius","angle","value"]});var p={};return f&&(p.radius=o),d&&(p.angle=r),{dimensions:c,categoryIndex:d?1:f?0:-1,categoryAxesModels:p}},geo:function(t,e,n){return{dimensions:h([{name:"lng"},{name:"lat"}],t,{defaultNames:["lng","lat","value"]})}}};t.exports=o},function(t,e){"use strict";var n={};t.exports={register:function(t,e){n[t]=e},get:function(t){return n[t]}}},function(t,e,n){function i(){this.group=new a,this.uid=s.getUID("viewChart")}function r(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var n=0;n<t.childCount();n++)r(t.childAt(n),e)}function o(t,e,n){var i=u.queryDataIndex(t,e);null!=i?h.each(u.normalizeToArray(i),function(e){r(t.getItemGraphicEl(e),n)}):t.eachItemGraphicEl(function(t){r(t,n)})}var a=n(36),s=n(49),l=n(15),u=n(6),h=n(1);i.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){o(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){o(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){}};var c=i.prototype;c.updateView=c.updateLayout=c.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},l.enableClassExtend(i,["dispose"]),l.enableClassManagement(i,{registerWhenExtend:!0}),t.exports=i},function(t,e,n){var i=n(1);t.exports=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e,n){for(var r={},o=0;o<t.length;o++){var a=t[o][1];if(!(e&&i.indexOf(e,a)>=0||n&&i.indexOf(n,a)<0)){var s=this.getShallow(a);null!=s&&(r[t[o][0]]=s)}}return r}}},function(t,e,n){"use strict";var i=n(3),r=n(1),o=n(2);n(56),n(116),o.extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new i.Rect({shape:t.coordinateSystem.getRect(),style:r.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),o.registerPreprocessor(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})})},function(t,e,n){function i(t,e){var n=t[1]-t[0],i=e,r=n/i/2;t[0]+=r,t[1]-=r}var r=n(4),o=r.linearMap,a=n(1),s=[0,1],l=function(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1};l.prototype={constructor:l,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){var t=this._extent.slice();return t},getPixelPrecision:function(t){return r.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,r=this.scale;return t=r.normalize(t),this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count())),o(t,s,n,e)},coordToData:function(t,e){var n=this._extent,r=this.scale;this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count()));var a=o(t,n,s,e);return this.scale.scale(a)},pointToData:function(t,e){},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),n=[],i=0;i<e.length;i++)n.push(e[i][0]);return e[i-1]&&n.push(e[i-1][1]),n}return a.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return a.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],n=this.scale.count(),i=t[0],r=t[1],o=r-i,a=0;a<n;a++)e.push([o*a/n+i,o*(a+1)/n+i]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n}},t.exports=l},function(t,e,n){function i(t){this._setting=t||{},this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var r=n(15),o=i.prototype;o.parse=function(t){return t},o.getSetting=function(t){return this._setting[t]},o.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},o.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},o.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},o.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},o.unionExtentFromData=function(t,e){this.unionExtent(t.getDataExtent(e,!0))},o.getExtent=function(){return this._extent.slice()},o.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},o.getTicksLabels=function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},o.isBlank=function(){return this._isBlank},o.setBlank=function(t){this._isBlank=t},r.enableClassExtend(i),r.enableClassManagement(i,{registerWhenExtend:!0}),t.exports=i},function(t,e){var n=1;"undefined"!=typeof window&&(n=Math.max(window.devicePixelRatio||1,1));var i={debugMode:0,devicePixelRatio:n};t.exports=i},function(t,e,n){var i=n(1),r=n(65),o=n(11),a=function(t){t=t||{},r.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};a.prototype={constructor:a,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof a&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,r=this._children,o=i.indexOf(r,t);return o<0?this:(r.splice(o,1),t.parent=null,n&&(n.delFromStorage(t),t instanceof a&&t.delChildrenFromStorage(n)),e&&e.refresh(),this)},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;e<n.length;e++)t=n[e],i&&(i.delFromStorage(t),t instanceof a&&t.delChildrenFromStorage(i)),t.parent=null;return n.length=0,this},eachChild:function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},traverse:function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n];t.call(e,i),"group"===i.type&&i.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.addToStorage(n),n instanceof a&&n.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.delFromStorage(n),n instanceof a&&n.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,n=new o(0,0,0,0),i=t||this._children,r=[],a=0;a<i.length;a++){var s=i[a];if(!s.ignore&&!s.invisible){var l=s.getBoundingRect(),u=s.getLocalTransform(r);u?(n.copy(l),n.applyTransform(u),e=e||n.clone(),e.union(n)):(e=e||l.clone(),e.union(l))}}return e||n}},i.inherits(a,r),t.exports=a},function(t,e){var n={},i="\0__throttleOriginMethod",r="\0__throttleRate",o="\0__throttleType";n.throttle=function(t,e,n){function i(){h=(new Date).getTime(),c=null,t.apply(a,s||[])}var r,o,a,s,l,u=0,h=0,c=null;e=e||0;var d=function(){r=(new Date).getTime(),a=this,s=arguments;var t=l||e,d=l||n;l=null,o=r-(d?u:h)-t,clearTimeout(c),d?c=setTimeout(i,t):o>=0?i():c=setTimeout(i,-o),u=r};return d.clear=function(){c&&(clearTimeout(c),c=null)},d.debounceNextCall=function(t){l=t},d},n.createOrUpdate=function(t,e,a,s){var l=t[e];if(l){var u=l[i]||l,h=l[o],c=l[r];if(c!==a||h!==s){if(null==a||!s)return t[e]=u;l=t[e]=n.throttle(u,a,"debounce"===s),l[i]=u,l[o]=s,l[r]=a}return l}},n.clear=function(t,e){var n=t[e];n&&n[i]&&(t[e]=n[i])},t.exports=n},function(t,e,n){function i(t){t=t||{},a.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new o(t.style),this._rect=null,this.__clipPaths=[]}var r=n(1),o=n(72),a=n(65),s=n(86);i.prototype={constructor:i,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return i.contain(n[0],n[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?a.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new o(t),this.dirty(!1),this}},r.inherits(i,a),r.mixin(i,s),t.exports=i},function(t,e){var n=function(t){this.colorStops=t||[]};n.prototype={constructor:n,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=n},function(t,e,n){function i(t){var e={componentType:t.mainType};return e[t.mainType+"Index"]=t.componentIndex,e}function r(t,e,n,i){var r,o,a=f(n-t.rotation),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;return p(a-x/2)?(o=l?"bottom":"top",r="center"):p(a-1.5*x)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*x&&a>x/2?l?"left":"right":l?"right":"left"),{rotation:a,textAlign:r,textVerticalAlign:o}}function o(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function a(t,e){var n=t.get("axisLabel.showMinLabel"),i=t.get("axisLabel.showMaxLabel"),r=e[0],o=e[1],a=e[e.length-1],l=e[e.length-2];n===!1?r.ignore=!0:null!=t.getMin()&&s(r,o)&&(n?o.ignore=!0:r.ignore=!0),i===!1?a.ignore=!0:null!=t.getMax()&&s(l,a)&&(i?l.ignore=!0:a.ignore=!0)}function s(t,e,n){var i=t&&t.getBoundingRect().clone(),r=e&&e.getBoundingRect().clone();if(i&&r){var o=v.identity([]);return v.rotate(o,o,-t.rotation),i.applyTransform(v.mul([],o,t.getLocalTransform())),r.applyTransform(v.mul([],o,e.getLocalTransform())),i.intersect(r)}}var l=n(1),u=n(7),h=n(3),c=n(10),d=n(4),f=d.remRadian,p=d.isRadianAroundZero,g=n(5),v=n(19),m=g.applyTransform,y=l.retrieve,x=Math.PI,_=function(t,e){this.opt=e,this.axisModel=t,l.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new h.Group;var n=new h.Group({position:e.position.slice(),rotation:e.rotation});n.updateTransform(),this._transform=n.transform,this._dumbGroup=n};_.prototype={constructor:_,hasBuilder:function(t){return!!b[t]},add:function(t){b[t].call(this)},getGroup:function(){return this.group}};var b={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var n=this.axisModel.axis.getExtent(),i=this._transform,r=[n[0],0],o=[n[1],0];i&&(m(r,r,i),m(o,o,i)),this.group.add(new h.Line(h.subPixelOptimizeLine({anid:"line",shape:{x1:r[0],y1:r[1],x2:o[0],y2:o[1]},style:l.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})))}},axisTick:function(){var t=this.axisModel,e=t.axis;if(t.get("axisTick.show")&&!e.scale.isBlank())for(var n=t.getModel("axisTick"),i=this.opt,r=n.getModel("lineStyle"),o=n.get("length"),a=S(n,i.labelInterval),s=e.getTicksCoords(n.get("alignWithLabel")),u=e.scale.getTicks(),c=[],d=[],f=this._transform,p=0;p<s.length;p++)if(!M(e,p,a)){var g=s[p];c[0]=g,c[1]=0,d[0]=g,d[1]=i.tickDirection*o,f&&(m(c,c,f),m(d,d,f)),this.group.add(new h.Line(h.subPixelOptimizeLine({anid:"tick_"+u[p],shape:{x1:c[0],y1:c[1],x2:d[0],y2:d[1]},style:l.defaults(r.getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")}),z2:2,silent:!0})))}},axisLabel:function(){var t=this.opt,e=this.axisModel,n=e.axis,r=y(t.axisLabelShow,e.get("axisLabel.show"));if(r&&!n.scale.isBlank()){var s=e.getModel("axisLabel"),u=s.getModel("textStyle"),d=s.get("margin"),f=n.scale.getTicks(),p=e.getFormattedLabels(),g=(y(t.labelRotate,s.get("rotate"))||0)*x/180,v=w(t.rotation,g,t.labelDirection),m=e.get("data"),_=[],b=o(e),S=e.get("triggerEvent");l.each(f,function(r,o){if(!M(n,o,t.labelInterval)){var a=u;m&&m[r]&&m[r].textStyle&&(a=new c(m[r].textStyle,u,e.ecModel));var s=a.getTextColor()||e.get("axisLine.lineStyle.color"),l=n.dataToCoord(r),f=[l,t.labelOffset+t.labelDirection*d],g=n.scale.getLabel(r),y=new h.Text({anid:"label_"+r,style:{text:p[o],textAlign:a.get("align",!0)||v.textAlign,textVerticalAlign:a.get("baseline",!0)||v.textVerticalAlign,textFont:a.getFont(),fill:"function"==typeof s?s("category"===n.type?g:"value"===n.type?r+"":r,o):s},position:f,rotation:v.rotation,silent:b,z2:10});S&&(y.eventData=i(e),y.eventData.targetType="axisLabel",y.eventData.value=g),this._dumbGroup.add(y),y.updateTransform(),_.push(y),this.group.add(y),y.decomposeTransform()}},this),a(e,_)}},axisName:function(){var t=this.opt,e=this.axisModel,n=y(t.axisName,e.get("name"));if(n){var a,s=e.get("nameLocation"),c=t.nameDirection,d=e.getModel("nameTextStyle"),f=e.get("nameGap")||0,p=this.axisModel.axis.getExtent(),g=p[0]>p[1]?-1:1,v=["start"===s?p[0]-g*f:"end"===s?p[1]+g*f:(p[0]+p[1])/2,"middle"===s?t.labelOffset+c*f:0],m=e.get("nameRotate");null!=m&&(m=m*x/180);var _;"middle"===s?a=w(t.rotation,null!=m?m:t.rotation,c):(a=r(t,s,m||0,p),_=t.axisNameAvailableWidth,null!=_&&(_=Math.abs(_/Math.sin(a.rotation)),!isFinite(_)&&(_=null)));var b=d.getFont(),M=e.get("nameTruncate",!0)||{},S=M.ellipsis,T=y(t.nameTruncateMaxWidth,M.maxWidth,_),A=null!=S&&null!=T?u.truncateText(n,T,b,S,{minChar:2,placeholder:M.placeholder}):n,I=e.get("tooltip",!0),C=e.mainType,P={componentType:C,name:n,$vars:["name"]};P[C+"Index"]=e.componentIndex;var k=new h.Text({anid:"name",__fullText:n,__truncatedText:A,style:{text:A,textFont:b,fill:d.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:a.textAlign,textVerticalAlign:a.textVerticalAlign},position:v,rotation:a.rotation,silent:o(e),z2:1,tooltip:I&&I.show?l.extend({content:n,formatter:function(){return n},formatterParams:P},I):null});e.get("triggerEvent")&&(k.eventData=i(e),k.eventData.targetType="axisName",k.eventData.name=n),this._dumbGroup.add(k),k.updateTransform(),this.group.add(k),k.decomposeTransform()}}},w=_.innerTextLayout=function(t,e,n){var i,r,o=f(e-t);return p(o)?(r=n>0?"top":"bottom",i="center"):p(o-x)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o<x?n>0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},M=_.ifIgnoreOnTick=function(t,e,n){var i,r=t.scale;return"ordinal"===r.type&&("function"==typeof n?(i=r.getTicks()[e],!n(i,r.getLabel(i))):e%(n+1))},S=_.getInterval=function(t,e){var n=t.get("interval");return null!=n&&"auto"!=n||(n=e),n};t.exports=_},function(t,e,n){function i(t,e,n,i,s,l){var u=a.getAxisPointerClass(t.axisPointerClass);if(u){var h=o.getAxisPointerModel(e);h?(t._axisPointer||(t._axisPointer=new u)).render(e,h,i,l):r(t,i)}}function r(t,e,n){var i=t._axisPointer;i&&i.dispose(e,n),t._axisPointer=null}var o=n(45),a=n(2).extendComponentView({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,n,r){this.axisPointerClass&&o.fixValue(t),a.superApply(this,"render",arguments),i(this,t,e,n,r,!0)},updateAxisPointer:function(t,e,n,r,o){i(this,t,e,n,r,!1)},remove:function(t,e){var n=this._axisPointer;n&&n.remove(e),a.superApply(this,"remove",arguments)},dispose:function(t,e){r(this,e),a.superApply(this,"dispose",arguments)}}),s=[];a.registerAxisPointerClass=function(t,e){s[t]=e},a.getAxisPointerClass=function(t){return t&&s[t]},t.exports=a},function(t,e,n){function i(t){return r.isObject(t)&&null!=t.value?t.value:t}var r=n(1),o=n(17);t.exports={getFormattedLabels:function(){return o.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))},getCategories:function(){return"category"===this.get("type")&&r.map(this.get("data"),i)},getMin:function(t){var e=this.option,n=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=n&&"dataMin"!==n&&!r.eqNaN(n)&&(n=this.axis.scale.parse(n)),n},getMax:function(t){var e=this.option,n=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=n&&"dataMax"!==n&&!r.eqNaN(n)&&(n=this.axis.scale.parse(n)),n},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:r.noop,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}}},function(t,e,n){var i=n(4),r=n(7),o=n(34),a=n(63),s=i.round,l=o.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e));
-},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),l.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval||this.niceTicks(),this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){return this._interval||this.niceTicks(),a.intervalScaleGetTicks(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},getLabel:function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=i.getPrecisionSafe(t)||0:"auto"===n&&(n=this._intervalPrecision),t=s(t,n,!0),r.addCommas(t)},niceTicks:function(t){t=t||5;var e=this._extent,n=e[1]-e[0];if(isFinite(n)){n<0&&(n=-n,e.reverse());var i=a.intervalScaleNiceTicks(e,t);this._intervalPrecision=i.intervalPrecision,this._interval=i.interval,this._niceExtent=i.niceTickExtent}},niceExtent:function(t,e,n){var i=this._extent;if(i[0]===i[1])if(0!==i[0]){var r=i[0];n?i[0]-=r/2:(i[1]+=r/2,i[0]-=r/2)}else i[1]=1;var o=i[1]-i[0];isFinite(o)||(i[0]=0,i[1]=1),this.niceTicks(t);var a=this._interval;e||(i[0]=s(Math.floor(i[0]/a)*a)),n||(i[1]=s(Math.ceil(i[1]/a)*a))}});l.create=function(){return new l},t.exports=l},function(t,e,n){function i(t){this.group=new o.Group,this._symbolCtor=t||a}function r(t,e,n){var i=t.getItemLayout(e);return i&&!isNaN(i[0])&&!isNaN(i[1])&&!(n&&n(e))&&"none"!==t.getItemVisual(e,"symbol")}var o=n(3),a=n(54),s=i.prototype;s.updateData=function(t,e){var n=this.group,i=t.hostModel,a=this._data,s=this._symbolCtor,l={itemStyle:i.getModel("itemStyle.normal").getItemStyle(["color"]),hoverItemStyle:i.getModel("itemStyle.emphasis").getItemStyle(),symbolRotate:i.get("symbolRotate"),symbolOffset:i.get("symbolOffset"),hoverAnimation:i.get("hoverAnimation"),labelModel:i.getModel("label.normal"),hoverLabelModel:i.getModel("label.emphasis")};t.diff(a).add(function(i){var o=t.getItemLayout(i);if(r(t,i,e)){var a=new s(t,i,l);a.attr("position",o),t.setItemGraphicEl(i,a),n.add(a)}}).update(function(u,h){var c=a.getItemGraphicEl(h),d=t.getItemLayout(u);return r(t,u,e)?(c?(c.updateData(t,u,l),o.updateProps(c,{position:d},i)):(c=new s(t,u),c.attr("position",d)),n.add(c),void t.setItemGraphicEl(u,c)):void n.remove(c)}).remove(function(t){var e=a.getItemGraphicEl(t);e&&e.fadeOut(function(){n.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,n){var i=t.getItemLayout(n);e.attr("position",i)})},s.remove=function(t){var e=this.group,n=this._data;n&&(t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=i},function(t,e,n){function i(t,e,n){var i=e.getComponent("tooltip"),o=e.getComponent("axisPointer"),s=o.get("link",!0)||[],u=[];c(n.getCoordinateSystems(),function(n){function h(i,h,c){var d=c.model.getModel("axisPointer",o),f=d.get("show");if(f&&("auto"!==f||i||l(d))){null==h&&(h=d.get("triggerTooltip")),d=i?r(c,m,o,e,i,h):d;var v=d.get("snap"),y=p(c.model),x=h||v||"category"===c.type,_=t.axesInfo[y]={key:y,axis:c,coordSys:n,axisPointerModel:d,triggerTooltip:h,involveSeries:x,snap:v,useHandle:l(d),seriesModels:[]};g[y]=_,t.seriesInvolved|=x;var b=a(s,c);if(null!=b){var w=u[b]||(u[b]={axesInfo:{}});w.axesInfo[y]=_,w.mapper=s[b].mapper,_.linkGroup=w}}}if(n.axisPointerEnabled){var f=p(n.model),g=t.coordSysAxesInfo[f]={};t.coordSysMap[f]=n;var v=n.model,m=v.getModel("tooltip",i);if(c(n.getAxes(),d(h,!1,null)),n.getTooltipAxes&&i&&m.get("show")){var y="axis"===m.get("trigger"),x="cross"===m.get("axisPointer.type"),_=n.getTooltipAxes(m.get("axisPointer.axis"));(y||x)&&c(_.baseAxes,d(h,!x||"cross",y)),x&&c(_.otherAxes,d(h,"cross",!1))}}})}function r(t,e,n,i,r,o){var a=e.getModel("axisPointer"),s={};c(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(t){s[t]=u.clone(a.get(t))}),s.snap="category"!==t.type&&!!o,"cross"===a.get("type")&&(s.type="line");var l=s.label||(s.label={});if(null==l.show&&(l.show=!1),"cross"===r&&(l.show=!0,!o)){var d=s.lineStyle=a.get("crossStyle");d&&u.defaults(l.textStyle||(l.textStyle={}),d.textStyle)}return t.model.getModel("axisPointer",new h(s,n,i))}function o(t,e){e.eachSeries(function(e){var n=e.coordinateSystem,i=e.get("tooltip.trigger",!0);n&&"none"!==i&&i!==!1&&"item"!==i&&e.get("axisPointer.show",!0)!==!1&&c(t.coordSysAxesInfo[p(n.model)],function(t){var i=t.axis;n.getAxis(i.dim)===i&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())})},this)}function a(t,e){for(var n=e.model,i=e.dim,r=0;r<t.length;r++){var o=t[r]||{};if(s(o[i+"AxisId"],n.id)||s(o[i+"AxisIndex"],n.componentIndex)||s(o[i+"AxisName"],n.name))return r}}function s(t,e){return"all"===t||u.isArray(t)&&u.indexOf(t,e)>=0||t===e}function l(t){return!!t.get("handle.show")}var u=n(1),h=n(10),c=u.each,d=u.curry,f={};f.collect=function(t,e){var n={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return i(n,t,e),n.seriesInvolved&&o(n,t),n},f.fixValue=function(t){var e=f.getAxisInfo(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=l(n);null==o&&(r.status=s?"show":"hide");var u=i.getExtent().slice();u[0]>u[1]&&u.reverse(),(null==a||a>u[1])&&(a=u[1]),a<u[0]&&(a=u[0]),r.value=a,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}},f.getAxisInfo=function(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[p(t)]},f.getAxisPointerModel=function(t){var e=f.getAxisInfo(t);return e&&e.axisPointerModel};var p=f.makeKey=function(t){return t.type+"||"+t.id};t.exports=f},function(t,e,n){function i(t){var e={};return c(["start","end","startValue","endValue","throttle"],function(n){t.hasOwnProperty(n)&&(e[n]=t[n])}),e}function r(t,e){c([["start","startValue"],["end","endValue"]],function(n,i){var r=t._rangePropMode;null!=e[n[0]]?r[i]="percent":null!=e[n[1]]&&(r[i]="value")})}var o=n(1),a=n(9),s=n(2),l=n(6),u=n(76),h=n(198),c=o.each,d=u.eachAxisDim,f=s.extendComponentModel({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null},init:function(t,e,n){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var r=i(t);this.mergeDefaultAndTheme(t,n),this.doInit(r)},mergeOption:function(t){var e=i(t);o.merge(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;a.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),r(this,t),c([["start","startValue"],["end","endValue"]],function(t,n){"value"===this._rangePropMode[n]&&(e[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,n,i,r){var o=this.dependentModels[e.axis][n],a=o.__dzAxisProxy||(o.__dzAxisProxy=new h(e.name,n,this,r));t[e.name+"_"+n]=a},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();d(function(e){var n=e.axisIndex;t[n]=l.normalizeToArray(t[n])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;d(function(n){null!=t[n.axisIndex]&&(e=!0)},this);var n=t.orient;return null==n&&e?"orient":e?void 0:(null==n&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),n=this.option,i=this.dependentModels;if(t){var r="vertical"===e?"y":"x";i[r+"Axis"].length?(n[r+"AxisIndex"]=[0],t=!1):c(i.singleAxis,function(i){t&&i.get("orient",!0)===e&&(n.singleAxisIndex=[i.componentIndex],t=!1)})}t&&d(function(e){if(t){var i=[],r=this.dependentModels[e.axis];if(r.length&&!i.length)for(var o=0,a=r.length;o<a;o++)"category"===r[o].get("type")&&i.push(o);n[e.axisIndex]=i,i.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&d(function(e){var i=n[e.axisIndex],r=t.get(e.axisIndex),a=t.get(e.axisId),s=t.ecModel.queryComponents({mainType:e.axis,index:r,id:a})[0];r=s.componentIndex,o.indexOf(i,r)<0&&i.push(r)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var n=!0;return d(function(i){var r=t.get(i.axisIndex),o=this.dependentModels[i.axis][r];o&&o.get("type")===e||(n=!1)},this),n},_setDefaultThrottle:function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var t;return d(function(e){if(null==t){var n=this.get(e.axisIndex);n.length&&(t=this.dependentModels[e.axis][n[0]])}},this),t},eachTargetAxis:function(t,e){var n=this.ecModel;d(function(i){c(this.get(i.axisIndex),function(r){t.call(e,i,r,this,n)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},getAxisModel:function(t,e){var n=this.getAxisProxy(t,e);return n&&n.getAxisModel()},setRawRange:function(t,e){c(["start","end","startValue","endValue"],function(e){this.option[e]=t[e]},this),!e&&r(this,t)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(){var t=this._axisProxies;for(var e in t)if(t.hasOwnProperty(e)&&t[e].hostedBy(this))return t[e];for(var e in t)if(t.hasOwnProperty(e)&&!t[e].hostedBy(this))return t[e]},getRangePropMode:function(){return this._rangePropMode.slice()}});t.exports=f},function(t,e,n){var i=n(64);t.exports=i.extend({type:"dataZoom",render:function(t,e,n,i){this.dataZoomModel=t,this.ecModel=e,this.api=n},getTargetCoordInfo:function(){function t(t,e,n,i){for(var r,o=0;o<n.length;o++)if(n[o].model===t){r=n[o];break}r||n.push(r={model:t,axisModels:[],coordIndex:i}),r.axisModels.push(e)}var e=this.dataZoomModel,n=this.ecModel,i={};return e.eachTargetAxis(function(e,r){var o=n.getComponent(e.axis,r);if(o){var a=o.getCoordSysModel();a&&t(a,o,i[a.mainType]||(i[a.mainType]=[]),a.componentIndex)}},this),i}})},function(t,e){"use strict";function n(t){return t}function i(t,e,i,r){this._old=t,this._new=e,this._oldKeyGetter=i||n,this._newKeyGetter=r||n}function r(t,e,n,i){for(var r=0;r<t.length;r++){var o=i(t[r],r),a=e[o];null==a?(n.push(o),e[o]=r):(a.length||(e[o]=a=[a]),a.push(r))}}i.prototype={constructor:i,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,n=this._new,i=this._oldKeyGetter,o=this._newKeyGetter,a={},s={},l=[],u=[];for(r(e,a,l,i),r(n,s,u,o),t=0;t<e.length;t++){var h=l[t],c=s[h];if(null!=c){var d=c.length;d?(1===d&&(s[h]=null),c=c.unshift()):s[h]=null,this._update&&this._update(c,t)}else this._remove&&this._remove(t)}for(var t=0;t<u.length;t++){var h=u[t];if(s.hasOwnProperty(h)){var c=s[h];if(null==c)continue;if(c.length)for(var f=0,d=c.length;f<d;f++)this._add&&this._add(c[f]);else this._add&&this._add(c)}}}},t.exports=i},function(t,e,n){var i=n(1),r=n(15),o=r.parseClassType,a=0,s={},l="_";s.getUID=function(t){return[t||"",a++,Math.random()].join(l)},s.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,n){t=o(t),e[t.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var a=o(n).main;t.hasSubTypes(n)&&e[a]&&(r=e[a](i))}return r},t},s.enableTopologicalTravel=function(t,e){function n(t){var n={},a=[];return i.each(t,function(s){var l=r(n,s),u=l.originalDeps=e(s),h=o(u,t);l.entryCount=h.length,0===l.entryCount&&a.push(s),i.each(h,function(t){i.indexOf(l.predecessor,t)<0&&l.predecessor.push(t);var e=r(n,t);i.indexOf(e.successor,t)<0&&e.successor.push(s)})}),{graph:n,noEntryList:a}}function r(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function o(t,e){var n=[];return i.each(t,function(t){i.indexOf(e,t)>=0&&n.push(t)}),n}t.topologicalTravel=function(t,e,r,o){function a(t){u[t].entryCount--,0===u[t].entryCount&&h.push(t)}function s(t){c[t]=!0,a(t)}if(t.length){var l=n(e),u=l.graph,h=l.noEntryList,c={};for(i.each(t,function(t){c[t]=!0});h.length;){var d=h.pop(),f=u[d],p=!!c[d];p&&(r.call(o,d,f.originalDeps.slice()),delete c[d]),i.each(f.successor,p?s:a)}i.each(c,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){t.exports=function(t,e,n,i,r){i.eachRawSeriesByType(t,function(t){var r=t.getData(),o=t.get("symbol")||e,a=t.get("symbolSize");r.setVisual({legendSymbol:n||o,symbol:o,symbolSize:a}),i.isSeriesFiltered(t)||("function"==typeof a&&r.each(function(e){var n=t.getRawValue(e),i=t.getDataParams(e);r.setItemVisual(e,"symbolSize",a(n,i))}),r.each(function(t){var e=r.getItemModel(t),n=e.getShallow("symbol",!0),i=e.getShallow("symbolSize",!0);null!=n&&r.setItemVisual(t,"symbol",n),null!=i&&r.setItemVisual(t,"symbolSize",i)}))})}},function(t,e){function n(t){for(var e=0;t>=h;)e|=1&t,t>>=1;return t+e}function i(t,e,n,i){var o=e+1;if(o===n)return 1;if(i(t[o++],t[e])<0){for(;o<n&&i(t[o],t[o-1])<0;)o++;r(t,e,o)}else for(;o<n&&i(t[o],t[o-1])>=0;)o++;return o-e}function r(t,e,n){for(n--;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}function o(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var o,a=t[i],s=e,l=i;s<l;)o=s+l>>>1,r(a,t[o])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function a(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l<s&&o(t,e[n+r+l])>0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;l<s&&o(t,e[n+r-l])<=0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function s(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;l<s&&o(t,e[n+r-l])<0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l<s&&o(t,e[n+r+l])>=0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function l(t,e){function n(t,e){h[y]=t,f[y]=e,y+=1}function i(){for(;y>1;){var t=y-2;if(t>=1&&f[t-1]<=f[t]+f[t+1]||t>=2&&f[t-2]<=f[t]+f[t-1])f[t-1]<f[t+1]&&t--;else if(f[t]>f[t+1])break;o(t)}}function r(){for(;y>1;){var t=y-2;t>0&&f[t-1]<f[t+1]&&t--,o(t)}}function o(n){var i=h[n],r=f[n],o=h[n+1],c=f[n+1];f[n]=r+c,n===y-3&&(h[n+1]=h[n+2],f[n+1]=f[n+2]),y--;var d=s(t[o],t,i,r,0,e);i+=d,r-=d,0!==r&&(c=a(t[i+r-1],t,o,c,c-1,e),0!==c&&(r<=c?l(i,r,o,c):u(i,r,o,c)))}function l(n,i,r,o){var l=0;for(l=0;l<i;l++)x[l]=t[n+l];var u=0,h=r,d=n;if(t[d++]=t[h++],0!==--o){if(1===i){for(l=0;l<o;l++)t[d+l]=t[h+l];return void(t[d+o]=x[u])}for(var f,g,v,m=p;;){f=0,g=0,v=!1;do if(e(t[h],x[u])<0){if(t[d++]=t[h++],g++,f=0,0===--o){v=!0;break}}else if(t[d++]=x[u++],f++,g=0,1===--i){v=!0;break}while((f|g)<m);if(v)break;do{if(f=s(t[h],x,u,i,0,e),0!==f){for(l=0;l<f;l++)t[d+l]=x[u+l];if(d+=f,u+=f,i-=f,i<=1){v=!0;break}}if(t[d++]=t[h++],0===--o){v=!0;break}if(g=a(x[u],t,h,o,0,e),0!==g){for(l=0;l<g;l++)t[d+l]=t[h+l];if(d+=g,h+=g,o-=g,0===o){v=!0;break}}if(t[d++]=x[u++],1===--i){v=!0;break}m--}while(f>=c||g>=c);if(v)break;m<0&&(m=0),m+=2}if(p=m,p<1&&(p=1),1===i){for(l=0;l<o;l++)t[d+l]=t[h+l];t[d+o]=x[u]}else{if(0===i)throw new Error;for(l=0;l<i;l++)t[d+l]=x[u+l]}}else for(l=0;l<i;l++)t[d+l]=x[u+l]}function u(n,i,r,o){var l=0;for(l=0;l<o;l++)x[l]=t[r+l];var u=n+i-1,h=o-1,d=r+o-1,f=0,g=0;if(t[d--]=t[u--],0!==--i){if(1===o){for(d-=i,u-=i,g=d+1,f=u+1,l=i-1;l>=0;l--)t[g+l]=t[f+l];return void(t[d]=x[h])}for(var v=p;;){var m=0,y=0,_=!1;do if(e(x[h],t[u])<0){if(t[d--]=t[u--],m++,y=0,0===--i){_=!0;break}}else if(t[d--]=x[h--],y++,m=0,1===--o){_=!0;break}while((m|y)<v);if(_)break;do{if(m=i-s(x[h],t,n,i,i-1,e),0!==m){for(d-=m,u-=m,i-=m,g=d+1,f=u+1,l=m-1;l>=0;l--)t[g+l]=t[f+l];if(0===i){_=!0;break}}if(t[d--]=x[h--],1===--o){_=!0;break}if(y=o-a(t[u],x,0,o,o-1,e),0!==y){for(d-=y,h-=y,o-=y,g=d+1,f=h+1,l=0;l<y;l++)t[g+l]=x[f+l];if(o<=1){_=!0;break}}if(t[d--]=t[u--],0===--i){_=!0;break}v--}while(m>=c||y>=c);if(_)break;v<0&&(v=0),v+=2}if(p=v,p<1&&(p=1),1===o){for(d-=i,u-=i,g=d+1,f=u+1,l=i-1;l>=0;l--)t[g+l]=t[f+l];t[d]=x[h]}else{if(0===o)throw new Error;for(f=d-(o-1),l=0;l<o;l++)t[f+l]=x[l]}}else for(f=d-(o-1),l=0;l<o;l++)t[f+l]=x[l]}var h,f,p=c,g=0,v=d,m=0,y=0;g=t.length,g<2*d&&(v=g>>>1);var x=[];m=g<120?5:g<1542?10:g<119151?19:40,h=[],f=[],this.mergeRuns=i,this.forceMergeRuns=r,this.pushRun=n}function u(t,e,r,a){r||(r=0),a||(a=t.length);var s=a-r;if(!(s<2)){var u=0;if(s<h)return u=i(t,r,a,e),void o(t,r,a,r+u,e);var c=new l(t,e),d=n(s);do{if(u=i(t,r,a,e),u<d){var f=s;f>d&&(f=d),o(t,r,r+f,r+u,e),u=f}c.pushRun(r,u),c.mergeRuns(),s-=u,r+=u}while(0!==s);c.forceMergeRuns()}}var h=32,c=7,d=256;t.exports=u},function(t,e,n){var i=n(35);t.exports=function(){if(0!==i.debugMode)if(1==i.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(i.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,n){function i(t){r.call(this,t)}var r=n(38),o=n(11),a=n(1),s=n(69),l=new s(50);i.prototype={constructor:i,type:"image",brush:function(t,e){var n,i=this.style,r=i.image;if(i.bind(t,this,e),n="string"==typeof r?this._image:r,!n&&r){var o=l.get(r);if(!o)return n=new Image,n.onload=function(){n.onload=null;for(var t=0;t<o.pending.length;t++)o.pending[t].dirty()},o={image:n,pending:[this]},n.src=r,l.put(r,o),void(this._image=n);if(n=o.image,this._image=n,!n.width||!n.height)return void o.pending.push(this)}if(n){var a=i.x||0,s=i.y||0;if(!n.width||!n.height)return;var u=i.width,h=i.height,c=n.width/n.height;if(null==u&&null!=h?u=h*c:null==h&&null!=u?h=u/c:null==u&&null==h&&(u=n.width,h=n.height),this.setTransform(t),i.sWidth&&i.sHeight){var d=i.sx||0,f=i.sy||0;t.drawImage(n,d,f,i.sWidth,i.sHeight,a,s,u,h)}else if(i.sx&&i.sy){var d=i.sx,f=i.sy,p=u-d,g=h-f;t.drawImage(n,d,f,p,g,a,s,u,h)}else t.drawImage(n,a,s,u,h);this.restoreTransform(t),null!=i.text&&this.drawRectText(t,this.getBoundingRect())}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new o(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},a.inherits(i,r),t.exports=i},function(t,e,n){function i(t,e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array?n.slice():[+n,+n]}function r(t){return[t[0]/2,t[1]/2]}function o(t,e,n){u.Group.call(this),this.updateData(t,e,n)}function a(t,e){this.parent.drift(t,e)}var s=n(1),l=n(24),u=n(3),h=n(4),c=o.prototype;c._createSymbol=function(t,e,n,i){this.removeAll();var o=e.hostModel,s=e.getItemVisual(n,"color"),h=l.createSymbol(t,-1,-1,2,2,s);h.attr({z2:100,culling:!0,scale:[0,0]}),h.drift=a,u.initProps(h,{scale:r(i)},o,n),this._symbolType=t,this.add(h)},c.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},c.getSymbolPath=function(){return this.childAt(0)},c.getScale=function(){return this.childAt(0).scale},c.highlight=function(){this.childAt(0).trigger("emphasis")},c.downplay=function(){this.childAt(0).trigger("normal")},c.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},c.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},c.updateData=function(t,e,n){this.silent=!1;var o=t.getItemVisual(e,"symbol")||"circle",a=t.hostModel,s=i(t,e);if(o!==this._symbolType)this._createSymbol(o,t,e,s);else{var l=this.childAt(0);l.silent=!1,u.updateProps(l,{scale:r(s)},a,e)}this._updateCommon(t,e,s,n),this._seriesModel=a};var d=["itemStyle","normal"],f=["itemStyle","emphasis"],p=["label","normal"],g=["label","emphasis"];c._updateCommon=function(t,e,n,i){var o=this.childAt(0),a=t.hostModel,l=t.getItemVisual(e,"color");"image"!==o.type&&o.useStyle({strokeNoScale:!0}),i=i||null;var c=i&&i.itemStyle,v=i&&i.hoverItemStyle,m=i&&i.symbolRotate,y=i&&i.symbolOffset,x=i&&i.labelModel,_=i&&i.hoverLabelModel,b=i&&i.hoverAnimation;if(!i||t.hasItemOption){var w=t.getItemModel(e);c=w.getModel(d).getItemStyle(["color"]),v=w.getModel(f).getItemStyle(),m=w.getShallow("symbolRotate"),y=w.getShallow("symbolOffset"),x=w.getModel(p),_=w.getModel(g),b=w.getShallow("hoverAnimation")}else v=s.extend({},v);var M=o.style;o.attr("rotation",(m||0)*Math.PI/180||0),y&&o.attr("position",[h.parsePercent(y[0],n[0]),h.parsePercent(y[1],n[1])]),o.setColor(l),o.setStyle(c);var S=t.getItemVisual(e,"opacity");null!=S&&(M.opacity=S);for(var T,A,I=t.dimensions.slice();I.length&&(T=I.pop(),A=t.getDimensionInfo(T).type,"ordinal"===A||"time"===A););null!=T&&x.getShallow("show")?(u.setText(M,x,l),M.text=s.retrieve(a.getFormattedLabel(e,"normal"),t.get(T,e))):M.text="",null!=T&&_.getShallow("show")?(u.setText(v,_,l),v.text=s.retrieve(a.getFormattedLabel(e,"emphasis"),t.get(T,e))):v.text="",o.off("mouseover").off("mouseout").off("emphasis").off("normal"),o.hoverStyle=v,u.setHoverStyle(o);var C=r(n);if(b&&a.isAnimationEnabled()){var P=function(){var t=C[1]/C[0];this.animateTo({scale:[Math.max(1.1*C[0],C[0]+3),Math.max(1.1*C[1],C[1]+3*t)]},400,"elasticOut")},k=function(){this.animateTo({scale:C},400,"elasticOut")};o.on("mouseover",P).on("mouseout",k).on("emphasis",P).on("normal",k)}},c.fadeOut=function(t){var e=this.childAt(0);this.silent=e.silent=!0,e.style.text="",u.updateProps(e,{scale:[0,0]},this._seriesModel,this.dataIndex,t)},s.inherits(o,u.Group),t.exports=o},function(t,e,n){var i=n(2),r=n(45),o=n(196),a=n(1);n(194),n(195),n(119),i.registerPreprocessor(function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!a.isArray(e)&&(t.axisPointer.link=[e])}}),i.registerProcessor(i.PRIORITY.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=r.collect(t,e)}),i.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,n){var i=o(e.getComponent("axisPointer").coordSysAxesInfo,t.currTrigger,[t.x,t.y],t,t.dispatchAction||a.bind(n.dispatchAction,n),e,n,t.tooltipOption,t.highDownKey);return i})},function(t,e,n){function i(t,e,n){return t.getCoordSysModel()===e}function r(t){var e,n=t.model,i=n.getFormattedLabels(),r=n.getModel("axisLabel.textStyle"),o=1,a=i.length;a>40&&(o=Math.ceil(a/40));for(var s=0;s<a;s+=o)if(!t.isLabelIgnored(s)){var l=r.getTextRect(i[s]);e?e.union(l):e=l}return e}function o(t,e,n){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,n),this.model=t}function a(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}function s(t,e){return c.map(y,function(e){var n=t.getReferringComponents(e)[0];return n})}function l(t){return"cartesian2d"===t.get("coordinateSystem")}var u=n(12),h=n(17),c=n(1),d=n(132),f=n(130),p=c.each,g=h.ifAxisCrossZero,v=h.niceScaleExtent;n(133);var m=o.prototype;m.type="grid",m.axisPointerEnabled=!0,m.getRect=function(){return this._rect},m.update=function(t,e){function n(t){var e=i[t];for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(r&&("category"===r.type||!g(r)))return!0}return!1}var i=this._axesMap;this._updateScale(t,this.model),p(i.x,function(t){v(t.scale,t.model)}),p(i.y,function(t){v(t.scale,t.model)}),p(i.x,function(t){n("y")&&(t.onZero=!1)}),p(i.y,function(t){n("x")&&(t.onZero=!1)}),this.resize(this.model,e)},m.resize=function(t,e){function n(){p(o,function(t){var e=t.isHorizontal(),n=e?[0,i.width]:[0,i.height],r=t.inverse?1:0;t.setExtent(n[r],n[1-r]),a(t,e?i.x:i.y)})}var i=u.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=i;var o=this._axesList;n(),t.get("containLabel")&&(p(o,function(t){if(!t.model.get("axisLabel.inside")){var e=r(t);if(e){var n=t.isHorizontal()?"height":"width",o=t.model.get("axisLabel.margin");i[n]-=e[n]+o,"top"===t.position?i.y+=e.height+o:"left"===t.position&&(i.x+=e.width+o)}}}),n())},m.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)if(n.hasOwnProperty(i))return n[i];return n[e]}},m.getAxes=function(){return this._axesList.slice()},m.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}c.isObject(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},m.getCartesians=function(){return this._coordsList.slice()},m.convertToPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},m.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},m._findConvertTarget=function(t,e){var n,i,r=e.seriesModel,o=e.xAxisModel||r&&r.getReferringComponents("xAxis")[0],a=e.yAxisModel||r&&r.getReferringComponents("yAxis")[0],s=e.gridModel,l=this._coordsList;if(r)n=r.coordinateSystem,c.indexOf(l,n)<0&&(n=null);else if(o&&a)n=this.getCartesian(o.componentIndex,a.componentIndex);else if(o)i=this.getAxis("x",o.componentIndex);else if(a)i=this.getAxis("y",a.componentIndex);else if(s){var u=s.coordinateSystem;u===this&&(n=this._coordsList[0])}return{cartesian:n,axis:i}},m.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},m._initCartesian=function(t,e,n){function r(n){return function(r,l){if(i(r,t,e)){var u=r.get("position");"x"===n?"top"!==u&&"bottom"!==u&&(u="bottom",o[u]&&(u="top"===u?"bottom":"top")):"left"!==u&&"right"!==u&&(u="left",o[u]&&(u="left"===u?"right":"left")),o[u]=!0;var c=new f(n,h.createScaleByModel(r),[0,0],r.get("type"),u),d="category"===c.type;c.onBand=d&&r.get("boundaryGap"),c.inverse=r.get("inverse"),c.onZero=r.get("axisLine.onZero"),r.axis=c,c.model=r,c.grid=this,c.index=l,this._axesList.push(c),a[n][l]=c,s[n]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},a={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",r("x"),this),e.eachComponent("yAxis",r("y"),this),s.x&&s.y?(this._axesMap=a,void p(a.x,function(e,n){p(a.y,function(i,r){var o="x"+n+"y"+r,a=new d(o);a.grid=this,a.model=t,this._coordsMap[o]=a,this._coordsList.push(a),a.addAxis(e),a.addAxis(i)},this)},this)):(this._axesMap={},void(this._axesList=[]))},m._updateScale=function(t,e){function n(t,e,n){p(n.coordDimToDataDim(e.dim),function(n){e.scale.unionExtentFromData(t,n)})}c.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(r){if(l(r)){var o=s(r,t),a=o[0],u=o[1];if(!i(a,e,t)||!i(u,e,t))return;var h=this.getCartesian(a.componentIndex,u.componentIndex),c=r.getData(),d=h.getAxis("x"),f=h.getAxis("y");"list"===c.type&&(n(c,d,r),n(c,f,r))}},this)},m.getTooltipAxes=function(t){var e=[],n=[];return p(this.getCartesians(),function(i){var r=null!=t&&"auto"!==t?i.getAxis(t):i.getBaseAxis(),o=i.getOtherAxis(r);c.indexOf(e,r)<0&&e.push(r),c.indexOf(n,o)<0&&n.push(o)}),{baseAxes:e,otherAxes:n}};var y=["xAxis","yAxis"];o.create=function(t,e){var n=[];return t.eachComponent("grid",function(i,r){var a=new o(i,t,e);a.name="grid_"+r,a.resize(i,e),i.coordinateSystem=a,n.push(a)}),t.eachSeries(function(e){if(l(e)){var n=s(e,t),i=n[0],r=n[1],o=i.getCoordSysModel(),a=o.coordinateSystem;e.coordinateSystem=a.getCartesian(i.componentIndex,r.componentIndex)}}),n},o.dimensions=o.prototype.dimensions=d.prototype.dimensions,n(26).register("cartesian2d",o),t.exports=o},function(t,e,n){"use strict";function i(t){return t>s||t<-s}var r=n(19),o=n(5),a=r.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},u=l.prototype;u.transform=null,u.needLocalTransform=function(){return i(this.rotation)||i(this.position[0])||i(this.position[1])||i(this.scale[0]-1)||i(this.scale[1]-1)},u.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;return n||e?(i=i||r.create(),n?this.getLocalTransform(i):a(i),e&&(n?r.mul(i,t.transform,i):r.copy(i,t.transform)),this.transform=i,this.invTransform=this.invTransform||r.create(),void r.invert(this.invTransform,i)):void(i&&a(i))},u.getLocalTransform=function(t){return l.getLocalTransform(this,t)},u.setTransform=function(t){var e=this.transform,n=t.dpr||1;e?t.setTransform(n*e[0],n*e[1],n*e[2],n*e[3],n*e[4],n*e[5]):t.setTransform(n,0,0,n,0,0)},u.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var h=[];u.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(r.mul(h,t.invTransform,e),e=h);var n=e[0]*e[0]+e[1]*e[1],o=e[2]*e[2]+e[3]*e[3],a=this.position,s=this.scale;i(n-1)&&(n=Math.sqrt(n)),i(o-1)&&(o=Math.sqrt(o)),e[0]<0&&(n=-n),e[3]<0&&(o=-o),a[0]=e[4],a[1]=e[5],s[0]=n,s[1]=o,this.rotation=Math.atan2(-e[1]/o,e[0]/n)}},u.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),n=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(n=-n),[e,n]},u.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&o.applyTransform(n,n,i),n},u.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&o.applyTransform(n,n,i),n},l.getLocalTransform=function(t,e){e=e||[],a(e);var n=t.origin,i=t.scale||[1,1],o=t.rotation||0,s=t.position||[0,0];return n&&(e[4]-=n[0],e[5]-=n[1]),r.scale(e,e,i),o&&r.rotate(e,e,o),n&&(e[4]+=n[0],e[5]+=n[1]),e[4]+=s[0],e[5]+=s[1],e},t.exports=l},function(t,e,n){var i=n(94),r=n(1),o=n(13),a=n(12),s=["value","category","time","log"];t.exports=function(t,e,n,l){r.each(s,function(o){e.extend({type:t+"Axis."+o,mergeDefaultAndTheme:function(e,i){var s=this.layoutMode,l=s?a.getLayoutParams(e):{},u=i.getTheme();r.merge(e,u.get(o+"Axis")),r.merge(e,this.getDefaultOption()),e.type=n(t,e),s&&a.mergeLayoutParam(e,l,s)},defaultOption:r.mergeAll([{},i[o+"Axis"],l],!0)})}),o.registerSubTypeDefaulter(t+"Axis",r.curry(n,t))}},function(t,e,n){"use strict";function i(t,e){return e.type||(e.data?"category":"value")}var r=n(13),o=n(1),a=n(58),s=r.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});o.merge(s.prototype,n(42));var l={offset:0};a("x",s,i,l),a("y",s,i,l),t.exports=s},function(t,e){t.exports=function(t,e){e.eachSeriesByType(t,function(t){var e=t.getData(),n=t.coordinateSystem;if(n){var i=n.dimensions;1===i.length?e.each(i[0],function(t,i){e.setItemLayout(i,isNaN(t)?[NaN,NaN]:n.dataToPoint(t))}):2===i.length&&e.each(i,function(t,i,r){e.setItemLayout(r,isNaN(t)||isNaN(i)?[NaN,NaN]:n.dataToPoint([t,i]))},!0)}})}},function(t,e,n){var i=n(15),r=i.set,o=i.get;t.exports={clearColorPalette:function(){r(this,"colorIdx",0),r(this,"colorNameMap",{})},getColorFromPalette:function(t,e){e=e||this;var n=o(e,"colorIdx")||0,i=o(e,"colorNameMap")||r(e,"colorNameMap",{});if(i[t])return i[t];var a=this.get("color",!0)||[];if(a.length){var s=a[n];return t&&(i[t]=s),r(e,"colorIdx",(n+1)%a.length),s}}}},function(t,e){t.exports=function(t,e){var n=e.findComponents({mainType:"legend"});n&&n.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var i=e.getName(t),r=0;r<n.length;r++)if(!n[r].isSelected(i))return!1;
-return!0},this)},this)}},function(t,e,n){function i(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}var r=n(4),o=r.round,a={};a.intervalScaleNiceTicks=function(t,e){var n={},i=t[1]-t[0],s=n.interval=r.nice(i/e,!0),l=n.intervalPrecision=r.getPrecisionSafe(s)+2,u=n.niceTickExtent=[o(Math.ceil(t[0]/s)*s,l),o(Math.floor(t[1]/s)*s,l)];return a.fixExtent(u,t),n},a.fixExtent=function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),i(t,0,e),i(t,1,e),t[0]>t[1]&&(t[0]=t[1])},a.intervalScaleGetTicks=function(t,e,n,i){var r=[];if(!t)return r;var a=1e4;e[0]<n[0]&&r.push(e[0]);for(var s=n[0];s<=n[1]&&(r.push(s),s=o(s+t,i),s!==r[r.length-1]);)if(r.length>a)return[];return e[1]>(r.length?r[r.length-1]:n[1])&&r.push(e[1]),r},t.exports=a},function(t,e,n){var i=n(36),r=n(49),o=n(15),a=function(){this.group=new i,this.uid=r.getUID("viewComponent")};a.prototype={constructor:a,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){}};var s=a.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,n,i){},o.enableClassExtend(a),o.enableClassManagement(a,{registerWhenExtend:!0}),t.exports=a},function(t,e,n){"use strict";var i=n(70),r=n(23),o=n(57),a=n(178),s=n(1),l=function(t){o.call(this,t),r.call(this,t),a.call(this,t),this.id=t.id||i()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;n||(n=this.transform=[1,0,0,1,0,0]),n[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];n||(n=this[t]=[]),n[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},s.mixin(l,a),s.mixin(l,o),s.mixin(l,r),t.exports=l},function(t,e,n){function i(t,e){return t[e]}function r(t,e,n){t[e]=n}function o(t,e,n){return(e-t)*n+t}function a(t,e,n){return n>.5?e:t}function s(t,e,n,i,r){var a=t.length;if(1==r)for(var s=0;s<a;s++)i[s]=o(t[s],e[s],n);else for(var l=t[0].length,s=0;s<a;s++)for(var u=0;u<l;u++)i[s][u]=o(t[s][u],e[s][u],n)}function l(t,e,n){var i=t.length,r=e.length;if(i!==r){var o=i>r;if(o)t.length=r;else for(var a=i;a<r;a++)t.push(1===n?e[a]:x.call(e[a]))}for(var s=t[0]&&t[0].length,a=0;a<t.length;a++)if(1===n)isNaN(t[a])&&(t[a]=e[a]);else for(var l=0;l<s;l++)isNaN(t[a][l])&&(t[a][l]=e[a][l])}function u(t,e,n){if(t===e)return!0;var i=t.length;if(i!==e.length)return!1;if(1===n){for(var r=0;r<i;r++)if(t[r]!==e[r])return!1}else for(var o=t[0].length,r=0;r<i;r++)for(var a=0;a<o;a++)if(t[r][a]!==e[r][a])return!1;return!0}function h(t,e,n,i,r,o,a,s,l){var u=t.length;if(1==l)for(var h=0;h<u;h++)s[h]=c(t[h],e[h],n[h],i[h],r,o,a);else for(var d=t[0].length,h=0;h<u;h++)for(var f=0;f<d;f++)s[h][f]=c(t[h][f],e[h][f],n[h][f],i[h][f],r,o,a)}function c(t,e,n,i,r,o,a){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*a+(-3*(e-n)-2*s-l)*o+s*r+e}function d(t){if(y(t)){var e=t.length;if(y(t[0])){for(var n=[],i=0;i<e;i++)n.push(x.call(t[i]));return n}return x.call(t)}return t}function f(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t,e,n,i,r){var d=t._getter,p=t._setter,m="spline"===e,x=i.length;if(x){var _,b=i[0].value,w=y(b),M=!1,S=!1,T=w&&y(b[0])?2:1;i.sort(function(t,e){return t.time-e.time}),_=i[x-1].time;for(var A=[],I=[],C=i[0].value,P=!0,k=0;k<x;k++){A.push(i[k].time/_);var L=i[k].value;if(w&&u(L,C,T)||!w&&L===C||(P=!1),C=L,"string"==typeof L){var D=v.parse(L);D?(L=D,M=!0):S=!0}I.push(L)}if(!P){for(var O=I[x-1],k=0;k<x-1;k++)w?l(I[k],O,T):!isNaN(I[k])||isNaN(O)||S||M||(I[k]=O);w&&l(d(t._target,r),O,T);var E,z,N,R,B,V,F=0,G=0;if(M)var H=[0,0,0,0];var W=function(t,e){var n;if(e<0)n=0;else if(e<G){for(E=Math.min(F+1,x-1),n=E;n>=0&&!(A[n]<=e);n--);n=Math.min(n,x-2)}else{for(n=F;n<x&&!(A[n]>e);n++);n=Math.min(n-1,x-2)}F=n,G=e;var i=A[n+1]-A[n];if(0!==i)if(z=(e-A[n])/i,m)if(R=I[n],N=I[0===n?n:n-1],B=I[n>x-2?x-1:n+1],V=I[n>x-3?x-1:n+2],w)h(N,R,B,V,z,z*z,z*z*z,d(t,r),T);else{var l;if(M)l=h(N,R,B,V,z,z*z,z*z*z,H,1),l=f(H);else{if(S)return a(R,B,z);l=c(N,R,B,V,z,z*z,z*z*z)}p(t,r,l)}else if(w)s(I[n],I[n+1],z,d(t,r),T);else{var l;if(M)s(I[n],I[n+1],z,H,1),l=f(H);else{if(S)return a(I[n],I[n+1],z);l=o(I[n],I[n+1],z)}p(t,r,l)}},Z=new g({target:t._target,life:_,loop:t._loop,delay:t._delay,onframe:W,ondestroy:n});return e&&"spline"!==e&&(Z.easing=e),Z}}}var g=n(157),v=n(22),m=n(1),y=m.isArrayLike,x=Array.prototype.slice,_=function(t,e,n,o){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||i,this._setter=o||r,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var n=this._tracks;for(var i in e)if(e.hasOwnProperty(i)){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:d(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,n=0;n<e;n++)t[n].call(this)},start:function(t){var e,n=this,i=0,r=function(){i--,i||n._doneCallback()};for(var o in this._tracks)if(this._tracks.hasOwnProperty(o)){var a=p(this,t,r,this._tracks[o],o);a&&(this._clipList.push(a),i++,this.animation&&this.animation.addClip(a),e=a)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var i=0;i<n._onframeList.length;i++)n._onframeList[i](t,e)}}return i||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,n=this.animation,i=0;i<e.length;i++){var r=e[i];t&&r.onframe(this._target,1),n&&n.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}},t.exports=_},function(t,e){t.exports="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)}},function(t,e){var n=2*Math.PI;t.exports={normalizeRadian:function(t){return t%=n,t<0&&(t+=n),t}}},function(t,e){var n=function(){this.head=null,this.tail=null,this._len=0},i=n.prototype;i.insert=function(t){var e=new r(t);return this.insertEntry(e),e},i.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},i.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},i.len=function(){return this._len},i.clear=function(){this.head=this.tail=null,this._len=0};var r=function(t){this.value=t,this.next,this.prev},o=function(t){this._list=new n,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},a=o.prototype;a.put=function(t,e){var n=this._list,i=this._map,o=null;if(null==i[t]){var a=n.len(),s=this._lastRemovedEntry;if(a>=this._maxSize&&a>0){var l=n.head;n.remove(l),delete i[l.key],o=l.value,this._lastRemovedEntry=l}s?s.value=e:s=new r(e),s.key=t,n.insertEntry(s),i[t]=s}return o},a.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},a.clear=function(){this._list.clear(),this._map={}},t.exports=o},function(t,e){var n=2311;t.exports=function(){return n++}},function(t,e){var n=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};n.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")},t.exports=n},function(t,e){function n(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y);var s=t.createLinearGradient(i,o,r,a);return s}function i(t,e,n){var i=n.width,r=n.height,o=Math.min(i,r),a=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;e.global||(a=a*i+n.x,s=s*r+n.y,l*=o);var u=t.createRadialGradient(a,s,0,a,s,l);return u}var r=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],o=function(t){this.extendFrom(t)};o.prototype={constructor:o,fill:"#000000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,textFill:"#000",textStroke:null,textPosition:"inside",textOffset:null,textBaseline:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textTransform:!1,textRotation:0,blend:null,bind:function(t,e,n){for(var i=this,o=n&&n.style,a=!o,s=0;s<r.length;s++){var l=r[s],u=l[0];(a||i[u]!==o[u])&&(t[u]=i[u]||l[1])}if((a||i.fill!==o.fill)&&(t.fillStyle=i.fill),(a||i.stroke!==o.stroke)&&(t.strokeStyle=i.stroke),(a||i.opacity!==o.opacity)&&(t.globalAlpha=null==i.opacity?1:i.opacity),(a||i.blend!==o.blend)&&(t.globalCompositeOperation=i.blend||"source-over"),this.hasStroke()){var h=i.lineWidth;t.lineWidth=h/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t){var n=this;for(var i in t)!t.hasOwnProperty(i)||!e&&n.hasOwnProperty(i)||(n[i]=t[i])}},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,r){for(var o="radial"===e.type?i:n,a=o(t,e,r),s=e.colorStops,l=0;l<s.length;l++)a.addColorStop(s[l].offset,s[l].color);return a}};for(var a=o.prototype,s=0;s<r.length;s++){var l=r[s];l[0]in a||(a[l[0]]=l[1])}o.getGradient=a.getGradient,t.exports=o},function(t,e,n){var i=n(168),r=n(167);t.exports={buildPath:function(t,e,n){var o=e.points,a=e.smooth;if(o&&o.length>=2){if(a&&"spline"!==a){var s=r(o,a,n,e.smoothConstraint);t.moveTo(o[0][0],o[0][1]);for(var l=o.length,u=0;u<(n?l:l-1);u++){var h=s[2*u],c=s[2*u+1],d=o[(u+1)%l];t.bezierCurveTo(h[0],h[1],c[0],c[1],d[0],d[1])}}else{"spline"===a&&(o=i(o,n)),t.moveTo(o[0][0],o[0][1]);for(var u=1,f=o.length;u<f;u++)t.lineTo(o[u][0],o[u][1])}n&&t.closePath()}}}},function(t,e,n){var i=n(1),r={};r.layout=function(t,e,n){function r(t,e){var n=o.getAxis(t);return n.toGlobalCoord(n.dataToCoord(0))}n=n||{};var o=t.coordinateSystem,a=e.axis,s={},l=a.position,u=a.onZero?"onZero":l,h=a.dim,c=o.getRect(),d=[c.x,c.x+c.width,c.y,c.y+c.height],f=e.get("offset")||0,p={x:{top:d[2]-f,bottom:d[3]+f},y:{left:d[0]-f,right:d[1]+f}};p.x.onZero=Math.max(Math.min(r("y"),p.x.bottom),p.x.top),p.y.onZero=Math.max(Math.min(r("x"),p.y.right),p.y.left),s.position=["y"===h?p.y[u]:d[0],"x"===h?p.x[u]:d[3]],s.rotation=Math.PI/2*("x"===h?0:1);var g={top:-1,bottom:1,left:-1,right:1};s.labelDirection=s.tickDirection=s.nameDirection=g[l],s.labelOffset=a.onZero?p[h][l]-p[h].onZero:0,e.get("axisTick.inside")&&(s.tickDirection=-s.tickDirection),i.retrieve(n.labelInside,e.get("axisLabel.inside"))&&(s.labelDirection=-s.labelDirection);var v=e.get("axisLabel.rotate");return s.labelRotate="top"===u?-v:v,s.labelInterval=a.getLabelInterval(),s.z2=1,s},t.exports=r},function(t,e,n){"use strict";function i(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}var r=n(1),o=n(3),a=n(16),s=n(7),l=n(19),u=n(17),h=n(40),c={};c.buildElStyle=function(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle(),e.fill=null):"shadow"===n&&(e=i.getAreaStyle(),e.stroke=null),e},c.buildLabelElOption=function(t,e,n,r,o){var l=n.get("value"),u=c.getValueLabel(l,e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get("label.precision"),formatter:n.get("label.formatter")}),h=n.getModel("label"),d=h.getModel("textStyle"),f=s.normalizeCssArray(h.get("padding")||0),p=d.getFont(),g=a.getBoundingRect(u,p,o.textAlign,o.textBaseline),v=o.position,m=g.width+f[1]+f[3],y=g.height+f[0]+f[2],x=o.align;"right"===x&&(v[0]-=m),"center"===x&&(v[0]-=m/2);var _=o.verticalAlign;"bottom"===_&&(v[1]-=y),"middle"===_&&(v[1]-=y/2),i(v,m,y,r);var b=h.get("backgroundColor");b&&"auto"!==b||(b=e.get("axisLine.lineStyle.color")),t.label={shape:{x:0,y:0,width:m,height:y,r:h.get("borderRadius")},position:v.slice(),style:{text:u,textFont:p,textFill:d.getTextColor(),textPosition:"inside",fill:b,stroke:h.get("borderColor")||"transparent",lineWidth:h.get("borderWidth")||0,shadowBlur:h.get("shadowBlur"),shadowColor:h.get("shadowColor"),shadowOffsetX:h.get("shadowOffsetX"),shadowOffsetY:h.get("shadowOffsetY")},z2:10}},c.getValueLabel=function(t,e,n,i,o){var a=e.scale.getLabel(t,{precision:o.precision}),s=o.formatter;if(s){var l={value:u.getAxisRawValue(e,t),seriesData:[]};r.each(i,function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&l.seriesData.push(r)}),r.isString(s)?a=s.replace("{value}",a):r.isFunction(s)&&(a=s(l))}return a},c.getTransformedPosition=function(t,e,n){var i=l.create();return l.rotate(i,i,n.rotation),l.translate(i,i,n.position),o.applyTransform([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)},c.buildCartesianSingleLabelElOption=function(t,e,n,i,r,o){var a=h.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get("label.margin"),c.buildLabelElOption(e,i,r,o,{position:c.getTransformedPosition(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})},c.makeLineShape=function(t,e,n){return n=n||0,{x1:t[n],y1:t[1-n],x2:e[n],y2:e[1-n]}},c.makeRectShape=function(t,e,n){return n=n||0,{x:t[n],y:t[1-n],width:e[n],height:e[1-n]}},c.makeSectorShape=function(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}},t.exports=c},function(t,e,n){var i=n(7),r=n(1),o={},a=["x","y","z","radius","angle","single"],s=["cartesian2d","polar","singleAxis"];o.isCoordSupported=function(t){return r.indexOf(s,t)>=0},o.createNameEach=function(t,e){t=t.slice();var n=r.map(t,i.capitalFirst);e=(e||[]).slice();var o=r.map(e,i.capitalFirst);return function(i,a){r.each(t,function(t,r){for(var s={name:t,capital:n[r]},l=0;l<e.length;l++)s[e[l]]=t+o[l];i.call(a,s)})}},o.eachAxisDim=o.createNameEach(a,["axisIndex","axis","index","id"]),o.createLinkedNodesFinder=function(t,e,n){function i(t,e){return r.indexOf(e.nodes,t)>=0}function o(t,i){var o=!1;return e(function(e){r.each(n(t,e)||[],function(t){i.records[e.name][t]&&(o=!0)})}),o}function a(t,i){i.nodes.push(t),e(function(e){r.each(n(t,e)||[],function(t){i.records[e.name][t]=!0})})}return function(n){function r(t){!i(t,s)&&o(t,s)&&(a(t,s),l=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!n)return s;a(n,s);var l;do l=!1,t(r);while(l);return s}},t.exports=o},function(t,e,n){var i=n(1);t.exports={updateSelectedMap:function(t){this._selectTargetMap=i.reduce(t||[],function(t,e){return t[e.name]=e,t},{})},select:function(t){var e=this._selectTargetMap,n=e[t],r=this.get("selectedMode");"single"===r&&i.each(e,function(t){t.selected=!1}),n&&(n.selected=!0)},unSelect:function(t){var e=this._selectTargetMap[t];e&&(e.selected=!1)},toggleSelected:function(t){var e=this._selectTargetMap[t];if(null!=e)return this[e.selected?"unSelect":"select"](t),e.selected},isSelected:function(t){var e=this._selectTargetMap[t];return e&&e.selected}}},function(t,e){t.exports=function(t,e,n,i,r){function o(t,e,n){var i=e.length?e.slice():[e,e];return e[0]>e[1]&&i.reverse(),t<0&&i[0]+t<n[0]&&(t=n[0]-i[0]),t>0&&i[1]+t>n[1]&&(t=n[1]-i[1]),t}return t?("rigid"===i?(t=o(t,e,n),e[0]+=t,e[1]+=t):(t=o(t,e[r],n),e[r]+=t,"push"===i&&e[0]>e[1]&&(e[1-r]=e[r])),e):e}},function(t,e,n){function i(t){r.defaultEmphasis(t.label,r.LABEL_OPTIONS)}var r=n(6),o=n(1),a=n(9),s=n(7),l=s.addCommas,u=s.encodeHTML,h=n(2).extendComponentModel({type:"marker",dependencies:["series","grid","polar","geo"],init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n),this.mergeOption(t,n,i.createdBySelf,!0)},isAnimationEnabled:function(){if(a.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},mergeOption:function(t,e,n,r){var a=this.constructor,s=this.mainType+"Model";n||e.eachSeries(function(t){var n=t.get(this.mainType),l=t[s];return n&&n.data?(l?l.mergeOption(n,e,!0):(r&&i(n),o.each(n.data,function(t){t instanceof Array?(i(t[0]),i(t[1])):i(t)}),l=new a(n,this,e),o.extend(l,{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),l.__hostSeries=t),void(t[s]=l)):void(t[s]=null)},this)},formatTooltip:function(t){var e=this.getData(),n=this.getRawValue(t),i=o.isArray(n)?o.map(n,l).join(", "):l(n),r=e.getName(t),a=u(this.name);return(null!=n||r)&&(a+="<br />"),r&&(a+=u(r),null!=n&&(a+=" : ")),null!=n&&(a+=u(i)),a},getData:function(){return this._data},setData:function(t){this._data=t}});o.mixin(h,r.dataFormatMixin),t.exports=h},function(t,e,n){t.exports=n(2).extendComponentView({type:"marker",init:function(){this.markerGroupMap={}},render:function(t,e,n){var i=this.markerGroupMap;for(var r in i)i.hasOwnProperty(r)&&(i[r].__keep=!1);var o=this.type+"Model";e.eachSeries(function(t){var i=t[o];i&&this.renderSeries(t,i,e,n)},this);for(var r in i)i.hasOwnProperty(r)&&!i[r].__keep&&this.group.remove(i[r].group)},renderSeries:function(){}})},function(t,e,n){function i(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function r(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function o(t,e,n){var i=-1;do i=Math.max(l.getPrecision(t.get(e,n)),i),t=t.stackedOn;while(t);return i}function a(t,e,n,i,r,a){var s=[],l=v(e,i,t),u=e.indicesOfNearest(i,l,!0)[0];s[r]=e.get(n,u,!0),s[a]=e.get(i,u,!0);var h=o(e,i,u);return h>=0&&(s[a]=+s[a].toFixed(h)),s}var s=n(1),l=n(4),u=s.indexOf,h=s.curry,c={min:h(a,"min"),max:h(a,"max"),average:h(a,"average")},d=function(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&!r(e)&&!s.isArray(e.coord)&&i){var o=i.dimensions,a=f(e,n,i,t);if(e=s.clone(e),e.type&&c[e.type]&&a.baseAxis&&a.valueAxis){var l=u(o,a.baseAxis.dim),h=u(o,a.valueAxis.dim);e.coord=c[e.type](n,a.baseDataDim,a.valueDataDim,l,h),e.value=e.coord[h]}else{for(var d=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],p=0;p<2;p++)if(c[d[p]]){var g=t.coordDimToDataDim(o[p])[0];d[p]=v(n,g,d[p])}e.coord=d}}return e},f=function(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(i.dataDimToCoordDim(r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=i.coordDimToDataDim(r.baseAxis.dim)[0]):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=i.coordDimToDataDim(r.baseAxis.dim)[0],r.valueDataDim=i.coordDimToDataDim(r.valueAxis.dim)[0]),r},p=function(t,e){return!(t&&t.containData&&e.coord&&!i(e))||t.containData(e.coord)},g=function(t,e,n,i){return i<2?t.coord&&t.coord[i]:t.value},v=function(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,function(t,e){isNaN(t)||(i+=t,r++)},!0),i/r}return t.getDataExtent(e,!0)["max"===n?1:0]};t.exports={dataTransform:d,dataFilter:p,dimValueGetter:g,getAxisInfo:f,numCalculate:v}},,function(t,e){t.exports=function(t,e){var n={};e.eachRawSeriesByType(t,function(t){var i=t.getRawData(),r={};if(!e.isSeriesFiltered(t)){var o=t.getData();o.each(function(t){var e=o.getRawIndex(t);r[e]=t}),i.each(function(e){var a=r[e],s=null!=a&&o.getItemVisual(a,"color",!0);if(s)i.setItemVisual(e,"color",s);else{var l=i.getItemModel(e),u=l.get("itemStyle.normal.color")||t.getColorFromPalette(i.getName(e),n);i.setItemVisual(e,"color",u),null!=a&&o.setItemVisual(a,"color",u)}})}})}},function(t,e,n){var i=n(5),r=n(20),o={},a=Math.min,s=Math.max,l=Math.sin,u=Math.cos,h=i.create(),c=i.create(),d=i.create(),f=2*Math.PI;o.fromPoints=function(t,e,n){if(0!==t.length){var i,r=t[0],o=r[0],l=r[0],u=r[1],h=r[1];for(i=1;i<t.length;i++)r=t[i],o=a(o,r[0]),l=s(l,r[0]),u=a(u,r[1]),h=s(h,r[1]);e[0]=o,e[1]=u,n[0]=l,n[1]=h}},o.fromLine=function(t,e,n,i,r,o){r[0]=a(t,n),r[1]=a(e,i),o[0]=s(t,n),o[1]=s(e,i)};var p=[],g=[];o.fromCubic=function(t,e,n,i,o,l,u,h,c,d){var f,v=r.cubicExtrema,m=r.cubicAt,y=v(t,n,o,u,p);for(c[0]=1/0,c[1]=1/0,d[0]=-(1/0),d[1]=-(1/0),f=0;f<y;f++){var x=m(t,n,o,u,p[f]);c[0]=a(x,c[0]),d[0]=s(x,d[0])}for(y=v(e,i,l,h,g),f=0;f<y;f++){var _=m(e,i,l,h,g[f]);c[1]=a(_,c[1]),d[1]=s(_,d[1])}c[0]=a(t,c[0]),d[0]=s(t,d[0]),c[0]=a(u,c[0]),d[0]=s(u,d[0]),c[1]=a(e,c[1]),d[1]=s(e,d[1]),c[1]=a(h,c[1]),d[1]=s(h,d[1])},o.fromQuadratic=function(t,e,n,i,o,l,u,h){var c=r.quadraticExtremum,d=r.quadraticAt,f=s(a(c(t,n,o),1),0),p=s(a(c(e,i,l),1),0),g=d(t,n,o,f),v=d(e,i,l,p);u[0]=a(t,o,g),u[1]=a(e,l,v),h[0]=s(t,o,g),h[1]=s(e,l,v)},o.fromArc=function(t,e,n,r,o,a,s,p,g){var v=i.min,m=i.max,y=Math.abs(o-a);if(y%f<1e-4&&y>1e-4)return p[0]=t-n,p[1]=e-r,g[0]=t+n,void(g[1]=e+r);if(h[0]=u(o)*n+t,h[1]=l(o)*r+e,c[0]=u(a)*n+t,c[1]=l(a)*r+e,v(p,h,c),m(g,h,c),o%=f,o<0&&(o+=f),a%=f,a<0&&(a+=f),o>a&&!s?a+=f:o<a&&s&&(o+=f),s){var x=a;a=o,o=x}for(var _=0;_<a;_+=Math.PI/2)_>o&&(d[0]=u(_)*n+t,d[1]=l(_)*r+e,v(p,d,p),m(g,d,g))},t.exports=o},function(t,e,n){var i=n(38),r=n(1),o=n(16),a=function(t){i.call(this,t)};a.prototype={constructor:a,type:"text",brush:function(t,e){var n=this.style,i=n.x||0,r=n.y||0,a=n.text;if(null!=a&&(a+=""),n.bind(t,this,e),a){this.setTransform(t);var s,l=n.textAlign,u=n.textFont||n.font;if(n.textVerticalAlign){var h=o.getBoundingRect(a,u,n.textAlign,"top");switch(s="middle",n.textVerticalAlign){case"middle":r-=h.height/2-h.lineHeight/2;break;case"bottom":r-=h.height-h.lineHeight/2;break;default:r+=h.lineHeight/2}}else s=n.textBaseline;t.font=u||"12px sans-serif",t.textAlign=l||"left",t.textAlign!==l&&(t.textAlign="left"),t.textBaseline=s||"alphabetic",t.textBaseline!==s&&(t.textBaseline="alphabetic");for(var c=o.measureText("国",t.font).width,d=a.split("\n"),f=0;f<d.length;f++)n.hasStroke()&&t.strokeText(d[f],i,r),n.hasFill()&&t.fillText(d[f],i,r),r+=c;this.restoreTransform(t)}},getBoundingRect:function(){var t=this.style;if(!this._rect){var e=t.textVerticalAlign,n=o.getBoundingRect(t.text+"",t.textFont||t.font,t.textAlign,e?"top":t.textBaseline);switch(e){case"middle":n.y-=n.height/2;break;case"bottom":n.y-=n.height}if(n.x+=t.x||0,n.y+=t.y||0,t.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect}},r.inherits(a,i),t.exports=a},function(t,e,n){function i(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}var r=n(16),o=n(11),a=new o,s=function(){};s.prototype={constructor:s,drawRectText:function(t,e,n){var o=this.style,s=o.text;if(null!=s&&(s+=""),s){t.save();var l,u,h=o.textPosition,c=o.textOffset,d=o.textDistance,f=o.textAlign,p=o.textFont||o.font,g=o.textBaseline,v=o.textVerticalAlign;n=n||r.getBoundingRect(s,p,f,g);var m=this.transform;if(o.textTransform?this.setTransform(t):m&&(a.copy(e),a.applyTransform(m),e=a),h instanceof Array){if(l=e.x+i(h[0],e.width),u=e.y+i(h[1],e.height),f=f||"left",g=g||"top",v){switch(v){case"middle":u-=n.height/2-n.lineHeight/2;break;case"bottom":u-=n.height-n.lineHeight/2;break;default:u+=n.lineHeight/2}g="middle"}}else{var y=r.adjustTextPositionOnRect(h,e,n,d);l=y.x,u=y.y,f=f||y.textAlign,g=g||y.textBaseline}c&&(l+=c[0],u+=c[1]),t.textAlign=f||"left",t.textBaseline=g||"alphabetic";var x=o.textFill,_=o.textStroke;x&&(t.fillStyle=x),_&&(t.strokeStyle=_),t.font=p||"12px sans-serif",t.shadowBlur=o.textShadowBlur,t.shadowColor=o.textShadowColor||"transparent",t.shadowOffsetX=o.textShadowOffsetX,t.shadowOffsetY=o.textShadowOffsetY;var b=s.split("\n");o.textRotation&&(m&&t.translate(m[4],m[5]),t.rotate(o.textRotation),m&&t.translate(-m[4],-m[5]));for(var w=0;w<b.length;w++)_&&t.strokeText(b[w],l,u),x&&t.fillText(b[w],l,u),u+=n.lineHeight;t.restore()}}},t.exports=s},function(t,e,n){function i(t){delete f[t]}/*!
+var M=n(9),S=n(137),T=n(101),A=n(26),I=n(138),C=n(13),P=n(17),D=n(65),k=n(30),L=n(3),O=n(5),z=n(37),E=n(88),N=n(1),R=n(22),B=n(23),V=n(51),F=N.each,G=C.parseClassType,H=1e3,W=5e3,Z=1e3,q=2e3,j=3e3,U=4e3,X=5e3,Y="__flagInMainProcess",$="__hasGradientOrPatternBg",K="__optionUpdated",Q=/^[a-zA-Z0-9_]+$/;r.prototype.on=i("on"),r.prototype.off=i("off"),r.prototype.one=i("one"),N.mixin(r,B);var J=o.prototype;J._onframe=function(){if(this[K]){var t=this[K].silent;this[Y]=!0,tt.prepareAndUpdate.call(this),this[Y]=!1,this[K]=!1,u.call(this,t),h.call(this,t)}},J.getDom=function(){return this._dom},J.getZr=function(){return this._zr},J.setOption=function(t,e,n){var i;if(N.isObject(e)&&(n=e.lazyUpdate,i=e.silent,e=e.notMerge),this[Y]=!0,!this._model||e){var r=new I(this._api),o=this._theme,a=this._model=new S(null,null,o,r);a.init(null,null,o,r)}this._model.setOption(t,ot),n?(this[K]={silent:i},this[Y]=!1):(tt.prepareAndUpdate.call(this),this._zr.flush(),this[K]=!1,this[Y]=!1,u.call(this,i),h.call(this,i))},J.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},J.getModel=function(){return this._model},J.getOption=function(){return this._model&&this._model.getOption()},J.getWidth=function(){return this._zr.getWidth()},J.getHeight=function(){return this._zr.getHeight()},J.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},J.getRenderedCanvas=function(t){if(M.canvasSupported){t=t||{},t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr,n=e.storage.getDisplayList();return N.each(n,function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},J.getDataURL=function(t){t=t||{};var e=t.excludeComponents,n=this._model,i=[],r=this;F(e,function(t){n.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)})});var o=this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return F(i,function(t){t.group.ignore=!1}),o},J.getConnectedDataURL=function(t){if(M.canvasSupported){var e=this.group,n=Math.min,i=Math.max,r=1/0;if(ct[e]){var o=r,a=r,s=-r,l=-r,u=[],h=t&&t.pixelRatio||1;N.each(ht,function(r,h){if(r.group===e){var c=r.getRenderedCanvas(N.clone(t)),d=r.getDom().getBoundingClientRect();o=n(d.left,o),a=n(d.top,a),s=i(d.right,s),l=i(d.bottom,l),u.push({dom:c,left:d.left,top:d.top})}}),o*=h,a*=h,s*=h,l*=h;var c=s-o,d=l-a,f=N.createCanvas();f.width=c,f.height=d;var p=E.init(f);return F(u,function(t){var e=new L.Image({style:{x:t.left*h-o,y:t.top*h-a,image:t.dom}});p.add(e)}),p.refreshImmediately(),f.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},J.convertToPixel=N.curry(a,"convertToPixel"),J.convertFromPixel=N.curry(a,"convertFromPixel"),J.containPixel=function(t,e){var n,i=this._model;return t=O.parseFinder(i,t),N.each(t,function(t,i){i.indexOf("Models")>=0&&N.each(t,function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n|=!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n|=o.containPoint(e,t))}},this)},this),!!n},J.getVisual=function(t,e){var n=this._model;t=O.parseFinder(n,t,{defaultMainType:"series"});var i=t.seriesModel,r=i.getData(),o=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?r.indexOfRawIndex(t.dataIndex):null;return null!=o?r.getItemVisual(o,e):r.getVisual(e)},J.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},J.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var tt={update:function(t){var e=this._model,n=this._api,i=this._coordSysMgr,r=this._zr;if(e){e.restoreData(),i.create(this._model,this._api),f.call(this,e,n),p.call(this,e),i.update(e,n),m.call(this,e,t),v.call(this,e,t);var o=e.get("backgroundColor")||"transparent",a=r.painter;if(a.isSingleCanvas&&a.isSingleCanvas())r.configLayer(0,{clearColor:o});else{if(!M.canvasSupported){var s=R.parse(o);o=R.stringify(s,"rgb"),0===s[3]&&(o="transparent")}o.colorStops||o.image?(r.configLayer(0,{clearColor:o}),this[$]=!0,this._dom.style.background="transparent"):(this[$]&&r.configLayer(0,{clearColor:null}),this[$]=!1,this._dom.style.background=o)}F(at,function(t){t(e,n)})}},updateView:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),m.call(this,e,t),c.call(this,"updateView",e,t))},updateVisual:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),m.call(this,e,t,!0),c.call(this,"updateVisual",e,t))},updateLayout:function(t){var e=this._model;e&&(g.call(this,e,t),c.call(this,"updateLayout",e,t))},prepareAndUpdate:function(t){var e=this._model;d.call(this,"component",e),d.call(this,"chart",e),tt.update.call(this,t)}};J.resize=function(t){this[Y]=!0,this._zr.resize(t);var e=this._model&&this._model.resetOption("media"),n=e?"prepareAndUpdate":"update";tt[n].call(this),this._loadingFX&&this._loadingFX.resize(),this[Y]=!1;var i=t&&t.silent;u.call(this,i),h.call(this,i)},J.showLoading=function(t,e){if(N.isObject(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),ut[t]){var n=ut[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},J.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},J.makeActionFromEvent=function(t){var e=N.extend({},t);return e.type=it[t.type],e},J.dispatchAction=function(t,e){if(N.isObject(e)||(e={silent:!!e}),nt[t.type]){if(this[Y])return void this._pendingActions.push(t);l.call(this,t,e.silent),e.flush?this._zr.flush(!0):e.flush!==!1&&M.browser.weChat&&this._throttledZrFlush(),u.call(this,e.silent),h.call(this,e.silent)}},J.on=i("on"),J.off=i("off"),J.one=i("one");var et=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];J._initEvents=function(){F(et,function(t){this._zr.on(t,function(e){var n,i=this.getModel(),r=e.target;if("globalout"===t)n={};else if(r&&null!=r.dataIndex){var o=r.dataModel||i.getSeriesByIndex(r.seriesIndex);n=o&&o.getDataParams(r.dataIndex,r.dataType)||{}}else r&&r.eventData&&(n=N.extend({},r.eventData));n&&(n.event=e,n.type=t,this.trigger(t,n))},this)},this),F(it,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},J.isDisposed=function(){return this._disposed},J.clear=function(){this.setOption({series:[]},!0)},J.dispose=function(){if(!this._disposed){this._disposed=!0;var t=this._api,e=this._model;F(this._componentsViews,function(n){n.dispose(e,t)}),F(this._chartsViews,function(n){n.dispose(e,t)}),this._zr.dispose(),delete ht[this.id]}},N.mixin(o,B);var nt={},it={},rt=[],ot=[],at=[],st=[],lt={},ut={},ht={},ct={},dt=new Date-0,ft=new Date-0,pt="_echarts_instance_",gt={version:"3.6.0",dependencies:{zrender:"3.5.0"}};gt.init=function(t,e,n){var i=gt.getInstanceByDom(t);if(i)return i;var r=new o(t,e,n);return r.id="ec_"+dt++,ht[r.id]=r,t.setAttribute?t.setAttribute(pt,r.id):t[pt]=r.id,w(r),r},gt.connect=function(t){if(N.isArray(t)){var e=t;t=null,N.each(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+ft++,N.each(e,function(e){e.group=t})}return ct[t]=!0,t},gt.disConnect=function(t){ct[t]=!1},gt.disconnect=gt.disConnect,gt.dispose=function(t){"string"==typeof t?t=ht[t]:t instanceof o||(t=gt.getInstanceByDom(t)),t instanceof o&&!t.isDisposed()&&t.dispose()},gt.getInstanceByDom=function(t){var e;return e=t.getAttribute?t.getAttribute(pt):t[pt],ht[e]},gt.getInstanceById=function(t){return ht[t]},gt.registerTheme=function(t,e){lt[t]=e},gt.registerPreprocessor=function(t){ot.push(t)},gt.registerProcessor=function(t,e){"function"==typeof t&&(e=t,t=H),rt.push({prio:t,func:e})},gt.registerPostUpdate=function(t){at.push(t)},gt.registerAction=function(t,e,n){"function"==typeof e&&(n=e,e="");var i=N.isObject(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,N.assert(Q.test(i)&&Q.test(e)),nt[i]||(nt[i]={action:n,actionInfo:t}),it[e]=i},gt.registerCoordinateSystem=function(t,e){A.register(t,e)},gt.registerLayout=function(t,e){"function"==typeof t&&(e=t,t=Z),st.push({prio:t,func:e,isLayout:!0})},gt.registerVisual=function(t,e){"function"==typeof t&&(e=t,t=j),st.push({prio:t,func:e})},gt.registerLoading=function(t,e){ut[t]=e},gt.extendComponentModel=function(t){return C.extend(t)},gt.extendComponentView=function(t){return D.extend(t)},gt.extendSeriesModel=function(t){return P.extend(t)},gt.extendChartView=function(t){return k.extend(t)},gt.setCanvasCreator=function(t){N.createCanvas=t},gt.registerVisual(q,n(151)),gt.registerPreprocessor(n(145)),gt.registerLoading("default",n(136)),gt.registerAction({type:"highlight",event:"highlight",update:"highlight"},N.noop),gt.registerAction({type:"downplay",event:"downplay",update:"downplay"},N.noop),gt.zrender=E,gt.List=n(14),gt.Model=n(10),gt.Axis=n(33),gt.graphic=n(3),gt.number=n(4),gt.format=n(7),gt.throttle=z.throttle,gt.matrix=n(19),gt.vector=n(6),gt.color=n(22),gt.util={},F(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){gt.util[t]=N[t]}),gt.helper=n(135),gt.PRIORITY={PROCESSOR:{FILTER:H,STATISTIC:W},VISUAL:{LAYOUT:Z,GLOBAL:q,CHART:j,COMPONENT:U,BRUSH:X}},t.exports=gt},function(t,e,n){"use strict";function i(t){return null!=t&&"none"!=t}function r(t){return"string"==typeof t?x.lift(t,-.1):t}function o(t){if(t.__hoverStlDirty){var e=t.style.stroke,n=t.style.fill,o=t.__hoverStl;o.fill=o.fill||(i(n)?r(n):null),o.stroke=o.stroke||(i(e)?r(e):null);var a={};for(var s in o)o.hasOwnProperty(s)&&(a[s]=t.style[s]);t.__normalStl=a,t.__hoverStlDirty=!1}}function a(t){t.__isHover||(o(t),t.useHoverLayer?t.__zr&&t.__zr.addHover(t,t.__hoverStl):(t.setStyle(t.__hoverStl),t.z2+=1),t.__isHover=!0)}function s(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function l(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&a(t)}):a(t)}function u(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&s(t)}):s(t)}function h(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&o(t)}function c(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&l(this)}function d(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&u(this)}function f(){this.__isEmphasis=!0,l(this)}function p(){this.__isEmphasis=!1,u(this)}function g(t,e,n,i,r,o){"function"==typeof r&&(o=r,r=null);var a=i&&i.isAnimationEnabled();if(a){var s=t?"Update":"",l=i.getShallow("animationDuration"+s),u=i.getShallow("animationEasing"+s),h=i.getShallow("animationDelay"+s);"function"==typeof h&&(h=h(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof l&&(l=l(r)),l>0?e.animateTo(n,l,h||0,u,o):(e.stopAnimation(),e.attr(n),o&&o())}else e.stopAnimation(),e.attr(n),o&&o()}var m=n(1),v=n(180),y=n(8),x=n(22),_=n(19),b=n(6),w=n(58),M=n(11),S=Math.round,T=Math.max,A=Math.min,I={};I.Group=n(36),I.Image=n(53),I.Text=n(86),I.Circle=n(171),I.Sector=n(177),I.Ring=n(176),I.Polygon=n(173),I.Polyline=n(174),I.Rect=n(175),I.Line=n(172),I.BezierCurve=n(170),I.Arc=n(169),I.CompoundPath=n(164),I.LinearGradient=n(100),I.RadialGradient=n(165),I.BoundingRect=M,I.extendShape=function(t){return y.extend(t)},I.extendPath=function(t,e){return v.extendFromString(t,e)},I.makePath=function(t,e,n,i){var r=v.createFromString(t,e),o=r.getBoundingRect();if(n){var a=o.width/o.height;if("center"===i){var s,l=n.height*a;l<=n.width?s=n.height:(l=n.width,s=l/a);var u=n.x+n.width/2,h=n.y+n.height/2;n.x=u-l/2,n.y=h-s/2,n.width=l,n.height=s}I.resizePath(r,n)}return r},I.mergePath=v.mergePath,I.resizePath=function(t,e){if(t.applyTransform){var n=t.getBoundingRect(),i=n.calculateTransform(e);t.applyTransform(i)}},I.subPixelOptimizeLine=function(t){var e=I.subPixelOptimize,n=t.shape,i=t.style.lineWidth;return S(2*n.x1)===S(2*n.x2)&&(n.x1=n.x2=e(n.x1,i,!0)),S(2*n.y1)===S(2*n.y2)&&(n.y1=n.y2=e(n.y1,i,!0)),t},I.subPixelOptimizeRect=function(t){var e=I.subPixelOptimize,n=t.shape,i=t.style.lineWidth,r=n.x,o=n.y,a=n.width,s=n.height;return n.x=e(n.x,i,!0),n.y=e(n.y,i,!0),n.width=Math.max(e(r+a,i,!1)-n.x,0===a?0:1),n.height=Math.max(e(o+s,i,!1)-n.y,0===s?0:1),t},I.subPixelOptimize=function(t,e,n){var i=S(2*t);return(i+S(e))%2===0?i/2:(i+(n?1:-1))/2},I.setHoverStyle=function(t,e,n){t.__hoverSilentOnTouch=n&&n.hoverSilentOnTouch,"group"===t.type?t.traverse(function(t){"group"!==t.type&&h(t,e)}):h(t,e),t.on("mouseover",c).on("mouseout",d),t.on("emphasis",f).on("normal",p)},I.setText=function(t,e,n){var i=e.getShallow("position")||"inside",r=e.getShallow("offset"),o=i.indexOf("inside")>=0?"white":n,a=e.getModel("textStyle");m.extend(t,{textDistance:e.getShallow("distance")||5,textFont:a.getFont(),textPosition:i,textOffset:r,textFill:a.getTextColor()||o})},I.getFont=function(t,e){var n=e&&e.getModel("textStyle");return[t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" ")},I.updateProps=function(t,e,n,i,r){g(!0,t,e,n,i,r)},I.initProps=function(t,e,n,i,r){g(!1,t,e,n,i,r)},I.getTransform=function(t,e){for(var n=_.identity([]);t&&t!==e;)_.mul(n,t.getLocalTransform(),n),t=t.parent;return n},I.applyTransform=function(t,e,n){return e&&!m.isArrayLike(e)&&(e=w.getLocalTransform(e)),n&&(e=_.invert([],e)),b.applyTransform([],t,e)},I.transformDirection=function(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return o=I.applyTransform(o,e,n),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"},I.groupTransition=function(t,e,n,i){function r(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}function o(t){var e={position:b.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=m.extend({},t.shape)),e}if(t&&e){var a=r(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var i=o(t);t.attr(o(e)),I.updateProps(t,i,n,t.dataIndex)}}})}},I.clipPointsByRect=function(t,e){return m.map(t,function(t){var n=t[0];n=T(n,e.x),n=A(n,e.x+e.width);var i=t[1];return i=T(i,e.y),i=A(i,e.y+e.height),[n,i]})},I.clipRectByRect=function(t,e){var n=T(t.x,e.x),i=A(t.x+t.width,e.x+e.width),r=T(t.y,e.y),o=A(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}},t.exports=I},function(t,e){function n(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function i(t){return Math.floor(Math.log(t)/Math.LN10)}var r={},o=1e-4;r.linearMap=function(t,e,n,i){var r=e[1]-e[0],o=n[1]-n[0];if(0===r)return 0===o?n[0]:(n[0]+n[1])/2;if(i)if(r>0){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*o+n[0]},r.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?n(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},r.round=function(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t},r.asc=function(t){return t.sort(function(t,e){return t-e}),t},r.getPrecision=function(t){if(t=+t,isNaN(t))return 0;for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n},r.getPrecisionSafe=function(t){var e=t.toString(),n=e.indexOf("e");if(n>0){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r},r.getPixelPrecision=function(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20},r.MAX_SAFE_INTEGER=9007199254740991,r.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},r.isRadianAroundZero=function(t){return t>-o&&t<o};var a=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;r.getTimezoneOffset=function(){return(new Date).getTimezoneOffset()},r.parseDate=function(t){if(t instanceof Date)return t;if("string"==typeof t){var e=a.exec(t);if(!e)return new Date(NaN);var n=r.getTimezoneOffset(),i=e[8]?"Z"===e[8].toUpperCase()?n:60*+e[8].slice(0,3)+n:0;return new Date((+e[1]),+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0)-i,+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))},r.quantity=function(t){return Math.pow(10,i(t))},r.nice=function(t,e){var n,r=i(t),o=Math.pow(10,r),a=t/o;return n=e?a<1.5?1:a<2.5?2:a<4?3:a<7?5:10:a<1?1:a<2?2:a<3?3:a<5?5:10,t=n*o,r>=-20?+t.toFixed(r<0?-r:0):t},r.reformIntervals=function(t){function e(t,n,i){return t.interval[i]<n.interval[i]||t.interval[i]===n.interval[i]&&(t.close[i]-n.close[i]===(i?-1:1)||!i&&e(t,n,1))}t.sort(function(t,n){return e(t,n,0)?-1:1});for(var n=-(1/0),i=1,r=0;r<t.length;){for(var o=t[r].interval,a=t[r].close,s=0;s<2;s++)o[s]<=n&&(o[s]=n,a[s]=s?1:1-i),n=o[s],i=a[s];o[0]===o[1]&&a[0]*a[1]!==1?t.splice(r,1):r++}return t},r.isNumeric=function(t){return t-parseFloat(t)>=0},t.exports=r},function(t,e,n){function i(t,e){return t&&t.hasOwnProperty(e)}var r=n(7),o=n(4),a=n(10),s=n(1),l=s.each,u=s.isObject,h={};h.normalizeToArray=function(t){return t instanceof Array?t:null==t?[]:[t]},h.defaultEmphasis=function(t,e){if(t){var n=t.emphasis=t.emphasis||{},i=t.normal=t.normal||{};l(e,function(t){var e=s.retrieve(n[t],i[t]);null!=e&&(n[t]=e)})}},h.LABEL_OPTIONS=["position","offset","show","textStyle","distance","formatter"],h.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},h.isDataItemOption=function(t){return u(t)&&!(t instanceof Array)},h.converDataValue=function(t,e){var n=e&&e.type;return"ordinal"===n?t:("time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+o.parseDate(t)),null==t||""===t?NaN:+t)},h.createDataFormatModel=function(t,e){var n=new a;return s.mixin(n,h.dataFormatMixin),n.seriesIndex=e.seriesIndex,n.name=e.name||"",n.mainType=e.mainType,n.subType=e.subType,n.getData=function(){return t},n},h.dataFormatMixin={getDataParams:function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),o=n.getRawIndex(t),a=n.getName(t,!0),s=n.getRawDataItem(t),l=n.getItemVisual(t,"color");return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:this.seriesIndex,seriesId:this.id,seriesName:this.name,name:a,dataIndex:o,data:s,dataType:e,value:i,color:l,marker:r.getTooltipMarker(l),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,n,i){e=e||"normal";var o=this.getData(n),a=o.getItemModel(t),s=this.getDataParams(t,n);null!=i&&s.value instanceof Array&&(s.value=s.value[i]);var l=a.get(["label",e,"formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?r.formatTpl(l,s):void 0},getRawValue:function(t,e){var n=this.getData(e),i=n.getRawDataItem(t);if(null!=i)return!u(i)||i instanceof Array?i:i.value},formatTooltip:s.noop},h.mappingToExists=function(t,e){e=(e||[]).slice();var n=s.map(t||[],function(t,e){return{exist:t}});return l(e,function(t,i){if(u(t)){for(var r=0;r<n.length;r++)if(!n[r].option&&null!=t.id&&n[r].exist.id===t.id+"")return n[r].option=t,void(e[i]=null);for(var r=0;r<n.length;r++){var o=n[r].exist;if(!(n[r].option||null!=o.id&&null!=t.id||null==t.name||h.isIdInner(t)||h.isIdInner(o)||o.name!==t.name+""))return n[r].option=t,void(e[i]=null)}}}),l(e,function(t,e){if(u(t)){for(var i=0;i<n.length;i++){var r=n[i].exist;if(!n[i].option&&!h.isIdInner(r)&&null==t.id){n[i].option=t;break}}i>=n.length&&n.push({option:t})}}),n},h.makeIdAndName=function(t){var e=s.createHashMap();l(t,function(t,n){var i=t.exist;i&&e.set(i.id,t)}),l(t,function(t,n){var i=t.option;s.assert(!i||null==i.id||!e.get(i.id)||e.get(i.id)===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&e.set(i.id,t),!t.keyInfo&&(t.keyInfo={})}),l(t,function(t,n){var i=t.exist,r=t.option,o=t.keyInfo;if(u(r)){if(o.name=null!=r.name?r.name+"":i?i.name:"\0-",i)o.id=i.id;else if(null!=r.id)o.id=r.id+"";else{var a=0;do o.id="\0"+o.name+"\0"+a++;while(e.get(o.id))}e.set(o.id,t)}})},h.isIdInner=function(t){return u(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")},h.compressBatches=function(t,e){function n(t,e,n){for(var i=0,r=t.length;i<r;i++)for(var o=t[i].seriesId,a=h.normalizeToArray(t[i].dataIndex),s=n&&n[o],l=0,u=a.length;l<u;l++){var c=a[l];s&&s[c]?s[c]=null:(e[o]||(e[o]={}))[c]=1}}function i(t,e){var n=[];for(var r in t)if(t.hasOwnProperty(r)&&null!=t[r])if(e)n.push(+r);else{var o=i(t[r],!0);o.length&&n.push({seriesId:r,dataIndex:o})}return n}var r={},o={};return n(t||[],r),n(e||[],o,r),[i(r),i(o)]},h.queryDataIndex=function(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?s.isArray(e.dataIndex)?s.map(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?s.isArray(e.name)?s.map(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0},h.makeGetter=function(){var t=0;return function(){var e="\0__ec_prop_getter_"+t++;return function(t){return t[e]||(t[e]={})}}}(),h.parseFinder=function(t,e,n){if(s.isString(e)){var r={};r[e+"Index"]=0,e=r}var o=n&&n.defaultMainType;!o||i(e,o+"Index")||i(e,o+"Id")||i(e,o+"Name")||(e[o+"Index"]=0);var a={};return l(e,function(i,r){var i=e[r];if("dataIndex"===r||"dataIndexInside"===r)return void(a[r]=i);var o=r.match(/^(\w+)(Index|Id|Name)$/)||[],l=o[1],u=(o[2]||"").toLowerCase();if(!(!l||!u||null==i||"index"===u&&"none"===i||n&&n.includeMainTypes&&s.indexOf(n.includeMainTypes,l)<0)){var h={mainType:l};"index"===u&&"all"===i||(h[u]=i);var c=t.queryComponents(h);a[l+"Models"]=c,a[l+"Model"]=c[0]}}),a},h.dataDimToCoordDim=function(t,e){var n=t.dimensions;e=t.getDimension(e);for(var i=0;i<n.length;i++){var r=t.getDimensionInfo(n[i]);if(r.name===e)return r.coordDim}},h.coordDimToDataDim=function(t,e){var n=[];return l(t.dimensions,function(i){var r=t.getDimensionInfo(i);r.coordDim===e&&(n[r.coordDimIndex]=r.name)}),n},h.otherDimToDataDim=function(t,e){var n=[];return l(t.dimensions,function(i){var r=t.getDimensionInfo(i),o=r.otherDims,a=o[e];null!=a&&a!==!1&&(n[a]=r.name)}),n},t.exports=h},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(t,e){var i=new n(2);return null==t&&(t=0),null==e&&(e=0),i[0]=t,i[1]=e,i},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new n(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,n){return t[0]=e,t[1]=n,t},add:function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t},scaleAndAdd:function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},sub:function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t},normalize:function(t,e){var n=i.len(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t},applyTransform:function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t},min:function(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t},max:function(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}};i.length=i.len,i.lengthSquare=i.lenSquare,i.dist=i.distance,i.distSquare=i.distanceSquare,t.exports=i},function(t,e,n){var i=n(1),r=n(4),o=n(16),a={};a.addCommas=function(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))},a.toCamelCase=function(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t},a.normalizeCssArray=function(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t};var s=a.encodeHTML=function(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")},l=["a","b","c","d","e","f","g"],u=function(t,e){return"{"+t+(null==e?"":e)+"}"};a.formatTpl=function(t,e,n){i.isArray(e)||(e=[e]);var r=e.length;if(!r)return"";for(var o=e[0].$vars||[],a=0;a<o.length;a++){var h=l[a],c=u(h,0);t=t.replace(u(h),n?s(c):c)}for(var d=0;d<r;d++)for(var f=0;f<o.length;f++){var c=e[d][o[f]];t=t.replace(u(l[f],d),n?s(c):c)}return t},a.formatTplSimple=function(t,e,n){return i.each(e,function(e,i){t=t.replace("{"+i+"}",n?s(e):e)}),t},a.getTooltipMarker=function(t,e){return t?'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+a.encodeHTML(t)+";"+(e||"")+'"></span>':""};var h=function(t){return t<10?"0"+t:t};a.formatTime=function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=r.parseDate(e),o=n?"UTC":"",a=i["get"+o+"FullYear"](),s=i["get"+o+"Month"]()+1,l=i["get"+o+"Date"](),u=i["get"+o+"Hours"](),c=i["get"+o+"Minutes"](),d=i["get"+o+"Seconds"]();return t=t.replace("MM",h(s)).toLowerCase().replace("yyyy",a).replace("yy",a%100).replace("dd",h(l)).replace("d",l).replace("hh",h(u)).replace("h",u).replace("mm",h(c)).replace("m",c).replace("ss",h(d)).replace("s",d)},a.capitalFirst=function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},a.truncateText=o.truncateText,t.exports=a},function(t,e,n){function i(t){r.call(this,t),this.path=null}var r=n(38),o=n(1),a=n(27),s=n(161),l=n(72),u=l.prototype.getCanvasPattern,h=Math.abs,c=new a((!0));i.prototype={constructor:i,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var n=this.style,i=this.path||c,r=n.hasStroke(),o=n.hasFill(),a=n.fill,s=n.stroke,l=o&&!!a.colorStops,h=r&&!!s.colorStops,d=o&&!!a.image,f=r&&!!s.image;if(n.bind(t,this,e),this.setTransform(t),this.__dirty){var p;l&&(p=p||this.getBoundingRect(),this._fillGradient=n.getGradient(t,a,p)),h&&(p=p||this.getBoundingRect(),this._strokeGradient=n.getGradient(t,s,p))}l?t.fillStyle=this._fillGradient:d&&(t.fillStyle=u.call(a,t)),h?t.strokeStyle=this._strokeGradient:f&&(t.strokeStyle=u.call(s,t));var g=n.lineDash,m=n.lineDashOffset,v=!!t.setLineDash,y=this.getGlobalScale();i.setScale(y[0],y[1]),this.__dirtyPath||g&&!v&&r?(i.beginPath(t),g&&!v&&(i.setLineDash(g),i.setLineDashOffset(m)),this.buildPath(i,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),o&&i.fill(t),g&&v&&(t.setLineDash(g),t.lineDashOffset=m),r&&i.stroke(t),g&&v&&t.setLineDash([]),this.restoreTransform(t),null!=n.text&&this.drawRectText(t,this.getBoundingRect())},buildPath:function(t,e,n){},createPathProxy:function(){this.path=new a},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var i=this.path;i||(i=this.path=new a),this.__dirtyPath&&(i.beginPath(),this.buildPath(i,this.shape,!1)),t=i.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){r.copy(t);var o=e.lineWidth,s=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(o=Math.max(o,this.strokeContainThreshold||4)),s>1e-10&&(r.width+=o/s,r.height+=o/s,r.x-=o/s/2,r.y-=o/s/2)}return r}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path.data;if(r.hasStroke()){var a=r.lineWidth,l=r.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(r.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),s.containStroke(o,a/l,t,e)))return!0}if(r.hasFill())return s.contain(o,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):r.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(o.isObject(t))for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&h(t[0]-1)>1e-10&&h(t[3]-1)>1e-10?Math.sqrt(h(t[0]*t[3]-t[2]*t[1])):1}},i.extend=function(t){var e=function(e){i.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var n=t.shape;if(n){this.shape=this.shape||{};var r=this.shape;for(var o in n)!r.hasOwnProperty(o)&&n.hasOwnProperty(o)&&(r[o]=n[o])}t.init&&t.init.call(this,e)};o.inherits(e,i);for(var n in t)"style"!==n&&"shape"!==n&&(e.prototype[n]=t[n]);return e},o.inherits(i,r),t.exports=i},function(t,e){function n(t){var e={},n={},i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge\/([\d.]+)/),a=/micromessenger/i.test(t);return i&&(n.firefox=!0,n.version=i[1]),r&&(n.ie=!0,n.version=r[1]),o&&(n.edge=!0,n.version=o[1]),a&&(n.weChat=!0),{browser:n,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!n.ie&&!n.edge,pointerEventsSupported:"onpointerdown"in window&&(n.edge||n.ie&&n.version>=11)}}var i={};i="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:n(navigator.userAgent),t.exports=i},function(t,e,n){function i(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}function r(t,e,n){for(var i=0;i<e.length&&(!e[i]||(t=t&&"object"==typeof t?t[e[i]]:null,null!=t));i++);return null==t&&n&&(t=n.get(e)),t}function o(t,e){var n=s.get(t,"getParent");return n?n.call(t,e):t.parentModel}var a=n(1),s=n(15),l=n(9);i.prototype={constructor:i,init:null,mergeOption:function(t){a.merge(this.option,t,!0)},get:function(t,e){return null==t?this.option:r(this.option,this.parsePath(t),!e&&o(this,t))},getShallow:function(t,e){var n=this.option,i=null==n?n:n[t],r=!e&&o(this,t);return null==i&&r&&(i=r.getShallow(t)),i},getModel:function(t,e){var n,a=null==t?this.option:r(this.option,t=this.parsePath(t));return e=e||(n=o(this,t))&&n.getModel(t),new i(a,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){var t=this.constructor;return new t(a.clone(this.option))},setReadOnly:function(t){s.setReadOnly(this,t)},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){s.set(this,"getParent",t)},isAnimationEnabled:function(){if(!l.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},s.enableClassExtend(i);var u=a.mixin;u(i,n(143)),u(i,n(140)),u(i,n(144)),u(i,n(142)),t.exports=i},function(t,e,n){"use strict";function i(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}var r=n(6),o=n(19),a=r.applyTransform,s=Math.min,l=Math.max;i.prototype={constructor:i,union:function(t){var e=s(t.x,this.x),n=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-n,this.x=e,this.y=n},applyTransform:function(){var t=[],e=[],n=[],i=[];return function(r){if(r){t[0]=n[0]=this.x,t[1]=i[1]=this.y,e[0]=i[0]=this.x+this.width,e[1]=n[1]=this.y+this.height,a(t,t,r),a(e,e,r),a(n,n,r),a(i,i,r),this.x=s(t[0],e[0],n[0],i[0]),this.y=s(t[1],e[1],n[1],i[1]);var o=l(t[0],e[0],n[0],i[0]),u=l(t[1],e[1],n[1],i[1]);this.width=o-this.x,this.height=u-this.y}}}(),calculateTransform:function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=o.create();return o.translate(r,r,[-e.x,-e.y]),o.scale(r,r,[n,i]),o.translate(r,r,[t.x,t.y]),
+r},intersect:function(t){if(!t)return!1;t instanceof i||(t=i.create(t));var e=this,n=e.x,r=e.x+e.width,o=e.y,a=e.y+e.height,s=t.x,l=t.x+t.width,u=t.y,h=t.y+t.height;return!(r<s||l<n||a<u||h<o)},contain:function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new i(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},i.create=function(t){return new i(t.x,t.y,t.width,t.height)},t.exports=i},function(t,e,n){"use strict";function i(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,u){var h,c,d=l.position,f=l.getBoundingRect(),p=e.childAt(u+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=f.width+(g?-g.x+f.x:0);h=o+m,h>i||l.newline?(o=0,h=m,a+=s+n,s=f.height):s=Math.max(s,f.height)}else{var v=f.height+(g?-g.y+f.y:0);c=a+v,c>r||l.newline?(o+=s+n,a=0,c=v,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=o,d[1]=a,"horizontal"===t?o=h+n:a=c+n)})}var r=n(1),o=n(11),a=n(4),s=n(7),l=a.parsePercent,u=r.each,h={},c=h.LOCATION_PARAMS=["left","right","top","bottom","width","height"],d=h.HV_NAMES=[["width","left","right"],["height","top","bottom"]];h.box=i,h.vbox=r.curry(i,"vertical"),h.hbox=r.curry(i,"horizontal"),h.getAvailableSize=function(t,e,n){var i=e.width,r=e.height,o=l(t.x,i),a=l(t.y,r),u=l(t.x2,i),h=l(t.y2,r);return(isNaN(o)||isNaN(parseFloat(t.x)))&&(o=0),(isNaN(u)||isNaN(parseFloat(t.x2)))&&(u=i),(isNaN(a)||isNaN(parseFloat(t.y)))&&(a=0),(isNaN(h)||isNaN(parseFloat(t.y2)))&&(h=r),n=s.normalizeCssArray(n||0),{width:Math.max(u-o-n[1]-n[3],0),height:Math.max(h-a-n[0]-n[2],0)}},h.getLayoutRect=function(t,e,n){n=s.normalizeCssArray(n||0);var i=e.width,r=e.height,a=l(t.left,i),u=l(t.top,r),h=l(t.right,i),c=l(t.bottom,r),d=l(t.width,i),f=l(t.height,r),p=n[2]+n[0],g=n[1]+n[3],m=t.aspect;switch(isNaN(d)&&(d=i-h-g-a),isNaN(f)&&(f=r-c-p-u),isNaN(d)&&isNaN(f)&&(m>i/r?d=.8*i:f=.8*r),null!=m&&(isNaN(d)&&(d=m*f),isNaN(f)&&(f=d/m)),isNaN(a)&&(a=i-h-d-g),isNaN(u)&&(u=r-c-f-p),t.left||t.right){case"center":a=i/2-d/2-n[3];break;case"right":a=i-d-g}switch(t.top||t.bottom){case"middle":case"center":u=r/2-f/2-n[0];break;case"bottom":u=r-f-p}a=a||0,u=u||0,isNaN(d)&&(d=i-a-(h||0)),isNaN(f)&&(f=r-u-(c||0));var v=new o(a+n[3],u+n[0],d,f);return v.margin=n,v},h.positionElement=function(t,e,n,i,a){var s=!a||!a.hv||a.hv[0],l=!a||!a.hv||a.hv[1],u=a&&a.boundingMode||"all";if(s||l){var c;if("raw"===u)c="group"===t.type?new o(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(c=t.getBoundingRect(),t.needLocalTransform()){var d=t.getLocalTransform();c=c.clone(),c.applyTransform(d)}e=h.getLayoutRect(r.defaults({width:c.width,height:c.height},e),n,i);var f=t.position,p=s?e.x-c.x:0,g=l?e.y-c.y:0;t.attr("position","raw"===u?[p,g]:[f[0]+p,f[1]+g])}},h.sizeCalculable=function(t,e){return null!=t[d[e][0]]||null!=t[d[e][1]]&&null!=t[d[e][2]]},h.mergeLayoutParam=function(t,e,n){function i(n,i){var r={},s=0,h={},c=0,d=2;if(u(n,function(e){h[e]=t[e]}),u(n,function(t){o(e,t)&&(r[t]=h[t]=e[t]),a(r,t)&&s++,a(h,t)&&c++}),l[i])return a(e,n[1])?h[n[2]]=null:a(e,n[2])&&(h[n[1]]=null),h;if(c!==d&&s){if(s>=d)return r;for(var f=0;f<n.length;f++){var p=n[f];if(!o(r,p)&&o(t,p)){r[p]=t[p];break}}return r}return h}function o(t,e){return t.hasOwnProperty(e)}function a(t,e){return null!=t[e]&&"auto"!==t[e]}function s(t,e,n){u(t,function(t){e[t]=n[t]})}!r.isObject(n)&&(n={});var l=n.ignoreSize;!r.isArray(l)&&(l=[l,l]);var h=i(d[0],0),c=i(d[1],1);s(d[0],t,h),s(d[1],t,c)},h.getLayoutParams=function(t){return h.copyLayoutParams({},t)},h.copyLayoutParams=function(t,e){return e&&t&&u(c,function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t},t.exports=h},function(t,e,n){function i(t){var e=[];return o.each(h.getClassesByMainType(t),function(t){a.apply(e,t.prototype.dependencies||[])}),o.map(e,function(t){return l.parseClassType(t).main})}var r=n(10),o=n(1),a=Array.prototype.push,s=n(49),l=n(15),u=n(12),h=r.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,n,i){r.call(this,t,e,n,i),this.uid=s.getUID("componentModel")},init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?u.getLayoutParams(t):{},r=e.getTheme();o.merge(t,r.get(this.mainType)),o.merge(t,this.getDefaultOption()),n&&u.mergeLayoutParam(t,i,n)},mergeOption:function(t,e){o.merge(this.option,t,!0);var n=this.layoutMode;n&&u.mergeLayoutParam(this.option,t,n)},optionUpdated:function(t,e){},getDefaultOption:function(){if(!l.hasOwn(this,"__defaultOption")){for(var t=[],e=this.constructor;e;){var n=e.prototype.defaultOption;n&&t.push(n),e=e.superClass}for(var i={},r=t.length-1;r>=0;r--)i=o.merge(i,t[r],!0);l.set(this,"__defaultOption",i)}return l.get(this,"__defaultOption")},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});l.enableClassManagement(h,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(h),s.enableTopologicalTravel(h,i),o.mixin(h,n(141)),t.exports=h},function(t,e,n){(function(e){function i(t,e){p.each(v.concat(e.__wrappedMethods||[]),function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t.__wrappedMethods=e.__wrappedMethods}function r(t){this._array=t||[]}function o(t){return p.isArray(t)||(t=[t]),t}function a(t,e){var n=t.dimensions,r=new y(p.map(n,t.getDimensionInfo,t),t.hostModel);i(r,t);for(var o=r._storage={},a=t._storage,s=0;s<n.length;s++){var l=n[s],u=a[l];p.indexOf(e,l)>=0?o[l]=new u.constructor(a[l].length):o[l]=a[l]}return r}var s="undefined",l="undefined"==typeof window?e:window,u=typeof l.Float64Array===s?Array:l.Float64Array,h=typeof l.Int32Array===s?Array:l.Int32Array,c={"float":u,"int":h,ordinal:Array,number:Array,time:Array},d=n(10),f=n(48),p=n(1),g=n(5),m=p.isObject,v=["stackedOn","hasItemOption","_nameList","_idList","_rawData"];r.prototype.pure=!1,r.prototype.count=function(){return this._array.length},r.prototype.getItem=function(t){return this._array[t]};var y=function(t,e){t=t||["x","y"];for(var n={},i=[],r=0;r<t.length;r++){var o,a={};"string"==typeof t[r]?(o=t[r],a={name:o,coordDim:o,coordDimIndex:0,stackable:!1,type:"number"}):(a=t[r],o=a.name,a.type=a.type||"number",a.coordDim||(a.coordDim=o,a.coordDimIndex=0)),a.otherDims=a.otherDims||{},i.push(o),n[o]=a}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this.dataType,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData,this._extent},x=y.prototype;x.type="list",x.hasItemOption=!0,x.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},x.getDimensionInfo=function(t){return p.clone(this._dimensionInfos[this.getDimension(t)])},x.initData=function(t,e,n){t=t||[];var i=p.isArray(t);i&&(t=new r(t)),this._rawData=t;var o,a=this._storage={},s=this.indices=[],l=this.dimensions,u=this._dimensionInfos,h=t.count(),d=[],f={};e=e||[];for(var m=0;m<l.length;m++){var v=u[l[m]];0===v.otherDims.itemName&&(o=m);var y=c[v.type];a[l[m]]=new y(h)}var x=this;n||(x.hasItemOption=!1),n=n||function(t,e,n,i){var r=g.getDataItemValue(t);return g.isDataItemOption(t)&&(x.hasItemOption=!0),g.converDataValue(r instanceof Array?r[i]:r,u[e])};for(var m=0;m<h;m++){for(var _=t.getItem(m),b=0;b<l.length;b++){var w=l[b],M=a[w];M[m]=n(_,w,m,b)}s.push(m)}for(var m=0;m<h;m++){var _=t.getItem(m);!e[m]&&_&&(null!=_.name?e[m]=_.name:null!=o&&(e[m]=a[l[o]][m]));var S=e[m]||"",T=_&&_.id;!T&&S&&(f[S]=f[S]||0,T=S,f[S]>0&&(T+="__ec__"+f[S]),f[S]++),T&&(d[m]=T)}this._nameList=e,this._idList=d},x.count=function(){return this.indices.length},x.get=function(t,e,n){var i=this._storage,r=this.indices[e];if(null==r||!i[t])return NaN;var o=i[t][r];if(n){var a=this._dimensionInfos[t];if(a&&a.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(o>=0&&l>0||o<=0&&l<0)&&(o+=l),s=s.stackedOn}}return o},x.getValues=function(t,e,n){var i=[];p.isArray(t)||(n=e,e=t,t=this.dimensions);for(var r=0,o=t.length;r<o;r++)i.push(this.get(t[r],e,n));return i},x.hasValue=function(t){for(var e=this.dimensions,n=this._dimensionInfos,i=0,r=e.length;i<r;i++)if("ordinal"!==n[e[i]].type&&isNaN(this.get(e[i],t)))return!1;return!0},x.getDataExtent=function(t,e,n){t=this.getDimension(t);var i=this._storage[t],r=this.getDimensionInfo(t);e=r&&r.stackable&&e;var o,a=(this._extent||(this._extent={}))[t+!!e];if(a)return a;if(i){for(var s=1/0,l=-(1/0),u=0,h=this.count();u<h;u++)o=this.get(t,u,e),n&&!n(o,t,u)||(o<s&&(s=o),o>l&&(l=o));return this._extent[t+!!e]=[s,l]}return[1/0,-(1/0)]},x.getSum=function(t,e){var n=this._storage[t],i=0;if(n)for(var r=0,o=this.count();r<o;r++){var a=this.get(t,r,e);isNaN(a)||(i+=a)}return i},x.indexOf=function(t,e){var n=this._storage,i=n[t],r=this.indices;if(i)for(var o=0,a=r.length;o<a;o++){var s=r[o];if(i[s]===e)return o}return-1},x.indexOfName=function(t){for(var e=this.indices,n=this._nameList,i=0,r=e.length;i<r;i++){var o=e[i];if(n[o]===t)return i}return-1},x.indexOfRawIndex=function(t){var e=this.indices,n=e[t];if(null!=n&&n===t)return t;for(var i=0,r=e.length-1;i<=r;){var o=(i+r)/2|0;if(e[o]<t)i=o+1;else{if(!(e[o]>t))return o;r=o-1}}return-1},x.indicesOfNearest=function(t,e,n,i){var r=this._storage,o=r[t],a=[];if(!o)return a;null==i&&(i=1/0);for(var s=Number.MAX_VALUE,l=-1,u=0,h=this.count();u<h;u++){var c=e-this.get(t,u,n),d=Math.abs(c);c<=i&&d<=s&&((d<s||c>=0&&l<0)&&(s=d,l=c,a.length=0),a.push(u))}return a},x.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},x.getRawDataItem=function(t){return this._rawData.getItem(this.getRawIndex(t))},x.getName=function(t){return this._nameList[this.indices[t]]||""},x.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},x.each=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]),t=p.map(o(t),this.getDimension,this);var r=[],a=t.length,s=this.indices;i=i||this;for(var l=0;l<s.length;l++)switch(a){case 0:e.call(i,l);break;case 1:e.call(i,this.get(t[0],l,n),l);break;case 2:e.call(i,this.get(t[0],l,n),this.get(t[1],l,n),l);break;default:for(var u=0;u<a;u++)r[u]=this.get(t[u],l,n);r[u]=l,e.apply(i,r)}},x.filterSelf=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]),t=p.map(o(t),this.getDimension,this);var r=[],a=[],s=t.length,l=this.indices;i=i||this;for(var u=0;u<l.length;u++){var h;if(s)if(1===s)h=e.call(i,this.get(t[0],u,n),u);else{for(var c=0;c<s;c++)a[c]=this.get(t[c],u,n);a[c]=u,h=e.apply(i,a)}else h=e.call(i,u);h&&r.push(l[u])}return this.indices=r,this._extent={},this},x.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n,i),r},x.map=function(t,e,n,i){t=p.map(o(t),this.getDimension,this);var r=a(this,t),s=r.indices=this.indices,l=r._storage,u=[];return this.each(t,function(){var n=arguments[arguments.length-1],i=e&&e.apply(this,arguments);if(null!=i){"number"==typeof i&&(u[0]=i,i=u);for(var r=0;r<i.length;r++){var o=t[r],a=l[o],h=s[n];a&&(a[h]=i[r])}}},n,i),r},x.downSample=function(t,e,n,i){for(var r=a(this,[t]),o=this._storage,s=r._storage,l=this.indices,u=r.indices=[],h=[],c=[],d=Math.floor(1/e),f=s[t],p=this.count(),g=0;g<o[t].length;g++)s[t][g]=o[t][g];for(var g=0;g<p;g+=d){d>p-g&&(d=p-g,h.length=d);for(var m=0;m<d;m++){var v=l[g+m];h[m]=f[v],c[m]=v}var y=n(h),v=c[i(h,y)||0];f[v]=y,u.push(v)}return r},x.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new d(this._rawData.getItem(t),e,e&&e.ecModel)},x.diff=function(t){var e,n=this._idList,i=t&&t._idList,r="e\0\0";return new f(t?t.indices:[],this.indices,function(t){return null!=(e=i[t])?e:r+t},function(t){return null!=(e=n[t])?e:r+t})},x.getVisual=function(t){var e=this._visual;return e&&e[t]},x.setVisual=function(t,e){if(m(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},x.setLayout=function(t,e){if(m(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},x.getLayout=function(t){return this._layout[t]},x.getItemLayout=function(t){return this._itemLayouts[t]},x.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?p.extend(this._itemLayouts[t]||{},e):e},x.clearItemLayouts=function(){this._itemLayouts.length=0},x.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},x.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};if(this._itemVisuals[t]=i,m(e))for(var r in e)e.hasOwnProperty(r)&&(i[r]=e[r]);else i[e]=n},x.clearAllVisual=function(){this._visual={},this._itemVisuals=[]};var _=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};x.setItemGraphicEl=function(t,e){var n=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(_,e)),this._graphicEls[t]=e},x.getItemGraphicEl=function(t){return this._graphicEls[t]},x.eachItemGraphicEl=function(t,e){p.each(this._graphicEls,function(n,i){n&&t&&t.call(e,n,i)})},x.cloneShallow=function(){var t=p.map(this.dimensions,this.getDimensionInfo,this),e=new y(t,this.hostModel);return e._storage=this._storage,i(e,this),e.indices=this.indices.slice(),this._extent&&(e._extent=p.extend({},this._extent)),e},x.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(p.slice(arguments)))})},x.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],x.CHANGABLE_METHODS=["filterSelf"],t.exports=y}).call(e,function(){return this}())},function(t,e,n){function i(t){a.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function r(t,e){var n=a.slice(arguments,2);return this.superClass.prototype[e].apply(t,n)}function o(t,e,n){return this.superClass.prototype[e].apply(t,n)}var a=n(1),s={},l=".",u="___EC__COMPONENT__CONTAINER___",h="\0ec_\0";s.set=function(t,e,n){return t[h+e]=n},s.get=function(t,e){return t[h+e]},s.hasOwn=function(t,e){return t.hasOwnProperty(h+e)};var c=s.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(l),e.main=t[0]||"",e.sub=t[1]||""),e};s.enableClassExtend=function(t,e){t.$constructor=t,t.extend=function(t){var e=this,n=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return a.extend(n.prototype,t),n.extend=this.extend,n.superCall=r,n.superApply=o,a.inherits(n,this),n.superClass=e,n}},s.enableClassManagement=function(t,e){function n(t){var e=r[t.main];return e&&e[u]||(e=r[t.main]={},e[u]=!0),e}e=e||{};var r={};if(t.registerClass=function(t,e){if(e)if(i(e),e=c(e),e.sub){if(e.sub!==u){var o=n(e);o[e.sub]=t}}else r[e.main]=t;return t},t.getClass=function(t,e,n){var i=r[t];if(i&&i[u]&&(i=e?i[e]:null),n&&!i)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return i},t.getClassesByMainType=function(t){t=c(t);var e=[],n=r[t.main];return n&&n[u]?a.each(n,function(t,n){n!==u&&e.push(t)}):e.push(n),e},t.hasClass=function(t){return t=c(t),!!r[t.main]},t.getAllClassMainTypes=function(){var t=[];return a.each(r,function(e,n){t.push(n)}),t},t.hasSubTypes=function(t){t=c(t);var e=r[t.main];return e&&e[u]},t.parseClassType=c,e.registerWhenExtend){var o=t.extend;o&&(t.extend=function(e){var n=o.call(this,e);return t.registerClass(n,e.type)})}return t},s.setReadOnly=function(t,e){},t.exports=s},function(t,e,n){function i(t,e){var n=t+":"+e;if(l[n])return l[n];for(var i=(t+"").split("\n"),r=0,o=0,a=i.length;o<a;o++)r=Math.max(p.measureText(i[o],e).width,r);return u>h&&(u=0,l={}),u++,l[n]=r,r}function r(t,e,n,r){var o=((t||"")+"").split("\n").length,a=i(t,e),s=i("国",e),l=o*s,u=new d(0,0,a,l);switch(u.lineHeight=s,r){case"bottom":case"alphabetic":u.y-=s;break;case"middle":u.y-=s/2}switch(n){case"end":case"right":u.x-=u.width;break;case"center":u.x-=u.width/2}return u}function o(t,e,n,i){var r=e.x,o=e.y,a=e.height,s=e.width,l=n.height,u=n.lineHeight,h=a/2-l/2+u,c="left";switch(t){case"left":r-=i,o+=h,c="right";break;case"right":r+=i+s,o+=h,c="left";break;case"top":r+=s/2,o-=i+l-u,c="center";break;case"bottom":r+=s/2,o+=a+i+u,c="center";break;case"inside":r+=s/2,o+=h,c="center";break;case"insideLeft":r+=i,o+=h,c="left";break;case"insideRight":r+=s-i,o+=h,c="right";break;case"insideTop":r+=s/2,o+=i+u,c="center";break;case"insideBottom":r+=s/2,o+=a-l-i+u,c="center";break;case"insideTopLeft":r+=i,o+=i+u,c="left";break;case"insideTopRight":r+=s-i,o+=i+u,c="right";break;case"insideBottomLeft":r+=i,o+=a-l-i+u;break;case"insideBottomRight":r+=s-i,o+=a-l-i+u,c="right"}return{x:r,y:o,textAlign:c,textBaseline:"alphabetic"}}function a(t,e,n,r,o){if(!e)return"";o=o||{},r=f(r,"...");for(var a=f(o.maxIterations,2),l=f(o.minChar,0),u=i("国",n),h=i("a",n),c=f(o.placeholder,""),d=e=Math.max(0,e-1),p=0;p<l&&d>=h;p++)d-=h;var g=i(r);g>d&&(r="",g=0),d=e-g;for(var m=(t+"").split("\n"),p=0,v=m.length;p<v;p++){var y=m[p],x=i(y,n);if(!(x<=e)){for(var _=0;;_++){if(x<=d||_>=a){y+=r;break}var b=0===_?s(y,d,h,u):x>0?Math.floor(y.length*d/x):0;y=y.substr(0,b),x=i(y,n)}""===y&&(y=c),m[p]=y}}return m.join("\n")}function s(t,e,n,i){for(var r=0,o=0,a=t.length;o<a&&r<e;o++){var s=t.charCodeAt(o);r+=0<=s&&s<=127?n:i}return o}var l={},u=0,h=5e3,c=n(1),d=n(11),f=c.retrieve,p={getWidth:i,getBoundingRect:r,adjustTextPositionOnRect:o,truncateText:a,measureText:function(t,e){var n=c.getContext();return n.font=e||"12px sans-serif",n.measureText(t)}};t.exports=p},function(t,e,n){"use strict";var i=n(1),r=n(7),o=n(15),a=n(5),s=n(13),l=n(62),u=n(9),h=n(12),c=o.set,d=o.get,f=r.encodeHTML,p=r.addCommas,g=s.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.normal.color",layoutMode:null,init:function(t,e,n,i){this.seriesIndex=this.componentIndex,this.mergeDefaultAndTheme(t,n);var r=this.getInitialData(t,n);c(this,"dataBeforeProcessed",r),this.restoreData()},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,r=n?h.getLayoutParams(t):{};i.merge(t,e.getTheme().get(this.subType)),i.merge(t,this.getDefaultOption()),a.defaultEmphasis(t.label,a.LABEL_OPTIONS),this.fillDataTextStyle(t.data),n&&h.mergeLayoutParam(t,r,n)},mergeOption:function(t,e){t=i.merge(this.option,t,!0),this.fillDataTextStyle(t.data);var n=this.layoutMode;n&&h.mergeLayoutParam(this.option,t,n);var r=this.getInitialData(t,e);r&&(c(this,"data",r),c(this,"dataBeforeProcessed",r.cloneShallow()))},fillDataTextStyle:function(t){if(t)for(var e=0;e<t.length;e++)t[e]&&t[e].label&&a.defaultEmphasis(t[e].label,a.LABEL_OPTIONS)},getInitialData:function(){},getData:function(t){var e=d(this,"data");return null==t?e:e.getLinkedData(t)},setData:function(t){c(this,"data",t)},getRawData:function(){return d(this,"dataBeforeProcessed")},coordDimToDataDim:function(t){return a.coordDimToDataDim(this.getData(),t)},dataDimToCoordDim:function(t){return a.dataDimToCoordDim(this.getData(),t)},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,n){function o(n){function o(t,n){var i=s.getDimensionInfo(n);if(i&&i.otherDims.tooltip!==!1){var o=i.type,a=(l?"- "+(i.tooltipName||i.name)+": ":"")+("ordinal"===o?t+"":"time"===o?e?"":r.formatTime("yyyy/MM/dd hh:mm:ss",t):p(t));a&&u.push(f(a))}}var l=i.reduce(n,function(t,e,n){var i=s.getDimensionInfo(n);return t|=i.tooltip!==!1&&null!=i.tooltipName},0),u=[],h=a.otherDimToDataDim(s,"tooltip");return h.length?i.each(h,function(e){o(s.get(e,t),e)}):i.each(n,o),(l?"<br/>":"")+u.join(l?"<br/>":", ")}var s=d(this,"data"),l=this.getRawValue(t),u=i.isArray(l)?o(l):f(p(l)),h=s.getName(t),c=s.getItemVisual(t,"color");i.isObject(c)&&c.colorStops&&(c=(c.colorStops[0]||{}).color),c=c||"transparent";var g=r.getTooltipMarker(c),m=this.name;return"\0-"===m&&(m=""),m=m?f(m)+(e?": ":"<br/>"):"",e?g+m+u:m+g+(h?f(h)+": "+u:u)},isAnimationEnabled:function(){if(u.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){c(this,"data",d(this,"dataBeforeProcessed").cloneShallow())},getColorFromPalette:function(t,e){var n=this.ecModel,i=l.getColorFromPalette.call(this,t,e);return i||(i=n.getColorFromPalette(t,e)),i},getAxisTooltipData:null,getTooltipPosition:null});i.mixin(g,a.dataFormatMixin),i.mixin(g,l),t.exports=g},function(t,e,n){var i=n(149),r=n(43);n(150),n(148);var o=n(34),a=n(4),s=n(1),l=n(16),u={};u.getScaleExtent=function(t,e){var n,i,r,o=t.type,l=e.getMin(),u=e.getMax(),h=null!=l,c=null!=u,d=t.getExtent();return"ordinal"===o?n=(e.get("data")||[]).length:(i=e.get("boundaryGap"),s.isArray(i)||(i=[i||0,i||0]),"boolean"==typeof i[0]&&(i=[0,0]),i[0]=a.parsePercent(i[0],1),i[1]=a.parsePercent(i[1],1),r=d[1]-d[0]||Math.abs(d[0])),null==l&&(l="ordinal"===o?n?0:NaN:d[0]-i[0]*r),null==u&&(u="ordinal"===o?n?n-1:NaN:d[1]+i[1]*r),"dataMin"===l&&(l=d[0]),"dataMax"===u&&(u=d[1]),(null==l||!isFinite(l))&&(l=NaN),(null==u||!isFinite(u))&&(u=NaN),t.setBlank(s.eqNaN(l)||s.eqNaN(u)),e.getNeedCrossZero()&&(l>0&&u>0&&!h&&(l=0),l<0&&u<0&&!c&&(u=0)),[l,u]},u.niceScaleExtent=function(t,e){var n=u.getScaleExtent(t,e),i=null!=e.getMin(),r=null!=e.getMax(),o=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase")),t.setExtent(n[0],n[1]),t.niceExtent({splitNumber:o,fixMin:i,fixMax:r,minInterval:"interval"===t.type?e.get("minInterval"):null});var a=e.get("interval");null!=a&&t.setInterval&&t.setInterval(a)},u.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new i(t.getCategories(),[1/0,-(1/0)]);case"value":return new r;default:return(o.getClass(e)||r).create(t)}},u.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)},u.getAxisLabelInterval=function(t,e,n,i){var r,o=0,a=0,s=1;e.length>40&&(s=Math.floor(e.length/40));for(var u=0;u<t.length;u+=s){var h=t[u],c=l.getBoundingRect(e[u],n,"center","top");c[i?"x":"y"]+=h,c[i?"width":"height"]*=1.3,r?r.intersect(c)?(a++,o=Math.max(o,a)):(r.union(c),a=0):r=c.clone()}return 0===o&&s>1?s:(o+1)*s-1},u.getFormattedLabels=function(t,e){var n=t.scale,i=n.getTicksLabels(),r=n.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),s.map(i,e)):"function"==typeof e?s.map(r,function(n,i){return e(u.getAxisRawValue(t,n),i)},this):i},u.getAxisRawValue=function(t,e){return"category"===t.type?t.scale.getLabel(e):e},t.exports=u},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(){var t=new n(6);return i.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t},translate:function(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t},rotate:function(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t},scale:function(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t},invert:function(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}};t.exports=i},function(t,e,n){"use strict";function i(t){return t>-w&&t<w}function r(t){return t>w||t<-w}function o(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function a(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function s(t,e,n,r,o,a){var s=r+3*(e-n)-t,l=3*(n-2*e+t),u=3*(e-t),h=t-o,c=l*l-3*s*u,d=l*u-9*s*h,f=u*u-3*l*h,p=0;if(i(c)&&i(d))if(i(l))a[0]=0;else{var g=-u/l;g>=0&&g<=1&&(a[p++]=g)}else{var m=d*d-4*c*f;if(i(m)){var v=d/c,g=-l/s+v,y=-v/2;g>=0&&g<=1&&(a[p++]=g),y>=0&&y<=1&&(a[p++]=y)}else if(m>0){var x=b(m),w=c*l+1.5*s*(-d+x),M=c*l+1.5*s*(-d-x);w=w<0?-_(-w,T):_(w,T),M=M<0?-_(-M,T):_(M,T);var g=(-l-(w+M))/(3*s);g>=0&&g<=1&&(a[p++]=g)}else{var A=(2*c*l-3*s*d)/(2*b(c*c*c)),I=Math.acos(A)/3,C=b(c),P=Math.cos(I),g=(-l-2*C*P)/(3*s),y=(-l+C*(P+S*Math.sin(I)))/(3*s),D=(-l+C*(P-S*Math.sin(I)))/(3*s);g>=0&&g<=1&&(a[p++]=g),y>=0&&y<=1&&(a[p++]=y),D>=0&&D<=1&&(a[p++]=D)}}return p}function l(t,e,n,o,a){var s=6*n-12*e+6*t,l=9*e+3*o-3*t-9*n,u=3*e-3*t,h=0;if(i(l)){if(r(s)){var c=-u/s;c>=0&&c<=1&&(a[h++]=c)}}else{var d=s*s-4*l*u;if(i(d))a[0]=-s/(2*l);else if(d>0){var f=b(d),c=(-s+f)/(2*l),p=(-s-f)/(2*l);c>=0&&c<=1&&(a[h++]=c),p>=0&&p<=1&&(a[h++]=p)}}return h}function u(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function h(t,e,n,i,r,a,s,l,u,h,c){var d,f,p,g,m,v=.005,y=1/0;A[0]=u,A[1]=h;for(var _=0;_<1;_+=.05)I[0]=o(t,n,r,s,_),I[1]=o(e,i,a,l,_),g=x(A,I),g<y&&(d=_,y=g);y=1/0;for(var w=0;w<32&&!(v<M);w++)f=d-v,p=d+v,I[0]=o(t,n,r,s,f),I[1]=o(e,i,a,l,f),g=x(I,A),f>=0&&g<y?(d=f,y=g):(C[0]=o(t,n,r,s,p),C[1]=o(e,i,a,l,p),m=x(C,A),p<=1&&m<y?(d=p,y=m):v*=.5);return c&&(c[0]=o(t,n,r,s,d),c[1]=o(e,i,a,l,d)),b(y)}function c(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function d(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function f(t,e,n,o,a){var s=t-2*e+n,l=2*(e-t),u=t-o,h=0;if(i(s)){if(r(l)){var c=-u/l;c>=0&&c<=1&&(a[h++]=c)}}else{var d=l*l-4*s*u;if(i(d)){var c=-l/(2*s);c>=0&&c<=1&&(a[h++]=c)}else if(d>0){var f=b(d),c=(-l+f)/(2*s),p=(-l-f)/(2*s);c>=0&&c<=1&&(a[h++]=c),p>=0&&p<=1&&(a[h++]=p)}}return h}function p(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function g(t,e,n,i,r){var o=(e-t)*i+t,a=(n-e)*i+e,s=(a-o)*i+o;r[0]=t,r[1]=o,r[2]=s,r[3]=s,r[4]=a,r[5]=n}function m(t,e,n,i,r,o,a,s,l){var u,h=.005,d=1/0;A[0]=a,A[1]=s;for(var f=0;f<1;f+=.05){I[0]=c(t,n,r,f),I[1]=c(e,i,o,f);var p=x(A,I);p<d&&(u=f,d=p)}d=1/0;for(var g=0;g<32&&!(h<M);g++){var m=u-h,v=u+h;I[0]=c(t,n,r,m),I[1]=c(e,i,o,m);var p=x(I,A);if(m>=0&&p<d)u=m,d=p;else{C[0]=c(t,n,r,v),C[1]=c(e,i,o,v);var y=x(C,A);v<=1&&y<d?(u=v,d=y):h*=.5}}return l&&(l[0]=c(t,n,r,u),l[1]=c(e,i,o,u)),b(d)}var v=n(6),y=v.create,x=v.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,M=1e-4,S=b(3),T=1/3,A=y(),I=y(),C=y();t.exports={cubicAt:o,cubicDerivativeAt:a,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:u,cubicProjectPoint:h,quadraticAt:c,quadraticDerivativeAt:d,quadraticRootAt:f,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:m}},function(t,e,n){"use strict";function i(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function r(t,e,n,i){return n=n||{},i||!h.canvasSupported?o(t,e,n):h.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):o(t,e,n),n}function o(t,e,n){var r=i(t);n.zrX=e.clientX-r.left,n.zrY=e.clientY-r.top}function a(t,e,n){if(e=e||window.event,null!=e.zrX)return e;var i=e.type,o=i&&i.indexOf("touch")>=0;if(o){var a="touchend"!=i?e.targetTouches[0]:e.changedTouches[0];a&&r(t,a,e,n)}else r(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;return e}function s(t,e,n){c?t.addEventListener(e,n):t.attachEvent("on"+e,n)}function l(t,e,n){c?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}var u=n(23),h=n(9),c="undefined"!=typeof window&&!!window.addEventListener,d=c?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={clientToLocal:r,normalizeEvent:a,addEventListener:s,removeEventListener:l,stop:d,Dispatcher:u}},function(t,e,n){function i(t){return t=Math.round(t),t<0?0:t>255?255:t}function r(t){return t=Math.round(t),t<0?0:t>360?360:t}function o(t){return t<0?0:t>1?1:t}function a(t){return i(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function s(t){return o(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function l(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function u(t,e,n){return t+(e-t)*n}function h(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function c(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function d(t,e){A&&c(A,e),A=T.put(t,A||e.slice())}function f(t,e){if(t){e=e||[];var n=T.get(t);if(n)return c(e,n);t+="";var i=t.replace(/ /g,"").toLowerCase();if(i in S)return c(e,S[i]),d(t,e),e;if("#"!==i.charAt(0)){var r=i.indexOf("("),o=i.indexOf(")");if(r!==-1&&o+1===i.length){var l=i.substr(0,r),u=i.substr(r+1,o-(r+1)).split(","),f=1;switch(l){case"rgba":if(4!==u.length)return void h(e,0,0,0,1);f=s(u.pop());case"rgb":return 3!==u.length?void h(e,0,0,0,1):(h(e,a(u[0]),a(u[1]),a(u[2]),f),d(t,e),e);case"hsla":return 4!==u.length?void h(e,0,0,0,1):(u[3]=s(u[3]),p(u,e),d(t,e),e);case"hsl":return 3!==u.length?void h(e,0,0,0,1):(p(u,e),d(t,e),e);default:return}}h(e,0,0,0,1)}else{if(4===i.length){var g=parseInt(i.substr(1),16);return g>=0&&g<=4095?(h(e,(3840&g)>>4|(3840&g)>>8,240&g|(240&g)>>4,15&g|(15&g)<<4,1),d(t,e),e):void h(e,0,0,0,1)}if(7===i.length){var g=parseInt(i.substr(1),16);return g>=0&&g<=16777215?(h(e,(16711680&g)>>16,(65280&g)>>8,255&g,1),d(t,e),e):void h(e,0,0,0,1)}}}}function p(t,e){var n=(parseFloat(t[0])%360+360)%360/360,r=s(t[1]),o=s(t[2]),a=o<=.5?o*(r+1):o+r-o*r,u=2*o-a;return e=e||[],h(e,i(255*l(u,a,n+1/3)),i(255*l(u,a,n)),i(255*l(u,a,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function g(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,d=((s-o)/6+l/2)/l;i===s?e=d-c:r===s?e=1/3+h-d:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var f=[360*e,n,u];return null!=t[3]&&f.push(t[3]),f}}function m(t,e){var n=f(t);if(n){for(var i=0;i<3;i++)e<0?n[i]=n[i]*(1-e)|0:n[i]=(255-n[i])*e+n[i]|0;return w(n,4===n.length?"rgba":"rgb")}}function v(t,e){var n=f(t);if(n)return((1<<24)+(n[0]<<16)+(n[1]<<8)+ +n[2]).toString(16).slice(1)}function y(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var r=t*(e.length-1),a=Math.floor(r),s=Math.ceil(r),l=e[a],h=e[s],c=r-a;return n[0]=i(u(l[0],h[0],c)),n[1]=i(u(l[1],h[1],c)),n[2]=i(u(l[2],h[2],c)),n[3]=o(u(l[3],h[3],c)),n}}function x(t,e,n){if(e&&e.length&&t>=0&&t<=1){var r=t*(e.length-1),a=Math.floor(r),s=Math.ceil(r),l=f(e[a]),h=f(e[s]),c=r-a,d=w([i(u(l[0],h[0],c)),i(u(l[1],h[1],c)),i(u(l[2],h[2],c)),o(u(l[3],h[3],c))],"rgba");return n?{color:d,leftIndex:a,rightIndex:s,value:r}:d}}function _(t,e,n,i){if(t=f(t))return t=g(t),null!=e&&(t[0]=r(e)),null!=n&&(t[1]=s(n)),null!=i&&(t[2]=s(i)),w(p(t),"rgba")}function b(t,e){if(t=f(t),t&&null!=e)return t[3]=o(e),w(t,"rgba")}function w(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}var M=n(70),S={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],
+darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},T=new M(20),A=null;t.exports={parse:f,lift:m,toHex:v,fastMapToColor:y,mapToColor:x,modifyHSL:_,modifyAlpha:b,stringify:w}},function(t,e){var n=Array.prototype.slice,i=function(){this._$handlers={}};i.prototype={constructor:i,one:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!0,ctx:n||this}),this},on:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!1,ctx:n||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var n=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,o=n[t].length;r<o;r++)n[t][r].h!=e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>3&&(e=n.call(e,1));for(var r=this._$handlers[t],o=r.length,a=0;a<o;){switch(i){case 1:r[a].h.call(r[a].ctx);break;case 2:r[a].h.call(r[a].ctx,e[1]);break;case 3:r[a].h.call(r[a].ctx,e[1],e[2]);break;default:r[a].h.apply(r[a].ctx,e)}r[a].one?(r.splice(a,1),o--):a++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>4&&(e=n.call(e,1,e.length-1));for(var r=e[e.length-1],o=this._$handlers[t],a=o.length,s=0;s<a;){switch(i){case 1:o[s].h.call(r);break;case 2:o[s].h.call(r,e[1]);break;case 3:o[s].h.call(r,e[1],e[2]);break;default:o[s].h.apply(r,e)}o[s].one?(o.splice(s,1),a--):s++}}return this}},t.exports=i},function(t,e,n){"use strict";var i=n(3),r=n(11),o=i.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i+o),t.lineTo(n-r,i+o),t.closePath()}}),a=i.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i),t.lineTo(n,i+o),t.lineTo(n-r,i),t.closePath()}}),s=i.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=i-o+a+s,u=Math.asin(s/a),h=Math.cos(u)*a,c=Math.sin(u),d=Math.cos(u);t.arc(n,l,a,Math.PI-u,2*Math.PI+u);var f=.6*a,p=.7*a;t.bezierCurveTo(n+h-c*f,l+s+d*f,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-h+c*f,l+s+d*f,n-h,l+s),t.closePath()}}),l=i.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,o=e.y,a=i/3*2;t.moveTo(r,o),t.lineTo(r+a,o+n),t.lineTo(r,o+n/4*3),t.lineTo(r-a,o+n),t.lineTo(r,o),t.closePath()}}),u={line:i.Line,rect:i.Rect,roundRect:i.Rect,square:i.Rect,circle:i.Circle,diamond:a,pin:s,arrow:l,triangle:o},h={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var o=Math.min(n,i);r.x=t,r.y=e,r.width=o,r.height=o},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},c={};for(var d in u)u.hasOwnProperty(d)&&(c[d]=new u[d]);var f=i.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,n){var i=e.symbolType,r=c[i];"none"!==e.symbolType&&(r||(i="rect",r=c[i]),h[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n))}}),p=function(t){if("image"!==this.type){var e=this.style,n=this.shape;n&&"line"===n.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty(!1)}},g={createSymbol:function(t,e,n,o,a,s){var l=0===t.indexOf("empty");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var u;return u=0===t.indexOf("image://")?new i.Image({style:{image:t.slice(8),x:e,y:n,width:o,height:a}}):0===t.indexOf("path://")?i.makePath(t.slice(7),{},new r(e,n,o,a)):new f({shape:{symbolType:t,x:e,y:n,width:o,height:a}}),u.__isEmptyBrush=l,u.setColor=p,u.setColor(s),u}};t.exports=g},function(t,e,n){function i(t,e,n){function i(t,e,n){c[e]?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,m.set(e,!0))}function a(t,e,n){if(n||null!=e.get(t)){for(var i=0;null!=e.get(t+i);)i++;t+=i}return e.set(t,!0),t}e=e||[],n=n||{},t=(t||[]).slice();var f=(n.dimsDef||[]).slice(),p=o.createHashMap(n.encodeDef),g=o.createHashMap(),m=o.createHashMap(),v=[],y=n.dimCount;if(null==y){var x=r(e[0]);y=Math.max(o.isArray(x)&&x.length||1,t.length,f.length),s(t,function(t){var e=t.dimsDef;e&&(y=Math.max(y,e.length))})}for(var _=0;_<y;_++){var b=l(f[_])?{name:f[_]}:f[_]||{},w=b.name,M=v[_]={otherDims:{}};null!=w&&null==g.get(w)&&(M.name=M.tooltipName=w,g.set(w,_)),null!=b.type&&(M.type=b.type)}p.each(function(t,e){t=p.set(e,h(t).slice()),s(t,function(n,r){l(n)&&(n=g.get(n)),null!=n&&n<y&&(t[r]=n,i(v[n],e,r))})});var S=0;s(t,function(t,e){var n,t,r,a;l(t)?(n=t,t={}):(n=t.name,t=o.clone(t),r=t.dimsDef,a=t.otherDims,t.name=t.coordDim=t.coordDimIndex=t.dimsDef=t.otherDims=null);var c=h(p.get(n));if(!c.length)for(var d=0;d<(r&&r.length||1);d++){for(;S<v.length&&null!=v[S].coordDim;)S++;S<v.length&&c.push(S++)}s(c,function(e,o){var s=v[e];i(u(s,t),n,o),null==s.name&&r&&(s.name=s.tooltipName=r[o]),a&&u(s.otherDims,a)})});for(var T=n.extraPrefix||"value",A=0;A<y;A++){var M=v[A]=v[A]||{},I=M.coordDim;null==I&&(M.coordDim=a(T,m,n.extraFromZero),M.coordDimIndex=0,M.isExtraCoord=!0),null==M.name&&(M.name=a(M.coordDim,g)),null==M.type&&d(e,A)&&(M.type="ordinal")}return v}function r(t){return o.isArray(t)?t:o.isObject(t)?t.value:t}var o=n(1),a=n(5),s=o.each,l=o.isString,u=o.defaults,h=a.normalizeToArray,c={tooltip:1,label:1,itemName:1},d=i.guessOrdinal=function(t,e){for(var n=0,i=t.length;n<i;n++){var a=r(t[n]);if(!o.isArray(a))return!1;var a=a[e];if(null!=a&&isFinite(a))return!1;if(l(a)&&"-"!==a)return!0}return!1};t.exports=i},function(t,e,n){"use strict";function i(){this._coordinateSystems=[]}var r=n(1),o={};i.prototype={constructor:i,create:function(t,e){var n=[];r.each(o,function(i,r){var o=i.create(t,e);n=n.concat(o||[])}),this._coordinateSystems=n},update:function(t,e){r.each(this._coordinateSystems,function(n){n.update&&n.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},i.register=function(t,e){o[t]=e},i.get=function(t){return o[t]},t.exports=i},function(t,e,n){"use strict";var i=n(20),r=n(6),o=n(85),a=n(11),s=n(35).devicePixelRatio,l={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},u=[],h=[],c=[],d=[],f=Math.min,p=Math.max,g=Math.cos,m=Math.sin,v=Math.sqrt,y=Math.abs,x="undefined"!=typeof Float32Array,_=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};_.prototype={constructor:_,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=y(1/s/t)||0,this._uy=y(1/s/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(l.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var n=y(t-this._xi)>this._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(l.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,o){return this.addData(l.C,t,e,n,i,r,o),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,o):this._ctx.bezierCurveTo(t,e,n,i,r,o)),this._xi=r,this._yi=o,this},quadraticCurveTo:function(t,e,n,i){return this.addData(l.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,o){return this.addData(l.A,t,e,n,n,i,r-i,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=g(r)*n+t,this._yi=m(r)*n+t,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(l.R,t,e,n,i),this},closePath:function(){this.addData(l.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!x||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();x&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(var r=0;r<e;r++)for(var o=t[r].data,a=0;a<o.length;a++)this.data[i++]=o[a];this._len=i},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var n=0;n<arguments.length;n++)e[this._len++]=arguments[n];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var n,i,r=this._dashSum,o=this._dashOffset,a=this._lineDash,s=this._ctx,l=this._xi,u=this._yi,h=t-l,c=e-u,d=v(h*h+c*c),g=l,m=u,y=a.length;for(h/=d,c/=d,o<0&&(o=r+o),o%=r,g-=o*h,m-=o*c;h>0&&g<=t||h<0&&g>=t||0==h&&(c>0&&m<=e||c<0&&m>=e);)i=this._dashIdx,n=a[i],g+=h*n,m+=c*n,this._dashIdx=(i+1)%y,h>0&&g<l||h<0&&g>l||c>0&&m<u||c<0&&m>u||s[i%2?"moveTo":"lineTo"](h>=0?f(g,t):p(g,t),c>=0?f(m,e):p(m,e));h=g-t,c=m-e,this._dashOffset=-v(h*h+c*c)},_dashedBezierTo:function(t,e,n,r,o,a){var s,l,u,h,c,d=this._dashSum,f=this._dashOffset,p=this._lineDash,g=this._ctx,m=this._xi,y=this._yi,x=i.cubicAt,_=0,b=this._dashIdx,w=p.length,M=0;for(f<0&&(f=d+f),f%=d,s=0;s<1;s+=.1)l=x(m,t,n,o,s+.1)-x(m,t,n,o,s),u=x(y,e,r,a,s+.1)-x(y,e,r,a,s),_+=v(l*l+u*u);for(;b<w&&(M+=p[b],!(M>f));b++);for(s=(M-f)/_;s<=1;)h=x(m,t,n,o,s),c=x(y,e,r,a,s),b%2?g.moveTo(h,c):g.lineTo(h,c),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(o,a),l=o-h,u=a-c,this._dashOffset=-v(l*l+u*u)},_dashedQuadraticTo:function(t,e,n,i){var r=n,o=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,o)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,x&&(this.data=new Float32Array(t)))},getBoundingRect:function(){u[0]=u[1]=c[0]=c[1]=Number.MAX_VALUE,h[0]=h[1]=d[0]=d[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,n=0,i=0,s=0,f=0;f<t.length;){var p=t[f++];switch(1==f&&(e=t[f],n=t[f+1],i=e,s=n),p){case l.M:i=t[f++],s=t[f++],e=i,n=s,c[0]=i,c[1]=s,d[0]=i,d[1]=s;break;case l.L:o.fromLine(e,n,t[f],t[f+1],c,d),e=t[f++],n=t[f++];break;case l.C:o.fromCubic(e,n,t[f++],t[f++],t[f++],t[f++],t[f],t[f+1],c,d),e=t[f++],n=t[f++];break;case l.Q:o.fromQuadratic(e,n,t[f++],t[f++],t[f],t[f+1],c,d),e=t[f++],n=t[f++];break;case l.A:var v=t[f++],y=t[f++],x=t[f++],_=t[f++],b=t[f++],w=t[f++]+b,M=(t[f++],1-t[f++]);1==f&&(i=g(b)*x+v,s=m(b)*_+y),o.fromArc(v,y,x,_,b,w,M,c,d),e=g(w)*x+v,n=m(w)*_+y;break;case l.R:i=e=t[f++],s=n=t[f++];var S=t[f++],T=t[f++];o.fromLine(i,s,i+S,s+T,c,d);break;case l.Z:e=i,n=s}r.min(u,u,c),r.max(h,h,d)}return 0===f&&(u[0]=u[1]=h[0]=h[1]=0),new a(u[0],u[1],h[0]-u[0],h[1]-u[1])},rebuildPath:function(t){for(var e,n,i,r,o,a,s=this.data,u=this._ux,h=this._uy,c=this._len,d=0;d<c;){var f=s[d++];switch(1==d&&(i=s[d],r=s[d+1],e=i,n=r),f){case l.M:e=i=s[d++],n=r=s[d++],t.moveTo(i,r);break;case l.L:o=s[d++],a=s[d++],(y(o-i)>u||y(a-r)>h||d===c-1)&&(t.lineTo(o,a),i=o,r=a);break;case l.C:t.bezierCurveTo(s[d++],s[d++],s[d++],s[d++],s[d++],s[d++]),i=s[d-2],r=s[d-1];break;case l.Q:t.quadraticCurveTo(s[d++],s[d++],s[d++],s[d++]),i=s[d-2],r=s[d-1];break;case l.A:var p=s[d++],v=s[d++],x=s[d++],_=s[d++],b=s[d++],w=s[d++],M=s[d++],S=s[d++],T=x>_?x:_,A=x>_?1:x/_,I=x>_?_/x:1,C=Math.abs(x-_)>.001,P=b+w;C?(t.translate(p,v),t.rotate(M),t.scale(A,I),t.arc(0,0,T,b,P,1-S),t.scale(1/A,1/I),t.rotate(-M),t.translate(-p,-v)):t.arc(p,v,T,b,P,1-S),1==d&&(e=g(b)*x+p,n=m(b)*_+v),i=g(P)*x+p,r=m(P)*_+v;break;case l.R:e=i=s[d],n=r=s[d+1],t.rect(s[d++],s[d++],s[d++],s[d++]);break;case l.Z:t.closePath(),i=e,r=n}}}},_.CMD=l,t.exports=_},function(t,e,n){"use strict";function i(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function r(t){var e=i(t);return null!=e&&!c.isArray(p(e))}function o(t,e,n){t=t||[];var i=e.get("coordinateSystem"),o=m[i],a=f.get(i),s={encodeDef:e.get("encode"),dimsDef:e.get("dimensions")},v=o&&o(t,e,n,s),y=v&&v.dimensions;y||(y=a&&(a.getDimensionsInfo?a.getDimensionsInfo():a.dimensions.slice())||["x","y"],y=h(y,t,s));var x=v?v.categoryIndex:-1,_=new u(y,e),b=l(v,t),w={},M=x>=0&&r(t)?function(t,e,n,i){return d.isDataItemOption(t)&&(_.hasItemOption=!0),i===x?n:g(p(t),y[i])}:function(t,e,n,i){var r=p(t),o=g(r&&r[i],y[i]);d.isDataItemOption(t)&&(_.hasItemOption=!0);var a=v&&v.categoryAxesModels;return a&&a[e]&&"string"==typeof o&&(w[e]=w[e]||a[e].getCategories(),o=c.indexOf(w[e],o),o<0&&!isNaN(o)&&(o=+o)),o};return _.hasItemOption=!1,_.initData(t,b,M),_}function a(t){return"category"!==t&&"time"!==t}function s(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function l(t,e){var n,i=[],r=t&&t.dimensions[t.categoryIndex];if(r&&(n=t.categoryAxesModels[r.name]),n){var o=n.getCategories();if(o){var a=e.length;if(c.isArray(e[0])&&e[0].length>1){i=[];for(var s=0;s<a;s++)i[s]=o[e[s][t.categoryIndex||0]]}else i=o.slice(0)}}return i}var u=n(14),h=n(25),c=n(1),d=n(5),f=n(26),p=d.getDataItemValue,g=d.converDataValue,m={cartesian2d:function(t,e,n,i){var r=c.map(["xAxis","yAxis"],function(t){return n.queryComponents({mainType:t,index:e.get(t+"Index"),id:e.get(t+"Id")})[0]}),o=r[0],l=r[1],u=o.get("type"),d=l.get("type"),f=[{name:"x",type:s(u),stackable:a(u)},{name:"y",type:s(d),stackable:a(d)}],p="category"===u,g="category"===d;f=h(f,t,i);var m={};return p&&(m.x=o),g&&(m.y=l),{dimensions:f,categoryIndex:p?0:g?1:-1,categoryAxesModels:m}},singleAxis:function(t,e,n,i){var r=n.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0],o=r.get("type"),l="category"===o,u=[{name:"single",type:s(o),stackable:a(o)}];u=h(u,t,i);var c={};return l&&(c.single=r),{dimensions:u,categoryIndex:l?0:-1,categoryAxesModels:c}},polar:function(t,e,n,i){var r=n.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0],o=r.findAxisModel("angleAxis"),l=r.findAxisModel("radiusAxis"),u=l.get("type"),c=o.get("type"),d=[{name:"radius",type:s(u),stackable:a(u)},{name:"angle",type:s(c),stackable:a(c)}],f="category"===c,p="category"===u;d=h(d,t,i);var g={};return p&&(g.radius=l),f&&(g.angle=o),{dimensions:d,categoryIndex:f?1:p?0:-1,categoryAxesModels:g}},geo:function(t,e,n,i){return{dimensions:h([{name:"lng"},{name:"lat"}],t,i)}}};t.exports=o},function(t,e){"use strict";var n={};t.exports={register:function(t,e){n[t]=e},get:function(t){return n[t]}}},function(t,e,n){function i(){this.group=new a,this.uid=s.getUID("viewChart")}function r(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var n=0;n<t.childCount();n++)r(t.childAt(n),e)}function o(t,e,n){var i=u.queryDataIndex(t,e);null!=i?h.each(u.normalizeToArray(i),function(e){r(t.getItemGraphicEl(e),n)}):t.eachItemGraphicEl(function(t){r(t,n)})}var a=n(36),s=n(49),l=n(15),u=n(5),h=n(1);i.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){o(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){o(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){}};var c=i.prototype;c.updateView=c.updateLayout=c.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},l.enableClassExtend(i,["dispose"]),l.enableClassManagement(i,{registerWhenExtend:!0}),t.exports=i},function(t,e,n){var i=n(1);t.exports=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e,n){for(var r={},o=0;o<t.length;o++){var a=t[o][1];if(!(e&&i.indexOf(e,a)>=0||n&&i.indexOf(n,a)<0)){var s=this.getShallow(a);null!=s&&(r[t[o][0]]=s)}}return r}}},function(t,e,n){"use strict";var i=n(3),r=n(1),o=n(2);n(57),n(117),o.extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new i.Rect({shape:t.coordinateSystem.getRect(),style:r.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),o.registerPreprocessor(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})})},function(t,e,n){function i(t,e){var n=t[1]-t[0],i=e,r=n/i/2;t[0]+=r,t[1]-=r}var r=n(4),o=r.linearMap,a=n(1),s=n(18),l=[0,1],u=function(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1,this._labelInterval};u.prototype={constructor:u,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return r.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,r=this.scale;return t=r.normalize(t),this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count())),o(t,l,n,e)},coordToData:function(t,e){var n=this._extent,r=this.scale;this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count()));var a=o(t,n,l,e);return this.scale.scale(a)},pointToData:function(t,e){},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),n=[],i=0;i<e.length;i++)n.push(e[i][0]);return e[i-1]&&n.push(e[i-1][1]),n}return a.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return a.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],n=this.scale.count(),i=t[0],r=t[1],o=r-i,a=0;a<n;a++)e.push([o*a/n+i,o*(a+1)/n+i]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},getLabelInterval:function(){var t=this._labelInterval;if(!t){var e=this.model,n=e.getModel("axisLabel"),i=n.get("interval");"category"!==this.type||"auto"!==i?t="auto"===i?0:i:this.isHorizontal&&(t=s.getAxisLabelInterval(a.map(this.scale.getTicks(),this.dataToCoord,this),e.getFormattedLabels(),n.getModel("textStyle").getFont(),this.isHorizontal())),this._labelInterval=t}return t}},t.exports=u},function(t,e,n){function i(t){this._setting=t||{},this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var r=n(15),o=i.prototype;o.parse=function(t){return t},o.getSetting=function(t){return this._setting[t]},o.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},o.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},o.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},o.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},o.unionExtentFromData=function(t,e){this.unionExtent(t.getDataExtent(e,!0))},o.getExtent=function(){return this._extent.slice()},o.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},o.getTicksLabels=function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},o.isBlank=function(){return this._isBlank},o.setBlank=function(t){this._isBlank=t},r.enableClassExtend(i),r.enableClassManagement(i,{registerWhenExtend:!0}),t.exports=i},function(t,e){var n=1;"undefined"!=typeof window&&(n=Math.max(window.devicePixelRatio||1,1));var i={debugMode:0,devicePixelRatio:n};t.exports=i},function(t,e,n){var i=n(1),r=n(66),o=n(11),a=function(t){t=t||{},r.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};a.prototype={constructor:a,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof a&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,r=this._children,o=i.indexOf(r,t);return o<0?this:(r.splice(o,1),t.parent=null,n&&(n.delFromStorage(t),t instanceof a&&t.delChildrenFromStorage(n)),e&&e.refresh(),this)},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;e<n.length;e++)t=n[e],i&&(i.delFromStorage(t),t instanceof a&&t.delChildrenFromStorage(i)),t.parent=null;return n.length=0,this},eachChild:function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},traverse:function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n];t.call(e,i),"group"===i.type&&i.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.addToStorage(n),n instanceof a&&n.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.delFromStorage(n),n instanceof a&&n.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,n=new o(0,0,0,0),i=t||this._children,r=[],a=0;a<i.length;a++){var s=i[a];if(!s.ignore&&!s.invisible){var l=s.getBoundingRect(),u=s.getLocalTransform(r);u?(n.copy(l),n.applyTransform(u),e=e||n.clone(),e.union(n)):(e=e||l.clone(),e.union(l))}}return e||n}},i.inherits(a,r),t.exports=a},function(t,e){var n={},i="\0__throttleOriginMethod",r="\0__throttleRate",o="\0__throttleType";n.throttle=function(t,e,n){function i(){h=(new Date).getTime(),c=null,t.apply(a,s||[])}var r,o,a,s,l,u=0,h=0,c=null;e=e||0;var d=function(){r=(new Date).getTime(),a=this,s=arguments;var t=l||e,d=l||n;l=null,o=r-(d?u:h)-t,clearTimeout(c),d?c=setTimeout(i,t):o>=0?i():c=setTimeout(i,-o),u=r};return d.clear=function(){c&&(clearTimeout(c),c=null)},d.debounceNextCall=function(t){l=t},d},n.createOrUpdate=function(t,e,a,s){var l=t[e];if(l){var u=l[i]||l,h=l[o],c=l[r];if(c!==a||h!==s){if(null==a||!s)return t[e]=u;l=t[e]=n.throttle(u,a,"debounce"===s),l[i]=u,l[o]=s,l[r]=a}return l}},n.clear=function(t,e){var n=t[e];n&&n[i]&&(t[e]=n[i])},t.exports=n},function(t,e,n){function i(t){t=t||{},a.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new o(t.style),this._rect=null,this.__clipPaths=[]}var r=n(1),o=n(73),a=n(66),s=n(87);i.prototype={constructor:i,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return i.contain(n[0],n[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?a.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new o(t),this.dirty(!1),this}},r.inherits(i,a),r.mixin(i,s),t.exports=i},function(t,e){var n=function(t){this.colorStops=t||[]};n.prototype={constructor:n,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=n},function(t,e,n){function i(t){var e={componentType:t.mainType};return e[t.mainType+"Index"]=t.componentIndex,e}function r(t,e,n,i){var r,o,a=f(n-t.rotation),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;return p(a-x/2)?(o=l?"bottom":"top",r="center"):p(a-1.5*x)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*x&&a>x/2?l?"left":"right":l?"right":"left"),{rotation:a,textAlign:r,textVerticalAlign:o}}function o(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function a(t,e){var n=t.get("axisLabel.showMinLabel"),i=t.get("axisLabel.showMaxLabel"),r=e[0],o=e[1],a=e[e.length-1],l=e[e.length-2];n===!1?r.ignore=!0:null!=t.getMin()&&s(r,o)&&(n?o.ignore=!0:r.ignore=!0),i===!1?a.ignore=!0:null!=t.getMax()&&s(l,a)&&(i?l.ignore=!0:a.ignore=!0)}function s(t,e,n){var i=t&&t.getBoundingRect().clone(),r=e&&e.getBoundingRect().clone();if(i&&r){var o=m.identity([]);return m.rotate(o,o,-t.rotation),i.applyTransform(m.mul([],o,t.getLocalTransform())),r.applyTransform(m.mul([],o,e.getLocalTransform())),i.intersect(r)}}var l=n(1),u=n(7),h=n(3),c=n(10),d=n(4),f=d.remRadian,p=d.isRadianAroundZero,g=n(6),m=n(19),v=g.applyTransform,y=l.retrieve,x=Math.PI,_=function(t,e){this.opt=e,this.axisModel=t,l.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new h.Group;var n=new h.Group({position:e.position.slice(),rotation:e.rotation});n.updateTransform(),this._transform=n.transform,this._dumbGroup=n};_.prototype={constructor:_,hasBuilder:function(t){return!!b[t]},add:function(t){b[t].call(this)},getGroup:function(){return this.group}};var b={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var n=this.axisModel.axis.getExtent(),i=this._transform,r=[n[0],0],o=[n[1],0];i&&(v(r,r,i),v(o,o,i)),this.group.add(new h.Line(h.subPixelOptimizeLine({anid:"line",shape:{x1:r[0],y1:r[1],x2:o[0],y2:o[1]},style:l.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})))}},axisTick:function(){var t=this.axisModel,e=t.axis;if(t.get("axisTick.show")&&!e.scale.isBlank())for(var n=t.getModel("axisTick"),i=this.opt,r=n.getModel("lineStyle"),o=n.get("length"),a=S(n,i.labelInterval),s=e.getTicksCoords(n.get("alignWithLabel")),u=e.scale.getTicks(),c=[],d=[],f=this._transform,p=0;p<s.length;p++)if(!M(e,p,a)){var g=s[p];c[0]=g,c[1]=0,d[0]=g,d[1]=i.tickDirection*o,f&&(v(c,c,f),v(d,d,f)),this.group.add(new h.Line(h.subPixelOptimizeLine({anid:"tick_"+u[p],shape:{x1:c[0],y1:c[1],x2:d[0],y2:d[1]},style:l.defaults(r.getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")}),z2:2,silent:!0})))}},axisLabel:function(){var t=this.opt,e=this.axisModel,n=e.axis,r=y(t.axisLabelShow,e.get("axisLabel.show"));if(r&&!n.scale.isBlank()){var s=e.getModel("axisLabel"),u=s.getModel("textStyle"),d=s.get("margin"),f=n.scale.getTicks(),p=e.getFormattedLabels(),g=(y(t.labelRotate,s.get("rotate"))||0)*x/180,m=w(t.rotation,g,t.labelDirection),v=e.get("data"),_=[],b=o(e),S=e.get("triggerEvent");l.each(f,function(r,o){if(!M(n,o,t.labelInterval)){var a=u;v&&v[r]&&v[r].textStyle&&(a=new c(v[r].textStyle,u,e.ecModel));var s=a.getTextColor()||e.get("axisLine.lineStyle.color"),l=n.dataToCoord(r),f=[l,t.labelOffset+t.labelDirection*d],g=n.scale.getLabel(r),y=new h.Text({anid:"label_"+r,style:{text:p[o],textAlign:a.get("align",!0)||m.textAlign,textVerticalAlign:a.get("baseline",!0)||m.textVerticalAlign,textFont:a.getFont(),fill:"function"==typeof s?s("category"===n.type?g:"value"===n.type?r+"":r,o):s},position:f,rotation:m.rotation,silent:b,z2:10});S&&(y.eventData=i(e),y.eventData.targetType="axisLabel",y.eventData.value=g),this._dumbGroup.add(y),y.updateTransform(),_.push(y),this.group.add(y),y.decomposeTransform()}},this),a(e,_)}},axisName:function(){var t=this.opt,e=this.axisModel,n=y(t.axisName,e.get("name"));if(n){var a,s=e.get("nameLocation"),c=t.nameDirection,d=e.getModel("nameTextStyle"),f=e.get("nameGap")||0,p=this.axisModel.axis.getExtent(),g=p[0]>p[1]?-1:1,m=["start"===s?p[0]-g*f:"end"===s?p[1]+g*f:(p[0]+p[1])/2,"middle"===s?t.labelOffset+c*f:0],v=e.get("nameRotate");
+null!=v&&(v=v*x/180);var _;"middle"===s?a=w(t.rotation,null!=v?v:t.rotation,c):(a=r(t,s,v||0,p),_=t.axisNameAvailableWidth,null!=_&&(_=Math.abs(_/Math.sin(a.rotation)),!isFinite(_)&&(_=null)));var b=d.getFont(),M=e.get("nameTruncate",!0)||{},S=M.ellipsis,T=y(t.nameTruncateMaxWidth,M.maxWidth,_),A=null!=S&&null!=T?u.truncateText(n,T,b,S,{minChar:2,placeholder:M.placeholder}):n,I=e.get("tooltip",!0),C=e.mainType,P={componentType:C,name:n,$vars:["name"]};P[C+"Index"]=e.componentIndex;var D=new h.Text({anid:"name",__fullText:n,__truncatedText:A,style:{text:A,textFont:b,fill:d.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:a.textAlign,textVerticalAlign:a.textVerticalAlign},position:m,rotation:a.rotation,silent:o(e),z2:1,tooltip:I&&I.show?l.extend({content:n,formatter:function(){return n},formatterParams:P},I):null});e.get("triggerEvent")&&(D.eventData=i(e),D.eventData.targetType="axisName",D.eventData.name=n),this._dumbGroup.add(D),D.updateTransform(),this.group.add(D),D.decomposeTransform()}}},w=_.innerTextLayout=function(t,e,n){var i,r,o=f(e-t);return p(o)?(r=n>0?"top":"bottom",i="center"):p(o-x)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o<x?n>0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},M=_.ifIgnoreOnTick=function(t,e,n){var i,r=t.scale;return"ordinal"===r.type&&("function"==typeof n?(i=r.getTicks()[e],!n(i,r.getLabel(i))):e%(n+1))},S=_.getInterval=function(t,e){var n=t.get("interval");return null!=n&&"auto"!=n||(n=e),n};t.exports=_},function(t,e,n){function i(t,e,n,i,s,l){var u=a.getAxisPointerClass(t.axisPointerClass);if(u){var h=o.getAxisPointerModel(e);h?(t._axisPointer||(t._axisPointer=new u)).render(e,h,i,l):r(t,i)}}function r(t,e,n){var i=t._axisPointer;i&&i.dispose(e,n),t._axisPointer=null}var o=n(45),a=n(2).extendComponentView({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,n,r){this.axisPointerClass&&o.fixValue(t),a.superApply(this,"render",arguments),i(this,t,e,n,r,!0)},updateAxisPointer:function(t,e,n,r,o){i(this,t,e,n,r,!1)},remove:function(t,e){var n=this._axisPointer;n&&n.remove(e),a.superApply(this,"remove",arguments)},dispose:function(t,e){r(this,e),a.superApply(this,"dispose",arguments)}}),s=[];a.registerAxisPointerClass=function(t,e){s[t]=e},a.getAxisPointerClass=function(t){return t&&s[t]},t.exports=a},function(t,e,n){function i(t){return r.isObject(t)&&null!=t.value?t.value:t+""}var r=n(1),o=n(18);t.exports={getFormattedLabels:function(){return o.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))},getCategories:function(){return"category"===this.get("type")&&r.map(this.get("data"),i)},getMin:function(t){var e=this.option,n=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=n&&"dataMin"!==n&&!r.eqNaN(n)&&(n=this.axis.scale.parse(n)),n},getMax:function(t){var e=this.option,n=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=n&&"dataMax"!==n&&!r.eqNaN(n)&&(n=this.axis.scale.parse(n)),n},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:r.noop,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}}},function(t,e,n){var i=n(4),r=n(7),o=n(34),a=n(64),s=i.round,l=o.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),l.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){return a.intervalScaleGetTicks(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},getLabel:function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=i.getPrecisionSafe(t)||0:"auto"===n&&(n=this._intervalPrecision),t=s(t,n,!0),r.addCommas(t)},niceTicks:function(t,e){t=t||5;var n=this._extent,i=n[1]-n[0];if(isFinite(i)){i<0&&(i=-i,n.reverse());var r=a.intervalScaleNiceTicks(n,t,e);this._intervalPrecision=r.intervalPrecision,this._interval=r.interval,this._niceExtent=r.niceTickExtent}},niceExtent:function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax?e[0]-=n/2:(e[1]+=n/2,e[0]-=n/2)}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval);var r=this._interval;t.fixMin||(e[0]=s(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=s(Math.ceil(e[1]/r)*r))}});l.create=function(){return new l},t.exports=l},function(t,e,n){function i(t){this.group=new o.Group,this._symbolCtor=t||a}function r(t,e,n){var i=t.getItemLayout(e);return i&&!isNaN(i[0])&&!isNaN(i[1])&&!(n&&n(e))&&"none"!==t.getItemVisual(e,"symbol")}var o=n(3),a=n(54),s=i.prototype;s.updateData=function(t,e){var n=this.group,i=t.hostModel,a=this._data,s=this._symbolCtor,l={itemStyle:i.getModel("itemStyle.normal").getItemStyle(["color"]),hoverItemStyle:i.getModel("itemStyle.emphasis").getItemStyle(),symbolRotate:i.get("symbolRotate"),symbolOffset:i.get("symbolOffset"),hoverAnimation:i.get("hoverAnimation"),labelModel:i.getModel("label.normal"),hoverLabelModel:i.getModel("label.emphasis")};t.diff(a).add(function(i){var o=t.getItemLayout(i);if(r(t,i,e)){var a=new s(t,i,l);a.attr("position",o),t.setItemGraphicEl(i,a),n.add(a)}}).update(function(u,h){var c=a.getItemGraphicEl(h),d=t.getItemLayout(u);return r(t,u,e)?(c?(c.updateData(t,u,l),o.updateProps(c,{position:d},i)):(c=new s(t,u),c.attr("position",d)),n.add(c),void t.setItemGraphicEl(u,c)):void n.remove(c)}).remove(function(t){var e=a.getItemGraphicEl(t);e&&e.fadeOut(function(){n.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,n){var i=t.getItemLayout(n);e.attr("position",i)})},s.remove=function(t){var e=this.group,n=this._data;n&&(t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=i},function(t,e,n){function i(t,e,n){var i=e.getComponent("tooltip"),o=e.getComponent("axisPointer"),s=o.get("link",!0)||[],u=[];c(n.getCoordinateSystems(),function(n){function h(i,h,c){var d=c.model.getModel("axisPointer",o),f=d.get("show");if(f&&("auto"!==f||i||l(d))){null==h&&(h=d.get("triggerTooltip")),d=i?r(c,v,o,e,i,h):d;var m=d.get("snap"),y=p(c.model),x=h||m||"category"===c.type,_=t.axesInfo[y]={key:y,axis:c,coordSys:n,axisPointerModel:d,triggerTooltip:h,involveSeries:x,snap:m,useHandle:l(d),seriesModels:[]};g[y]=_,t.seriesInvolved|=x;var b=a(s,c);if(null!=b){var w=u[b]||(u[b]={axesInfo:{}});w.axesInfo[y]=_,w.mapper=s[b].mapper,_.linkGroup=w}}}if(n.axisPointerEnabled){var f=p(n.model),g=t.coordSysAxesInfo[f]={};t.coordSysMap[f]=n;var m=n.model,v=m.getModel("tooltip",i);if(c(n.getAxes(),d(h,!1,null)),n.getTooltipAxes&&i&&v.get("show")){var y="axis"===v.get("trigger"),x="cross"===v.get("axisPointer.type"),_=n.getTooltipAxes(v.get("axisPointer.axis"));(y||x)&&c(_.baseAxes,d(h,!x||"cross",y)),x&&c(_.otherAxes,d(h,"cross",!1))}}})}function r(t,e,n,i,r,o){var a=e.getModel("axisPointer"),s={};c(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(t){s[t]=u.clone(a.get(t))}),s.snap="category"!==t.type&&!!o,"cross"===a.get("type")&&(s.type="line");var l=s.label||(s.label={});if(null==l.show&&(l.show=!1),"cross"===r&&(l.show=!0,!o)){var d=s.lineStyle=a.get("crossStyle");d&&u.defaults(l.textStyle||(l.textStyle={}),d.textStyle)}return t.model.getModel("axisPointer",new h(s,n,i))}function o(t,e){e.eachSeries(function(e){var n=e.coordinateSystem,i=e.get("tooltip.trigger",!0);n&&"none"!==i&&i!==!1&&"item"!==i&&e.get("axisPointer.show",!0)!==!1&&c(t.coordSysAxesInfo[p(n.model)],function(t){var i=t.axis;n.getAxis(i.dim)===i&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())})},this)}function a(t,e){for(var n=e.model,i=e.dim,r=0;r<t.length;r++){var o=t[r]||{};if(s(o[i+"AxisId"],n.id)||s(o[i+"AxisIndex"],n.componentIndex)||s(o[i+"AxisName"],n.name))return r}}function s(t,e){return"all"===t||u.isArray(t)&&u.indexOf(t,e)>=0||t===e}function l(t){return!!t.get("handle.show")}var u=n(1),h=n(10),c=u.each,d=u.curry,f={};f.collect=function(t,e){var n={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return i(n,t,e),n.seriesInvolved&&o(n,t),n},f.fixValue=function(t){var e=f.getAxisInfo(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=l(n);null==o&&(r.status=s?"show":"hide");var u=i.getExtent().slice();u[0]>u[1]&&u.reverse(),(null==a||a>u[1])&&(a=u[1]),a<u[0]&&(a=u[0]),r.value=a,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}},f.getAxisInfo=function(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[p(t)]},f.getAxisPointerModel=function(t){var e=f.getAxisInfo(t);return e&&e.axisPointerModel};var p=f.makeKey=function(t){return t.type+"||"+t.id};t.exports=f},function(t,e,n){function i(t){var e={};return c(["start","end","startValue","endValue","throttle"],function(n){t.hasOwnProperty(n)&&(e[n]=t[n])}),e}function r(t,e){c([["start","startValue"],["end","endValue"]],function(n,i){var r=t._rangePropMode;null!=e[n[0]]?r[i]="percent":null!=e[n[1]]&&(r[i]="value")})}var o=n(1),a=n(9),s=n(2),l=n(5),u=n(77),h=n(198),c=o.each,d=u.eachAxisDim,f=s.extendComponentModel({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null,minSpan:null,maxSpan:null,minValueSpan:null,maxValueSpan:null},init:function(t,e,n){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var r=i(t);this.mergeDefaultAndTheme(t,n),this.doInit(r)},mergeOption:function(t){var e=i(t);o.merge(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;a.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),r(this,t),c([["start","startValue"],["end","endValue"]],function(t,n){"value"===this._rangePropMode[n]&&(e[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,n,i,r){var o=this.dependentModels[e.axis][n],a=o.__dzAxisProxy||(o.__dzAxisProxy=new h(e.name,n,this,r));t[e.name+"_"+n]=a},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();d(function(e){var n=e.axisIndex;t[n]=l.normalizeToArray(t[n])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;d(function(n){null!=t[n.axisIndex]&&(e=!0)},this);var n=t.orient;return null==n&&e?"orient":e?void 0:(null==n&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),n=this.option,i=this.dependentModels;if(t){var r="vertical"===e?"y":"x";i[r+"Axis"].length?(n[r+"AxisIndex"]=[0],t=!1):c(i.singleAxis,function(i){t&&i.get("orient",!0)===e&&(n.singleAxisIndex=[i.componentIndex],t=!1)})}t&&d(function(e){if(t){var i=[],r=this.dependentModels[e.axis];if(r.length&&!i.length)for(var o=0,a=r.length;o<a;o++)"category"===r[o].get("type")&&i.push(o);n[e.axisIndex]=i,i.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&d(function(e){var i=n[e.axisIndex],r=t.get(e.axisIndex),a=t.get(e.axisId),s=t.ecModel.queryComponents({mainType:e.axis,index:r,id:a})[0];r=s.componentIndex,o.indexOf(i,r)<0&&i.push(r)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var n=!0;return d(function(i){var r=t.get(i.axisIndex),o=this.dependentModels[i.axis][r];o&&o.get("type")===e||(n=!1)},this),n},_setDefaultThrottle:function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var t;return d(function(e){if(null==t){var n=this.get(e.axisIndex);n.length&&(t=this.dependentModels[e.axis][n[0]])}},this),t},eachTargetAxis:function(t,e){var n=this.ecModel;d(function(i){c(this.get(i.axisIndex),function(r){t.call(e,i,r,this,n)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},getAxisModel:function(t,e){var n=this.getAxisProxy(t,e);return n&&n.getAxisModel()},setRawRange:function(t,e){c(["start","end","startValue","endValue"],function(e){this.option[e]=t[e]},this),!e&&r(this,t)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(t){if(t)return t.__dzAxisProxy;var e=this._axisProxies;for(var n in e)if(e.hasOwnProperty(n)&&e[n].hostedBy(this))return e[n];for(var n in e)if(e.hasOwnProperty(n)&&!e[n].hostedBy(this))return e[n]},getRangePropMode:function(){return this._rangePropMode.slice()}});t.exports=f},function(t,e,n){var i=n(65);t.exports=i.extend({type:"dataZoom",render:function(t,e,n,i){this.dataZoomModel=t,this.ecModel=e,this.api=n},getTargetCoordInfo:function(){function t(t,e,n,i){for(var r,o=0;o<n.length;o++)if(n[o].model===t){r=n[o];break}r||n.push(r={model:t,axisModels:[],coordIndex:i}),r.axisModels.push(e)}var e=this.dataZoomModel,n=this.ecModel,i={};return e.eachTargetAxis(function(e,r){var o=n.getComponent(e.axis,r);if(o){var a=o.getCoordSysModel();a&&t(a,o,i[a.mainType]||(i[a.mainType]=[]),a.componentIndex)}},this),i}})},function(t,e){"use strict";function n(t){return t}function i(t,e,i,r){this._old=t,this._new=e,this._oldKeyGetter=i||n,this._newKeyGetter=r||n}function r(t,e,n,i){for(var r=0;r<t.length;r++){var o="_ec_"+i(t[r],r),a=e[o];null==a?(n.push(o),e[o]=r):(a.length||(e[o]=a=[a]),a.push(r))}}i.prototype={constructor:i,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,n=this._new,i=this._oldKeyGetter,o=this._newKeyGetter,a={},s={},l=[],u=[];for(r(e,a,l,i),r(n,s,u,o),t=0;t<e.length;t++){var h=l[t],c=s[h];if(null!=c){var d=c.length;d?(1===d&&(s[h]=null),c=c.unshift()):s[h]=null,this._update&&this._update(c,t)}else this._remove&&this._remove(t)}for(var t=0;t<u.length;t++){var h=u[t];if(s.hasOwnProperty(h)){var c=s[h];if(null==c)continue;if(c.length)for(var f=0,d=c.length;f<d;f++)this._add&&this._add(c[f]);else this._add&&this._add(c)}}}},t.exports=i},function(t,e,n){var i=n(1),r=n(15),o=r.parseClassType,a=0,s={},l="_";s.getUID=function(t){return[t||"",a++,Math.random()].join(l)},s.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,n){t=o(t),e[t.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var a=o(n).main;t.hasSubTypes(n)&&e[a]&&(r=e[a](i))}return r},t},s.enableTopologicalTravel=function(t,e){function n(t){var n={},a=[];return i.each(t,function(s){var l=r(n,s),u=l.originalDeps=e(s),h=o(u,t);l.entryCount=h.length,0===l.entryCount&&a.push(s),i.each(h,function(t){i.indexOf(l.predecessor,t)<0&&l.predecessor.push(t);var e=r(n,t);i.indexOf(e.successor,t)<0&&e.successor.push(s)})}),{graph:n,noEntryList:a}}function r(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function o(t,e){var n=[];return i.each(t,function(t){i.indexOf(e,t)>=0&&n.push(t)}),n}t.topologicalTravel=function(t,e,r,o){function a(t){u[t].entryCount--,0===u[t].entryCount&&h.push(t)}function s(t){c[t]=!0,a(t)}if(t.length){var l=n(e),u=l.graph,h=l.noEntryList,c={};for(i.each(t,function(t){c[t]=!0});h.length;){var d=h.pop(),f=u[d],p=!!c[d];p&&(r.call(o,d,f.originalDeps.slice()),delete c[d]),i.each(f.successor,p?s:a)}i.each(c,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){t.exports=function(t,e,n,i,r){i.eachRawSeriesByType(t,function(t){var r=t.getData(),o=t.get("symbol")||e,a=t.get("symbolSize");r.setVisual({legendSymbol:n||o,symbol:o,symbolSize:a}),i.isSeriesFiltered(t)||("function"==typeof a&&r.each(function(e){var n=t.getRawValue(e),i=t.getDataParams(e);r.setItemVisual(e,"symbolSize",a(n,i))}),r.each(function(t){var e=r.getItemModel(t),n=e.getShallow("symbol",!0),i=e.getShallow("symbolSize",!0);null!=n&&r.setItemVisual(t,"symbol",n),null!=i&&r.setItemVisual(t,"symbolSize",i)}))})}},function(t,e){function n(t){for(var e=0;t>=h;)e|=1&t,t>>=1;return t+e}function i(t,e,n,i){var o=e+1;if(o===n)return 1;if(i(t[o++],t[e])<0){for(;o<n&&i(t[o],t[o-1])<0;)o++;r(t,e,o)}else for(;o<n&&i(t[o],t[o-1])>=0;)o++;return o-e}function r(t,e,n){for(n--;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}function o(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var o,a=t[i],s=e,l=i;s<l;)o=s+l>>>1,r(a,t[o])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function a(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l<s&&o(t,e[n+r+l])>0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;l<s&&o(t,e[n+r-l])<=0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function s(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;l<s&&o(t,e[n+r-l])<0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l<s&&o(t,e[n+r+l])>=0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function l(t,e){function n(t,e){h[y]=t,f[y]=e,y+=1}function i(){for(;y>1;){var t=y-2;if(t>=1&&f[t-1]<=f[t]+f[t+1]||t>=2&&f[t-2]<=f[t]+f[t-1])f[t-1]<f[t+1]&&t--;else if(f[t]>f[t+1])break;o(t)}}function r(){for(;y>1;){var t=y-2;t>0&&f[t-1]<f[t+1]&&t--,o(t)}}function o(n){var i=h[n],r=f[n],o=h[n+1],c=f[n+1];f[n]=r+c,n===y-3&&(h[n+1]=h[n+2],f[n+1]=f[n+2]),y--;var d=s(t[o],t,i,r,0,e);i+=d,r-=d,0!==r&&(c=a(t[i+r-1],t,o,c,c-1,e),0!==c&&(r<=c?l(i,r,o,c):u(i,r,o,c)))}function l(n,i,r,o){var l=0;for(l=0;l<i;l++)x[l]=t[n+l];var u=0,h=r,d=n;if(t[d++]=t[h++],0!==--o){if(1===i){for(l=0;l<o;l++)t[d+l]=t[h+l];return void(t[d+o]=x[u])}for(var f,g,m,v=p;;){f=0,g=0,m=!1;do if(e(t[h],x[u])<0){if(t[d++]=t[h++],g++,f=0,0===--o){m=!0;break}}else if(t[d++]=x[u++],f++,g=0,1===--i){m=!0;break}while((f|g)<v);if(m)break;do{if(f=s(t[h],x,u,i,0,e),0!==f){for(l=0;l<f;l++)t[d+l]=x[u+l];if(d+=f,u+=f,i-=f,i<=1){m=!0;break}}if(t[d++]=t[h++],0===--o){m=!0;break}if(g=a(x[u],t,h,o,0,e),0!==g){for(l=0;l<g;l++)t[d+l]=t[h+l];if(d+=g,h+=g,o-=g,0===o){m=!0;break}}if(t[d++]=x[u++],1===--i){m=!0;break}v--}while(f>=c||g>=c);if(m)break;v<0&&(v=0),v+=2}if(p=v,p<1&&(p=1),1===i){for(l=0;l<o;l++)t[d+l]=t[h+l];t[d+o]=x[u]}else{if(0===i)throw new Error;for(l=0;l<i;l++)t[d+l]=x[u+l]}}else for(l=0;l<i;l++)t[d+l]=x[u+l]}function u(n,i,r,o){var l=0;for(l=0;l<o;l++)x[l]=t[r+l];var u=n+i-1,h=o-1,d=r+o-1,f=0,g=0;if(t[d--]=t[u--],0!==--i){if(1===o){for(d-=i,u-=i,g=d+1,f=u+1,l=i-1;l>=0;l--)t[g+l]=t[f+l];return void(t[d]=x[h])}for(var m=p;;){var v=0,y=0,_=!1;do if(e(x[h],t[u])<0){if(t[d--]=t[u--],v++,y=0,0===--i){_=!0;break}}else if(t[d--]=x[h--],y++,v=0,1===--o){_=!0;break}while((v|y)<m);if(_)break;do{if(v=i-s(x[h],t,n,i,i-1,e),0!==v){for(d-=v,u-=v,i-=v,g=d+1,f=u+1,l=v-1;l>=0;l--)t[g+l]=t[f+l];if(0===i){_=!0;break}}if(t[d--]=x[h--],1===--o){_=!0;break}if(y=o-a(t[u],x,0,o,o-1,e),0!==y){for(d-=y,h-=y,o-=y,g=d+1,f=h+1,l=0;l<y;l++)t[g+l]=x[f+l];if(o<=1){_=!0;break}}if(t[d--]=t[u--],0===--i){_=!0;break}m--}while(v>=c||y>=c);if(_)break;m<0&&(m=0),m+=2}if(p=m,p<1&&(p=1),1===o){for(d-=i,u-=i,g=d+1,f=u+1,l=i-1;l>=0;l--)t[g+l]=t[f+l];t[d]=x[h]}else{if(0===o)throw new Error;for(f=d-(o-1),l=0;l<o;l++)t[f+l]=x[l]}}else for(f=d-(o-1),l=0;l<o;l++)t[f+l]=x[l]}var h,f,p=c,g=0,m=d,v=0,y=0;g=t.length,g<2*d&&(m=g>>>1);var x=[];v=g<120?5:g<1542?10:g<119151?19:40,h=[],f=[],this.mergeRuns=i,this.forceMergeRuns=r,this.pushRun=n}function u(t,e,r,a){r||(r=0),a||(a=t.length);var s=a-r;if(!(s<2)){var u=0;if(s<h)return u=i(t,r,a,e),void o(t,r,a,r+u,e);var c=new l(t,e),d=n(s);do{if(u=i(t,r,a,e),u<d){var f=s;f>d&&(f=d),o(t,r,r+f,r+u,e),u=f}c.pushRun(r,u),c.mergeRuns(),s-=u,r+=u}while(0!==s);c.forceMergeRuns()}}var h=32,c=7,d=256;t.exports=u},function(t,e,n){var i=n(35);t.exports=function(){if(0!==i.debugMode)if(1==i.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(i.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,n){function i(t){r.call(this,t)}var r=n(38),o=n(11),a=n(1),s=n(70),l=new s(50);i.prototype={constructor:i,type:"image",brush:function(t,e){var n,i=this.style,r=i.image;if(i.bind(t,this,e),n="string"==typeof r?this._image:r,!n&&r){var o=l.get(r);if(!o)return n=new Image,n.onload=function(){n.onload=null;for(var t=0;t<o.pending.length;t++)o.pending[t].dirty()},o={image:n,pending:[this]},n.src=r,l.put(r,o),void(this._image=n);if(n=o.image,this._image=n,!n.width||!n.height)return void o.pending.push(this)}if(n){var a=i.x||0,s=i.y||0;if(!n.width||!n.height)return;var u=i.width,h=i.height,c=n.width/n.height;if(null==u&&null!=h?u=h*c:null==h&&null!=u?h=u/c:null==u&&null==h&&(u=n.width,h=n.height),this.setTransform(t),i.sWidth&&i.sHeight){var d=i.sx||0,f=i.sy||0;t.drawImage(n,d,f,i.sWidth,i.sHeight,a,s,u,h)}else if(i.sx&&i.sy){var d=i.sx,f=i.sy,p=u-d,g=h-f;t.drawImage(n,d,f,p,g,a,s,u,h)}else t.drawImage(n,a,s,u,h);this.restoreTransform(t),null!=i.text&&this.drawRectText(t,this.getBoundingRect())}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new o(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},a.inherits(i,r),t.exports=i},function(t,e,n){function i(t,e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array?n.slice():[+n,+n]}function r(t){return[t[0]/2,t[1]/2]}function o(t,e,n){u.Group.call(this),this.updateData(t,e,n)}function a(t,e){this.parent.drift(t,e)}var s=n(1),l=n(24),u=n(3),h=n(4),c=n(92),d=o.prototype;d._createSymbol=function(t,e,n,i){this.removeAll();var o=e.hostModel,s=e.getItemVisual(n,"color"),h=l.createSymbol(t,-1,-1,2,2,s);h.attr({z2:100,culling:!0,scale:[0,0]}),h.drift=a,u.initProps(h,{scale:r(i)},o,n),this._symbolType=t,this.add(h)},d.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},d.getSymbolPath=function(){return this.childAt(0)},d.getScale=function(){return this.childAt(0).scale},d.highlight=function(){this.childAt(0).trigger("emphasis")},d.downplay=function(){this.childAt(0).trigger("normal")},d.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},d.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},d.updateData=function(t,e,n){this.silent=!1;var o=t.getItemVisual(e,"symbol")||"circle",a=t.hostModel,s=i(t,e);if(o!==this._symbolType)this._createSymbol(o,t,e,s);else{var l=this.childAt(0);l.silent=!1,u.updateProps(l,{scale:r(s)},a,e)}this._updateCommon(t,e,s,n),this._seriesModel=a};var f=["itemStyle","normal"],p=["itemStyle","emphasis"],g=["label","normal"],m=["label","emphasis"];d._updateCommon=function(t,e,n,i){var o=this.childAt(0),a=t.hostModel,l=t.getItemVisual(e,"color");"image"!==o.type&&o.useStyle({strokeNoScale:!0}),i=i||null;var d=i&&i.itemStyle,v=i&&i.hoverItemStyle,y=i&&i.symbolRotate,x=i&&i.symbolOffset,_=i&&i.labelModel,b=i&&i.hoverLabelModel,w=i&&i.hoverAnimation;if(!i||t.hasItemOption){var M=t.getItemModel(e);d=M.getModel(f).getItemStyle(["color"]),v=M.getModel(p).getItemStyle(),y=M.getShallow("symbolRotate"),x=M.getShallow("symbolOffset"),_=M.getModel(g),b=M.getModel(m),w=M.getShallow("hoverAnimation")}else v=s.extend({},v);var S=o.style;o.attr("rotation",(y||0)*Math.PI/180||0),x&&o.attr("position",[h.parsePercent(x[0],n[0]),h.parsePercent(x[1],n[1])]),o.setColor(l),o.setStyle(d);var T=t.getItemVisual(e,"opacity");null!=T&&(S.opacity=T);var A=c.findLabelValueDim(t);c.setTextToStyle(t,e,A,S,a,_,l),c.setTextToStyle(t,e,A,v,a,b,l),o.off("mouseover").off("mouseout").off("emphasis").off("normal"),o.hoverStyle=v,u.setHoverStyle(o);var I=r(n);if(w&&a.isAnimationEnabled()){var C=function(){var t=I[1]/I[0];this.animateTo({scale:[Math.max(1.1*I[0],I[0]+3),Math.max(1.1*I[1],I[1]+3*t)]},400,"elasticOut")},P=function(){this.animateTo({scale:I},400,"elasticOut")};o.on("mouseover",C).on("mouseout",P).on("emphasis",C).on("normal",P)}},d.fadeOut=function(t){var e=this.childAt(0);this.silent=e.silent=!0,e.style.text="",u.updateProps(e,{scale:[0,0]},this._seriesModel,this.dataIndex,t)},s.inherits(o,u.Group),t.exports=o},function(t,e,n){var i=n(2),r=n(45),o=n(196),a=n(1);n(194),n(195),n(120),i.registerPreprocessor(function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!a.isArray(e)&&(t.axisPointer.link=[e])}}),i.registerProcessor(i.PRIORITY.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=r.collect(t,e)}),i.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,n){var i=o(e.getComponent("axisPointer").coordSysAxesInfo,t.currTrigger,[t.x,t.y],t,t.dispatchAction||a.bind(n.dispatchAction,n),e,n,t.tooltipOption);return i})},function(t,e){function n(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function i(t,e){return Math.min(e[1],Math.max(e[0],t))}t.exports=function(t,e,r,o,a,s){e[0]=i(e[0],r),e[1]=i(e[1],r),t=t||0;var l=r[1]-r[0];null!=a&&(a=i(a,[0,l])),null!=s&&(s=Math.max(s,null!=a?a:0)),"all"===o&&(a=s=Math.abs(e[1]-e[0]),o=0);var u=n(e,o);e[o]+=t;var h=a||0,c=r.slice();u.sign<0?c[0]+=h:c[1]-=h,e[o]=i(e[o],c);var d=n(e,o);null!=a&&(d.sign!==u.sign||d.span<a)&&(e[1-o]=e[o]+u.sign*a);var d=n(e,o);return null!=s&&d.span>s&&(e[1-o]=e[o]+d.sign*s),e}},function(t,e,n){function i(t,e,n){return t.getCoordSysModel()===e}function r(t){var e,n=t.model,i=n.getFormattedLabels(),r=n.getModel("axisLabel.textStyle"),o=1,a=i.length;a>40&&(o=Math.ceil(a/40));for(var s=0;s<a;s+=o)if(!t.isLabelIgnored(s)){var l=r.getTextRect(i[s]);e?e.union(l):e=l}return e}function o(t,e,n){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,n),this.model=t}function a(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}function s(t,e){return c.map(y,function(e){var n=t.getReferringComponents(e)[0];return n})}function l(t){return"cartesian2d"===t.get("coordinateSystem")}var u=n(12),h=n(18),c=n(1),d=n(133),f=n(131),p=c.each,g=h.ifAxisCrossZero,m=h.niceScaleExtent;n(134);var v=o.prototype;v.type="grid",v.axisPointerEnabled=!0,v.getRect=function(){return this._rect},v.update=function(t,e){function n(t){var e=i[t];for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(r&&("category"===r.type||"time"===r.type||!g(r)))return!0}return!1}var i=this._axesMap;this._updateScale(t,this.model),p(i.x,function(t){m(t.scale,t.model)}),p(i.y,function(t){m(t.scale,t.model)}),p(i.x,function(t){n("y")&&(t.onZero=!1)}),p(i.y,function(t){n("x")&&(t.onZero=!1)}),this.resize(this.model,e)},v.resize=function(t,e){function n(){p(o,function(t){var e=t.isHorizontal(),n=e?[0,i.width]:[0,i.height],r=t.inverse?1:0;t.setExtent(n[r],n[1-r]),a(t,e?i.x:i.y)})}var i=u.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=i;var o=this._axesList;n(),t.get("containLabel")&&(p(o,function(t){if(!t.model.get("axisLabel.inside")){var e=r(t);if(e){var n=t.isHorizontal()?"height":"width",o=t.model.get("axisLabel.margin");i[n]-=e[n]+o,"top"===t.position?i.y+=e.height+o:"left"===t.position&&(i.x+=e.width+o)}}}),n())},v.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)if(n.hasOwnProperty(i))return n[i];return n[e]}},v.getAxes=function(){return this._axesList.slice()},v.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}c.isObject(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},v.getCartesians=function(){return this._coordsList.slice()},v.convertToPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},v.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},v._findConvertTarget=function(t,e){var n,i,r=e.seriesModel,o=e.xAxisModel||r&&r.getReferringComponents("xAxis")[0],a=e.yAxisModel||r&&r.getReferringComponents("yAxis")[0],s=e.gridModel,l=this._coordsList;if(r)n=r.coordinateSystem,c.indexOf(l,n)<0&&(n=null);else if(o&&a)n=this.getCartesian(o.componentIndex,a.componentIndex);else if(o)i=this.getAxis("x",o.componentIndex);else if(a)i=this.getAxis("y",a.componentIndex);else if(s){var u=s.coordinateSystem;u===this&&(n=this._coordsList[0])}return{cartesian:n,axis:i}},v.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},v._initCartesian=function(t,e,n){function r(n){return function(r,l){if(i(r,t,e)){var u=r.get("position");"x"===n?"top"!==u&&"bottom"!==u&&(u="bottom",o[u]&&(u="top"===u?"bottom":"top")):"left"!==u&&"right"!==u&&(u="left",o[u]&&(u="left"===u?"right":"left")),o[u]=!0;var c=new f(n,h.createScaleByModel(r),[0,0],r.get("type"),u),d="category"===c.type;c.onBand=d&&r.get("boundaryGap"),c.inverse=r.get("inverse"),c.onZero=r.get("axisLine.onZero"),r.axis=c,c.model=r,c.grid=this,c.index=l,this._axesList.push(c),a[n][l]=c,s[n]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},a={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",r("x"),this),e.eachComponent("yAxis",r("y"),this),s.x&&s.y?(this._axesMap=a,void p(a.x,function(e,n){p(a.y,function(i,r){var o="x"+n+"y"+r,a=new d(o);a.grid=this,a.model=t,this._coordsMap[o]=a,this._coordsList.push(a),a.addAxis(e),a.addAxis(i)},this)},this)):(this._axesMap={},void(this._axesList=[]))},v._updateScale=function(t,e){function n(t,e,n){p(n.coordDimToDataDim(e.dim),function(n){e.scale.unionExtentFromData(t,n)})}c.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(r){if(l(r)){var o=s(r,t),a=o[0],u=o[1];if(!i(a,e,t)||!i(u,e,t))return;var h=this.getCartesian(a.componentIndex,u.componentIndex),c=r.getData(),d=h.getAxis("x"),f=h.getAxis("y");"list"===c.type&&(n(c,d,r),n(c,f,r))}},this)},v.getTooltipAxes=function(t){var e=[],n=[];return p(this.getCartesians(),function(i){var r=null!=t&&"auto"!==t?i.getAxis(t):i.getBaseAxis(),o=i.getOtherAxis(r);c.indexOf(e,r)<0&&e.push(r),c.indexOf(n,o)<0&&n.push(o)}),{baseAxes:e,otherAxes:n}};var y=["xAxis","yAxis"];o.create=function(t,e){var n=[];return t.eachComponent("grid",function(i,r){var a=new o(i,t,e);a.name="grid_"+r,i.coordinateSystem=a,n.push(a)}),t.eachSeries(function(e){if(l(e)){var n=s(e,t),i=n[0],r=n[1],o=i.getCoordSysModel(),a=o.coordinateSystem;e.coordinateSystem=a.getCartesian(i.componentIndex,r.componentIndex)}}),n},o.dimensions=o.prototype.dimensions=d.prototype.dimensions,n(26).register("cartesian2d",o),t.exports=o},function(t,e,n){"use strict";function i(t){return t>s||t<-s}var r=n(19),o=n(6),a=r.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},u=l.prototype;u.transform=null,
+u.needLocalTransform=function(){return i(this.rotation)||i(this.position[0])||i(this.position[1])||i(this.scale[0]-1)||i(this.scale[1]-1)},u.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;return n||e?(i=i||r.create(),n?this.getLocalTransform(i):a(i),e&&(n?r.mul(i,t.transform,i):r.copy(i,t.transform)),this.transform=i,this.invTransform=this.invTransform||r.create(),void r.invert(this.invTransform,i)):void(i&&a(i))},u.getLocalTransform=function(t){return l.getLocalTransform(this,t)},u.setTransform=function(t){var e=this.transform,n=t.dpr||1;e?t.setTransform(n*e[0],n*e[1],n*e[2],n*e[3],n*e[4],n*e[5]):t.setTransform(n,0,0,n,0,0)},u.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var h=[];u.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(r.mul(h,t.invTransform,e),e=h);var n=e[0]*e[0]+e[1]*e[1],o=e[2]*e[2]+e[3]*e[3],a=this.position,s=this.scale;i(n-1)&&(n=Math.sqrt(n)),i(o-1)&&(o=Math.sqrt(o)),e[0]<0&&(n=-n),e[3]<0&&(o=-o),a[0]=e[4],a[1]=e[5],s[0]=n,s[1]=o,this.rotation=Math.atan2(-e[1]/o,e[0]/n)}},u.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),n=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(n=-n),[e,n]},u.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&o.applyTransform(n,n,i),n},u.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&o.applyTransform(n,n,i),n},l.getLocalTransform=function(t,e){e=e||[],a(e);var n=t.origin,i=t.scale||[1,1],o=t.rotation||0,s=t.position||[0,0];return n&&(e[4]-=n[0],e[5]-=n[1]),r.scale(e,e,i),o&&r.rotate(e,e,o),n&&(e[4]+=n[0],e[5]+=n[1]),e[4]+=s[0],e[5]+=s[1],e},t.exports=l},function(t,e,n){var i=n(96),r=n(1),o=n(13),a=n(12),s=["value","category","time","log"];t.exports=function(t,e,n,l){r.each(s,function(o){e.extend({type:t+"Axis."+o,mergeDefaultAndTheme:function(e,i){var s=this.layoutMode,l=s?a.getLayoutParams(e):{},u=i.getTheme();r.merge(e,u.get(o+"Axis")),r.merge(e,this.getDefaultOption()),e.type=n(t,e),s&&a.mergeLayoutParam(e,l,s)},defaultOption:r.mergeAll([{},i[o+"Axis"],l],!0)})}),o.registerSubTypeDefaulter(t+"Axis",r.curry(n,t))}},function(t,e,n){"use strict";function i(t,e){return e.type||(e.data?"category":"value")}var r=n(13),o=n(1),a=n(59),s=r.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});o.merge(s.prototype,n(42));var l={offset:0};a("x",s,i,l),a("y",s,i,l),t.exports=s},function(t,e){t.exports=function(t,e){e.eachSeriesByType(t,function(t){var e=t.getData(),n=t.coordinateSystem;if(n){for(var i=[],r=n.dimensions,o=0;o<r.length;o++)i.push(t.coordDimToDataDim(n.dimensions[o])[0]);1===i.length?e.each(i[0],function(t,i){e.setItemLayout(i,isNaN(t)?[NaN,NaN]:n.dataToPoint(t))}):2===i.length&&e.each(i,function(t,i,r){e.setItemLayout(r,isNaN(t)||isNaN(i)?[NaN,NaN]:n.dataToPoint([t,i]))},!0)}})}},function(t,e,n){var i=n(15),r=i.set,o=i.get;t.exports={clearColorPalette:function(){r(this,"colorIdx",0),r(this,"colorNameMap",{})},getColorFromPalette:function(t,e){e=e||this;var n=o(e,"colorIdx")||0,i=o(e,"colorNameMap")||r(e,"colorNameMap",{});if(i.hasOwnProperty(t))return i[t];var a=this.get("color",!0)||[];if(a.length){var s=a[n];return t&&(i[t]=s),r(e,"colorIdx",(n+1)%a.length),s}}}},function(t,e){t.exports=function(t,e){var n=e.findComponents({mainType:"legend"});n&&n.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var i=e.getName(t),r=0;r<n.length;r++)if(!n[r].isSelected(i))return!1;return!0},this)},this)}},function(t,e,n){function i(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}var r=n(4),o=r.round,a={};a.intervalScaleNiceTicks=function(t,e,n){var i={},s=t[1]-t[0],l=i.interval=r.nice(s/e,!0);null!=n&&l<n&&(l=i.interval=n);var u=i.intervalPrecision=r.getPrecisionSafe(l)+2,h=i.niceTickExtent=[o(Math.ceil(t[0]/l)*l,u),o(Math.floor(t[1]/l)*l,u)];return a.fixExtent(h,t),i},a.fixExtent=function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),i(t,0,e),i(t,1,e),t[0]>t[1]&&(t[0]=t[1])},a.intervalScaleGetTicks=function(t,e,n,i){var r=[];if(!t)return r;var a=1e4;e[0]<n[0]&&r.push(e[0]);for(var s=n[0];s<=n[1]&&(r.push(s),s=o(s+t,i),s!==r[r.length-1]);)if(r.length>a)return[];return e[1]>(r.length?r[r.length-1]:n[1])&&r.push(e[1]),r},t.exports=a},function(t,e,n){var i=n(36),r=n(49),o=n(15),a=function(){this.group=new i,this.uid=r.getUID("viewComponent")};a.prototype={constructor:a,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){}};var s=a.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,n,i){},o.enableClassExtend(a),o.enableClassManagement(a,{registerWhenExtend:!0}),t.exports=a},function(t,e,n){"use strict";var i=n(71),r=n(23),o=n(58),a=n(178),s=n(1),l=function(t){o.call(this,t),r.call(this,t),a.call(this,t),this.id=t.id||i()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;n||(n=this.transform=[1,0,0,1,0,0]),n[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];n||(n=this[t]=[]),n[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},s.mixin(l,a),s.mixin(l,o),s.mixin(l,r),t.exports=l},function(t,e,n){function i(t,e){return t[e]}function r(t,e,n){t[e]=n}function o(t,e,n){return(e-t)*n+t}function a(t,e,n){return n>.5?e:t}function s(t,e,n,i,r){var a=t.length;if(1==r)for(var s=0;s<a;s++)i[s]=o(t[s],e[s],n);else for(var l=a&&t[0].length,s=0;s<a;s++)for(var u=0;u<l;u++)i[s][u]=o(t[s][u],e[s][u],n)}function l(t,e,n){var i=t.length,r=e.length;if(i!==r){var o=i>r;if(o)t.length=r;else for(var a=i;a<r;a++)t.push(1===n?e[a]:_.call(e[a]))}for(var s=t[0]&&t[0].length,a=0;a<t.length;a++)if(1===n)isNaN(t[a])&&(t[a]=e[a]);else for(var l=0;l<s;l++)isNaN(t[a][l])&&(t[a][l]=e[a][l])}function u(t,e,n){if(t===e)return!0;var i=t.length;if(i!==e.length)return!1;if(1===n){for(var r=0;r<i;r++)if(t[r]!==e[r])return!1}else for(var o=t[0].length,r=0;r<i;r++)for(var a=0;a<o;a++)if(t[r][a]!==e[r][a])return!1;return!0}function h(t,e,n,i,r,o,a,s,l){var u=t.length;if(1==l)for(var h=0;h<u;h++)s[h]=c(t[h],e[h],n[h],i[h],r,o,a);else for(var d=t[0].length,h=0;h<u;h++)for(var f=0;f<d;f++)s[h][f]=c(t[h][f],e[h][f],n[h][f],i[h][f],r,o,a)}function c(t,e,n,i,r,o,a){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*a+(-3*(e-n)-2*s-l)*o+s*r+e}function d(t){if(x(t)){var e=t.length;if(x(t[0])){for(var n=[],i=0;i<e;i++)n.push(_.call(t[i]));return n}return _.call(t)}return t}function f(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t){var e=t[t.length-1].value;return x(e&&e[0])?2:1}function g(t,e,n,i,r){var d=t._getter,g=t._setter,y="spline"===e,_=i.length;if(_){var b,w=i[0].value,M=x(w),S=!1,T=!1,A=M?p(i):0;i.sort(function(t,e){return t.time-e.time}),b=i[_-1].time;for(var I=[],C=[],P=i[0].value,D=!0,k=0;k<_;k++){I.push(i[k].time/b);var L=i[k].value;if(M&&u(L,P,A)||!M&&L===P||(D=!1),P=L,"string"==typeof L){var O=v.parse(L);O?(L=O,S=!0):T=!0}C.push(L)}if(!D){for(var z=C[_-1],k=0;k<_-1;k++)M?l(C[k],z,A):!isNaN(C[k])||isNaN(z)||T||S||(C[k]=z);M&&l(d(t._target,r),z,A);var E,N,R,B,V,F,G=0,H=0;if(S)var W=[0,0,0,0];var Z=function(t,e){var n;if(e<0)n=0;else if(e<H){for(E=Math.min(G+1,_-1),n=E;n>=0&&!(I[n]<=e);n--);n=Math.min(n,_-2)}else{for(n=G;n<_&&!(I[n]>e);n++);n=Math.min(n-1,_-2)}G=n,H=e;var i=I[n+1]-I[n];if(0!==i)if(N=(e-I[n])/i,y)if(B=C[n],R=C[0===n?n:n-1],V=C[n>_-2?_-1:n+1],F=C[n>_-3?_-1:n+2],M)h(R,B,V,F,N,N*N,N*N*N,d(t,r),A);else{var l;if(S)l=h(R,B,V,F,N,N*N,N*N*N,W,1),l=f(W);else{if(T)return a(B,V,N);l=c(R,B,V,F,N,N*N,N*N*N)}g(t,r,l)}else if(M)s(C[n],C[n+1],N,d(t,r),A);else{var l;if(S)s(C[n],C[n+1],N,W,1),l=f(W);else{if(T)return a(C[n],C[n+1],N);l=o(C[n],C[n+1],N)}g(t,r,l)}},q=new m({target:t._target,life:b,loop:t._loop,delay:t._delay,onframe:Z,ondestroy:n});return e&&"spline"!==e&&(q.easing=e),q}}}var m=n(157),v=n(22),y=n(1),x=y.isArrayLike,_=Array.prototype.slice,b=function(t,e,n,o){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||i,this._setter=o||r,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};b.prototype={when:function(t,e){var n=this._tracks;for(var i in e)if(e.hasOwnProperty(i)){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:d(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,n=0;n<e;n++)t[n].call(this)},start:function(t){var e,n=this,i=0,r=function(){i--,i||n._doneCallback()};for(var o in this._tracks)if(this._tracks.hasOwnProperty(o)){var a=g(this,t,r,this._tracks[o],o);a&&(this._clipList.push(a),i++,this.animation&&this.animation.addClip(a),e=a)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var i=0;i<n._onframeList.length;i++)n._onframeList[i](t,e)}}return i||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,n=this.animation,i=0;i<e.length;i++){var r=e[i];t&&r.onframe(this._target,1),n&&n.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}},t.exports=b},function(t,e){t.exports="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)}},function(t,e){var n=2*Math.PI;t.exports={normalizeRadian:function(t){return t%=n,t<0&&(t+=n),t}}},function(t,e){var n=function(){this.head=null,this.tail=null,this._len=0},i=n.prototype;i.insert=function(t){var e=new r(t);return this.insertEntry(e),e},i.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},i.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},i.len=function(){return this._len},i.clear=function(){this.head=this.tail=null,this._len=0};var r=function(t){this.value=t,this.next,this.prev},o=function(t){this._list=new n,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},a=o.prototype;a.put=function(t,e){var n=this._list,i=this._map,o=null;if(null==i[t]){var a=n.len(),s=this._lastRemovedEntry;if(a>=this._maxSize&&a>0){var l=n.head;n.remove(l),delete i[l.key],o=l.value,this._lastRemovedEntry=l}s?s.value=e:s=new r(e),s.key=t,n.insertEntry(s),i[t]=s}return o},a.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},a.clear=function(){this._list.clear(),this._map={}},t.exports=o},function(t,e){var n=2311;t.exports=function(){return n++}},function(t,e){var n=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};n.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")},t.exports=n},function(t,e){function n(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y);var s=t.createLinearGradient(i,o,r,a);return s}function i(t,e,n){var i=n.width,r=n.height,o=Math.min(i,r),a=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;e.global||(a=a*i+n.x,s=s*r+n.y,l*=o);var u=t.createRadialGradient(a,s,0,a,s,l);return u}var r=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],o=function(t){this.extendFrom(t)};o.prototype={constructor:o,fill:"#000000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,textFill:"#000",textStroke:null,textPosition:"inside",textOffset:null,textBaseline:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textTransform:!1,textRotation:0,blend:null,bind:function(t,e,n){for(var i=this,o=n&&n.style,a=!o,s=0;s<r.length;s++){var l=r[s],u=l[0];(a||i[u]!==o[u])&&(t[u]=i[u]||l[1])}if((a||i.fill!==o.fill)&&(t.fillStyle=i.fill),(a||i.stroke!==o.stroke)&&(t.strokeStyle=i.stroke),(a||i.opacity!==o.opacity)&&(t.globalAlpha=null==i.opacity?1:i.opacity),(a||i.blend!==o.blend)&&(t.globalCompositeOperation=i.blend||"source-over"),this.hasStroke()){var h=i.lineWidth;t.lineWidth=h/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t){var n=this;for(var i in t)!t.hasOwnProperty(i)||!e&&n.hasOwnProperty(i)||(n[i]=t[i])}},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,r){for(var o="radial"===e.type?i:n,a=o(t,e,r),s=e.colorStops,l=0;l<s.length;l++)a.addColorStop(s[l].offset,s[l].color);return a}};for(var a=o.prototype,s=0;s<r.length;s++){var l=r[s];l[0]in a||(a[l[0]]=l[1])}o.getGradient=a.getGradient,t.exports=o},function(t,e,n){var i=n(168),r=n(167);t.exports={buildPath:function(t,e,n){var o=e.points,a=e.smooth;if(o&&o.length>=2){if(a&&"spline"!==a){var s=r(o,a,n,e.smoothConstraint);t.moveTo(o[0][0],o[0][1]);for(var l=o.length,u=0;u<(n?l:l-1);u++){var h=s[2*u],c=s[2*u+1],d=o[(u+1)%l];t.bezierCurveTo(h[0],h[1],c[0],c[1],d[0],d[1])}}else{"spline"===a&&(o=i(o,n)),t.moveTo(o[0][0],o[0][1]);for(var u=1,f=o.length;u<f;u++)t.lineTo(o[u][0],o[u][1])}n&&t.closePath()}}}},function(t,e,n){var i=n(1),r={};r.layout=function(t,e,n){function r(t,e){var n=o.getAxis(t);return n.toGlobalCoord(n.dataToCoord(0))}n=n||{};var o=t.coordinateSystem,a=e.axis,s={},l=a.position,u=a.onZero?"onZero":l,h=a.dim,c=o.getRect(),d=[c.x,c.x+c.width,c.y,c.y+c.height],f=e.get("offset")||0,p={x:{top:d[2]-f,bottom:d[3]+f},y:{left:d[0]-f,right:d[1]+f}};p.x.onZero=Math.max(Math.min(r("y"),p.x.bottom),p.x.top),p.y.onZero=Math.max(Math.min(r("x"),p.y.right),p.y.left),s.position=["y"===h?p.y[u]:d[0],"x"===h?p.x[u]:d[3]],s.rotation=Math.PI/2*("x"===h?0:1);var g={top:-1,bottom:1,left:-1,right:1};s.labelDirection=s.tickDirection=s.nameDirection=g[l],s.labelOffset=a.onZero?p[h][l]-p[h].onZero:0,e.get("axisTick.inside")&&(s.tickDirection=-s.tickDirection),i.retrieve(n.labelInside,e.get("axisLabel.inside"))&&(s.labelDirection=-s.labelDirection);var m=e.get("axisLabel.rotate");return s.labelRotate="top"===u?-m:m,s.labelInterval=a.getLabelInterval(),s.z2=1,s},t.exports=r},function(t,e,n){"use strict";function i(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}var r=n(1),o=n(3),a=n(16),s=n(7),l=n(19),u=n(18),h=n(40),c={};c.buildElStyle=function(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle(),e.fill=null):"shadow"===n&&(e=i.getAreaStyle(),e.stroke=null),e},c.buildLabelElOption=function(t,e,n,r,o){var l=n.get("value"),u=c.getValueLabel(l,e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get("label.precision"),formatter:n.get("label.formatter")}),h=n.getModel("label"),d=h.getModel("textStyle"),f=s.normalizeCssArray(h.get("padding")||0),p=d.getFont(),g=a.getBoundingRect(u,p,o.textAlign,o.textBaseline),m=o.position,v=g.width+f[1]+f[3],y=g.height+f[0]+f[2],x=o.align;"right"===x&&(m[0]-=v),"center"===x&&(m[0]-=v/2);var _=o.verticalAlign;"bottom"===_&&(m[1]-=y),"middle"===_&&(m[1]-=y/2),i(m,v,y,r);var b=h.get("backgroundColor");b&&"auto"!==b||(b=e.get("axisLine.lineStyle.color")),t.label={shape:{x:0,y:0,width:v,height:y,r:h.get("borderRadius")},position:m.slice(),style:{text:u,textFont:p,textFill:d.getTextColor(),textPosition:"inside",fill:b,stroke:h.get("borderColor")||"transparent",lineWidth:h.get("borderWidth")||0,shadowBlur:h.get("shadowBlur"),shadowColor:h.get("shadowColor"),shadowOffsetX:h.get("shadowOffsetX"),shadowOffsetY:h.get("shadowOffsetY")},z2:10}},c.getValueLabel=function(t,e,n,i,o){var a=e.scale.getLabel(t,{precision:o.precision}),s=o.formatter;if(s){var l={value:u.getAxisRawValue(e,t),seriesData:[]};r.each(i,function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&l.seriesData.push(r)}),r.isString(s)?a=s.replace("{value}",a):r.isFunction(s)&&(a=s(l))}return a},c.getTransformedPosition=function(t,e,n){var i=l.create();return l.rotate(i,i,n.rotation),l.translate(i,i,n.position),o.applyTransform([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)},c.buildCartesianSingleLabelElOption=function(t,e,n,i,r,o){var a=h.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get("label.margin"),c.buildLabelElOption(e,i,r,o,{position:c.getTransformedPosition(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})},c.makeLineShape=function(t,e,n){return n=n||0,{x1:t[n],y1:t[1-n],x2:e[n],y2:e[1-n]}},c.makeRectShape=function(t,e,n){return n=n||0,{x:t[n],y:t[1-n],width:e[n],height:e[1-n]}},c.makeSectorShape=function(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}},t.exports=c},function(t,e,n){var i=n(7),r=n(1),o={},a=["x","y","z","radius","angle","single"],s=["cartesian2d","polar","singleAxis"];o.isCoordSupported=function(t){return r.indexOf(s,t)>=0},o.createNameEach=function(t,e){t=t.slice();var n=r.map(t,i.capitalFirst);e=(e||[]).slice();var o=r.map(e,i.capitalFirst);return function(i,a){r.each(t,function(t,r){for(var s={name:t,capital:n[r]},l=0;l<e.length;l++)s[e[l]]=t+o[l];i.call(a,s)})}},o.eachAxisDim=o.createNameEach(a,["axisIndex","axis","index","id"]),o.createLinkedNodesFinder=function(t,e,n){function i(t,e){return r.indexOf(e.nodes,t)>=0}function o(t,i){var o=!1;return e(function(e){r.each(n(t,e)||[],function(t){i.records[e.name][t]&&(o=!0)})}),o}function a(t,i){i.nodes.push(t),e(function(e){r.each(n(t,e)||[],function(t){i.records[e.name][t]=!0})})}return function(n){function r(t){!i(t,s)&&o(t,s)&&(a(t,s),l=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!n)return s;a(n,s);var l;do l=!1,t(r);while(l);return s}},t.exports=o},function(t,e,n){var i=n(1);t.exports={updateSelectedMap:function(t){this._selectTargetMap=i.reduce(t||[],function(t,e){return t.set(e.name,e),t},i.createHashMap())},select:function(t){var e=this._selectTargetMap,n=e.get(t),i=this.get("selectedMode");"single"===i&&e.each(function(t){t.selected=!1}),n&&(n.selected=!0)},unSelect:function(t){var e=this._selectTargetMap.get(t);e&&(e.selected=!1)},toggleSelected:function(t){var e=this._selectTargetMap.get(t);if(null!=e)return this[e.selected?"unSelect":"select"](t),e.selected},isSelected:function(t){var e=this._selectTargetMap.get(t);return e&&e.selected}}},function(t,e,n){function i(t){r.defaultEmphasis(t.label,r.LABEL_OPTIONS)}var r=n(5),o=n(1),a=n(9),s=n(7),l=s.addCommas,u=s.encodeHTML,h=n(2).extendComponentModel({type:"marker",dependencies:["series","grid","polar","geo"],init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n),this.mergeOption(t,n,i.createdBySelf,!0)},isAnimationEnabled:function(){if(a.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},mergeOption:function(t,e,n,r){var a=this.constructor,s=this.mainType+"Model";n||e.eachSeries(function(t){var n=t.get(this.mainType),l=t[s];return n&&n.data?(l?l.mergeOption(n,e,!0):(r&&i(n),o.each(n.data,function(t){t instanceof Array?(i(t[0]),i(t[1])):i(t)}),l=new a(n,this,e),o.extend(l,{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),l.__hostSeries=t),void(t[s]=l)):void(t[s]=null)},this)},formatTooltip:function(t){var e=this.getData(),n=this.getRawValue(t),i=o.isArray(n)?o.map(n,l).join(", "):l(n),r=e.getName(t),a=u(this.name);return(null!=n||r)&&(a+="<br />"),r&&(a+=u(r),null!=n&&(a+=" : ")),null!=n&&(a+=u(i)),a},getData:function(){return this._data},setData:function(t){this._data=t}});o.mixin(h,r.dataFormatMixin),t.exports=h},function(t,e,n){var i=n(1);t.exports=n(2).extendComponentView({type:"marker",init:function(){this.markerGroupMap=i.createHashMap()},render:function(t,e,n){var i=this.markerGroupMap;i.each(function(t){t.__keep=!1});var r=this.type+"Model";e.eachSeries(function(t){var i=t[r];i&&this.renderSeries(t,i,e,n)},this),i.each(function(t){!t.__keep&&this.group.remove(t.group)},this)},renderSeries:function(){}})},function(t,e,n){function i(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function r(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function o(t,e,n){var i=-1;do i=Math.max(l.getPrecision(t.get(e,n)),i),t=t.stackedOn;while(t);return i}function a(t,e,n,i,r,a){var s=[],l=m(e,i,t),u=e.indicesOfNearest(i,l,!0)[0];s[r]=e.get(n,u,!0),s[a]=e.get(i,u,!0);var h=o(e,i,u);return h>=0&&(s[a]=+s[a].toFixed(h)),s}var s=n(1),l=n(4),u=s.indexOf,h=s.curry,c={min:h(a,"min"),max:h(a,"max"),average:h(a,"average")},d=function(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&!r(e)&&!s.isArray(e.coord)&&i){var o=i.dimensions,a=f(e,n,i,t);if(e=s.clone(e),e.type&&c[e.type]&&a.baseAxis&&a.valueAxis){var l=u(o,a.baseAxis.dim),h=u(o,a.valueAxis.dim);e.coord=c[e.type](n,a.baseDataDim,a.valueDataDim,l,h),e.value=e.coord[h]}else{for(var d=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],p=0;p<2;p++)if(c[d[p]]){var g=t.coordDimToDataDim(o[p])[0];d[p]=m(n,g,d[p])}e.coord=d}}return e},f=function(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(i.dataDimToCoordDim(r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=i.coordDimToDataDim(r.baseAxis.dim)[0]):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=i.coordDimToDataDim(r.baseAxis.dim)[0],r.valueDataDim=i.coordDimToDataDim(r.valueAxis.dim)[0]),r},p=function(t,e){return!(t&&t.containData&&e.coord&&!i(e))||t.containData(e.coord)},g=function(t,e,n,i){return i<2?t.coord&&t.coord[i]:t.value},m=function(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,function(t,e){isNaN(t)||(i+=t,r++)},!0),i/r}return t.getDataExtent(e,!0)["max"===n?1:0]};t.exports={dataTransform:d,dataFilter:p,dimValueGetter:g,getAxisInfo:f,numCalculate:m}},function(t,e,n){"use strict";function i(t){return t.get("stack")||d+t.seriesIndex}function r(t){return t.dim+t.index}function o(t,e){var n=[],i=t.axis,r="axis0";if("category"===i.type){for(var o=i.getBandWidth(),a=0;a<t.count;a++)n.push(u.defaults({bandWidth:o,axisKey:r,stackId:d+a},t));for(var l=s(n,e),h=[],a=0;a<t.count;a++){var c=l[r][d+a];c.offsetCenter=c.offset+c.width/2,h.push(c)}return h}}function a(t,e){var n=u.map(t,function(t){var e=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),a=o.getExtent(),s="category"===o.type?o.getBandWidth():Math.abs(a[1]-a[0])/e.count(),l=c(t.get("barWidth"),s),u=c(t.get("barMaxWidth"),s),h=t.get("barGap"),d=t.get("barCategoryGap");return{bandWidth:s,barWidth:l,barMaxWidth:u,barGap:h,barCategoryGap:d,axisKey:r(o),stackId:i(t)}});return s(n,e)}function s(t,e){var n={};u.each(t,function(t,e){var i=t.axisKey,r=t.bandWidth,o=n[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},a=o.stacks;n[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(l=Math.min(o.remainedWidth,l),a[s].width=l,o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barGap;null!=h&&(o.gap=h);var c=t.barCategoryGap;null!=c&&(o.categoryGap=c)});var i={};return u.each(n,function(t,e){i[e]={};var n=t.stacks,r=t.bandWidth,o=c(t.categoryGap,r),a=c(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,h=(s-o)/(l+(l-1)*a);h=Math.max(h,0),u.each(n,function(t,e){var n=t.maxWidth;n&&n<h&&(n=Math.min(n,s),t.width&&(n=Math.min(n,t.width)),s-=n,t.width=n,l--)}),h=(s-o)/(l+(l-1)*a),h=Math.max(h,0);var d,f=0;u.each(n,function(t,e){t.width||(t.width=h),d=t,f+=t.width*(1+a)}),d&&(f-=d.width*a);var p=-f/2;u.each(n,function(t,n){i[e][n]=i[e][n]||{offset:p,width:t.width},p+=t.width*(1+a)})}),i}function l(t,e,n){var o=a(u.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),s={},l={};e.eachSeriesByType(t,function(t){if("cartesian2d"===t.coordinateSystem.type){var e=t.getData(),n=t.coordinateSystem,a=n.getBaseAxis(),u=i(t),h=o[r(a)][u],c=h.offset,d=h.width,f=n.getOtherAxis(a),p=t.get("barMinHeight")||0,g=a.onZero?f.toGlobalCoord(f.dataToCoord(0)):f.getGlobalExtent()[0],m=n.dataToPoints(e,!0);s[u]=s[u]||[],l[u]=l[u]||[],e.setLayout({offset:c,size:d}),e.each(f.dim,function(t,n){if(!isNaN(t)){s[u][n]||(s[u][n]={p:g,n:g},l[u][n]={p:g,n:g});var i,r,o,a,h=t>=0?"p":"n",v=m[n],y=s[u][n][h],x=l[u][n][h];f.isHorizontal()?(i=y,r=v[1]+c,o=v[0]-x,a=d,l[u][n][h]+=o,Math.abs(o)<p&&(o=(o<0?-1:1)*p),s[u][n][h]+=o):(i=v[0]+c,r=y,o=d,a=v[1]-x,l[u][n][h]+=a,Math.abs(a)<p&&(a=(a<=0?-1:1)*p),s[u][n][h]+=a),e.setItemLayout(n,{x:i,y:r,width:o,height:a})}},!0)}},this)}var u=n(1),h=n(4),c=h.parsePercent,d="__ec_stack_";l.getLayoutOnAxis=o,t.exports=l},,function(t,e){t.exports=function(t,e){var n={};e.eachRawSeriesByType(t,function(t){var i=t.getRawData(),r={};if(!e.isSeriesFiltered(t)){var o=t.getData();o.each(function(t){var e=o.getRawIndex(t);r[e]=t}),i.each(function(e){var a=r[e],s=null!=a&&o.getItemVisual(a,"color",!0);if(s)i.setItemVisual(e,"color",s);else{var l=i.getItemModel(e),u=l.get("itemStyle.normal.color")||t.getColorFromPalette(i.getName(e),n);i.setItemVisual(e,"color",u),null!=a&&o.setItemVisual(a,"color",u)}})}})}},function(t,e,n){var i=n(6),r=n(20),o={},a=Math.min,s=Math.max,l=Math.sin,u=Math.cos,h=i.create(),c=i.create(),d=i.create(),f=2*Math.PI;o.fromPoints=function(t,e,n){if(0!==t.length){var i,r=t[0],o=r[0],l=r[0],u=r[1],h=r[1];for(i=1;i<t.length;i++)r=t[i],o=a(o,r[0]),l=s(l,r[0]),u=a(u,r[1]),h=s(h,r[1]);e[0]=o,e[1]=u,n[0]=l,n[1]=h}},o.fromLine=function(t,e,n,i,r,o){r[0]=a(t,n),r[1]=a(e,i),o[0]=s(t,n),o[1]=s(e,i)};var p=[],g=[];o.fromCubic=function(t,e,n,i,o,l,u,h,c,d){var f,m=r.cubicExtrema,v=r.cubicAt,y=m(t,n,o,u,p);for(c[0]=1/0,c[1]=1/0,d[0]=-(1/0),d[1]=-(1/0),f=0;f<y;f++){var x=v(t,n,o,u,p[f]);c[0]=a(x,c[0]),d[0]=s(x,d[0])}for(y=m(e,i,l,h,g),f=0;f<y;f++){var _=v(e,i,l,h,g[f]);c[1]=a(_,c[1]),d[1]=s(_,d[1])}c[0]=a(t,c[0]),d[0]=s(t,d[0]),c[0]=a(u,c[0]),d[0]=s(u,d[0]),c[1]=a(e,c[1]),d[1]=s(e,d[1]),c[1]=a(h,c[1]),d[1]=s(h,d[1])},o.fromQuadratic=function(t,e,n,i,o,l,u,h){var c=r.quadraticExtremum,d=r.quadraticAt,f=s(a(c(t,n,o),1),0),p=s(a(c(e,i,l),1),0),g=d(t,n,o,f),m=d(e,i,l,p);u[0]=a(t,o,g),u[1]=a(e,l,m),h[0]=s(t,o,g),h[1]=s(e,l,m)},o.fromArc=function(t,e,n,r,o,a,s,p,g){var m=i.min,v=i.max,y=Math.abs(o-a);if(y%f<1e-4&&y>1e-4)return p[0]=t-n,p[1]=e-r,g[0]=t+n,void(g[1]=e+r);if(h[0]=u(o)*n+t,h[1]=l(o)*r+e,c[0]=u(a)*n+t,c[1]=l(a)*r+e,m(p,h,c),v(g,h,c),o%=f,o<0&&(o+=f),a%=f,a<0&&(a+=f),o>a&&!s?a+=f:o<a&&s&&(o+=f),s){var x=a;a=o,o=x}for(var _=0;_<a;_+=Math.PI/2)_>o&&(d[0]=u(_)*n+t,d[1]=l(_)*r+e,m(p,d,p),v(g,d,g))},t.exports=o},function(t,e,n){var i=n(38),r=n(1),o=n(16),a=function(t){i.call(this,t)};a.prototype={constructor:a,type:"text",brush:function(t,e){var n=this.style,i=n.x||0,r=n.y||0,a=n.text;if(null!=a&&(a+=""),n.bind(t,this,e),a){this.setTransform(t);var s,l=n.textAlign,u=n.textFont||n.font;if(n.textVerticalAlign){var h=o.getBoundingRect(a,u,n.textAlign,"top");switch(s="middle",n.textVerticalAlign){case"middle":r-=h.height/2-h.lineHeight/2;break;case"bottom":r-=h.height-h.lineHeight/2;break;default:r+=h.lineHeight/2}}else s=n.textBaseline;t.font=u||"12px sans-serif",t.textAlign=l||"left",t.textAlign!==l&&(t.textAlign="left"),t.textBaseline=s||"alphabetic",t.textBaseline!==s&&(t.textBaseline="alphabetic");for(var c=o.measureText("国",t.font).width,d=a.split("\n"),f=0;f<d.length;f++)n.hasStroke()&&t.strokeText(d[f],i,r),n.hasFill()&&t.fillText(d[f],i,r),r+=c;this.restoreTransform(t)}},getBoundingRect:function(){var t=this.style;if(!this._rect){var e=t.textVerticalAlign,n=o.getBoundingRect(t.text+"",t.textFont||t.font,t.textAlign,e?"top":t.textBaseline);switch(e){case"middle":n.y-=n.height/2;break;case"bottom":n.y-=n.height}if(n.x+=t.x||0,n.y+=t.y||0,t.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect}},r.inherits(a,i),t.exports=a},function(t,e,n){function i(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}var r=n(16),o=n(11),a=new o,s=function(){};s.prototype={constructor:s,drawRectText:function(t,e,n){var o=this.style,s=o.text;if(null!=s&&(s+=""),s){t.save();var l,u,h=o.textPosition,c=o.textOffset,d=o.textDistance,f=o.textAlign,p=o.textFont||o.font,g=o.textBaseline,m=o.textVerticalAlign;n=n||r.getBoundingRect(s,p,f,g);var v=this.transform;if(o.textTransform?this.setTransform(t):v&&(a.copy(e),a.applyTransform(v),e=a),h instanceof Array){if(l=e.x+i(h[0],e.width),u=e.y+i(h[1],e.height),f=f||"left",g=g||"top",m){switch(m){case"middle":u-=n.height/2-n.lineHeight/2;break;case"bottom":u-=n.height-n.lineHeight/2;break;default:u+=n.lineHeight/2}g="middle"}}else{var y=r.adjustTextPositionOnRect(h,e,n,d);l=y.x,u=y.y,f=f||y.textAlign,g=g||y.textBaseline}c&&(l+=c[0],u+=c[1]),t.textAlign=f||"left",t.textBaseline=g||"alphabetic";var x=o.textFill,_=o.textStroke;x&&(t.fillStyle=x),_&&(t.strokeStyle=_),t.font=p||"12px sans-serif",t.shadowBlur=o.textShadowBlur,t.shadowColor=o.textShadowColor||"transparent",t.shadowOffsetX=o.textShadowOffsetX,t.shadowOffsetY=o.textShadowOffsetY;var b=s.split("\n");o.textRotation&&(v&&t.translate(v[4],v[5]),t.rotate(o.textRotation),v&&t.translate(-v[4],-v[5]));for(var w=0;w<b.length;w++)_&&t.strokeText(b[w],l,u),x&&t.fillText(b[w],l,u),u+=n.lineHeight;t.restore()}}},t.exports=s},function(t,e,n){function i(t){delete f[t]}/*!
 	 * ZRender, a high performance 2d drawing library.
 	 *
 	 * Copyright (c) 2013, Baidu Inc.
@@ -20,10 +20,10 @@
 	 * LICENSE
 	 * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt
 	 */
-var r=n(70),o=n(9),a=n(1),s=n(152),l=n(155),u=n(156),h=n(163),c=!o.canvasSupported,d={canvas:n(154)},f={},p={};p.version="3.4.4",p.init=function(t,e){var n=new g(r(),t,e);return f[n.id]=n,n},p.dispose=function(t){if(t)t.dispose();else{for(var e in f)f.hasOwnProperty(e)&&f[e].dispose();f={}}return p},p.getInstance=function(t){return f[t]},p.registerPainter=function(t,e){d[t]=e};var g=function(t,e,n){n=n||{},this.dom=e,this.id=t;var i=this,r=new l,f=n.renderer;if(c){if(!d.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");f="vml"}else f&&d[f]||(f="canvas");var p=new d[f](e,r,n);this.storage=r,this.painter=p;var g=o.node?null:new h(p.getViewportRoot());this.handler=new s(r,p,g,p.root),this.animation=new u({stage:{update:a.bind(this.flush,this)}}),this.animation.start(),this._needsRefresh;var v=r.delFromStorage,m=r.addToStorage;r.delFromStorage=function(t){v.call(r,t),t&&t.removeSelfFromZr(i)},r.addToStorage=function(t){m.call(r,t),t.addSelfToZr(i)}};g.prototype={constructor:g,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,n){this.handler.on(t,e,n)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,i(this.id)}},t.exports=p},function(t,e,n){var i=n(2),r=n(1);t.exports=function(t,e){r.each(e,function(e){e.update="updateView",i.registerAction(e,function(n,i){var r={};return i.eachComponent({mainType:"series",subType:t,query:n},function(t){t[e.method]&&t[e.method](n.name);var i=t.getData();i.each(function(e){var n=i.getName(e);r[n]=t.isSelected(n)||!1})}),{name:n.name,selected:r}})})}},function(t,e,n){"use strict";var i=n(18),r=n(28);t.exports=i.extend({type:"series.__base_bar__",getInitialData:function(t,e){return r(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(t,!0),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size"),a=e.getBaseAxis().isHorizontal()?0:1;return n[a]+=r+o/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,itemStyle:{normal:{},emphasis:{}}}})},function(t,e,n){function i(t,e,n,i,r){o.setText(t,e,n),t.text=i,"outside"===t.textPosition&&(t.textPosition=r)}var r=n(1),o=n(3),a={};a.setLabel=function(t,e,n,o,a,s,l){var u=n.getModel("label.normal"),h=n.getModel("label.emphasis");u.get("show")?i(t,u,o,r.retrieve(a.getFormattedLabel(s,"normal"),a.getRawValue(s)),l):t.text="",h.get("show")?i(e,h,o,r.retrieve(a.getFormattedLabel(s,"emphasis"),a.getRawValue(s)),l):e.text=""},t.exports=a},function(t,e,n){function i(t){return isNaN(t[0])||isNaN(t[1])}function r(t,e,n,r,o,a,g,v,m,y,x){for(var _=0,b=n,w=0;w<r;w++){var M=e[b];if(b>=o||b<0)break;if(i(M)){if(x){b+=a;continue}break}if(b===n)t[a>0?"moveTo":"lineTo"](M[0],M[1]),c(f,M);else if(m>0){var S=b+a,T=e[S];if(x)for(;T&&i(e[S]);)S+=a,T=e[S];var A=.5,I=e[_],T=e[S];if(!T||i(T))c(p,M);else{i(T)&&!x&&(T=M),s.sub(d,T,I);var C,P;if("x"===y||"y"===y){var k="x"===y?0:1;C=Math.abs(M[k]-I[k]),P=Math.abs(M[k]-T[k])}else C=s.dist(M,I),P=s.dist(M,T);A=P/(P+C),h(p,M,d,-m*(1-A))}l(f,f,v),u(f,f,g),l(p,p,v),u(p,p,g),t.bezierCurveTo(f[0],f[1],p[0],p[1],M[0],M[1]),h(f,M,d,m*A)}else t.lineTo(M[0],M[1]);_=b,b+=a}return w}function o(t,e){var n=[1/0,1/0],i=[-(1/0),-(1/0)];if(e)for(var r=0;r<t.length;r++){var o=t[r];o[0]<n[0]&&(n[0]=o[0]),o[1]<n[1]&&(n[1]=o[1]),o[0]>i[0]&&(i[0]=o[0]),o[1]>i[1]&&(i[1]=o[1])}return{min:e?n:i,max:e?i:n}}var a=n(8),s=n(5),l=s.min,u=s.max,h=s.scaleAndAdd,c=s.copy,d=[],f=[],p=[];t.exports={Polyline:a.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},buildPath:function(t,e){var n=e.points,a=0,s=n.length,l=o(n,e.smoothConstraint);if(e.connectNulls){for(;s>0&&i(n[s-1]);s--);for(;a<s&&i(n[a]);a++);}for(;a<s;)a+=r(t,n,a,s,s,1,l.min,l.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),Polygon:a.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},buildPath:function(t,e){var n=e.points,a=e.stackedOnPoints,s=0,l=n.length,u=e.smoothMonotone,h=o(n,e.smoothConstraint),c=o(a,e.smoothConstraint);if(e.connectNulls){for(;l>0&&i(n[l-1]);l--);for(;s<l&&i(n[s]);s++);}for(;s<l;){var d=r(t,n,s,l,l,1,h.min,h.max,e.smooth,u,e.connectNulls);r(t,a,s+d-1,d,l,-1,c.min,c.max,e.stackedOnSmooth,u,e.connectNulls),s+=d+1,t.closePath()}}})}},,function(t,e,n){function i(t){this.pointerChecker,this._zr=t;var e=c.bind,n=e(r,this),i=e(o,this),u=e(a,this),d=e(s,this),f=e(l,this);h.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(e){this.disable(),null==e&&(e=!0),e!==!0&&"move"!==e&&"pan"!==e||(t.on("mousedown",n),t.on("mousemove",i),t.on("mouseup",u)),e!==!0&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",d),t.on("pinch",f))},this.disable=function(){t.off("mousedown",n),t.off("mousemove",i),t.off("mouseup",u),t.off("mousewheel",d),t.off("pinch",f)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function r(t){if(!t.target||!t.target.draggable){var e=t.offsetX,n=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,n)&&(this._x=e,this._y=n,this._dragging=!0)}}function o(t){if(this._dragging&&(d.stop(t.event),"pinch"!==t.gestureEvent)){if(f.isTaken(this._zr,"globalPan"))return;var e=t.offsetX,n=t.offsetY,i=this._x,r=this._y,o=e-i,a=n-r;this._x=e,this._y=n,d.stop(t.event),this.trigger("pan",o,a,i,r,e,n)}}function a(t){this._dragging=!1}function s(t){if(0!==t.wheelDelta){var e=t.wheelDelta>0?1.1:1/1.1;u.call(this,t,e,t.offsetX,t.offsetY)}}function l(t){if(!f.isTaken(this._zr,"globalPan")){var e=t.pinchScale>1?1.1:1/1.1;u.call(this,t,e,t.pinchX,t.pinchY)}}function u(t,e,n,i){this.pointerChecker&&this.pointerChecker(t,n,i)&&(d.stop(t.event),this.trigger("zoom",e,n,i))}var h=n(23),c=n(1),d=n(21),f=n(128);c.mixin(i,h),t.exports=i},function(t,e,n){var i=n(1),r={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,textStyle:{fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},o=i.merge({boundaryGap:!0,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},r),a=i.merge({boundaryGap:[0,0],splitNumber:5},r),s=i.defaults({scale:!0,min:"dataMin",max:"dataMax"},a),l=i.defaults({logBase:10},a);l.scale=!0,t.exports={categoryAxis:o,valueAxis:a,timeAxis:s,logAxis:l}},function(t,e,n){"use strict";function i(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}function r(t){return t.dim+t.index}function o(t,e){var n={};s.each(t,function(t,e){var o=t.getData(),a=t.coordinateSystem,s=a.getBaseAxis(),l=s.getExtent(),h="category"===s.type?s.getBandWidth():Math.abs(l[1]-l[0])/o.count(),c=n[r(s)]||{bandWidth:h,remainedWidth:h,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},d=c.stacks;n[r(s)]=c;var f=i(t);d[f]||c.autoWidthCount++,d[f]=d[f]||{width:0,maxWidth:0};var p=u(t.get("barWidth"),h),g=u(t.get("barMaxWidth"),h),v=t.get("barGap"),m=t.get("barCategoryGap");p&&!d[f].width&&(p=Math.min(c.remainedWidth,p),d[f].width=p,c.remainedWidth-=p),g&&(d[f].maxWidth=g),null!=v&&(c.gap=v),null!=m&&(c.categoryGap=m)});var o={};return s.each(n,function(t,e){o[e]={};var n=t.stacks,i=t.bandWidth,r=u(t.categoryGap,i),a=u(t.gap,1),l=t.remainedWidth,h=t.autoWidthCount,c=(l-r)/(h+(h-1)*a);c=Math.max(c,0),s.each(n,function(t,e){var n=t.maxWidth;n&&n<c&&(n=Math.min(n,l),t.width&&(n=Math.min(n,t.width)),l-=n,t.width=n,h--)}),c=(l-r)/(h+(h-1)*a),c=Math.max(c,0);var d,f=0;s.each(n,function(t,e){t.width||(t.width=c),d=t,f+=t.width*(1+a)}),d&&(f-=d.width*a);var p=-f/2;s.each(n,function(t,n){o[e][n]=o[e][n]||{offset:p,width:t.width},p+=t.width*(1+a)})}),o}function a(t,e,n){var a=o(s.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),l={},u={};e.eachSeriesByType(t,function(t){var e=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),s=i(t),h=a[r(o)][s],c=h.offset,d=h.width,f=n.getOtherAxis(o),p=t.get("barMinHeight")||0,g=o.onZero?f.toGlobalCoord(f.dataToCoord(0)):f.getGlobalExtent()[0],v=n.dataToPoints(e,!0);l[s]=l[s]||[],u[s]=u[s]||[],e.setLayout({offset:c,size:d}),e.each(f.dim,function(t,n){if(!isNaN(t)){l[s][n]||(l[s][n]={p:g,n:g},u[s][n]={p:g,n:g});var i,r,o,a,h=t>=0?"p":"n",m=v[n],y=l[s][n][h],x=u[s][n][h];f.isHorizontal()?(i=y,r=m[1]+c,o=m[0]-x,a=d,u[s][n][h]+=o,Math.abs(o)<p&&(o=(o<0?-1:1)*p),l[s][n][h]+=o):(i=m[0]+c,r=y,o=d,a=m[1]-x,u[s][n][h]+=a,Math.abs(a)<p&&(a=(a<=0?-1:1)*p),l[s][n][h]+=a),e.setItemLayout(n,{x:i,y:r,width:o,height:a})}},!0)},this)}var s=n(1),l=n(4),u=l.parsePercent;t.exports=a},function(t,e){t.exports={containStroke:function(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0,u=t;if(a>e+s&&a>i+s||a<e-s&&a<i-s||o>t+s&&o>n+s||o<t-s&&o<n-s)return!1;if(t===n)return Math.abs(o-t)<=s/2;l=(e-i)/(t-n),u=(t*i-n*e)/(t-n);var h=l*o-a+u,c=h*h/(l*l+1);return c<=s/2*s/2}}},function(t,e,n){var i=n(20);t.exports={containStroke:function(t,e,n,r,o,a,s,l,u){if(0===s)return!1;var h=s;if(u>e+h&&u>r+h&&u>a+h||u<e-h&&u<r-h&&u<a-h||l>t+h&&l>n+h&&l>o+h||l<t-h&&l<n-h&&l<o-h)return!1;var c=i.quadraticProjectPoint(t,e,n,r,o,a,l,u,null);return c<=h/2}}},function(t,e){t.exports=function(t,e,n,i,r,o){if(o>e&&o>i||o<e&&o<i)return 0;if(i===e)return 0;var a=i<e?1:-1,s=(o-e)/(i-e);1!==s&&0!==s||(a=i<e?.5:-.5);var l=s*(n-t)+t;return l>r?a:0}},function(t,e,n){"use strict";var i=n(1),r=n(39),o=function(t,e,n,i,o,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==i?0:i,this.type="linear",this.global=a||!1,r.call(this,o)};o.prototype={constructor:o},i.inherits(o,r),t.exports=o},function(t,e,n){"use strict";function i(t){r.each(o,function(e){this[e]=r.bind(t[e],t)},this)}var r=n(1),o=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"];t.exports=i},function(t,e,n){var i=n(1);n(56),n(102),n(103);var r=n(95),o=n(2);o.registerLayout(i.curry(r,"bar")),o.registerVisual(function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),n(32)},function(t,e,n){t.exports=n(89).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"})},function(t,e,n){"use strict";function i(t,e,n,i,r,o,a){var s=new u.Rect({shape:l.extend({},i)});if(o){var h=s.shape,c=r?"height":"width",d={};h[c]=0,d[c]=i[c],u[a?"updateProps":"initProps"](s,{shape:d},o,e)}return s}function r(t,e,n){n.style.text="",u.updateProps(n,{shape:{width:0}},e,t,function(){n.parent&&n.parent.remove(n)})}function o(t,e,n){var i=t.getItemLayout(e),r=s(n,i),o=i.width>0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}}function a(t,e,n,i,r,o,a){var s=e.getItemVisual(n,"color"),c=e.getItemVisual(n,"opacity"),d=i.getModel("itemStyle.normal"),f=i.getModel("itemStyle.emphasis").getBarItemStyle();t.setShape("r",d.get("barBorderRadius")||0),t.useStyle(l.defaults({fill:s,opacity:c},d.getBarItemStyle()));var p=a?r.height>0?"bottom":"top":r.width>0?"left":"right";h.setLabel(t.style,f,i,s,o,n,p),u.setHoverStyle(t,f)}function s(t,e){var n=t.get(c)||0;return Math.min(n,Math.abs(e.width),Math.abs(e.height))}var l=n(1),u=n(3),h=n(90),c=["itemStyle","normal","barBorderWidth"];l.extend(n(10).prototype,n(104));var d=n(2).extendChartView({type:"bar",render:function(t,e,n){var i=t.get("coordinateSystem");return"cartesian2d"===i&&this._renderOnCartesian(t,e,n),this.group},dispose:l.noop,_renderOnCartesian:function(t,e,n){var s=this.group,l=t.getData(),h=this._data,c=t.coordinateSystem,d=c.getBaseAxis(),f=d.isHorizontal(),p=t.isAnimationEnabled()?t:null;l.diff(h).add(function(e){if(l.hasValue(e)){var n=l.getItemModel(e),r=o(l,e,n),u=i(l,e,n,r,f,p);l.setItemGraphicEl(e,u),s.add(u),a(u,l,e,n,r,t,f)}}).update(function(e,n){var r=h.getItemGraphicEl(n);if(!l.hasValue(e))return void s.remove(r);var c=l.getItemModel(e),d=o(l,e,c);r?u.updateProps(r,{shape:d},p,e):r=i(l,e,c,d,f,p,!0),l.setItemGraphicEl(e,r),s.add(r),a(r,l,e,c,d,t,f)}).remove(function(t){var e=h.getItemGraphicEl(t);e&&r(t,p,e)}).execute(),this._data=l},remove:function(t,e){var n=this.group,i=this._data;t.get("animation")?i&&i.eachItemGraphicEl(function(e){r(e.dataIndex,t,e)}):n.removeAll()}});t.exports=d},function(t,e,n){var i=n(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getBarItemStyle:function(t){var e=i.call(this,t);if(this.getBorderLineDash){var n=this.getBorderLineDash();n&&(e.lineDash=n)}return e}}},function(t,e,n){function i(t){return"_"+t+"Type"}function r(t,e,n){var i=e.getItemVisual(n,"color"),r=e.getItemVisual(n,t),o=e.getItemVisual(n,t+"Size");if(r&&"none"!==r){f.isArray(o)||(o=[o,o]);var a=u.createSymbol(r,-o[0]/2,-o[1]/2,o[0],o[1],i);return a.name=t,a}}function o(t){var e=new c({name:"line"});return a(e.shape,t),e}function a(t,e){var n=e[0],i=e[1],r=e[2];t.x1=n[0],t.y1=n[1],t.x2=i[0],t.y2=i[1],t.percent=1,r?(t.cpx1=r[0],t.cpy1=r[1]):(t.cpx1=NaN,t.cpy1=NaN)}function s(){var t=this,e=t.childOfName("fromSymbol"),n=t.childOfName("toSymbol"),i=t.childOfName("label");if(e||n||!i.ignore){for(var r=1,o=this.parent;o;)o.scale&&(r/=o.scale[0]),o=o.parent;var a=t.childOfName("line");if(this.__dirty||a.__dirty){var s=a.shape.percent,l=a.pointAt(0),u=a.pointAt(s),c=h.sub([],u,l);if(h.normalize(c,c),e){e.attr("position",l);var d=a.tangentAt(0);e.attr("rotation",Math.PI/2-Math.atan2(d[1],d[0])),e.attr("scale",[r*s,r*s])}if(n){n.attr("position",u);var d=a.tangentAt(1);n.attr("rotation",-Math.PI/2-Math.atan2(d[1],d[0])),n.attr("scale",[r*s,r*s])}if(!i.ignore){i.attr("position",u);var f,p,g,v=5*r;if("end"===i.__position)f=[c[0]*v+u[0],c[1]*v+u[1]],p=c[0]>.8?"left":c[0]<-.8?"right":"center",g=c[1]>.8?"top":c[1]<-.8?"bottom":"middle";else if("middle"===i.__position){var m=s/2,d=a.tangentAt(m),y=[d[1],-d[0]],x=a.pointAt(m);y[1]>0&&(y[0]=-y[0],y[1]=-y[1]),f=[x[0]+y[0]*v,x[1]+y[1]*v],p="center",g="bottom";var _=-Math.atan2(d[1],d[0]);u[0]<l[0]&&(_=Math.PI+_),i.attr("rotation",_)}else f=[-c[0]*v+l[0],-c[1]*v+l[1]],p=c[0]>.8?"right":c[0]<-.8?"left":"center",g=c[1]>.8?"bottom":c[1]<-.8?"top":"middle";i.attr({style:{textVerticalAlign:i.__verticalAlign||g,textAlign:i.__textAlign||p},position:f,scale:[r,r]})}}}}function l(t,e,n){d.Group.call(this),this._createLine(t,e,n)}var u=n(24),h=n(5),c=n(190),d=n(3),f=n(1),p=n(4),g=["fromSymbol","toSymbol"],v=l.prototype;v.beforeUpdate=s,v._createLine=function(t,e,n){var a=t.hostModel,s=t.getItemLayout(e),l=o(s);l.shape.percent=0,d.initProps(l,{shape:{percent:1}},a,e),this.add(l);var u=new d.Text({name:"label"});this.add(u),f.each(g,function(n){var o=r(n,t,e);this.add(o),this[i(n)]=t.getItemVisual(e,n)},this),this._updateCommonStl(t,e,n)},v.updateData=function(t,e,n){var o=t.hostModel,s=this.childOfName("line"),l=t.getItemLayout(e),u={shape:{}};a(u.shape,l),d.updateProps(s,u,o,e),f.each(g,function(n){var o=t.getItemVisual(e,n),a=i(n);if(this[a]!==o){this.remove(this.childOfName(n));var s=r(n,t,e);this.add(s)}this[a]=o},this),this._updateCommonStl(t,e,n)},v._updateCommonStl=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=n&&n.lineStyle,a=n&&n.hoverLineStyle,s=n&&n.labelModel,l=n&&n.hoverLabelModel;if(!n||t.hasItemOption){var u=t.getItemModel(e);o=u.getModel("lineStyle.normal").getLineStyle(),a=u.getModel("lineStyle.emphasis").getLineStyle(),s=u.getModel("label.normal"),l=u.getModel("label.emphasis")}var h=t.getItemVisual(e,"color"),c=f.retrieve(t.getItemVisual(e,"opacity"),o.opacity,1);r.useStyle(f.defaults({strokeNoScale:!0,fill:"none",stroke:h,opacity:c},o)),r.hoverStyle=a,f.each(g,function(t){var e=this.childOfName(t);e&&(e.setColor(h),e.setStyle({opacity:c}))},this);var v,m,y=s.getShallow("show"),x=l.getShallow("show"),_=this.childOfName("label");if(y||x){var b=i.getRawValue(e);m=null==b?m=t.getName(e):isFinite(b)?p.round(b):b,v=h||"#000"}if(y){var w=s.getModel("textStyle");_.setStyle({text:f.retrieve(i.getFormattedLabel(e,"normal",t.dataType),m),textFont:w.getFont(),fill:w.getTextColor()||v}),_.__textAlign=w.get("align"),_.__verticalAlign=w.get("baseline"),_.__position=s.get("position")}else _.setStyle("text","");if(x){var M=l.getModel("textStyle");_.hoverStyle={text:f.retrieve(i.getFormattedLabel(e,"emphasis",t.dataType),m),textFont:M.getFont(),fill:M.getTextColor()||v}}else _.hoverStyle={text:""};_.ignore=!y&&!x,d.setHoverStyle(this)},v.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},v.setLinePoints=function(t){var e=this.childOfName("line");a(e.shape,t),e.dirty()},f.inherits(l,d.Group),t.exports=l},function(t,e,n){function i(t){return isNaN(t[0])||isNaN(t[1])}function r(t){return!i(t[0])&&!i(t[1])}function o(t){this._ctor=t||s,this.group=new a.Group}var a=n(3),s=n(105),l=o.prototype;l.updateData=function(t){var e=this._lineData,n=this.group,i=this._ctor,o=t.hostModel,a={lineStyle:o.getModel("lineStyle.normal").getLineStyle(),hoverLineStyle:o.getModel("lineStyle.emphasis").getLineStyle(),labelModel:o.getModel("label.normal"),hoverLabelModel:o.getModel("label.emphasis")};t.diff(e).add(function(e){if(r(t.getItemLayout(e))){var o=new i(t,e,a);t.setItemGraphicEl(e,o),n.add(o)}}).update(function(o,s){var l=e.getItemGraphicEl(s);return r(t.getItemLayout(o))?(l?l.updateData(t,o,a):l=new i(t,o,a),t.setItemGraphicEl(o,l),void n.add(l)):void n.remove(l)}).remove(function(t){n.remove(e.getItemGraphicEl(t))}).execute(),this._lineData=t},l.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,n){e.updateLayout(t,n)},this)},l.remove=function(){this.group.removeAll()},t.exports=o},function(t,e,n){var i=n(1),r=n(2),o=r.PRIORITY;n(108),n(109),r.registerVisual(i.curry(n(50),"line","circle","line")),r.registerLayout(i.curry(n(60),"line")),r.registerProcessor(o.PROCESSOR.STATISTIC,i.curry(n(147),"line")),n(32)},function(t,e,n){"use strict";var i=n(28),r=n(18);t.exports=r.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return i(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}})},function(t,e,n){"use strict";function i(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++){var i=t[n],r=e[n];if(i[0]!==r[0]||i[1]!==r[1])return}return!0}}function r(t){return"number"==typeof t?t:t?.3:0}function o(t){var e=t.getGlobalExtent();if(t.onBand){var n=t.getBandWidth()/2-1,i=e[1]>e[0]?1:-1;e[0]+=i*n,e[1]-=i*n}return e}function a(t){return t>=0?1:-1}function s(t,e){var n=t.getBaseAxis(),i=t.getOtherAxis(n),r=n.onZero?0:i.scale.getExtent()[0],o=i.dim,s="x"===o||"radius"===o?1:0;return e.mapArray([o],function(i,l){for(var u,h=e.stackedOn;h&&a(h.get(o,l))===a(i);){u=h;break}var c=[];return c[s]=e.get(n.dim,l),c[1-s]=u?u.get(o,l,!0):r,t.dataToPoint(c)},!0)}function l(t,e,n){var i=o(t.getAxis("x")),r=o(t.getAxis("y")),a=t.getBaseAxis().isHorizontal(),s=Math.min(i[0],i[1]),l=Math.min(r[0],r[1]),u=Math.max(i[0],i[1])-s,h=Math.max(r[0],r[1])-l,c=n.get("lineStyle.normal.width")||2,d=n.get("clipOverflow")?c/2:Math.max(u,h);a?(l-=d,h+=2*d):(s-=d,u+=2*d);var f=new m.Rect({shape:{x:s,y:l,width:u,height:h}});return e&&(f.shape[a?"width":"height"]=0,m.initProps(f,{shape:{width:u,height:h}},n)),f}function u(t,e,n){var i=t.getAngleAxis(),r=t.getRadiusAxis(),o=r.getExtent(),a=i.getExtent(),s=Math.PI/180,l=new m.Sector({shape:{cx:t.cx,cy:t.cy,r0:o[0],r:o[1],startAngle:-a[0]*s,endAngle:-a[1]*s,clockwise:i.inverse}});return e&&(l.shape.endAngle=-a[0]*s,m.initProps(l,{shape:{endAngle:-a[1]*s}},n)),l}function h(t,e,n){return"polar"===t.type?u(t,e,n):l(t,e,n)}function c(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,o=[],a=0;a<t.length-1;a++){var s=t[a+1],l=t[a];o.push(l);var u=[];switch(n){case"end":u[r]=s[r],u[1-r]=l[1-r],o.push(u);break;case"middle":var h=(l[r]+s[r])/2,c=[];u[r]=c[r]=h,u[1-r]=l[1-r],c[1-r]=s[1-r],o.push(u),o.push(c);break;default:u[r]=l[r],u[1-r]=s[1-r],o.push(u)}}return t[a]&&o.push(t[a]),o}function d(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()){for(var i,r=n.length-1;r>=0;r--)if(n[r].dimension<2){i=n[r];break}if(i&&"cartesian2d"===e.type){var o=i.dimension,a=t.dimensions[o],s=e.getAxis(a),l=f.map(i.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),u=l.length,h=i.outerColors.slice();u&&l[0].coord>l[u-1].coord&&(l.reverse(),h.reverse());var c=10,d=l[0].coord-c,p=l[u-1].coord+c,g=p-d;if(g<.001)return"transparent";f.each(l,function(t){t.offset=(t.coord-d)/g}),l.push({offset:u?l[u-1].offset:.5,color:h[1]||"transparent"}),l.unshift({offset:u?l[0].offset:.5,color:h[0]||"transparent"});var v=new m.LinearGradient(0,0,0,0,l,(!0));return v[a]=d,v[a+"2"]=p,v}}}var f=n(1),p=n(44),g=n(54),v=n(110),m=n(3),y=n(6),x=n(91),_=n(30);t.exports=_.extend({type:"line",init:function(){var t=new m.Group,e=new p;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var o=t.coordinateSystem,a=this.group,l=t.getData(),u=t.getModel("lineStyle.normal"),p=t.getModel("areaStyle.normal"),g=l.mapArray(l.getItemLayout,!0),v="polar"===o.type,m=this._coordSys,y=this._symbolDraw,x=this._polyline,_=this._polygon,b=this._lineGroup,w=t.get("animation"),M=!p.isEmpty(),S=s(o,l),T=t.get("showSymbol"),A=T&&!v&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,o),I=this._data;I&&I.eachItemGraphicEl(function(t,e){t.__temp&&(a.remove(t),I.setItemGraphicEl(e,null))}),T||y.remove(),a.add(b);var C=!v&&t.get("step");x&&m.type===o.type&&C===this._step?(M&&!_?_=this._newPolygon(g,S,o,w):_&&!M&&(b.remove(_),_=this._polygon=null),b.setClipPath(h(o,!1,t)),T&&y.updateData(l,A),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),i(this._stackedOnPoints,S)&&i(this._points,g)||(w?this._updateAnimation(l,S,o,n,C):(C&&(g=c(g,o,C),S=c(S,o,C)),x.setShape({points:g}),_&&_.setShape({points:g,stackedOnPoints:S})))):(T&&y.updateData(l,A),C&&(g=c(g,o,C),S=c(S,o,C)),x=this._newPolyline(g,o,w),M&&(_=this._newPolygon(g,S,o,w)),b.setClipPath(h(o,!0,t)));var P=d(l,o)||l.getVisual("color");x.useStyle(f.defaults(u.getLineStyle(),{fill:"none",stroke:P,lineJoin:"bevel"}));var k=t.get("smooth");if(k=r(t.get("smooth")),x.setShape({smooth:k,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),_){var L=l.stackedOn,D=0;if(_.useStyle(f.defaults(p.getAreaStyle(),{fill:P,opacity:.7,lineJoin:"bevel"})),L){var O=L.hostModel;D=r(O.get("smooth"))}_.setShape({smooth:k,stackedOnSmooth:D,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=l,this._coordSys=o,this._stackedOnPoints=S,this._points=g,this._step=C},dispose:function(){},highlight:function(t,e,n,i){var r=t.getData(),o=y.queryDataIndex(r,i);if(!(o instanceof Array)&&null!=o&&o>=0){var a=r.getItemGraphicEl(o);if(!a){var s=r.getItemLayout(o);if(!s)return;a=new g(r,o),a.position=s,a.setZ(t.get("zlevel"),t.get("z")),a.ignore=isNaN(s[0])||isNaN(s[1]),a.__temp=!0,r.setItemGraphicEl(o,a),a.stopSymbolAnimation(!0),this.group.add(a)}a.highlight()}else _.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),o=y.queryDataIndex(r,i);if(null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else _.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new x.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new x.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n,n},_getSymbolIgnoreFunc:function(t,e){var n=e.getAxesByScale("ordinal")[0];if(n&&n.isLabelIgnored)return f.bind(n.isLabelIgnored,n)},_updateAnimation:function(t,e,n,i,r){var o=this._polyline,a=this._polygon,s=t.hostModel,l=v(this._data,t,this._stackedOnPoints,e,this._coordSys,n),u=l.current,h=l.stackedOnCurrent,d=l.next,f=l.stackedOnNext;r&&(u=c(l.current,n,r),h=c(l.stackedOnCurrent,n,r),d=c(l.next,n,r),f=c(l.stackedOnNext,n,r)),o.shape.__points=l.current,o.shape.points=u,m.updateProps(o,{shape:{points:d}},s),a&&(a.setShape({points:u,stackedOnPoints:h}),m.updateProps(a,{shape:{points:d,stackedOnPoints:f}},s));for(var p=[],g=l.status,y=0;y<g.length;y++){var x=g[y].cmd;if("="===x){var _=t.getItemGraphicEl(g[y].idx1);_&&p.push({el:_,ptIdx:y})}}o.animators&&o.animators.length&&o.animators[0].during(function(){for(var t=0;t<p.length;t++){var e=p[t].el;e.attr("position",o.shape.__points[p[t].ptIdx])}})},remove:function(t){var e=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl(function(t,i){t.__temp&&(e.remove(t),n.setItemGraphicEl(i,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}})},function(t,e){function n(t){return t>=0?1:-1}function i(t,e,i){for(var r,o=t.getBaseAxis(),a=t.getOtherAxis(o),s=o.onZero?0:a.scale.getExtent()[0],l=a.dim,u="x"===l||"radius"===l?1:0,h=e.stackedOn,c=e.get(l,i);h&&n(h.get(l,i))===n(c);){r=h;break}var d=[];return d[u]=e.get(o.dim,i),d[1-u]=r?r.get(l,i,!0):s,t.dataToPoint(d)}function r(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}t.exports=function(t,e,n,o,a,s){for(var l=r(t,e),u=[],h=[],c=[],d=[],f=[],p=[],g=[],v=s.dimensions,m=0;m<l.length;m++){var y=l[m],x=!0;switch(y.cmd){case"=":var _=t.getItemLayout(y.idx),b=e.getItemLayout(y.idx1);(isNaN(_[0])||isNaN(_[1]))&&(_=b.slice()),u.push(_),h.push(b),c.push(n[y.idx]),d.push(o[y.idx1]),g.push(e.getRawIndex(y.idx1));break;case"+":var w=y.idx;u.push(a.dataToPoint([e.get(v[0],w,!0),e.get(v[1],w,!0)])),h.push(e.getItemLayout(w).slice()),c.push(i(a,e,w)),d.push(o[w]),g.push(e.getRawIndex(w));break;case"-":var w=y.idx,M=t.getRawIndex(w);M!==w?(u.push(t.getItemLayout(w)),h.push(s.dataToPoint([t.get(v[0],w,!0),t.get(v[1],w,!0)])),c.push(n[w]),d.push(i(s,t,w)),g.push(M)):x=!1}x&&(f.push(y),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});for(var S=[],T=[],A=[],I=[],C=[],m=0;m<p.length;m++){var w=p[m];S[m]=u[w],T[m]=h[w],A[m]=c[w],I[m]=d[w],C[m]=f[w]}return{current:S,next:T,stackedOnCurrent:A,stackedOnNext:I,status:C}}},function(t,e,n){var i=n(1),r=n(2);n(112),n(113),n(88)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),r.registerVisual(i.curry(n(83),"pie")),r.registerLayout(i.curry(n(115),"pie")),r.registerProcessor(i.curry(n(62),"pie"))},function(t,e,n){"use strict";var i=n(14),r=n(1),o=n(6),a=n(25),s=n(77),l=n(2).extendSeriesModel({type:"series.pie",init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(t.data),this._defaultLabelLine(t)},mergeOption:function(t){l.superCall(this,"mergeOption",t),this.updateSelectedMap(this.option.data)},getInitialData:function(t,e){var n=a(["value"],t.data),r=new i(n,this);return r.initData(t.data),r},getDataParams:function(t){var e=this.getData(),n=l.superCall(this,"getDataParams",t),i=e.getSum("value");return n.percent=i?+(e.get("value",t)/i*100).toFixed(2):0,n.$vars.push("percent"),n},_defaultLabelLine:function(t){o.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,n=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,n.show=n.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,stillShowZeroSum:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderWidth:1},emphasis:{}},animationType:"expansion",animationEasing:"cubicOut",data:[]}});r.mixin(l,s),t.exports=l},function(t,e,n){function i(t,e,n,i){var o=e.getData(),a=this.dataIndex,s=o.getName(a),l=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),o.each(function(t){r(o.getItemGraphicEl(t),o.getItemLayout(t),e.isSelected(o.getName(t)),l,n)})}function r(t,e,n,i,r){var o=(e.startAngle+e.endAngle)/2,a=Math.cos(o),s=Math.sin(o),l=n?i:0,u=[a*l,s*l];r?t.animate().when(200,{position:u}).start("bounceOut"):t.attr("position",u)}function o(t,e){function n(){o.ignore=o.hoverIgnore,a.ignore=a.hoverIgnore}function i(){o.ignore=o.normalIgnore,a.ignore=a.normalIgnore}s.Group.call(this);var r=new s.Sector({z2:2}),o=new s.Polyline,a=new s.Text;this.add(r),this.add(o),this.add(a),this.updateData(t,e,!0),this.on("emphasis",n).on("normal",i).on("mouseover",n).on("mouseout",i)}function a(t,e,n,i,r){var o=i.getModel("textStyle"),a="inside"===r||"inner"===r;return{fill:o.getTextColor()||(a?"#fff":t.getItemVisual(e,"color")),opacity:t.getItemVisual(e,"opacity"),textFont:o.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,n),t.getName(e))}}var s=n(3),l=n(1),u=o.prototype;u.updateData=function(t,e,n){function i(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r+10}},300,"elasticOut")}function o(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r}},300,"elasticOut")}var a=this.childAt(0),u=t.hostModel,h=t.getItemModel(e),c=t.getItemLayout(e),d=l.extend({},c);
-if(d.label=null,n){a.setShape(d);var f=u.getShallow("animationType");"scale"===f?(a.shape.r=c.r0,s.initProps(a,{shape:{r:c.r}},u,e)):(a.shape.endAngle=c.startAngle,s.updateProps(a,{shape:{endAngle:c.endAngle}},u,e))}else s.updateProps(a,{shape:d},u,e);var p=h.getModel("itemStyle"),g=t.getItemVisual(e,"color");a.useStyle(l.defaults({lineJoin:"bevel",fill:g},p.getModel("normal").getItemStyle())),a.hoverStyle=p.getModel("emphasis").getItemStyle(),r(this,t.getItemLayout(e),h.get("selected"),u.get("selectedOffset"),u.get("animation")),a.off("mouseover").off("mouseout").off("emphasis").off("normal"),h.get("hoverAnimation")&&u.isAnimationEnabled()&&a.on("mouseover",i).on("mouseout",o).on("emphasis",i).on("normal",o),this._updateLabel(t,e),s.setHoverStyle(this)},u._updateLabel=function(t,e){var n=this.childAt(1),i=this.childAt(2),r=t.hostModel,o=t.getItemModel(e),l=t.getItemLayout(e),u=l.label,h=t.getItemVisual(e,"color");s.updateProps(n,{shape:{points:u.linePoints||[[u.x,u.y],[u.x,u.y],[u.x,u.y]]}},r,e),s.updateProps(i,{style:{x:u.x,y:u.y}},r,e),i.attr({style:{textVerticalAlign:u.verticalAlign,textAlign:u.textAlign,textFont:u.font},rotation:u.rotation,origin:[u.x,u.y],z2:10});var c=o.getModel("label.normal"),d=o.getModel("label.emphasis"),f=o.getModel("labelLine.normal"),p=o.getModel("labelLine.emphasis"),g=c.get("position")||d.get("position");i.setStyle(a(t,e,"normal",c,g)),i.ignore=i.normalIgnore=!c.get("show"),i.hoverIgnore=!d.get("show"),n.ignore=n.normalIgnore=!f.get("show"),n.hoverIgnore=!p.get("show"),n.setStyle({stroke:h,opacity:t.getItemVisual(e,"opacity")}),n.setStyle(f.getModel("lineStyle").getLineStyle()),i.hoverStyle=a(t,e,"emphasis",d,g),n.hoverStyle=p.getModel("lineStyle").getLineStyle();var v=f.get("smooth");v&&v===!0&&(v=.4),n.setShape({smooth:v})},l.inherits(o,s.Group);var h=n(30).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,n,r){if(!r||r.from!==this.uid){var a=t.getData(),s=this._data,u=this.group,h=e.get("animation"),c=!s,d=t.get("animationType"),f=l.curry(i,this.uid,t,h,n),p=t.get("selectedMode");if(a.diff(s).add(function(t){var e=new o(a,t);c&&"scale"!==d&&e.eachChild(function(t){t.stopAnimation(!0)}),p&&e.on("click",f),a.setItemGraphicEl(t,e),u.add(e)}).update(function(t,e){var n=s.getItemGraphicEl(e);n.updateData(a,t),n.off("click"),p&&n.on("click",f),u.add(n),a.setItemGraphicEl(t,n)}).remove(function(t){var e=s.getItemGraphicEl(t);u.remove(e)}).execute(),h&&c&&a.count()>0&&"scale"!==d){var g=a.getItemLayout(0),v=Math.max(n.getWidth(),n.getHeight())/2,m=l.bind(u.removeClipPath,u);u.setClipPath(this._createClipPath(g.cx,g.cy,v,g.startAngle,g.clockwise,m,t))}this._data=a}},dispose:function(){},_createClipPath:function(t,e,n,i,r,o,a){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return s.initProps(l,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},a,o),l},containPoint:function(t,e){var n=e.getData(),i=n.getItemLayout(0);if(i){var r=t[0]-i.cx,o=t[1]-i.cy,a=Math.sqrt(r*r+o*o);return a<=i.r&&a>=i.r0}}});t.exports=h},function(t,e,n){"use strict";function i(t,e,n,i,r,o,a){function s(e,n,i,r){for(var o=e;o<n;o++)if(t[o].y+=i,o>e&&o+1<n&&t[o+1].y>t[o].y+t[o].height)return void l(o,i/2);l(n-1,i/2)}function l(e,n){for(var i=e;i>=0&&(t[i].y-=n,!(i>0&&t[i].y>t[i-1].y+t[i-1].height));i--);}function u(t,e,n,i,r,o){for(var a=o>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var u=Math.abs(t[s].y-i),h=t[s].len,c=t[s].len2,d=u<r+h?Math.sqrt((r+h+c)*(r+h+c)-u*u):Math.abs(t[s].x-n);e&&d>=a&&(d=a-10),!e&&d<=a&&(d=a+10),t[s].x=n+d*o,a=d}}t.sort(function(t,e){return t.y-e.y});for(var h,c=0,d=t.length,f=[],p=[],g=0;g<d;g++)h=t[g].y-c,h<0&&s(g,d,-h,r),c=t[g].y+t[g].height;a-c<0&&l(d-1,c-a);for(var g=0;g<d;g++)t[g].y>=n?p.push(t[g]):f.push(t[g]);u(f,!1,e,n,i,r),u(p,!0,e,n,i,r)}function r(t,e,n,r,o,a){for(var s=[],l=[],u=0;u<t.length;u++)t[u].x<e?s.push(t[u]):l.push(t[u]);i(l,e,n,r,1,o,a),i(s,e,n,r,-1,o,a);for(var u=0;u<t.length;u++){var h=t[u].linePoints;if(h){var c=h[1][0]-h[2][0];t[u].x<e?h[2][0]=t[u].x+3:h[2][0]=t[u].x-3,h[1][1]=h[2][1]=t[u].y,h[1][0]=h[2][0]+c}}}var o=n(16);t.exports=function(t,e,n,i){var a,s,l=t.getData(),u=[],h=!1;l.each(function(n){var i,r,c,d,f=l.getItemLayout(n),p=l.getItemModel(n),g=p.getModel("label.normal"),v=g.get("position")||p.get("label.emphasis.position"),m=p.getModel("labelLine.normal"),y=m.get("length"),x=m.get("length2"),_=(f.startAngle+f.endAngle)/2,b=Math.cos(_),w=Math.sin(_);a=f.cx,s=f.cy;var M="inside"===v||"inner"===v;if("center"===v)i=f.cx,r=f.cy,d="center";else{var S=(M?(f.r+f.r0)/2*b:f.r*b)+a,T=(M?(f.r+f.r0)/2*w:f.r*w)+s;if(i=S+3*b,r=T+3*w,!M){var A=S+b*(y+e-f.r),I=T+w*(y+e-f.r),C=A+(b<0?-1:1)*x,P=I;i=C+(b<0?-5:5),r=P,c=[[S,T],[A,I],[C,P]]}d=M?"center":b>0?"left":"right"}var k=g.getModel("textStyle").getFont(),L=g.get("rotate")?b<0?-_+Math.PI:-_:0,D=t.getFormattedLabel(n,"normal")||l.getName(n),O=o.getBoundingRect(D,k,d,"top");h=!!L,f.label={x:i,y:r,position:v,height:O.height,len:y,len2:x,linePoints:c,textAlign:d,verticalAlign:"middle",font:k,rotation:L},M||u.push(f.label)}),!h&&t.get("avoidLabelOverlap")&&r(u,a,s,e,n,i)}},function(t,e,n){var i=n(4),r=i.parsePercent,o=n(114),a=n(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,n,u){e.eachSeriesByType(t,function(t){var e=t.get("center"),u=t.get("radius");a.isArray(u)||(u=[0,u]),a.isArray(e)||(e=[e,e]);var h=n.getWidth(),c=n.getHeight(),d=Math.min(h,c),f=r(e[0],h),p=r(e[1],c),g=r(u[0],d/2),v=r(u[1],d/2),m=t.getData(),y=-t.get("startAngle")*l,x=t.get("minAngle")*l,_=m.getSum("value"),b=Math.PI/(_||m.count())*2,w=t.get("clockwise"),M=t.get("roseType"),S=t.get("stillShowZeroSum"),T=m.getDataExtent("value");T[0]=0;var A=s,I=0,C=y,P=w?1:-1;if(m.each("value",function(t,e){var n;if(isNaN(t))return void m.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:w,cx:f,cy:p,r0:g,r:M?NaN:v});n="area"!==M?0===_&&S?b:t*b:s/(m.count()||1),n<x?(n=x,A-=x):I+=t;var r=C+P*n;m.setItemLayout(e,{angle:n,startAngle:C,endAngle:r,clockwise:w,cx:f,cy:p,r0:g,r:M?i.linearMap(t,T,[g,v]):v}),C=r},!0),A<s)if(A<=.001){var k=s/m.count();m.each(function(t){var e=m.getItemLayout(t);e.startAngle=y+P*t*k,e.endAngle=y+P*(t+1)*k})}else b=A/I,C=y,m.each("value",function(t,e){var n=m.getItemLayout(e),i=n.angle===x?x:t*b;n.startAngle=C,n.endAngle=C+P*i,C+=P*i});o(t,v,h,c)})}},function(t,e,n){"use strict";n(59),n(117)},function(t,e,n){var i=n(1),r=n(3),o=n(40),a=n(41),s=n(74),l=o.ifIgnoreOnTick,u=o.getInterval,h=["axisLine","axisLabel","axisTick","axisName"],c=["splitArea","splitLine"],d=a.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,n,a){this.group.removeAll();var l=this._axisGroup;if(this._axisGroup=new r.Group,this.group.add(this._axisGroup),t.get("show")){var u=t.getCoordSysModel(),f=s.layout(u,t),p=new o(t,f);i.each(h,p.add,p),this._axisGroup.add(p.getGroup()),i.each(c,function(e){t.get(e+".show")&&this["_"+e](t,u,f.labelInterval)},this),r.groupTransition(l,this._axisGroup,t),d.superCall(this,"render",t,e,n,a)}},_splitLine:function(t,e,n){var o=t.axis;if(!o.scale.isBlank()){var a=t.getModel("splitLine"),s=a.getModel("lineStyle"),h=s.get("color"),c=u(a,n);h=i.isArray(h)?h:[h];for(var d=e.coordinateSystem.getRect(),f=o.isHorizontal(),p=0,g=o.getTicksCoords(),v=o.scale.getTicks(),m=[],y=[],x=s.getLineStyle(),_=0;_<g.length;_++)if(!l(o,_,c)){var b=o.toGlobalCoord(g[_]);f?(m[0]=b,m[1]=d.y,y[0]=b,y[1]=d.y+d.height):(m[0]=d.x,m[1]=b,y[0]=d.x+d.width,y[1]=b);var w=p++%h.length;this._axisGroup.add(new r.Line(r.subPixelOptimizeLine({anid:"line_"+v[_],shape:{x1:m[0],y1:m[1],x2:y[0],y2:y[1]},style:i.defaults({stroke:h[w]},x),silent:!0})))}}},_splitArea:function(t,e,n){var o=t.axis;if(!o.scale.isBlank()){var a=t.getModel("splitArea"),s=a.getModel("areaStyle"),h=s.get("color"),c=e.coordinateSystem.getRect(),d=o.getTicksCoords(),f=o.scale.getTicks(),p=o.toGlobalCoord(d[0]),g=o.toGlobalCoord(d[0]),v=0,m=u(a,n),y=s.getAreaStyle();h=i.isArray(h)?h:[h];for(var x=1;x<d.length;x++)if(!l(o,x,m)){var _,b,w,M,S=o.toGlobalCoord(d[x]);o.isHorizontal()?(_=p,b=c.y,w=S-_,M=c.height):(_=c.x,b=g,w=c.width,M=S-b);var T=v++%h.length;this._axisGroup.add(new r.Rect({anid:"area_"+f[x],shape:{x:_,y:b,width:w,height:M},style:i.defaults({fill:h[T]},y),silent:!0})),p=_+w,g=b+M}}}});d.extend({type:"xAxis"}),d.extend({type:"yAxis"})},function(t,e,n){"use strict";function i(){}function r(t,e,n,i){o(f(n).lastProp,i)||(f(n).lastProp=i,e?d.updateProps(n,i,t):(n.stopAnimation(),n.attr(i)))}function o(t,e){if(h.isObject(t)&&h.isObject(e)){var n=!0;return h.each(e,function(e,i){n&=o(t[i],e)}),!!n}return t===e}function a(t,e){t[e.get("label.show")?"show":"hide"]()}function s(t){return{position:t.position.slice(),rotation:t.rotation||0}}function l(t,e){var n=t.get("icon"),i={x:-1,y:-1,width:2,height:2},r=h.extend({style:{strokeNoScale:!0},rectHover:!0,cursor:"move",draggable:!0},e);return 0===n.indexOf("image://")?(i.image=n.slice(8),r.style=i,new d.Image(r)):d.makePath(n.replace("path://",""),r,i,"center")}function u(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)})}var h=n(1),c=n(15),d=n(3),f=n(6).makeGetter(),p=n(45),g=n(21),v=n(37),m=h.clone,y=h.bind;i.prototype={_group:null,_lastGraphicKey:null,_handle:null,_dragging:!1,_lastValue:null,_lastStatus:null,_payloadInfo:null,animationThreshold:15,render:function(t,e,n,i){var o=e.get("value"),a=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==o||this._lastStatus!==a){this._lastValue=o,this._lastStatus=a;var s=this._group,l=this._handle;if(!a||"hide"===a)return s&&s.hide(),void(l&&l.hide());s&&s.show(),l&&l.show();var c={};this.makeElOption(c,o,t,e,n);var f=c.graphicKey;f!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=f;var p=this._moveAnimation=this.determineAnimation(t,e);if(s){var g=h.curry(r,e,p);this.updatePointerEl(s,c,g,e),this.updateLabelEl(s,c,g,e)}else s=this._group=new d.Group,this.createPointerEl(s,c,t,e),this.createLabelEl(s,c,t,e),n.getZr().add(s);u(s,e,!0),this._renderHandle(o)}},remove:function(t){this.clear(t)},dispose:function(t){this.clear(t)},determineAnimation:function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=p.getAxisInfo(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return n===!0},makeElOption:function(t,e,n,i,r){},createPointerEl:function(t,e,n,i){var r=e.pointer;if(r){var o=f(t).pointerEl=new d[r.type](m(e.pointer));t.add(o)}},createLabelEl:function(t,e,n,i){if(e.label){var r=f(t).labelEl=new d.Rect(m(e.label));t.add(r),a(r,i)}},updatePointerEl:function(t,e,n){var i=f(t).pointerEl;i&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,n,i){var r=f(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{shape:e.label.shape,position:e.label.position}),a(r,i))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e=this._axisPointerModel,n=this._api.getZr(),i=this._handle,r=e.getModel("handle"),o=e.get("status");if(!r.get("show")||!o||"hide"===o)return i&&n.remove(i),void(this._handle=null);var a;this._handle||(a=!0,i=this._handle=l(r,{onmousemove:function(t){g.stop(t.event)},onmousedown:y(this._onHandleDragMove,this,0,0),drift:y(this._onHandleDragMove,this),ondragend:y(this._onHandleDragEnd,this)}),n.add(i)),u(i,e,!1);var s=["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];i.setStyle(r.getItemStyle(null,s));var c=r.get("size");h.isArray(c)||(c=[c,c]),i.attr("scale",[c[0]/2,c[1]/2]),v.createOrUpdate(this,"_doDispatchAxisPointer",r.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,a)}},_moveHandleToValue:function(t,e){r(this._axisPointerModel,!e&&this._moveAnimation,this._handle,s(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(s(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(s(i)),f(n).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){var t=this._handle;if(t){var e=this._payloadInfo,n={type:"updateAxisPointer",x:e.cursorPoint[0],y:e.cursorPoint[1],tooltipOption:e.tooltipOption,highDownKey:"axisPointerHandle"},i=this._axisModel.axis;n[i.dim+"AxisId"]=this._axisModel.id,this._api.dispatchAction(n)}},_onHandleDragEnd:function(t){this._dragging=!1;var e=this._handle;if(e){var n=this._axisPointerModel.get("value");this._moveHandleToValue(n),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,n){return n=n||0,{x:t[n],y:t[1-n],width:e[n],height:e[1-n]}}},i.prototype.constructor=i,c.enableClassExtend(i),t.exports=i},function(t,e,n){"use strict";function i(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}function r(t){return"x"===t.dim?0:1}var o=n(3),a=n(118),s=n(75),l=n(74),u=n(41),h=a.extend({makeElOption:function(t,e,n,r,o){var a=n.axis,u=a.grid,h=r.get("type"),d=i(u,a).getOtherAxis(a).getGlobalExtent(),f=a.toGlobalCoord(a.dataToCoord(e,!0));if(h&&"none"!==h){var p=s.buildElStyle(r),g=c[h](a,f,d,p);g.style=p,t.graphicKey=g.type,t.pointer=g}var v=l.layout(u.model,n);s.buildCartesianSingleLabelElOption(e,t,v,n,r,o)},getHandleTransform:function(t,e,n){var i=l.layout(e.axis.grid.model,e,{labelInside:!1});return i.labelMargin=n.get("handle.margin"),{position:s.getTransformedPosition(e.axis,t,i),rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,n,r){var o=n.axis,a=o.grid,s=o.getGlobalExtent(!0),l=i(a,o).getOtherAxis(o).getGlobalExtent(),u="x"===o.dim?0:1,h=t.position;h[u]+=e[u],h[u]=Math.min(s[1],h[u]),h[u]=Math.max(s[0],h[u]);var c=(l[1]+l[0])/2,d=[c,c];d[u]=h[u];var f=[{verticalAlign:"middle"},{align:"center"}];return{position:h,rotation:t.rotation,cursorPoint:d,tooltipOption:f[u]}}}),c={line:function(t,e,n,i){var a=s.makeLineShape([e,n[0]],[e,n[1]],r(t));return o.subPixelOptimizeLine({shape:a,style:i}),{type:"Line",shape:a}},shadow:function(t,e,n,i){var o=t.getBandWidth(),a=n[1]-n[0];return{type:"Rect",shape:s.makeRectShape([e-o/2,n[0]],[o,a],r(t))}}};u.registerAxisPointerClass("CartesianAxisPointer",h),t.exports=h},function(t,e,n){var i=n(1),r=n(6);t.exports=function(t,e){var n,o=[],a=t.seriesIndex;if(null==a||!(n=e.getSeriesByIndex(a)))return{point:[]};var s=n.getData(),l=r.queryDataIndex(s,t);if(null==l||i.isArray(l))return{point:[]};var u=s.getItemGraphicEl(l),h=n.coordinateSystem;if(n.getTooltipPosition)o=n.getTooltipPosition(l)||[];else if(h&&h.dataToPoint)o=h.dataToPoint(s.getValues(i.map(h.dimensions,function(t){return n.coordDimToDataDim(t)[0]}),l,!0))||[];else if(u){var c=u.getBoundingRect().clone();c.applyTransform(u.transform),o=[c.x+c.width/2,c.y+c.height/2]}return{point:o,el:u}}},function(t,e,n){function i(t,e){function n(n,i){t.on(n,function(n){var o=s(e);c(h(t).records,function(t){t&&i(t,n,o.dispatchAction)}),r(o.pendings,e)})}h(t).initialized||(h(t).initialized=!0,n("click",u.curry(a,"click")),n("mousemove",u.curry(a,"mousemove")),n("globalout",o))}function r(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]),n&&(n.dispatchAction=null,e.dispatchAction(n))}function o(t,e,n){t.handler("leave",null,n)}function a(t,e,n,i){e.handler(t,n,i)}function s(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}var l=n(9),u=n(1),h=n(6).makeGetter(),c=u.each,d={};d.register=function(t,e,n){if(!l.node){var r=e.getZr();h(r).records||(h(r).records={}),i(r,e);var o=h(r).records[t]||(h(r).records[t]={});o.handler=n}},d.unregister=function(t,e){if(!l.node){var n=e.getZr(),i=(h(n).records||{})[t];i&&(h(n).records[t]=null)}},t.exports=d},function(t,e,n){var i=n(1),r=n(76),o=n(2);o.registerAction("dataZoom",function(t,e){var n=r.createLinkedNodesFinder(i.bind(e.eachComponent,e,"dataZoom"),r.eachAxisDim,function(t,e){return t.get(e.axisIndex)}),o=[];e.eachComponent({mainType:"dataZoom",query:t},function(t,e){o.push.apply(o,n(t).nodes)}),i.each(o,function(e,n){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})})},function(t,e,n){function i(t,e,n){n.getAxisProxy(t.name,e).reset(n)}function r(t,e,n){n.getAxisProxy(t.name,e).filterData(n)}var o=n(2);o.registerProcessor(function(t,e){t.eachComponent("dataZoom",function(t){t.eachTargetAxis(i),t.eachTargetAxis(r)}),t.eachComponent("dataZoom",function(t){var e=t.findRepresentativeAxisProxy(),n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setRawRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]},!0)})})},function(t,e,n){function i(t){var e=t[a];return e||(e=t[a]=[{}]),e}var r=n(1),o=r.each,a="\0_ec_hist_store",s={push:function(t,e){var n=i(t);o(e,function(e,i){for(var r=n.length-1;r>=0;r--){var o=n[r];if(o[i])break}if(r<0){var a=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(a){var s=a.getPercentRange();n[0][i]={dataZoomId:i,start:s[0],end:s[1]}}}}),n.push(e)},pop:function(t){var e=i(t),n=e[e.length-1];e.length>1&&e.pop();var r={};return o(n,function(t,n){for(var i=e.length-1;i>=0;i--){var t=e[i][n];if(t){r[n]=t;break}}}),r},clear:function(t){t[a]=null},count:function(t){return i(t).length}};t.exports=s},function(t,e,n){n(13).registerSubTypeDefaulter("dataZoom",function(t){return"slider"})},function(t,e,n){function i(t){B.call(this),this._zr=t,this.group=new F.Group,this._brushType,this._brushOption,this._panels,this._track=[],this._dragging,this._covers=[],this._creatingCover,this._creatingPanel,this._enableGlobalPan,this._uid="brushController_"+nt++,this._handlers={},Z(it,function(t,e){this._handlers[e]=V.bind(t,this)},this)}function r(t,e){var n=t._zr;t._enableGlobalPan||G.take(n,Q,t._uid),Z(t._handlers,function(t,e){n.on(e,t)}),t._brushType=e.brushType,t._brushOption=V.merge(V.clone(et),e,!0)}function o(t){var e=t._zr;G.release(e,Q,t._uid),Z(t._handlers,function(t,n){e.off(n,t)}),t._brushType=t._brushOption=null}function a(t,e){var n=rt[e.brushType].createCover(t,e);return n.__brushOption=e,u(n,e),t.group.add(n),n}function s(t,e){var n=c(e);return n.endCreating&&(n.endCreating(t,e),u(e,e.__brushOption)),e}function l(t,e){var n=e.__brushOption;c(e).updateCoverShape(t,e,n.range,n)}function u(t,e){var n=e.z;null==n&&(n=Y),t.traverse(function(t){t.z=n,t.z2=n})}function h(t,e){c(e).updateCommon(t,e),l(t,e)}function c(t){return rt[t.__brushOption.brushType]}function d(t,e,n){var i=t._panels;if(!i)return!0;var r,o=t._transform;return Z(i,function(t){t.isTargetByCursor(e,n,o)&&(r=t)}),r}function f(t,e){var n=t._panels;if(!n)return!0;var i=e.__brushOption.panelId;return null==i||n[i]}function p(t){var e=t._covers,n=e.length;return Z(e,function(e){t.group.remove(e)},t),e.length=0,!!n}function g(t,e){var n=q(t._covers,function(t){var e=t.__brushOption,n=V.clone(e.range);return{brushType:e.brushType,panelId:e.panelId,range:n}});t.trigger("brush",n,{isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function v(t){var e=t._track;if(!e.length)return!1;var n=e[e.length-1],i=e[0],r=n[0]-i[0],o=n[1]-i[1],a=X(r*r+o*o,.5);return a>$}function m(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function y(t,e,n,i){var r=new F.Group;return r.add(new F.Rect({name:"main",style:w(n),silent:!0,draggable:!0,cursor:"move",drift:W(t,e,r,"nswe"),ondragend:W(g,e,{isEnd:!0})})),Z(i,function(n){r.add(new F.Rect({name:n,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:W(t,e,r,n),ondragend:W(g,e,{isEnd:!0})}))}),r}function x(t,e,n,i){var r=i.brushStyle.lineWidth||0,o=U(r,K),a=n[0][0],s=n[1][0],l=a-r/2,u=s-r/2,h=n[0][1],c=n[1][1],d=h-o+r/2,f=c-o+r/2,p=h-a,g=c-s,v=p+r,m=g+r;b(t,e,"main",a,s,p,g),i.transformable&&(b(t,e,"w",l,u,o,m),b(t,e,"e",d,u,o,m),b(t,e,"n",l,u,v,o),b(t,e,"s",l,f,v,o),b(t,e,"nw",l,u,o,o),b(t,e,"ne",d,u,o,o),b(t,e,"sw",l,f,o,o),b(t,e,"se",d,f,o,o))}function _(t,e){var n=e.__brushOption,i=n.transformable,r=e.childAt(0);r.useStyle(w(n)),r.attr({silent:!i,cursor:i?"move":"default"}),Z(["w","e","n","s","se","sw","ne","nw"],function(n){var r=e.childOfName(n),o=T(t,n);r&&r.attr({silent:!i,invisible:!i,cursor:i?tt[o]+"-resize":null})})}function b(t,e,n,i,r,o,a){var s=e.childOfName(n);s&&s.setShape(k(P(t,e,[[i,r],[i+o,r+a]])))}function w(t){return V.defaults({strokeNoScale:!0},t.brushStyle)}function M(t,e,n,i){var r=[j(t,n),j(e,i)],o=[U(t,n),U(e,i)];return[[r[0],o[0]],[r[1],o[1]]]}function S(t){return F.getTransform(t.group)}function T(t,e){if(e.length>1){e=e.split("");var n=[T(t,e[0]),T(t,e[1])];return("e"===n[0]||"w"===n[0])&&n.reverse(),n.join("")}var i={w:"left",e:"right",n:"top",s:"bottom"},r={left:"w",right:"e",top:"n",bottom:"s"},n=F.transformDirection(i[e],S(t));return r[n]}function A(t,e,n,i,r,o,a,s){var l=i.__brushOption,u=t(l.range),c=C(n,o,a);Z(r.split(""),function(t){var e=J[t];u[e[0]][e[1]]+=c[e[0]]}),l.range=e(M(u[0][0],u[1][0],u[0][1],u[1][1])),h(n,i),g(n,{isEnd:!1})}function I(t,e,n,i,r){var o=e.__brushOption.range,a=C(t,n,i);Z(o,function(t){t[0]+=a[0],t[1]+=a[1]}),h(t,e),g(t,{isEnd:!1})}function C(t,e,n){var i=t.group,r=i.transformCoordToLocal(e,n),o=i.transformCoordToLocal(0,0);return[r[0]-o[0],r[1]-o[1]]}function P(t,e,n){var i=f(t,e);return i&&i!==!0?i.clipPath(n,t._transform):V.clone(n)}function k(t){var e=j(t[0][0],t[1][0]),n=j(t[0][1],t[1][1]),i=U(t[0][0],t[1][0]),r=U(t[0][1],t[1][1]);return{x:e,y:n,width:i-e,height:r-n}}function L(t,e,n){if(t._brushType){var i=t._zr,r=t._covers,o=d(t,e,n);if(!t._dragging)for(var a=0;a<r.length;a++){var s=r[a].__brushOption;if(o&&(o===!0||s.panelId===o.panelId)&&rt[s.brushType].contain(r[a],n[0],n[1]))return}o&&i.setCursorStyle("crosshair")}}function D(t){var e=t.event;e.preventDefault&&e.preventDefault()}function O(t,e,n){return t.childOfName("main").contain(e,n)}function E(t,e,n,i){var r,o=t._creatingCover,u=t._creatingPanel,h=t._brushOption;if(t._track.push(n.slice()),v(t)||o){if(u&&!o){"single"===h.brushMode&&p(t);var c=V.clone(h);c.brushType=z(c.brushType,u),c.panelId=u===!0?null:u.panelId,o=t._creatingCover=a(t,c),t._covers.push(o)}if(o){var f=rt[z(t._brushType,u)],g=o.__brushOption;g.range=f.getCreatingRange(P(t,o,t._track)),i&&(s(t,o),f.updateCommon(t,o)),l(t,o),r={isEnd:i}}}else i&&"single"===h.brushMode&&h.removeOnClick&&d(t,e,n)&&p(t)&&(r={isEnd:i,removeOnClick:!0});return r}function z(t,e){return"auto"===t?e.defaultBrushType:t}function N(t){if(this._dragging){D(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY),n=E(this,t,e,!0);this._dragging=!1,this._track=[],this._creatingCover=null,n&&g(this,n)}}function R(t){return{createCover:function(e,n){return y(W(A,function(e){var n=[e,[0,100]];return t&&n.reverse(),n},function(e){return e[t]}),e,n,[["w","e"],["n","s"]][t])},getCreatingRange:function(e){var n=m(e),i=j(n[0][t],n[1][t]),r=U(n[0][t],n[1][t]);return[i,r]},updateCoverShape:function(e,n,i,r){var o,a=f(e,n);if(a!==!0&&a.getLinearBrushOtherExtent)o=a.getLinearBrushOtherExtent(t,e._transform);else{var s=e._zr;o=[0,[s.getWidth(),s.getHeight()][1-t]]}var l=[i,o];t&&l.reverse(),x(e,n,l,r)},updateCommon:_,contain:O}}var B=n(23),V=n(1),F=n(3),G=n(128),H=n(48),W=V.curry,Z=V.each,q=V.map,j=Math.min,U=Math.max,X=Math.pow,Y=1e4,$=6,K=6,Q="globalPan",J={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},tt={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},et={brushStyle:{lineWidth:2,stroke:"rgba(0,0,0,0.3)",fill:"rgba(0,0,0,0.1)"},transformable:!0,brushMode:"single",removeOnClick:!1},nt=0;i.prototype={constructor:i,enableBrush:function(t){return this._brushType&&o(this),t.brushType&&r(this,t),this},setPanels:function(t){if(t&&t.length){var e=this._panels={};V.each(t,function(t){e[t.panelId]=V.clone(t)})}else this._panels=null;return this},mount:function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({position:t.position||[0,0],rotation:t.rotation||0,scale:t.scale||[1,1]}),this._transform=e.getLocalTransform(),this},eachCover:function(t,e){Z(this._covers,t,e)},updateCovers:function(t){function e(t,e){return(null!=t.id?t.id:o+e)+"-"+t.brushType}function n(t,n){return e(t.__brushOption,n)}function i(e,n){var i=t[e];if(null!=n&&l[n]===d)u[e]=l[n];else{var r=u[e]=null!=n?(l[n].__brushOption=i,l[n]):s(c,a(c,i));h(c,r)}}function r(t){l[t]!==d&&c.group.remove(l[t])}t=V.map(t,function(t){return V.merge(V.clone(et),t,!0)});var o="\0-brush-index-",l=this._covers,u=this._covers=[],c=this,d=this._creatingCover;return new H(l,t,n,e).add(i).update(i).remove(r).execute(),this},unmount:function(){return this.enableBrush(!1),p(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},V.mixin(i,B);var it={mousedown:function(t){if(this._dragging)N.call(this,t);else if(!t.target||!t.target.draggable){D(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null;var n=this._creatingPanel=d(this,t,e);n&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);if(L(this,t,e),this._dragging){D(t);var n=E(this,t,e,!1);n&&g(this,n)}},mouseup:N},rt={lineX:R(0),lineY:R(1),rect:{createCover:function(t,e){return y(W(A,function(t){return t},function(t){return t}),t,e,["w","e","n","s","se","sw","ne","nw"])},getCreatingRange:function(t){var e=m(t);return M(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,n,i){x(t,e,n,i)},updateCommon:_,contain:O},polygon:{createCover:function(t,e){var n=new F.Group;return n.add(new F.Polyline({name:"main",style:w(e),silent:!0})),n},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new F.Polygon({name:"main",draggable:!0,drift:W(I,t,e),ondragend:W(g,t,{isEnd:!0})}))},updateCoverShape:function(t,e,n,i){e.childAt(0).setShape({points:P(t,e,n)})},updateCommon:_,contain:O}};t.exports=i},function(t,e){var n={},i={axisPointer:1,tooltip:1,brush:1};n.onIrrelevantElement=function(t,e,n){var r=e.getComponentByElement(t.topTarget),o=r&&r.coordinateSystem;return r&&r!==n&&!i[r.mainType]&&o&&o.model!==n},t.exports=n},function(t,e,n){function i(t){return t[r]||(t[r]={})}var r="\0_ec_interaction_mutex",o={take:function(t,e,n){var r=i(t);r[e]=n},release:function(t,e,n){var r=i(t),o=r[e];o===n&&(r[e]=null)},isTaken:function(t,e){return!!i(t)[e]}};n(2).registerAction({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),t.exports=o},function(t,e,n){function i(t,e,n){r.positionElement(t,e.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()},e.get("padding"))}var r=n(12),o=n(7),a=n(3);t.exports={layout:function(t,e,n){var o=r.getLayoutRect(e.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()},e.get("padding"));r.box(e.get("orient"),t,e.get("itemGap"),o.width,o.height),i(t,e,n)},addBackground:function(t,e){var n=o.normalizeCssArray(e.get("padding")),i=t.getBoundingRect(),r=e.getItemStyle(["color","opacity"]);r.fill=e.get("backgroundColor");var s=new a.Rect({shape:{x:i.x-n[3],y:i.y-n[0],width:i.width+n[1]+n[3],height:i.height+n[0]+n[2]},style:r,silent:!0,z2:-1});a.subPixelOptimizeRect(s),t.add(s)}}},function(t,e,n){var i=n(1),r=n(33),o=n(134),a=function(t,e,n,i,o){r.call(this,t,e,n),this.type=i||"value",this.position=o||"bottom"};a.prototype={constructor:a,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},getLabelInterval:function(){var t=this._labelInterval;return t||(t=this._labelInterval=o(this)),t},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},i.inherits(a,r),t.exports=a},function(t,e,n){"use strict";function i(t){return this._axes[t]}var r=n(1),o=function(t){this._axes={},this._dimList=[],this.name=t||""};o.prototype={constructor:o,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return r.map(this._dimList,i,this)},getAxesByScale:function(t){return t=t.toLowerCase(),r.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var n=this._dimList,i=t instanceof Array?[]:{},r=0;r<n.length;r++){var o=n[r],a=this._axes[o];i[o]=a[e](t[o])}return i}},t.exports=o},function(t,e,n){"use strict";function i(t){o.call(this,t)}var r=n(1),o=n(131);i.prototype={constructor:i,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoints:function(t,e){return t.mapArray(["x","y"],function(t,e){return this.dataToPoint([t,e])},e,this)},dataToPoint:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return[n.toGlobalCoord(n.dataToCoord(t[0],e)),i.toGlobalCoord(i.dataToCoord(t[1],e))]},pointToData:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return[n.coordToData(n.toLocalCoord(t[0]),e),i.coordToData(i.toLocalCoord(t[1]),e)]},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},r.inherits(i,o),t.exports=i},function(t,e,n){"use strict";n(59);var i=n(13);t.exports=i.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}})},function(t,e,n){"use strict";var i=n(1),r=n(17);t.exports=function(t){var e=t.model,n=e.getModel("axisLabel"),o=n.get("interval");return"category"!==t.type||"auto"!==o?"auto"===o?0:o:r.getAxisLabelInterval(i.map(t.scale.getTicks(),t.dataToCoord,t),e.getFormattedLabels(),n.getModel("textStyle").getFont(),t.isHorizontal())}},function(t,e,n){var i=n(28),r=n(24),o=n(17),a=n(42),s=n(10),l=n(1);t.exports={createList:function(t){var e=t.get("data");return i(e,t,t.ecModel)},completeDimensions:n(25),createSymbol:r.createSymbol,createScale:function(t,e){var n=e;e instanceof s||(n=new s(e),l.mixin(n,a));var i=o.createScaleByModel(n);return i.setExtent(t[0],t[1]),o.niceScaleExtent(i,n),i},mixinAxisModelCommonMethods:function(t){l.mixin(t,a)}}},function(t,e,n){var i=n(3),r=n(1),o=Math.PI;t.exports=function(t,e){e=e||{},r.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var n=new i.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),a=new i.Arc({shape:{startAngle:-o/2,endAngle:-o/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new i.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});a.animateShape(!0).when(1e3,{endAngle:3*o/2}).start("circularInOut"),a.animateShape(!0).when(1e3,{startAngle:3*o/2}).delay(300).start("circularInOut");
-var l=new i.Group;return l.add(a),l.add(s),l.add(n),l.resize=function(){var e=t.getWidth()/2,i=t.getHeight()/2;a.setShape({cx:e,cy:i});var r=a.shape.r;s.setShape({x:e-r,y:i-r,width:2*r,height:2*r}),n.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,n){function i(t,e){h.each(e,function(e,n){x.hasClass(n)||("object"==typeof e?t[n]=t[n]?h.merge(t[n],e,!1):h.clone(e):null==t[n]&&(t[n]=e))})}function r(t){t=t,this.option={},this.option[b]=1,this._componentsMap={series:[]},this._seriesIndices=null,i(t,this._theme.option),h.merge(t,_,!1),this.mergeOption(t)}function o(t,e){h.isArray(e)||(e=e?[e]:[]);var n={};return f(e,function(e){n[e]=(t[e]||[]).slice()}),n}function a(t,e,n){var i=e.type?e.type:n?n.subType:x.determineSubType(t,e);return i}function s(t){return g(t,function(t){return t.componentIndex})||[]}function l(t,e){return e.hasOwnProperty("subType")?p(t,function(t){return t.subType===e.subType}):t}function u(t){}var h=n(1),c=n(6),d=n(10),f=h.each,p=h.filter,g=h.map,v=h.isArray,m=h.indexOf,y=h.isObject,x=n(13),_=n(139),b="\0_ec_inner",w=d.extend({constructor:w,init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new d(n),this._optionManager=i},setOption:function(t,e,n){h.assert(!(b in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null,n)},resetOption:function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var o=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(!e&&this.restoreData(),this.mergeOption(o)):r.call(this,o),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var a=i.getTimelineOption(this);a&&(this.mergeOption(a),n=!0)}if(!t||"recreate"===t||"media"===t){var s=i.getMediaOption(this,this._api);s.length&&f(s,function(t){this.mergeOption(t,n=!0)},this)}return n},mergeOption:function(t){function e(e,r){var l=c.normalizeToArray(t[e]),u=c.mappingToExists(i[e],l);c.makeIdAndName(u),f(u,function(t,n){var i=t.option;y(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=a(e,i,t.exist))});var d=o(i,r);n[e]=[],i[e]=[],f(u,function(t,r){var o=t.exist,a=t.option;if(h.assert(y(a)||o,"Empty component definition"),a){var s=x.getClass(e,t.keyInfo.subType,!0);if(o&&o instanceof s)o.name=t.keyInfo.name,o.mergeOption(a,this),o.optionUpdated(a,!1);else{var l=h.extend({dependentModels:d,componentIndex:r},t.keyInfo);o=new s(a,this,this,l),h.extend(o,l),o.init(a,this,this,l),o.optionUpdated(null,!0)}}else o.mergeOption({},this),o.optionUpdated({},!1);i[e][r]=o,n[e][r]=o.option},this),"series"===e&&(this._seriesIndices=s(i.series))}var n=this.option,i=this._componentsMap,r=[];f(t,function(t,e){null!=t&&(x.hasClass(e)?r.push(e):n[e]=null==n[e]?h.clone(t):h.merge(n[e],t,!0))}),x.topologicalTravel(r,x.getAllClassMainTypes(),e,this),this._seriesIndices=this._seriesIndices||[]},getOption:function(){var t=h.clone(this.option);return f(t,function(e,n){if(x.hasClass(n)){for(var e=c.normalizeToArray(e),i=e.length-1;i>=0;i--)c.isIdInner(e[i])&&e.splice(i,1);t[n]=e}}),delete t[b],t},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap[t];if(n)return n[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n=t.index,i=t.id,r=t.name,o=this._componentsMap[e];if(!o||!o.length)return[];var a;if(null!=n)v(n)||(n=[n]),a=p(g(n,function(t){return o[t]}),function(t){return!!t});else if(null!=i){var s=v(i);a=p(o,function(t){return s&&m(i,t.id)>=0||!s&&t.id===i})}else if(null!=r){var u=v(r);a=p(o,function(t){return u&&m(r,t.name)>=0||!u&&t.name===r})}else a=o.slice();return l(a,t)},findComponents:function(t){function e(t){var e=r+"Index",n=r+"Id",i=r+"Name";return!t||null==t[e]&&null==t[n]&&null==t[i]?null:{mainType:r,index:t[e],id:t[n],name:t[i]}}function n(e){return t.filter?p(e,t.filter):e}var i=t.query,r=t.mainType,o=e(i),a=o?this.queryComponents(o):this._componentsMap[r];return n(l(a,t))},eachComponent:function(t,e,n){var i=this._componentsMap;if("function"==typeof t)n=e,e=t,f(i,function(t,i){f(t,function(t,r){e.call(n,i,t,r)})});else if(h.isString(t))f(i[t],e,n);else if(y(t)){var r=this.findComponents(t);f(r,e,n)}},getSeriesByName:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.series[t]},getSeriesByType:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.series.slice()},eachSeries:function(t,e){u(this),f(this._seriesIndices,function(n){var i=this._componentsMap.series[n];t.call(e,i,n)},this)},eachRawSeries:function(t,e){f(this._componentsMap.series,t,e)},eachSeriesByType:function(t,e,n){u(this),f(this._seriesIndices,function(i){var r=this._componentsMap.series[i];r.subType===t&&e.call(n,r,i)},this)},eachRawSeriesByType:function(t,e,n){return f(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return u(this),h.indexOf(this._seriesIndices,t.componentIndex)<0},filterSeries:function(t,e){u(this);var n=p(this._componentsMap.series,t,e);this._seriesIndices=s(n)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=s(t.series);var e=[];f(t,function(t,n){e.push(n)}),x.topologicalTravel(e,x.getAllClassMainTypes(),function(e,n){f(t[e],function(t){t.restoreData()})})}});h.mixin(w,n(61)),t.exports=w},function(t,e,n){function i(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function r(t,e,n){var i,r,o=[],a=[],s=t.timeline;if(t.baseOption&&(r=t.baseOption),(s||t.options)&&(r=r||{},o=(t.options||[]).slice()),t.media){r=r||{};var l=t.media;d(l,function(t){t&&t.option&&(t.query?a.push(t):i||(i=t))})}return r||(r=t),r.timeline||(r.timeline=s),d([r].concat(o).concat(u.map(a,function(t){return t.option})),function(t){d(e,function(e){e(t,n)})}),{baseOption:r,timelineOptions:o,mediaDefault:i,mediaList:a}}function o(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return u.each(t,function(t,e){var n=e.match(v);if(n&&n[1]&&n[2]){var o=n[1],s=n[2].toLowerCase();a(i[s],t,o)||(r=!1)}}),r}function a(t,e,n){return"min"===n?t>=e:"max"===n?t<=e:t===e}function s(t,e){return t.join(",")===e.join(",")}function l(t,e){e=e||{},d(e,function(e,n){if(null!=e){var i=t[n];if(c.hasClass(n)){e=h.normalizeToArray(e),i=h.normalizeToArray(i);var r=h.mappingToExists(i,e);t[n]=p(r,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[n]=g(i,e,!0)}})}var u=n(1),h=n(6),c=n(13),d=u.each,f=u.clone,p=u.map,g=u.merge,v=/^(min|max)?(.+)$/;i.prototype={constructor:i,setOption:function(t,e){t=f(t,!0);var n=this._optionBackup,i=r.call(this,t,e,!n);this._newBaseOption=i.baseOption,n?(l(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=p(e.timelineOptions,f),this._mediaList=p(e.mediaList,f),this._mediaDefault=f(e.mediaDefault),this._currentMediaIndices=[],f(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=f(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,a=[],l=[];if(!i.length&&!r)return l;for(var u=0,h=i.length;u<h;u++)o(i[u].query,e,n)&&a.push(u);return!a.length&&r&&(a=[-1]),a.length&&!s(a,this._currentMediaIndices)&&(l=p(a,function(t){return f(t===-1?r.option:i[t].option)})),this._currentMediaIndices=a,l}},t.exports=i},function(t,e){var n="";"undefined"!=typeof navigator&&(n=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],textStyle:{fontFamily:n.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1}},function(t,e,n){t.exports={getAreaStyle:n(31)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,n){var i=n(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]);t.exports={getItemStyle:function(t,e){var n=i.call(this,t,e),r=this.getBorderLineDash();return r&&(n.lineDash=r),n},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,n){var i=n(31)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=i.call(this,t),n=this.getLineDash(e.lineWidth);return n&&(e.lineDash=n),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),n=Math.max(t,2),i=4*t;return"solid"===e||null==e?null:"dashed"===e?[i,i]:[n,n]}}},function(t,e,n){function i(t,e){return t&&t.getShallow(e)}var r=n(16);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){var t=this.ecModel,e=t&&t.getModel("textStyle");return[this.getShallow("fontStyle")||i(e,"fontStyle"),this.getShallow("fontWeight")||i(e,"fontWeight"),(this.getShallow("fontSize")||i(e,"fontSize")||12)+"px",this.getShallow("fontFamily")||i(e,"fontFamily")||"sans-serif"].join(" ")},getTextRect:function(t){return r.getBoundingRect(t,this.getFont(),this.getShallow("align"),this.getShallow("baseline"))},truncateText:function(t,e,n,i){return r.truncateText(t,e,this.getFont(),n,i)}}},function(t,e,n){function i(t,e){e=e.split(",");for(var n=t,i=0;i<e.length&&(n=n&&n[e[i]],null!=n);i++);return n}function r(t,e,n,i){e=e.split(",");for(var r,o=t,a=0;a<e.length-1;a++)r=e[a],null==o[r]&&(o[r]={}),o=o[r];(i||null==o[e[a]])&&(o[e[a]]=n)}function o(t){c(l,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}var a=n(1),s=n(146),l=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],u=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],h=["bar","boxplot","candlestick","chord","effectScatter","funnel","gauge","lines","graph","heatmap","line","map","parallel","pie","radar","sankey","scatter","treemap"],c=a.each;t.exports=function(t){c(t.series,function(t){if(a.isObject(t)){var e=t.type;if(s(t),"pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var n=i(t,"pointer.color");null!=n&&r(t,"itemStyle.normal.color",n)}for(var l=0;l<h.length;l++)if(h[l]===t.type){o(t);break}}}),t.dataRange&&(t.visualMap=t.dataRange),c(u,function(e){var n=t[e];n&&(a.isArray(n)||(n=[n]),c(n,function(t){o(t)}))})}},function(t,e,n){function i(t){var e=t&&t.itemStyle;e&&r.each(o,function(n){var i=e.normal,o=e.emphasis;i&&i[n]&&(t[n]=t[n]||{},t[n].normal?r.merge(t[n].normal,i[n]):t[n].normal=i[n],i[n]=null),o&&o[n]&&(t[n]=t[n]||{},t[n].emphasis?r.merge(t[n].emphasis,o[n]):t[n].emphasis=o[n],o[n]=null)})}var r=n(1),o=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];t.exports=function(t){if(t){i(t),i(t.markPoint),i(t.markLine);var e=t.data;if(e){for(var n=0;n<e.length;n++)i(e[n]);var o=t.markPoint;if(o&&o.data)for(var a=o.data,n=0;n<a.length;n++)i(a[n]);var s=t.markLine;if(s&&s.data)for(var l=s.data,n=0;n<l.length;n++)r.isArray(l[n])?(i(l[n][0]),i(l[n][1])):i(l[n])}}}},function(t,e){var n={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-(1/0),n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return e},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return e},nearest:function(t){return t[0]}},i=function(t,e){return Math.round(t.length/2)};t.exports=function(t,e,r){e.eachSeriesByType(t,function(t){var e=t.getData(),r=t.get("sampling"),o=t.coordinateSystem;if("cartesian2d"===o.type&&r){var a=o.getBaseAxis(),s=o.getOtherAxis(a),l=a.getExtent(),u=l[1]-l[0],h=Math.round(e.count()/u);if(h>1){var c;"string"==typeof r?c=n[r]:"function"==typeof r&&(c=r),c&&(e=e.downSample(s.dim,1/h,c,i),t.setData(e))}}},this)}},function(t,e,n){function i(t,e){return c(t,h(e))}var r=n(1),o=n(34),a=n(4),s=n(43),l=o.prototype,u=s.prototype,h=a.getPrecisionSafe,c=a.round,d=Math.floor,f=Math.ceil,p=Math.pow,g=Math.log,v=o.extend({type:"log",base:10,$constructor:function(){o.apply(this,arguments),this._originalScale=new s},getTicks:function(){var t=this._originalScale,e=this._extent,n=t.getExtent();return r.map(u.getTicks.call(this),function(r){var o=a.round(p(this.base,r));return o=r===e[0]&&t.__fixMin?i(o,n[0]):o,o=r===e[1]&&t.__fixMax?i(o,n[1]):o},this)},getLabel:u.getLabel,scale:function(t){return t=l.scale.call(this,t),p(this.base,t)},setExtent:function(t,e){var n=this.base;t=g(t)/g(n),e=g(e)/g(n),u.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=l.getExtent.call(this);e[0]=p(t,e[0]),e[1]=p(t,e[1]);var n=this._originalScale,r=n.getExtent();return n.__fixMin&&(e[0]=i(e[0],r[0])),n.__fixMax&&(e[1]=i(e[1],r[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=g(t[0])/g(e),t[1]=g(t[1])/g(e),l.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=a.quantity(n),r=t/n*i;for(r<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var o=[a.round(f(e[0]/i)*i),a.round(d(e[1]/i)*i)];this._interval=i,this._niceExtent=o}},niceExtent:function(t,e,n){u.niceExtent.call(this,t,e,n);var i=this._originalScale;i.__fixMin=e,i.__fixMax=n}});r.each(["contain","normalize"],function(t){v.prototype[t]=function(e){return e=g(e)/g(this.base),l[t].call(this,e)}}),v.create=function(){return new v},t.exports=v},function(t,e,n){var i=n(1),r=n(34),o=r.prototype,a=r.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?i.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),o.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return o.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(o.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!1))},niceTicks:i.noop,niceExtent:i.noop});a.create=function(){return new a},t.exports=a},function(t,e,n){var i=n(1),r=n(4),o=n(7),a=n(63),s=n(43),l=s.prototype,u=Math.ceil,h=Math.floor,c=1e3,d=60*c,f=60*d,p=24*f,g=function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][2]<e?n=r+1:i=r}return n},v=s.extend({type:"time",getLabel:function(t){var e=this._stepLvl,n=new Date(t);return o.formatTime(e[0],n,this.getSetting("useUTC"))},niceExtent:function(t,e,n){var i=this._extent;if(i[0]===i[1]&&(i[0]-=p,i[1]+=p),i[1]===-(1/0)&&i[0]===1/0){var o=new Date;i[1]=new Date(o.getFullYear(),o.getMonth(),o.getDate()),i[0]=i[1]-p}this.niceTicks(t);var a=this._interval;e||(i[0]=r.round(h(i[0]/a)*a)),n||(i[1]=r.round(u(i[1]/a)*a))},niceTicks:function(t){var e=this.getSetting("useUTC")?0:60*r.getTimezoneOffset()*1e3;t=t||10;var n=this._extent,i=n[1]-n[0],o=i/t,s=m.length,l=g(m,o,0,s),c=m[Math.min(l,s-1)],d=c[2];if("year"===c[0]){var f=i/d,p=r.nice(f/t,!0);d*=p}var v=[Math.round(u((n[0]-e)/d)*d+e),Math.round(h((n[1]-e)/d)*d+e)];a.fixExtent(v,n),this._stepLvl=c,this._interval=d,this._niceExtent=v},parse:function(t){return+r.parseDate(t)}});i.each(["contain","normalize"],function(t){v.prototype[t]=function(e){return l[t].call(this,this.parse(e))}});var m=[["hh:mm:ss",1,c],["hh:mm:ss",5,5*c],["hh:mm:ss",10,10*c],["hh:mm:ss",15,15*c],["hh:mm:ss",30,30*c],["hh:mm\nMM-dd",1,d],["hh:mm\nMM-dd",5,5*d],["hh:mm\nMM-dd",10,10*d],["hh:mm\nMM-dd",15,15*d],["hh:mm\nMM-dd",30,30*d],["hh:mm\nMM-dd",1,f],["hh:mm\nMM-dd",2,2*f],["hh:mm\nMM-dd",6,6*f],["hh:mm\nMM-dd",12,12*f],["MM-dd\nyyyy",1,p],["week",7,7*p],["month",1,31*p],["quarter",3,380*p/4],["half-year",6,380*p/2],["year",1,380*p]];v.create=function(t){return new v({useUTC:t.ecModel.get("useUTC")})},t.exports=v},function(t,e,n){var i=n(39);t.exports=function(t){function e(e){var n=(e.visualColorAccessPath||"itemStyle.normal.color").split("."),r=e.getData(),o=e.get(n)||e.getColorFromPalette(e.get("name"));r.setVisual("color",o),t.isSeriesFiltered(e)||("function"!=typeof o||o instanceof i||r.each(function(t){r.setItemVisual(t,"color",o(e.getDataParams(t)))}),r.each(function(t){var e=r.getItemModel(t),i=e.get(n,!0);null!=i&&r.setItemVisual(t,"color",i)}))}t.eachRawSeries(e)}},function(t,e,n){"use strict";function i(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch}}function r(){}function o(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i,r=t;r;){if(r.clipPath&&!r.clipPath.contain(e,n))return!1;r.silent&&(i=!0),r=r.parent}return!i||u}return!1}var a=n(1),s=n(179),l=n(23),u="silent";r.prototype.dispose=function(){};var h=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],c=function(t,e,n,i){l.call(this),this.storage=t,this.painter=e,this.painterRoot=i,n=n||new r,this.proxy=n,n.handler=this,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,s.call(this),a.each(h,function(t){n.on&&n.on(t,this[t],this)},this)};c.prototype={constructor:c,mousemove:function(t){var e=t.zrX,n=t.zrY,i=this._hovered,r=this._hovered=this.findHover(e,n),o=r.target,a=i.target,s=this.proxy;s.setCursor&&s.setCursor(o?o.cursor:"default"),a&&o!==a&&a.__zr&&this.dispatchToElement(i,"mouseout",t),this.dispatchToElement(r,"mousemove",t),o&&o!==a&&this.dispatchToElement(r,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,n=t.toElement||t.relatedTarget;do n=n&&n.parentNode;while(n&&9!=n.nodeType&&!(e=n===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var n=this[t];n&&n.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,n){t=t||{};for(var r="on"+e,o=i(e,t,n),a=t.target;a&&(a[r]&&(o.cancelBubble=a[r].call(a,o)),a.trigger(e,o),a=a.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)}))},findHover:function(t,e,n){for(var i=this.storage.getDisplayList(),r={},a=i.length-1;a>=0;a--){var s;if(i[a]!==n&&!i[a].ignore&&(s=o(i[a],t,e))&&(!r.topTarget&&(r.topTarget=i[a]),s!==u)){r.target=i[a];break}}return r}},a.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){c.prototype[t]=function(e){var n=this.findHover(e.zrX,e.zrY),i=n.target;if("mousedown"===t)this._downel=i,this._upel=i;else if("mosueup"===t)this._upel=i;else if("click"===t&&this._downel!==this._upel)return;this.dispatchToElement(n,t,e)}}),a.mixin(c,l),a.mixin(c,s),t.exports=c},function(t,e,n){function i(){return!1}function r(t,e,n,i){var r=document.createElement(e),o=n.getWidth(),a=n.getHeight(),s=r.style;return s.position="absolute",s.left=0,s.top=0,s.width=o+"px",s.height=a+"px",r.width=o*i,r.height=a*i,r.setAttribute("data-zr-dom-id",t),r}var o=n(1),a=n(35),s=n(72),l=n(71),u=function(t,e,n){var s;n=n||a.devicePixelRatio,"string"==typeof t?s=r(t,"canvas",e,n):o.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=i,l["-webkit-user-select"]="none",l["user-select"]="none",l["-webkit-touch-callout"]="none",l["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",l.padding=0,l.margin=0,l["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=n};u.prototype={constructor:u,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=r("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var n=this.dpr,i=this.dom,r=i.style,o=this.domBack;r.width=t+"px",r.height=e+"px",i.width=t*n,i.height=e*n,o&&(o.width=t*n,o.height=e*n,1!=n&&this.ctxBack.scale(n,n))},clear:function(t){var e=this.dom,n=this.ctx,i=e.width,r=e.height,o=this.clearColor,a=this.motionBlur&&!t,u=this.lastFrameAlpha,h=this.dpr;if(a&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,i/h,r/h)),n.clearRect(0,0,i,r),o){var c;o.colorStops?(c=o.__canvasGradient||s.getGradient(n,o,{x:0,y:0,width:i,height:r}),o.__canvasGradient=c):o.image&&(c=l.prototype.getCanvasPattern.call(o,n)),n.save(),n.fillStyle=c||o,n.fillRect(0,0,i,r),n.restore()}if(a){var d=this.domBack;n.save(),n.globalAlpha=u,n.drawImage(d,0,0,i,r),n.restore()}}},t.exports=u},function(t,e,n){"use strict";function i(t){return parseInt(t,10)}function r(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function o(t){t.__unusedCount++}function a(t){1==t.__unusedCount&&t.clear()}function s(t,e,n){return x.copy(t.getBoundingRect()),t.transform&&x.applyTransform(t.transform),_.width=e,_.height=n,!x.intersect(_)}function l(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0}function u(t,e){for(var n=0;n<t.length;n++){var i=t[n];i.setTransform(e),e.beginPath(),i.buildPath(e,i.shape),e.clip(),i.restoreTransform(e)}}function h(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}var c=n(35),d=n(1),f=n(52),p=n(11),g=n(51),v=n(153),m=n(67),y=5,x=new p(0,0,0,0),_=new p(0,0,0,0),b=function(t,e,n){var i=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=d.extend({},n||{}),this.dpr=n.devicePixelRatio||c.devicePixelRatio,this._singleCanvas=i,this.root=t;var r=t.style;r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]=r["user-select"]=r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var o=this._zlevelList=[],a=this._layers={};if(this._layerConfig={},i){null!=n.width&&(t.width=n.width),null!=n.height&&(t.height=n.height);var s=t.width,l=t.height;this._width=s,this._height=l;var u=new v(t,this,1);u.initContext(),a[0]=u,o.push(0),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var f=this._domRoot=h(this._width,this._height);t.appendChild(f)}this._progressiveLayers=[],this._hoverlayer,this._hoverElements=[]};b.prototype={constructor:b,isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},refresh:function(t){var e=this.storage.getDisplayList(!0),n=this._zlevelList;this._paintList(e,t);for(var i=0;i<n.length;i++){var r=n[i],o=this._layers[r];!o.__builtin__&&o.refresh&&o.refresh()}return this.refreshHover(),this._progressiveLayers.length&&this._startProgessive(),this},addHover:function(t,e){if(!t.__hoverMir){var n=new t.constructor({style:t.style,shape:t.shape});n.__from=t,t.__hoverMir=n,n.setStyle(e),this._hoverElements.push(n)}},removeHover:function(t){var e=t.__hoverMir,n=this._hoverElements,i=d.indexOf(n,e);i>=0&&n.splice(i,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,n=0;n<e.length;n++){var i=e[n].__from;i&&(i.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){g(t,this.storage.displayableSortFunc),n||(n=this._hoverlayer=this.getLayer(1e5));var i={};n.ctx.save();for(var r=0;r<e;){var o=t[r],a=o.__from;a&&a.__zr?(r++,a.invisible||(o.transform=a.transform,o.invTransform=a.invTransform,o.__clipPaths=a.__clipPaths,this._doPaintEl(o,n,!0,i))):(t.splice(r,1),a.__hoverMir=null,e--)}n.ctx.restore()}},_startProgessive:function(){function t(){n===e._progressiveToken&&e.storage&&(e._doPaintList(e.storage.getDisplayList()),e._furtherProgressive?(e._progress++,m(t)):e._progressiveToken=-1)}var e=this;if(e._furtherProgressive){var n=e._progressiveToken=+new Date;e._progress++,m(t)}},_clearProgressive:function(){this._progressiveToken=-1,this._progress=0,d.each(this._progressiveLayers,function(t){t.__dirty&&t.clear()})},_paintList:function(t,e){null==e&&(e=!1),this._updateLayerStatus(t),this._clearProgressive(),this.eachBuiltinLayer(o),this._doPaintList(t,e),this.eachBuiltinLayer(a)},_doPaintList:function(t,e){function n(t){var e=o.dpr||1;o.save(),o.globalAlpha=1,o.shadowBlur=0,i.__dirty=!0,o.setTransform(1,0,0,1,0,0),o.drawImage(t.dom,0,0,h*e,c*e),o.restore()}for(var i,r,o,a,s,l,u=0,h=this._width,c=this._height,p=this._progress,g=0,v=t.length;g<v;g++){var m=t[g],x=this._singleCanvas?0:m.zlevel,_=m.__frame;if(_<0&&s&&(n(s),s=null),r!==x&&(o&&o.restore(),a={},r=x,i=this.getLayer(r),i.__builtin__||f("ZLevel "+r+" has been used by unkown layer "+i.id),o=i.ctx,o.save(),i.__unusedCount=0,(i.__dirty||e)&&i.clear()),i.__dirty||e){if(_>=0){if(!s){if(s=this._progressiveLayers[Math.min(u++,y-1)],s.ctx.save(),s.renderScope={},s&&s.__progress>s.__maxProgress){g=s.__nextIdxNotProg-1;continue}l=s.__progress,s.__dirty||(p=l),s.__progress=p+1}_===p&&this._doPaintEl(m,s,!0,s.renderScope)}else this._doPaintEl(m,i,e,a);m.__dirty=!1}}s&&n(s),o&&o.restore(),this._furtherProgressive=!1,d.each(this._progressiveLayers,function(t){t.__maxProgress>=t.__progress&&(this._furtherProgressive=!0)},this)},_doPaintEl:function(t,e,n,i){var r=e.ctx,o=t.transform;if((e.__dirty||n)&&!t.invisible&&0!==t.style.opacity&&(!o||o[0]||o[3])&&(!t.culling||!s(t,this._width,this._height))){var a=t.__clipPaths;(i.prevClipLayer!==e||l(a,i.prevElClipPaths))&&(i.prevElClipPaths&&(i.prevClipLayer.ctx.restore(),i.prevClipLayer=i.prevElClipPaths=null,i.prevEl=null),a&&(r.save(),u(a,r),i.prevClipLayer=e,i.prevElClipPaths=a)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,i.prevEl||null),i.prevEl=t,t.afterBrush&&t.afterBrush(r)}},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new v("zr_"+t,this,this.dpr),e.__builtin__=!0,this._layerConfig[t]&&d.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var n=this._layers,i=this._zlevelList,o=i.length,a=null,s=-1,l=this._domRoot;if(n[t])return void f("ZLevel "+t+" has been used already");if(!r(e))return void f("Layer of zlevel "+t+" is not valid");if(o>0&&t>i[0]){for(s=0;s<o-1&&!(i[s]<t&&i[s+1]>t);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var u=a.dom;u.nextSibling?l.insertBefore(e.dom,u.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom)},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i<r.length;i++)n=r[i],t.call(e,this._layers[n],n)},eachBuiltinLayer:function(t,e){var n,i,r,o=this._zlevelList;for(r=0;r<o.length;r++)i=o[r],n=this._layers[i],n.__builtin__&&t.call(e,n,i)},eachOtherLayer:function(t,e){var n,i,r,o=this._zlevelList;for(r=0;r<o.length;r++)i=o[r],n=this._layers[i],n.__builtin__||t.call(e,n,i)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){var e=this._layers,n=this._progressiveLayers,i={},r={};this.eachBuiltinLayer(function(t,e){i[e]=t.elCount,t.elCount=0,t.__dirty=!1}),d.each(n,function(t,e){r[e]=t.elCount,t.elCount=0,t.__dirty=!1});for(var o,a,s=0,l=0,u=0,h=t.length;u<h;u++){var c=t[u],f=this._singleCanvas?0:c.zlevel,p=e[f],g=c.progressive;if(p&&(p.elCount++,p.__dirty=p.__dirty||c.__dirty),g>=0){a!==g&&(a=g,l++);var m=c.__frame=l-1;if(!o){var x=Math.min(s,y-1);o=n[x],o||(o=n[x]=new v("progressive",this,this.dpr),o.initContext()),o.__maxProgress=0}o.__dirty=o.__dirty||c.__dirty,o.elCount++,o.__maxProgress=Math.max(o.__maxProgress,m),o.__maxProgress>=o.__progress&&(p.__dirty=!0)}else c.__frame=-1,o&&(o.__nextIdxNotProg=u,s++,o=null)}o&&(s++,o.__nextIdxNotProg=u),this.eachBuiltinLayer(function(t,e){i[e]!==t.elCount&&(t.__dirty=!0)}),n.length=Math.min(s,y),d.each(n,function(t,e){r[e]!==t.elCount&&(c.__dirty=!0),t.__dirty&&(t.__progress=0)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?d.merge(n[t],e,!0):n[t]=e;var i=this._layers[t];i&&d.merge(i,n[t],!0)}},delLayer:function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(d.indexOf(n,t),1))},resize:function(t,e){var n=this._domRoot;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!=t||e!=this._height){n.style.width=t+"px",n.style.height=e+"px";for(var r in this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(t,e);d.each(this._progressiveLayers,function(n){n.resize(t,e)}),this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas)return this._layers[0].dom;var e=new v("image",this,t.pixelRatio||this.dpr);e.initContext(),e.clearColor=t.backgroundColor,e.clear();for(var n=this.storage.getDisplayList(!0),i={},r=0;r<n.length;r++){var o=n[r];this._doPaintEl(o,e,!0,i)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],r=["clientWidth","clientHeight"][t],o=["paddingLeft","paddingTop"][t],a=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var s=this.root,l=document.defaultView.getComputedStyle(s);return(s[r]||i(l[n])||i(s.style[n]))-(i(l[o])||0)-(i(l[a])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var i=document.createElement("canvas"),r=i.getContext("2d"),o=t.getBoundingRect(),a=t.style,s=a.shadowBlur,l=a.shadowOffsetX,u=a.shadowOffsetY,h=a.hasStroke()?a.lineWidth:0,c=Math.max(h/2,-l+s),d=Math.max(h/2,l+s),f=Math.max(h/2,-u+s),p=Math.max(h/2,u+s),g=o.width+c+d,v=o.height+f+p;i.width=g*e,i.height=v*e,r.scale(e,e),r.clearRect(0,0,g,v),r.dpr=e;var m={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[c-o.x,f-o.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(r);var y=n(53),x=new y({style:{x:0,y:0,image:i}});return null!=m.position&&(x.position=t.position=m.position),null!=m.rotation&&(x.rotation=t.rotation=m.rotation),null!=m.scale&&(x.scale=t.scale=m.scale),x}},t.exports=b},function(t,e,n){"use strict";function i(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var r=n(1),o=n(9),a=n(36),s=n(51),l=function(){this._roots=[],this._displayList=[],this._displayListLen=0};l.prototype={constructor:l,traverse:function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e);
-},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,r=0,a=e.length;r<a;r++)this._updateAndAddDisplayable(e[r],null,t);n.length=this._displayListLen,o.canvasSupported&&s(n,i)},_updateAndAddDisplayable:function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var i=t.clipPath;if(i){e=e?e.slice():[];for(var r=i,o=t;r;)r.parent=o,r.updateTransform(),e.push(r),o=r,r=r.clipPath}if(t.isGroup){for(var a=t._children,s=0;s<a.length;s++){var l=a[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,n)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof a&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var n=this._roots[e];n instanceof a&&n.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var e=0,i=t.length;e<i;e++)this.delRoot(t[e]);else{var o=r.indexOf(this._roots,t);o>=0&&(this.delFromStorage(t),this._roots.splice(o,1),t instanceof a&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t.__storage=this,t.dirty(!1),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:i},t.exports=l},function(t,e,n){"use strict";var i=n(1),r=n(21).Dispatcher,o=n(67),a=n(66),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,r.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),n=0;n<e.length;n++)this.addClip(e[n])},removeClip:function(t){var e=i.indexOf(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;n<e.length;n++)this.removeClip(e[n]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,n=this._clips,i=n.length,r=[],o=[],a=0;a<i;a++){var s=n[a],l=s.step(t,e);l&&(r.push(l),o.push(s))}for(var a=0;a<i;)n[a]._needsRemove?(n[a]=n[i-1],n.pop(),i--):a++;i=r.length;for(var a=0;a<i;a++)o[a].fire(r[a]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(o(t),!e._paused&&e._update())}var e=this;this._running=!0,o(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var n=new a(t,e.loop,e.getter,e.setter);return this.addAnimator(n),n}},i.mixin(s,r),t.exports=s},function(t,e,n){function i(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}var r=n(158);i.prototype={constructor:i,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)return void(this._pausedTime+=e);var n=(t-this._startTime-this._pausedTime)/this._life;if(!(n<0)){n=Math.min(n,1);var i=this.easing,o="string"==typeof i?r[i]:i,a="function"==typeof o?o(n):n;return this.fire("frame",a),1==n?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}},t.exports=i},function(t,e){var n={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),-(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)))},elasticOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?-.5*(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)):n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-n.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*n.bounceIn(2*t):.5*n.bounceOut(2*t-1)+.5}};t.exports=n},function(t,e,n){var i=n(68).normalizeRadian,r=2*Math.PI;t.exports={containStroke:function(t,e,n,o,a,s,l,u,h){if(0===l)return!1;var c=l;u-=t,h-=e;var d=Math.sqrt(u*u+h*h);if(d-c>n||d+c<n)return!1;if(Math.abs(o-a)%r<1e-4)return!0;if(s){var f=o;o=i(a),a=i(f)}else o=i(o),a=i(a);o>a&&(a+=r);var p=Math.atan2(h,u);return p<0&&(p+=r),p>=o&&p<=a||p+r>=o&&p+r<=a}}},function(t,e,n){var i=n(20);t.exports={containStroke:function(t,e,n,r,o,a,s,l,u,h,c){if(0===u)return!1;var d=u;if(c>e+d&&c>r+d&&c>a+d&&c>l+d||c<e-d&&c<r-d&&c<a-d&&c<l-d||h>t+d&&h>n+d&&h>o+d&&h>s+d||h<t-d&&h<n-d&&h<o-d&&h<s-d)return!1;var f=i.cubicProjectPoint(t,e,n,r,o,a,s,l,h,c,null);return f<=d/2}}},function(t,e,n){"use strict";function i(t,e){return Math.abs(t-e)<x}function r(){var t=b[0];b[0]=b[1],b[1]=t}function o(t,e,n,i,o,a,s,l,u,h){if(h>e&&h>i&&h>a&&h>l||h<e&&h<i&&h<a&&h<l)return 0;var c=g.cubicRootAt(e,i,a,l,h,_);if(0===c)return 0;for(var d,f,p=0,v=-1,m=0;m<c;m++){var y=_[m],x=0===y||1===y?.5:1,w=g.cubicAt(t,n,o,s,y);w<u||(v<0&&(v=g.cubicExtrema(e,i,a,l,b),b[1]<b[0]&&v>1&&r(),d=g.cubicAt(e,i,a,l,b[0]),v>1&&(f=g.cubicAt(e,i,a,l,b[1]))),p+=2==v?y<b[0]?d<e?x:-x:y<b[1]?f<d?x:-x:l<f?x:-x:y<b[0]?d<e?x:-x:l<d?x:-x)}return p}function a(t,e,n,i,r,o,a,s){if(s>e&&s>i&&s>o||s<e&&s<i&&s<o)return 0;var l=g.quadraticRootAt(e,i,o,s,_);if(0===l)return 0;var u=g.quadraticExtremum(e,i,o);if(u>=0&&u<=1){for(var h=0,c=g.quadraticAt(e,i,o,u),d=0;d<l;d++){var f=0===_[d]||1===_[d]?.5:1,p=g.quadraticAt(t,n,r,_[d]);p<a||(h+=_[d]<u?c<e?f:-f:o<c?f:-f)}return h}var f=0===_[0]||1===_[0]?.5:1,p=g.quadraticAt(t,n,r,_[0]);return p<a?0:o<e?f:-f}function s(t,e,n,i,r,o,a,s){if(s-=e,s>n||s<-n)return 0;var l=Math.sqrt(n*n-s*s);_[0]=-l,_[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u%y<1e-4){i=0,r=y;var h=o?1:-1;return a>=_[0]+t&&a<=_[1]+t?h:0}if(o){var l=i;i=p(r),r=p(l)}else i=p(i),r=p(r);i>r&&(r+=y);for(var c=0,d=0;d<2;d++){var f=_[d];if(f+t>a){var g=Math.atan2(s,f),h=o?1:-1;g<0&&(g=y+g),(g>=i&&g<=r||g+y>=i&&g+y<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),c+=h)}}return c}function l(t,e,n,r,l){for(var h=0,p=0,g=0,y=0,x=0,_=0;_<t.length;){var b=t[_++];switch(b===u.M&&_>1&&(n||(h+=v(p,g,y,x,r,l))),1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case u.M:y=t[_++],x=t[_++],p=y,g=x;break;case u.L:if(n){if(m(p,g,t[_],t[_+1],e,r,l))return!0}else h+=v(p,g,t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case u.C:if(n){if(c.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else h+=o(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case u.Q:if(n){if(d.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else h+=a(p,g,t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case u.A:var w=t[_++],M=t[_++],S=t[_++],T=t[_++],A=t[_++],I=t[_++],C=(t[_++],1-t[_++]),P=Math.cos(A)*S+w,k=Math.sin(A)*T+M;_>1?h+=v(p,g,P,k,r,l):(y=P,x=k);var L=(r-w)*T/S+w;if(n){if(f.containStroke(w,M,T,A,A+I,C,e,L,l))return!0}else h+=s(w,M,T,A,A+I,C,L,l);p=Math.cos(A+I)*S+w,g=Math.sin(A+I)*T+M;break;case u.R:y=p=t[_++],x=g=t[_++];var D=t[_++],O=t[_++],P=y+D,k=x+O;if(n){if(m(y,x,P,x,e,r,l)||m(P,x,P,k,e,r,l)||m(P,k,y,k,e,r,l)||m(y,k,y,x,e,r,l))return!0}else h+=v(P,x,P,k,r,l),h+=v(y,k,y,x,r,l);break;case u.Z:if(n){if(m(p,g,y,x,e,r,l))return!0}else h+=v(p,g,y,x,r,l);p=y,g=x}}return n||i(g,x)||(h+=v(p,g,y,x,r,l)||0),0!==h}var u=n(27).CMD,h=n(96),c=n(160),d=n(97),f=n(159),p=n(68).normalizeRadian,g=n(20),v=n(98),m=h.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,n){return l(t,0,!1,e,n)},containStroke:function(t,e,n,i){return l(t,e,!0,n,i)}}},function(t,e,n){"use strict";function i(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}function r(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var o=n(21),a=function(){this._track=[]};a.prototype={constructor:a,recognize:function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},a=0,s=i.length;a<s;a++){var l=i[a],u=o.clientToLocal(n,l,{});r.points.push([u.zrX,u.zrY]),r.touches.push(l)}this._track.push(r)}},_recognize:function(t){for(var e in s)if(s.hasOwnProperty(e)){var n=s[e](this._track,t);if(n)return n}}};var s={pinch:function(t,e){var n=t.length;if(n){var o=(t[n-1]||{}).points,a=(t[n-2]||{}).points||o;if(a&&a.length>1&&o&&o.length>1){var s=i(o)/i(a);!isFinite(s)&&(s=1),e.pinchScale=s;var l=r(o);return e.pinchX=l[0],e.pinchY=l[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=a},function(t,e,n){function i(t){return"mousewheel"===t&&d.browser.firefox?"DOMMouseScroll":t}function r(t,e,n){var i=t._gestureMgr;"start"===n&&i.clear();var r=i.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===n&&i.clear(),r){var o=r.type;e.gestureEvent=o,t.handler.dispatchToElement({target:r.target},o,r.event)}}function o(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function a(t){var e=t.pointerType;return"pen"===e||"touch"===e}function s(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}h.each(x,function(e){t._handlers[e]=h.bind(w[e],t)}),h.each(b,function(e){t._handlers[e]=h.bind(w[e],t)}),h.each(y,function(n){t._handlers[n]=e(w[n],t)})}function l(t){function e(e,n){h.each(e,function(e){p(t,i(e),n._handlers[e])},n)}c.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new f,this._handlers={},s(this),d.pointerEventsSupported?e(b,this):(d.touchEventsSupported&&e(x,this),e(y,this))}var u=n(21),h=n(1),c=n(23),d=n(9),f=n(162),p=u.addEventListener,g=u.removeEventListener,v=u.normalizeEvent,m=300,y=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],x=["touchstart","touchend","touchmove"],_={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},b=h.map(y,function(t){var e=t.replace("mouse","pointer");return _[e]?e:t}),w={mousemove:function(t){t=v(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){t=v(this.dom,t);var e=t.toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){t=v(this.dom,t),t.zrByTouch=!0,this._lastTouchMoment=new Date,r(this,t,"start"),w.mousemove.call(this,t),w.mousedown.call(this,t),o(this)},touchmove:function(t){t=v(this.dom,t),t.zrByTouch=!0,r(this,t,"change"),w.mousemove.call(this,t),o(this)},touchend:function(t){t=v(this.dom,t),t.zrByTouch=!0,r(this,t,"end"),w.mouseup.call(this,t),+new Date-this._lastTouchMoment<m&&w.click.call(this,t),o(this)},pointerdown:function(t){w.mousedown.call(this,t)},pointermove:function(t){a(t)||w.mousemove.call(this,t)},pointerup:function(t){w.mouseup.call(this,t)},pointerout:function(t){a(t)||w.mouseout.call(this,t)}};h.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){w[t]=function(e){e=v(this.dom,e),this.trigger(t,e)}});var M=l.prototype;M.dispose=function(){for(var t=y.concat(x),e=0;e<t.length;e++){var n=t[e];g(this.dom,i(n),this._handlers[n])}},M.setCursor=function(t){this.dom.style.cursor=t||"default"},h.mixin(l,c),t.exports=l},function(t,e,n){var i=n(8);t.exports=i.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,n=0;n<e.length;n++)t=t||e[n].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},afterBrush:function(){for(var t=this.shape.paths,e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),i.prototype.getBoundingRect.call(this)}})},function(t,e,n){"use strict";var i=n(1),r=n(39),o=function(t,e,n,i,o){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,this.type="radial",this.global=o||!1,r.call(this,i)};o.prototype={constructor:o},i.inherits(o,r),t.exports=o},function(t,e){t.exports={buildPath:function(t,e){var n,i,r,o,a=e.x,s=e.y,l=e.width,u=e.height,h=e.r;l<0&&(a+=l,l=-l),u<0&&(s+=u,u=-u),"number"==typeof h?n=i=r=o=h:h instanceof Array?1===h.length?n=i=r=o=h[0]:2===h.length?(n=r=h[0],i=o=h[1]):3===h.length?(n=h[0],i=o=h[1],r=h[2]):(n=h[0],i=h[1],r=h[2],o=h[3]):n=i=r=o=0;var c;n+i>l&&(c=n+i,n*=l/c,i*=l/c),r+o>l&&(c=r+o,r*=l/c,o*=l/c),i+r>u&&(c=i+r,i*=u/c,r*=u/c),n+o>u&&(c=n+o,n*=u/c,o*=u/c),t.moveTo(a+n,s),t.lineTo(a+l-i,s),0!==i&&t.quadraticCurveTo(a+l,s,a+l,s+i),t.lineTo(a+l,s+u-r),0!==r&&t.quadraticCurveTo(a+l,s+u,a+l-r,s+u),t.lineTo(a+o,s+u),0!==o&&t.quadraticCurveTo(a,s+u,a,s+u-o),t.lineTo(a,s+n),0!==n&&t.quadraticCurveTo(a,s,a+n,s)}}},function(t,e,n){var i=n(5),r=i.min,o=i.max,a=i.scale,s=i.distance,l=i.add;t.exports=function(t,e,n,u){var h,c,d,f,p=[],g=[],v=[],m=[];if(u){d=[1/0,1/0],f=[-(1/0),-(1/0)];for(var y=0,x=t.length;y<x;y++)r(d,d,t[y]),o(f,f,t[y]);r(d,d,u[0]),o(f,f,u[1])}for(var y=0,x=t.length;y<x;y++){var _=t[y];if(n)h=t[y?y-1:x-1],c=t[(y+1)%x];else{if(0===y||y===x-1){p.push(i.clone(t[y]));continue}h=t[y-1],c=t[y+1]}i.sub(g,c,h),a(g,g,e);var b=s(_,h),w=s(_,c),M=b+w;0!==M&&(b/=M,w/=M),a(v,g,-b),a(m,g,w);var S=l([],_,v),T=l([],_,m);u&&(o(S,S,d),r(S,S,f),o(T,T,d),r(T,T,f)),p.push(S),p.push(T)}return n&&p.push(p.shift()),p}},function(t,e,n){function i(t,e,n,i,r,o,a){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*a+(-3*(e-n)-2*s-l)*o+s*r+e}var r=n(5);t.exports=function(t,e){for(var n=t.length,o=[],a=0,s=1;s<n;s++)a+=r.distance(t[s-1],t[s]);var l=a/2;l=l<n?n:l;for(var s=0;s<l;s++){var u,h,c,d=s/(l-1)*(e?n:n-1),f=Math.floor(d),p=d-f,g=t[f%n];e?(u=t[(f-1+n)%n],h=t[(f+1)%n],c=t[(f+2)%n]):(u=t[0===f?f:f-1],h=t[f>n-2?n-1:f+1],c=t[f>n-3?n-1:f+2]);var v=p*p,m=p*v;o.push([i(u[0],g[0],h[0],c[0],p,v,m),i(u[1],g[1],h[1],c[1],p,v,m)])}return o}},function(t,e,n){t.exports=n(8).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),o=e.startAngle,a=e.endAngle,s=e.clockwise,l=Math.cos(o),u=Math.sin(o);t.moveTo(l*r+n,u*r+i),t.arc(n,i,r,o,a,!s)}})},function(t,e,n){"use strict";function i(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?c:u)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?c:u)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?h:l)(t.x1,t.cpx1,t.x2,e),(n?h:l)(t.y1,t.cpy1,t.y2,e)]}var r=n(20),o=n(5),a=r.quadraticSubdivide,s=r.cubicSubdivide,l=r.quadraticAt,u=r.cubicAt,h=r.quadraticDerivativeAt,c=r.cubicDerivativeAt,d=[];t.exports=n(8).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,o=e.y2,l=e.cpx1,u=e.cpy1,h=e.cpx2,c=e.cpy2,f=e.percent;0!==f&&(t.moveTo(n,i),null==h||null==c?(f<1&&(a(n,l,r,f,d),l=d[1],r=d[2],a(i,u,o,f,d),u=d[1],o=d[2]),t.quadraticCurveTo(l,u,r,o)):(f<1&&(s(n,l,h,r,f,d),l=d[1],h=d[2],r=d[3],s(i,u,c,o,f,d),u=d[1],c=d[2],o=d[3]),t.bezierCurveTo(l,u,h,c,r,o)))},pointAt:function(t){return i(this.shape,t,!1)},tangentAt:function(t){var e=i(this.shape,t,!0);return o.normalize(e,e)}})},function(t,e,n){"use strict";t.exports=n(8).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,n){t.exports=n(8).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,o=e.y2,a=e.percent;0!==a&&(t.moveTo(n,i),a<1&&(r=n*(1-a)+r*a,o=i*(1-a)+o*a),t.lineTo(r,o))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,n){var i=n(73);t.exports=n(8).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){i.buildPath(t,e,!0)}})},function(t,e,n){var i=n(73);t.exports=n(8).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){i.buildPath(t,e,!1)}})},function(t,e,n){var i=n(166);t.exports=n(8).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,r=e.y,o=e.width,a=e.height;e.r?i.buildPath(t,e):t.rect(n,r,o,a),t.closePath()}})},function(t,e,n){t.exports=n(8).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)}})},function(t,e,n){var i=n(9),r=n(8),o=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]];t.exports=r.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:i.browser.ie&&i.browser.version>=11?function(){var t,e=this.__clipPaths,n=this.style;if(e)for(var i=0;i<e.length;i++){var a=e[i]&&e[i].shape;if(a&&a.startAngle===a.endAngle){for(var s=0;s<o.length;s++)o[s][2]=n[o[s][0]],n[o[s][0]]=o[s][1];t=!0;break}}if(r.prototype.brush.apply(this,arguments),t)for(var s=0;s<o.length;s++)n[o[s][0]]=o[s][2]}:r.prototype.brush,buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=e.startAngle,s=e.endAngle,l=e.clockwise,u=Math.cos(a),h=Math.sin(a);t.moveTo(u*r+n,h*r+i),t.lineTo(u*o+n,h*o+i),t.arc(n,i,o,a,s,!l),t.lineTo(Math.cos(s)*r+n,Math.sin(s)*r+i),0!==r&&t.arc(n,i,r,s,a,l),t.closePath()}})},function(t,e,n){"use strict";var i=n(66),r=n(1),o=r.isString,a=r.isFunction,s=r.isObject,l=n(52),u=function(){this.animators=[]};u.prototype={constructor:u,animate:function(t,e){var n,o=!1,a=this,s=this.__zr;if(t){var u=t.split("."),h=a;o="shape"===u[0];for(var c=0,d=u.length;c<d;c++)h&&(h=h[u[c]]);h&&(n=h)}else n=a;if(!n)return void l('Property "'+t+'" is not existed in element '+a.id);var f=a.animators,p=new i(n,e);return p.during(function(t){a.dirty(o)}).done(function(){f.splice(r.indexOf(f,p),1)}),f.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,n=e.length,i=0;i<n;i++)e[i].stop(t);return e.length=0,this},animateTo:function(t,e,n,i,r){function s(){u--,u||r&&r()}o(n)?(r=i,i=n,n=0):a(i)?(r=i,i="linear",n=0):a(n)?(r=n,n=0):a(e)?(r=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,n,i,r);var l=this.animators.slice(),u=l.length;u||r&&r();for(var h=0;h<l.length;h++)l[h].done(s).start(i)},_animateToShallow:function(t,e,n,i,o){var a={},l=0;for(var u in n)if(n.hasOwnProperty(u))if(null!=e[u])s(n[u])&&!r.isArrayLike(n[u])?this._animateToShallow(t?t+"."+u:u,e[u],n[u],i,o):(a[u]=n[u],l++);else if(null!=n[u])if(t){var h={};h[t]={},h[t][u]=n[u],this.attr(h)}else this.attr(u,n[u]);return l>0&&this.animate(t,!1).when(null==i?500:i,a).delay(o||0),this}},t.exports=u},function(t,e){function n(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function i(t,e){return{target:t,topTarget:e&&e.topTarget}}n.prototype={constructor:n,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(i(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,r=t.offsetY,o=n-this._x,a=r-this._y;this._x=n,this._y=r,e.drift(o,a,t),this.dispatchToElement(i(e,t),"drag",t.event);var s=this.findHover(n,r,e).target,l=this._dropTarget;this._dropTarget=s,e!==s&&(l&&s!==l&&this.dispatchToElement(i(l,t),"dragleave",t.event),s&&s!==l&&this.dispatchToElement(i(s,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(i(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(i(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=n},function(t,e,n){function i(t,e,n,i,r,o,a,s,l,u,p){var m=l*(f/180),y=d(m)*(t-n)/2+c(m)*(e-i)/2,x=-1*c(m)*(t-n)/2+d(m)*(e-i)/2,_=y*y/(a*a)+x*x/(s*s);_>1&&(a*=h(_),s*=h(_));var b=(r===o?-1:1)*h((a*a*(s*s)-a*a*(x*x)-s*s*(y*y))/(a*a*(x*x)+s*s*(y*y)))||0,w=b*a*x/s,M=b*-s*y/a,S=(t+n)/2+d(m)*w-c(m)*M,T=(e+i)/2+c(m)*w+d(m)*M,A=v([1,0],[(y-w)/a,(x-M)/s]),I=[(y-w)/a,(x-M)/s],C=[(-1*y-w)/a,(-1*x-M)/s],P=v(I,C);g(I,C)<=-1&&(P=f),g(I,C)>=1&&(P=0),0===o&&P>0&&(P-=2*f),1===o&&P<0&&(P+=2*f),p.addData(u,S,T,a,s,A,P,m,o)}function r(t){if(!t)return[];var e,n=t.replace(/-/g," -").replace(/  /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e<u.length;e++)n=n.replace(new RegExp(u[e],"g"),"|"+u[e]);var r,o=n.split("|"),a=0,l=0,h=new s,c=s.CMD;for(e=1;e<o.length;e++){var d,f=o[e],p=f.charAt(0),g=0,v=f.slice(1).replace(/e,-/g,"e-").split(",");v.length>0&&""===v[0]&&v.shift();for(var m=0;m<v.length;m++)v[m]=parseFloat(v[m]);for(;g<v.length&&!isNaN(v[g])&&!isNaN(v[0]);){var y,x,_,b,w,M,S,T=a,A=l;switch(p){case"l":a+=v[g++],l+=v[g++],d=c.L,h.addData(d,a,l);break;case"L":a=v[g++],l=v[g++],d=c.L,h.addData(d,a,l);break;case"m":a+=v[g++],l+=v[g++],d=c.M,h.addData(d,a,l),p="l";break;case"M":a=v[g++],l=v[g++],d=c.M,h.addData(d,a,l),p="L";break;case"h":a+=v[g++],d=c.L,h.addData(d,a,l);break;case"H":a=v[g++],d=c.L,h.addData(d,a,l);break;case"v":l+=v[g++],d=c.L,h.addData(d,a,l);break;case"V":l=v[g++],d=c.L,h.addData(d,a,l);break;case"C":d=c.C,h.addData(d,v[g++],v[g++],v[g++],v[g++],v[g++],v[g++]),a=v[g-2],l=v[g-1];break;case"c":d=c.C,h.addData(d,v[g++]+a,v[g++]+l,v[g++]+a,v[g++]+l,v[g++]+a,v[g++]+l),a+=v[g-2],l+=v[g-1];break;case"S":y=a,x=l;var I=h.len(),C=h.data;r===c.C&&(y+=a-C[I-4],x+=l-C[I-3]),d=c.C,T=v[g++],A=v[g++],a=v[g++],l=v[g++],h.addData(d,y,x,T,A,a,l);break;case"s":y=a,x=l;var I=h.len(),C=h.data;r===c.C&&(y+=a-C[I-4],x+=l-C[I-3]),d=c.C,T=a+v[g++],A=l+v[g++],a+=v[g++],l+=v[g++],h.addData(d,y,x,T,A,a,l);break;case"Q":T=v[g++],A=v[g++],a=v[g++],l=v[g++],d=c.Q,h.addData(d,T,A,a,l);break;case"q":T=v[g++]+a,A=v[g++]+l,a+=v[g++],l+=v[g++],d=c.Q,h.addData(d,T,A,a,l);break;case"T":y=a,x=l;var I=h.len(),C=h.data;r===c.Q&&(y+=a-C[I-4],x+=l-C[I-3]),a=v[g++],l=v[g++],d=c.Q,h.addData(d,y,x,a,l);break;case"t":y=a,x=l;var I=h.len(),C=h.data;r===c.Q&&(y+=a-C[I-4],x+=l-C[I-3]),a+=v[g++],l+=v[g++],d=c.Q,h.addData(d,y,x,a,l);break;case"A":_=v[g++],b=v[g++],w=v[g++],M=v[g++],S=v[g++],T=a,A=l,a=v[g++],l=v[g++],d=c.A,i(T,A,a,l,M,S,_,b,w,d,h);break;case"a":_=v[g++],b=v[g++],w=v[g++],M=v[g++],S=v[g++],T=a,A=l,a+=v[g++],l+=v[g++],d=c.A,i(T,A,a,l,M,S,_,b,w,d,h)}}"z"!==p&&"Z"!==p||(d=c.Z,h.addData(d)),r=d}return h.toStatic(),h}function o(t,e){var n=r(t);return e=e||{},e.buildPath=function(t){if(t.setData){t.setData(n.data);var e=t.getContext();e&&t.rebuildPath(e)}else{var e=t;n.rebuildPath(e)}},e.applyTransform=function(t){l(n,t),this.dirty(!0)},e}var a=n(8),s=n(27),l=n(181),u=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],h=Math.sqrt,c=Math.sin,d=Math.cos,f=Math.PI,p=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},g=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(p(t)*p(e))},v=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(g(t,e))};t.exports={createFromString:function(t,e){return new a(o(t,e))},extendFromString:function(t,e){return a.extend(o(t,e))},mergePath:function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var o=t[r];o.path||o.createPathProxy(),o.__dirtyPath&&o.buildPath(o.path,o.shape,!0),n.push(o.path)}var s=new a(e);return s.createPathProxy(),s.buildPath=function(t){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,n){function i(t,e){var n,i,o,h,c,d,f=t.data,p=r.M,g=r.C,v=r.L,m=r.R,y=r.A,x=r.Q;for(o=0,h=0;o<f.length;){switch(n=f[o++],h=o,i=0,n){case p:i=1;break;case v:i=1;break;case g:i=3;break;case x:i=2;break;case y:var _=e[4],b=e[5],w=l(e[0]*e[0]+e[1]*e[1]),M=l(e[2]*e[2]+e[3]*e[3]),S=u(-e[1]/M,e[0]/w);f[o]*=w,f[o++]+=_,f[o]*=M,f[o++]+=b,f[o++]*=w,f[o++]*=M,f[o++]+=S,f[o++]+=S,o+=2,h=o;break;case m:d[0]=f[o++],d[1]=f[o++],a(d,d,e),f[h++]=d[0],f[h++]=d[1],d[0]+=f[o++],d[1]+=f[o++],a(d,d,e),f[h++]=d[0],f[h++]=d[1]}for(c=0;c<i;c++){var d=s[c];d[0]=f[o++],d[1]=f[o++],a(d,d,e),f[h++]=d[0],f[h++]=d[1]}}}var r=n(27).CMD,o=n(5),a=o.applyTransform,s=[[],[],[]],l=Math.sqrt,u=Math.atan2;t.exports=i},function(t,e,n){if(!n(9).canvasSupported){var i,r="urn:schemas-microsoft-com:vml",o=window,a=o.document,s=!1;try{!a.namespaces.zrvml&&a.namespaces.add("zrvml",r),i=function(t){return a.createElement("<zrvml:"+t+' class="zrvml">')}}catch(l){i=function(t){return a.createElement("<"+t+' xmlns="'+r+'" class="zrvml">')}}var u=function(){if(!s){s=!0;var t=a.styleSheets;t.length<31?a.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}};t.exports={doc:a,initVML:u,createNode:i}}},,function(t,e,n){function i(t,e,n){var i=this._targetInfoList=[],r={},a=o(e,t);p(_,function(t,e){(!n||!n.include||g(n.include,e)>=0)&&t(a,i,r)})}function r(t){return t[0]>t[1]&&t.reverse(),t}function o(t,e){return d.parseFinder(t,e,{includeMainTypes:y})}function a(t,e,n,i){var o=n.getAxis(["x","y"][t]),a=r(h.map([0,1],function(t){return e?o.coordToData(o.toLocalCoord(i[t])):o.toGlobalCoord(o.dataToCoord(i[t]))})),s=[];return s[t]=a,s[1-t]=[NaN,NaN],{values:a,xyMinMax:s}}function s(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function l(t,e){var n=u(t),i=u(e),r=[n[0]/i[0],n[1]/i[1]];return isNaN(r[0])&&(r[0]=1),isNaN(r[1])&&(r[1]=1),r}function u(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var h=n(1),c=n(3),d=n(6),f=n(185),p=h.each,g=h.indexOf,v=h.curry,m=["dataToPoint","pointToData"],y=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],x=i.prototype;x.setOutputRanges=function(t,e){this.matchOutputRanges(t,e,function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=M[t.brushType](0,n,e);t.__rangeOffset={offset:S[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})},x.matchOutputRanges=function(t,e,n){p(t,function(t){var i=this.findTargetInfo(t,e);i&&i!==!0&&h.each(i.coordSyses,function(i){var r=M[t.brushType](1,i,t.range);n(t,r.values,i,e)})},this)},x.setInputRanges=function(t,e){p(t,function(t){var n=this.findTargetInfo(t,e);if(t.range=t.range||[],n&&n!==!0){t.panelId=n.panelId;var i=M[t.brushType](0,n.coordSys,t.coordRange),r=t.__rangeOffset;t.range=r?S[t.brushType](i.values,r.offset,l(i.xyMinMax,r.xyMinMax)):i.values}},this)},x.makePanelOpts=function(t,e){return h.map(this._targetInfoList,function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e&&e(n),clipPath:f.makeRectPanelClipPath(i),isTargetByCursor:f.makeRectIsTargetByCursor(i,t,n.coordSysModel),getLinearBrushOtherExtent:f.makeLinearBrushOtherExtent(i)}})},x.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return i===!0||i&&g(i.coordSyses,e.coordinateSystem)>=0},x.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=o(e,t),r=0;r<n.length;r++){var a=n[r],s=t.panelId;if(s){if(a.panelId===s)return a}else for(var r=0;r<b.length;r++)if(b[r](i,a))return a}return!0};var _={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o={},a={},s={};(n||i||r)&&(p(n,function(t){var e=t.axis.grid.model;o[e.id]=e,a[e.id]=!0}),p(i,function(t){var e=t.axis.grid.model;o[e.id]=e,s[e.id]=!0}),p(r,function(t){o[t.id]=t,a[t.id]=!0,s[t.id]=!0}),p(o,function(t){var r=t.coordinateSystem,o=[];p(r.getCartesians(),function(t,e){(g(n,t.getAxis("x").model)>=0||g(i,t.getAxis("y").model)>=0)&&o.push(t)}),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:w.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})}))},geo:function(t,e){p(t.geoModels,function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:w.geo})})}},b=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],w={grid:function(){return this.coordSys.grid.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(c.getTransform(t)),e}},M={lineX:v(a,0),lineY:v(a,1),rect:function(t,e,n){var i=e[m[t]]([n[0][0],n[1][0]]),o=e[m[t]]([n[0][1],n[1][1]]),a=[r([i[0],o[0]]),r([i[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n){var i=[[1/0,-(1/0)],[1/0,-(1/0)]],r=h.map(n,function(n){var r=e[m[t]](n);return i[0][0]=Math.min(i[0][0],r[0]),i[1][0]=Math.min(i[1][0],r[1]),i[0][1]=Math.max(i[0][1],r[0]),i[1][1]=Math.max(i[1][1],r[1]),r});return{values:r,xyMinMax:i}}},S={lineX:v(s,0),lineY:v(s,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return h.map(t,function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]})}};t.exports=i},function(t,e,n){function i(t){return a.create(t)}var r=n(1),o=n(127),a=n(11),s=Math.max,l=Math.min,u={};u.makeRectPanelClipPath=function(t){return t=i(t),function(e,n){return r.map(e,function(e){var n=e[0];n=s(n,t.x),n=l(n,t.x+t.width);var i=e[1];return i=s(i,t.y),i=l(i,t.y+t.height),[n,i]})}},u.makeLinearBrushOtherExtent=function(t,e){return t=i(t),function(n){var i=null!=e?e:n,r=i?t.width:t.height,o=i?t.x:t.y;return[o,o+(r||0)]}},u.makeRectIsTargetByCursor=function(t,e,n){return t=i(t),function(i,r,a){return t.contain(r[0],r[1])&&!o.onIrrelevantElement(i,e,n);
-}},t.exports=u},,,function(t,e){function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function r(t){if(h===setTimeout)return setTimeout(t,0);if((h===n||!h)&&setTimeout)return h=setTimeout,setTimeout(t,0);try{return h(t,0)}catch(e){try{return h.call(null,t,0)}catch(e){return h.call(this,t,0)}}}function o(t){if(c===clearTimeout)return clearTimeout(t);if((c===i||!c)&&clearTimeout)return c=clearTimeout,clearTimeout(t);try{return c(t)}catch(e){try{return c.call(null,t)}catch(e){return c.call(this,t)}}}function a(){g&&f&&(g=!1,f.length?p=f.concat(p):v=-1,p.length&&s())}function s(){if(!g){var t=r(a);g=!0;for(var e=p.length;e;){for(f=p,p=[];++v<e;)f&&f[v].run();v=-1,e=p.length}f=null,g=!1,o(t)}}function l(t,e){this.fun=t,this.array=e}function u(){}var h,c,d=t.exports={};!function(){try{h="function"==typeof setTimeout?setTimeout:n}catch(t){h=n}try{c="function"==typeof clearTimeout?clearTimeout:i}catch(t){c=i}}();var f,p=[],g=!1,v=-1;d.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];p.push(new l(t,e)),1!==p.length||g||r(s)},l.prototype.run=function(){this.fun.apply(null,this.array)},d.title="browser",d.browser=!0,d.env={},d.argv=[],d.version="",d.versions={},d.on=u,d.addListener=u,d.once=u,d.off=u,d.removeListener=u,d.removeAllListeners=u,d.emit=u,d.binding=function(t){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(t){throw new Error("process.chdir is not supported")},d.umask=function(){return 0}},function(t,e,n){function i(){this.group=new r.Group,this._symbolEl=new a({})}var r=n(3),o=n(24),a=r.extendShape({shape:{points:null,sizes:null},symbolProxy:null,buildPath:function(t,e){for(var n=e.points,i=e.sizes,r=this.symbolProxy,o=r.shape,a=0;a<n.length;a++){var s=n[a],l=i[a];l[0]<4?t.rect(s[0]-l[0]/2,s[1]-l[1]/2,l[0],l[1]):(o.x=s[0]-l[0]/2,o.y=s[1]-l[1]/2,o.width=l[0],o.height=l[1],r.buildPath(t,o,!0))}},findDataIndex:function(t,e){for(var n=this.shape,i=n.points,r=n.sizes,o=i.length-1;o>=0;o--){var a=i[o],s=r[o],l=a[0]-s[0]/2,u=a[1]-s[1]/2;if(t>=l&&e>=u&&t<=l+s[0]&&e<=u+s[1])return o}return-1}}),s=i.prototype;s.updateData=function(t){this.group.removeAll();var e=this._symbolEl,n=t.hostModel;e.setShape({points:t.mapArray(t.getItemLayout),sizes:t.mapArray(function(e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array||(n=[n,n]),n})}),e.symbolProxy=o.createSymbol(t.getVisual("symbol"),0,0,0,0),e.setColor=e.symbolProxy.setColor,e.useStyle(n.getModel("itemStyle.normal").getItemStyle(["color"]));var i=t.getVisual("color");i&&e.setColor(i),e.seriesIndex=n.seriesIndex,e.on("mousemove",function(t){e.dataIndex=null;var n=e.findDataIndex(t.offsetX,t.offsetY);n>0&&(e.dataIndex=n)}),this.group.add(e)},s.updateLayout=function(t){var e=t.getData();this._symbolEl.setShape({points:e.mapArray(e.getItemLayout)})},s.remove=function(){this.group.removeAll()},t.exports=i},function(t,e,n){function i(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var r=n(3),o=n(5),a=r.Line.prototype,s=r.BezierCurve.prototype;t.exports=r.extendShape({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(i(e)?a:s).buildPath(t,e)},pointAt:function(t){return i(this.shape)?a.pointAt.call(this,t):s.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,n=i(e)?[e.x2-e.x1,e.y2-e.y1]:s.tangentAt.call(this,t);return o.normalize(n,n)}})},function(t,e,n){var i=n(1),r=n(2);n(192),n(193),r.registerVisual(i.curry(n(50),"scatter","circle",null)),r.registerLayout(i.curry(n(60),"scatter")),n(32)},function(t,e,n){"use strict";var i=n(28),r=n(18);t.exports=r.extend({type:"series.scatter",dependencies:["grid","polar","geo","singleAxis"],getInitialData:function(t,e){var n=i(t.data,this,e);return n},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{normal:{opacity:.8}}}})},function(t,e,n){var i=n(44),r=n(189);n(2).extendChartView({type:"scatter",init:function(){this._normalSymbolDraw=new i,this._largeSymbolDraw=new r},render:function(t,e,n){var i=t.getData(),r=this._largeSymbolDraw,o=this._normalSymbolDraw,a=this.group,s=t.get("large")&&i.count()>t.get("largeThreshold")?r:o;this._symbolDraw=s,s.updateData(i),a.add(s.group),a.remove(s===r?o.group:r.group)},updateLayout:function(t){this._symbolDraw.updateLayout(t)},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e,!0)},dispose:function(){}})},function(t,e,n){var i=n(2),r=i.extendComponentModel({type:"axisPointer",coordSysAxesInfo:null,defaultOption:{show:"auto",triggerOn:null,zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#aaa",width:1,type:"solid"},shadowStyle:{color:"rgba(150,150,150,0.3)"},label:{show:!0,formatter:null,precision:"auto",margin:3,textStyle:{color:"#fff"},padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,shadowBlur:3,shadowColor:"#aaa"},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}}});t.exports=r},function(t,e,n){var i=n(121),r=n(2).extendComponentView({type:"axisPointer",render:function(t,e,n){var r=e.getComponent("tooltip"),o=t.get("triggerOn")||r&&r.get("triggerOn")||"mousemove|click";i.register("axisPointer",n,function(t,e,n){"none"!==o&&("leave"===t||o.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})})},remove:function(t,e){i.disopse(e.getZr(),"axisPointer"),r.superApply(this._model,"remove",arguments)},dispose:function(t,e){i.unregister("axisPointer",e),r.superApply(this._model,"dispose",arguments)}})},function(t,e,n){function i(t,e,n,i,o,g,v,m,b){i=i||{},n&&null!=n[0]&&null!=n[1]||(n=y({seriesIndex:i.seriesIndex,dataIndex:i.dataIndex},g).point);var w=t.axesInfo,M="leave"===e||p(n),S={},T={},A={list:[],map:{}},I=[],C={showPointer:_(a,T),showTooltip:_(s,A),highlight:_(l,I)};x(t.coordSysMap,function(e,o){var a=e.containPoint(n);x(t.coordSysAxesInfo[o],function(t,e){var o=t.axis;M||!a||d(i,o)||r(t,o.pointToData(n),C,!1,S)})});var P={};return x(w,function(t,e){var n=t.linkGroup;n&&!T[e]&&x(n.axesInfo,function(e,i){var r=T[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,f(e),f(t)))),P[t.key]=o}})}),x(P,function(t,e){r(w[e],t,C,!0,S)}),u(T,w),h(A,n,m,o),c(I,o,v,b),S}function r(t,e,n,i,r){var a=t.axis;if(!a.scale.isBlank()&&a.containData(e)){if(!t.involveSeries)return void n.showPointer(t,e);var s=o(e,t),l=s.payloadBatch,u=s.snapToValue;l[0]&&null==r.seriesIndex&&g.extend(r,l[0]),!i&&t.snap&&a.containData(u)&&null!=u&&(e=u),n.highlight("highlight",l),n.showPointer(t,e,l),n.showTooltip(t,s,u)}}function o(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return x(e.seriesModels,function(e,l){var u,h,c=e.coordDimToDataDim(i);if(e.getAxisTooltipData){var d=e.getAxisTooltipData(c,t,n);h=d.dataIndices,u=d.nestestValue}else{if(h=e.getData().indicesOfNearest(c[0],t,!1,"category"===n.type?.5:null),!h.length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var f=t-u,p=Math.abs(f);p<=a&&((p<a||f>=0&&s<0)&&(a=p,s=f,r=u,o.length=0),x(h,function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})}))}}),{payloadBatch:o,snapToValue:r}}function a(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function s(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=m.makeKey(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get("label.precision"),formatter:s.get("label.formatter")},seriesDataIndices:r.slice()})}}function l(t,e,n){t.push.apply(t,n)}function u(t,e){x(e,function(e,n){var i=e.axisPointerModel.option,r=t[n];r?(!e.useHandle&&(i.status="show"),i.value=r.value,i.seriesDataIndices=(r.payloadBatch||[]).slice()):!e.useHandle&&(i.status="hide")})}function h(t,e,n,i){if(p(e)||!t.list.length)return void i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}function c(t,e,n,i){var r=n.getZr();i="lastHighlights"+(i||"");var o=b(r)[i]||{},a=b(r)[i]={};g.each(t,function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t});var s=[],l=[];g.each(o,function(t,e){!a[e]&&l.push(t)}),g.each(a,function(t,e){!o[e]&&s.push(t)}),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,batch:s})}function d(t,e){var n=1;return x(t,function(t,e){n&=!/^.+(AxisId|AxisName|AxisIndex)$/.test(e)}),!n&&x([["AxisId","id"],["AxisIndex","componentIndex"],["AxisName","name"]],function(i){var r=v.normalizeToArray(t[e.dim+i[0]]);n|=g.indexOf(r,e.model[i[1]])>=0}),!n}function f(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function p(t){return null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}var g=n(1),v=n(6),m=n(45),y=n(120),x=g.each,_=g.curry,b=v.makeGetter();t.exports=i},function(t,e,n){n(125),n(46),n(47),n(203),n(204),n(199),n(200),n(123),n(122)},function(t,e,n){function i(t,e,n){var i=[1/0,-(1/0)];return u(n,function(t){var n=t.getData();n&&u(t.coordDimToDataDim(e),function(t){var e=n.getDataExtent(t);e[0]<i[0]&&(i[0]=e[0]),e[1]>i[1]&&(i[1]=e[1])})}),i[1]<i[0]&&(i=[NaN,NaN]),r(t,i),i}function r(t,e){var n=t.getAxisModel(),i=n.getMin(!0),r="category"===n.get("type"),o=r&&(n.get("data")||[]).length;null!=i&&"dataMin"!==i?e[0]=i:r&&(e[0]=o>0?0:NaN);var a=n.getMax(!0);return null!=a&&"dataMax"!==a?e[1]=a:r&&(e[1]=o>0?o-1:NaN),n.get("scale",!0)||(e[0]>0&&(e[0]=0),e[1]<0&&(e[1]=0)),e}function o(t,e){var n=t.getAxisModel(),i=t._percentWindow,r=t._valueWindow;if(i){var o=s.getPixelPrecision(r,[0,500]),a=e||0===i[0]&&100===i[1];n.setRange(a?null:+r[0].toFixed(o),a?null:+r[1].toFixed(o))}}var a=n(1),s=n(4),l=n(76),u=a.each,h=s.asc,c=function(t,e,n,i){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this.ecModel=i,this._dataZoomModel=n};c.prototype={constructor:c,hostedBy:function(t){return this._dataZoomModel===t},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[],e=this.ecModel;return e.eachSeries(function(n){if(l.isCoordSupported(n.get("coordinateSystem"))){var i=this._dimName,r=e.queryComponents({mainType:i+"Axis",index:n.get(i+"AxisIndex"),id:n.get(i+"AxisId")})[0];this._axisIndex===(r&&r.componentIndex)&&t.push(n)}},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,n=this._dimName,i=this.ecModel,r=this.getAxisModel(),o="x"===n||"y"===n;o?(e="gridIndex",t="x"===n?"y":"x"):(e="polarIndex",t="angle"===n?"radius":"angle");var a;return i.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(r.get(e)||0)&&(a=t)}),a},calculateDataWindow:function(t){var e=this._dataExtent,n=this.getAxisModel(),i=n.axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[t.start,t.end],l=[];return u(["startValue","endValue"],function(e){l.push(null!=t[e]?i.parse(t[e]):null)}),u([0,1],function(t){var n=l[t],u=a[t];"percent"===r[t]?(null==u&&(u=o[t]),n=i.parse(s.linearMap(u,o,e,!0))):u=s.linearMap(n,e,o,!0),l[t]=n,a[t]=u}),{valueWindow:h(l),percentWindow:h(a)}},reset:function(t){if(t===this._dataZoomModel){this._dataExtent=i(this,this._dimName,this.getTargetSeriesModels());var e=this.calculateDataWindow(t.option);this._valueWindow=e.valueWindow,this._percentWindow=e.percentWindow,o(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,o(this,!0))},filterData:function(t){function e(t){return t>=o[0]&&t<=o[1]}if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow,a=this.getOtherAxisModel();t.get("$fromToolbox")&&a&&"category"===a.get("type")&&(r="empty"),u(i,function(t){var i=t.getData();i&&u(t.coordDimToDataDim(n),function(n){"empty"===r?t.setData(i.map(n,function(t){return e(t)?t:NaN})):i.filterSelf(n,e)})})}}},t.exports=c},function(t,e,n){t.exports=n(46).extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1}})},function(t,e,n){function i(t){var e=[0,100];return!(t[0]<=e[1])&&(t[0]=e[1]),!(t[1]<=e[1])&&(t[1]=e[1]),!(t[0]>=e[0])&&(t[0]=e[0]),!(t[1]>=e[0])&&(t[1]=e[0]),t}var r=n(47),o=n(1),a=n(78),s=n(205),l=o.bind,u=r.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,n,i){u.superApply(this,"render",arguments),s.shouldRecordRange(i,t.id)&&(this._range=t.getPercentRange()),o.each(this.getTargetCoordInfo(),function(e,i){var r=o.map(e,function(t){return s.generateCoordId(t.model)});o.each(e,function(e){var o=e.model;s.register(n,{coordId:s.generateCoordId(o),allCoordIds:r,containsPoint:function(t,e,n){return o.coordinateSystem.containPoint([e,n])},dataZoomId:t.id,throttleRate:t.get("throttle",!0),panGetRange:l(this._onPan,this,e,i),zoomGetRange:l(this._onZoom,this,e,i)})},this)},this)},dispose:function(){s.unregister(this.api,this.dataZoomModel.id),u.superApply(this,"dispose",arguments),this._range=null},_onPan:function(t,e,n,i,r,o,s,l,u){if(this.dataZoomModel.option.disabled)return this._range;var c=this._range.slice(),d=t.axisModels[0];if(d){var f=h[e]([o,s],[l,u],d,n,t),p=f.signal*(c[1]-c[0])*f.pixel/f.pixelLength;return a(p,c,[0,100],"rigid"),this._range=c}},_onZoom:function(t,e,n,r,o,a){var s=this.dataZoomModel.option;if(s.disabled||s.zoomLock)return this._range;var l=this._range.slice(),u=t.axisModels[0];if(u){var c=h[e](null,[o,a],u,n,t),d=(c.pixel-c.pixelStart)/c.pixelLength*(l[1]-l[0])+l[0];return r=Math.max(1/r,0),l[0]=(l[0]-d)*r+d,l[1]=(l[1]-d)*r+d,this._range=i(l)}}}),h={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};t.exports=u},function(t,e,n){var i=n(46);t.exports=i.extend({type:"dataZoom.select"})},function(t,e,n){t.exports=n(47).extend({type:"dataZoom.select"})},function(t,e,n){var i=n(46),r=i.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}});t.exports=r},function(t,e,n){function i(t){var e={x:"y",y:"x",radius:"angle",angle:"radius"};return e[t]}var r=n(1),o=n(3),a=n(37),s=n(47),l=o.Rect,u=n(4),h=u.linearMap,c=n(12),d=n(78),f=n(21),p=u.asc,g=r.bind,v=r.each,m=7,y=1,x=30,_="horizontal",b="vertical",w=5,M=["line","bar","candlestick","scatter"],S=s.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,n,i){return S.superApply(this,"render",arguments),a.createOrUpdate(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),this.dataZoomModel.get("show")===!1?void this.group.removeAll():(i&&"dataZoom"===i.type&&i.from===this.uid||this._buildView(),void this._updateView())},remove:function(){S.superApply(this,"remove",arguments),a.clear(this,"_dispatchZoomAction")},dispose:function(){S.superApply(this,"dispose",arguments),a.clear(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new o.Group;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,n=this._findCoordRect(),i={width:e.getWidth(),height:e.getHeight()},o=this._orient===_?{right:i.width-n.x-n.width,top:i.height-x-m,width:n.width,height:x}:{right:m,top:n.y,width:x,height:n.height},a=c.getLayoutParams(t.option);r.each(["right","top","width","height"],function(t){"ph"===a[t]&&(a[t]=o[t])});var s=c.getLayoutRect(a,i,t.padding);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===b&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.barGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==_||r?n===_&&r?{scale:a?[-1,1]:[-1,-1]}:n!==b||r?{scale:a?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:a?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:a?[1,1]:[1,-1]});var s=t.getBoundingRect([o]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size;this._displayables.barGroup.add(new l({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,n=t.series,i=n.getRawData(),a=n.getShadowDim?n.getShadowDim():t.otherDim;if(null!=a){var s=i.getDataExtent(a),l=.3*(s[1]-s[0]);s=[s[0]-l,s[1]+l];var u,c=[0,e[1]],d=[0,e[0]],f=[[e[0],0],[0,0]],p=[],g=d[1]/(i.count()-1),v=0,m=Math.round(i.count()/e[0]);i.each([a],function(t,e){if(m>0&&e%m)return void(v+=g);var n=null==t||isNaN(t)||""===t,i=n?0:h(t,s,c,!0);n&&!u&&e?(f.push([f[f.length-1][0],0]),p.push([p[p.length-1][0],0])):!n&&u&&(f.push([v,0]),p.push([v,0])),f.push([v,i]),p.push([v,i]),v+=g,u=n});var y=this.dataZoomModel;this._displayables.barGroup.add(new o.Polygon({shape:{points:f},style:r.defaults({fill:y.get("dataBackgroundColor")},y.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new o.Polyline({shape:{points:p},style:y.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(e!==!1){var n,o=this.ecModel;return t.eachTargetAxis(function(a,s){var l=t.getAxisProxy(a.name,s).getTargetSeriesModels();r.each(l,function(t){if(!(n||e!==!0&&r.indexOf(M,t.get("type"))<0)){var l,u=o.getComponent(a.axis,s).axis,h=i(a.name),c=t.coordinateSystem;null!=h&&c.getOtherAxis&&(l=c.getOtherAxis(u).inverse),n={thisAxis:u,series:t,thisDim:a.name,otherDim:h,otherAxisInverse:l}}},this)},this),n}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],n=t.handleLabels=[],i=this._displayables.barGroup,r=this._size,a=this.dataZoomModel;i.add(t.filler=new l({draggable:!0,cursor:"move",drift:g(this._onDragMove,this,"all"),onmousemove:function(t){f.stop(t.event)},ondragstart:g(this._showDataInfo,this,!0),ondragend:g(this._onDragEnd,this),onmouseover:g(this._showDataInfo,this,!0),onmouseout:g(this._showDataInfo,this,!1),style:{fill:a.get("fillerColor"),textPosition:"inside"}})),i.add(new l(o.subPixelOptimizeRect({silent:!0,shape:{x:0,y:0,width:r[0],height:r[1]},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:y,fill:"rgba(0,0,0,0)"}})));var s=a.get("handleIcon");v([0,1],function(t){var r=o.makePath(s,{style:{strokeNoScale:!0},rectHover:!0,cursor:"vertical"===this._orient?"ns-resize":"ew-resize",draggable:!0,drift:g(this._onDragMove,this,t),onmousemove:function(t){f.stop(t.event)},ondragend:g(this._onDragEnd,this),onmouseover:g(this._showDataInfo,this,!0),onmouseout:g(this._showDataInfo,this,!1)},{x:-.5,y:0,width:1,height:1},"center"),l=r.getBoundingRect();this._handleHeight=u.parsePercent(a.get("handleSize"),this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,r.setStyle(a.getModel("handleStyle").getItemStyle());var h=a.get("handleColor");null!=h&&(r.style.fill=h),i.add(e[t]=r);var c=a.textStyleModel;this.group.add(n[t]=new o.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",fill:c.getTextColor(),textFont:c.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[h(t[0],[0,100],e,!0),h(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var n=this._handleEnds,i=this._getViewExtent();d(e,n,i,"all"===t||this.dataZoomModel.get("zoomLock")?"rigid":"cross",t),this._range=p([h(n[0],i,[0,100],!0),h(n[1],i,[0,100],!0)])},_updateView:function(t){var e=this._displayables,n=this._handleEnds,i=p(n.slice()),r=this._size;v([0,1],function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scale:[o,o],position:[n[t],r[1]/2-o/2]})},this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]}),this._updateDataInfo(t)},_updateDataInfo:function(t){function e(t){var e=o.getTransform(i.handles[t].parent,this.group),n=o.transformDirection(0===t?"right":"left",e),l=this._handleWidth/2+w,u=o.applyTransform([d[t]+(0===t?-l:l),this._size[1]/2],e);r[t].setStyle({x:u[0],y:u[1],textVerticalAlign:a===_?"middle":n,textAlign:a===_?n:"center",text:s[t]})}var n=this.dataZoomModel,i=this._displayables,r=i.handleLabels,a=this._orient,s=["",""];if(n.get("showDetail")){var l=n.findRepresentativeAxisProxy();if(l){var u=l.getAxisModel().axis,h=this._range,c=t?l.calculateDataWindow({start:h[0],end:h[1]}).valueWindow:l.getDataValueWindow();s=[this._formatLabel(c[0],u),this._formatLabel(c[1],u)]}}var d=p(this._handleEnds.slice());e.call(this,0),e.call(this,1)},_formatLabel:function(t,e){var n=this.dataZoomModel,i=n.get("labelFormatter"),o=n.get("labelPrecision");null!=o&&"auto"!==o||(o=e.getPixelPrecision());var a=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(o,20));return r.isFunction(i)?i(t,a):r.isString(i)?i.replace("{value}",a):a},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,n){this._dragging=!0;var i=this._applyBarTransform([e,n],!0);this._updateInterval(t,i[0]);var r=this.dataZoomModel.get("realtime");this._updateView(!r),r&&r&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),this._dispatchZoomAction()},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_applyBarTransform:function(t,e){var n=this._displayables.barGroup.getLocalTransform();return o.applyTransform(t,n,e)},_findCoordRect:function(){var t;if(v(this.getTargetCoordInfo(),function(e){if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}}),!t){var e=this.api.getWidth(),n=this.api.getHeight();t={x:.2*e,y:.2*n,width:.6*e,height:.6*n}}return t}});t.exports=S},function(t,e,n){function i(t){var e=t.getZr();return e[p]||(e[p]={})}function r(t,e,n){var i=new c(t.getZr());return i.enable(),i.on("pan",f(a,n)),i.on("zoom",f(s,n)),i}function o(t){h.each(t,function(e,n){e.count||(e.controller.dispose(),delete t[n])})}function a(t,e,n,i,r,o,a){l(t,function(s){return s.panGetRange(t.controller,e,n,i,r,o,a)})}function s(t,e,n,i){l(t,function(r){return r.zoomGetRange(t.controller,e,n,i)})}function l(t,e){var n=[];h.each(t.dataZoomInfos,function(t){var i=e(t);i&&n.push({dataZoomId:t.dataZoomId,start:i[0],end:i[1]})}),t.dispatchAction(n)}function u(t,e){t.dispatchAction({type:"dataZoom",batch:e})}var h=n(1),c=n(93),d=n(37),f=h.curry,p="\0_ec_dataZoom_roams",g={register:function(t,e){var n=i(t),a=e.dataZoomId,s=e.coordId;h.each(n,function(t,n){var i=t.dataZoomInfos;i[a]&&h.indexOf(e.allCoordIds,s)<0&&(delete i[a],t.count--)}),o(n);var l=n[s];l||(l=n[s]={coordId:s,dataZoomInfos:{},count:0},l.controller=r(t,e,l),l.dispatchAction=h.curry(u,t)),l.controller.setPointerChecker(e.containsPoint),d.createOrUpdate(l,"dispatchAction",e.throttleRate,"fixRate"),!l.dataZoomInfos[a]&&l.count++,l.dataZoomInfos[a]=e},unregister:function(t,e){var n=i(t);h.each(n,function(t){t.controller.dispose();var n=t.dataZoomInfos;n[e]&&(delete n[e],t.count--)}),o(n)},shouldRecordRange:function(t,e){if(t&&"dataZoom"===t.type&&t.batch)for(var n=0,i=t.batch.length;n<i;n++)if(t.batch[n].dataZoomId===e)return!1;return!0},generateCoordId:function(t){return t.type+"\0_"+t.id}};t.exports=g},function(t,e,n){n(125),n(46),n(47),n(201),n(202),n(123),n(122)},function(t,e,n){function i(t,e,n,i){var r=n.type,o=f[r.charAt(0).toUpperCase()+r.slice(1)],a=new o(n);e.add(a),i[t]=a,a.__ecGraphicId=t}function r(t,e){var n=t&&t.parent;n&&("group"===t.type&&t.traverse(function(t){r(t,e)}),delete e[t.__ecGraphicId],n.remove(t))}function o(t){return t=c.extend({},t),c.each(["id","parentId","$action","hv","bounding"].concat(p.LOCATION_PARAMS),function(e){delete t[e]}),t}function a(t,e){var n;return c.each(e,function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)}),n}function s(t,e){var n=t.exist;if(e.id=t.keyInfo.id,!e.type&&n&&(e.type=n.type),null==e.parentId){var i=e.parentOption;i?e.parentId=i.id:n&&(e.parentId=n.parentId)}e.parentOption=null}function l(t,e,n){var i=c.extend({},n),r=t[e],o=n.$action||"merge";if("merge"===o)if(r){c.merge(r,i,!0),p.mergeLayoutParam(r,i,{ignoreSize:!0}),p.copyLayoutParams(n,r)}else t[e]=i;else"replace"===o?t[e]=i:"remove"===o&&r&&(t[e]=null)}function u(t,e){t&&(t.hv=e.hv=[a(e,["left","right"]),a(e,["top","bottom"])],"group"===t.type&&(null==t.width&&(t.width=e.width=0),null==t.height&&(t.height=e.height=0)))}var h=n(2),c=n(1),d=n(6),f=n(3),p=n(12);h.registerPreprocessor(function(t){var e=t.graphic;c.isArray(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])});var g=h.extendComponentModel({type:"graphic",defaultOption:{elements:[],parentId:null},_elOptionsToUpdate:null,mergeOption:function(t){var e=this.option.elements;this.option.elements=null,g.superApply(this,"mergeOption",arguments),this.option.elements=e},optionUpdated:function(t,e){var n=this.option,i=(e?n:t).elements,r=n.elements=e?[]:n.elements,o=[];this._flatten(i,o);var a=d.mappingToExists(r,o);d.makeIdAndName(a);var h=this._elOptionsToUpdate=[];c.each(a,function(t,e){var n=t.option;n&&(h.push(n),s(t,n),l(r,e,n),u(r[e],n))},this);for(var f=r.length-1;f>=0;f--)null==r[f]?r.splice(f,1):delete r[f].$action},_flatten:function(t,e,n){c.each(t,function(t){if(t){n&&(t.parentOption=n),e.push(t);var i=t.children;"group"===t.type&&i&&this._flatten(i,e,t),delete t.children}},this)},useElOptionsToUpdate:function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t}});h.extendComponentView({type:"graphic",init:function(t,e){this._elMap={},this._lastGraphicModel},render:function(t,e,n){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t,n),this._relocate(t,n)},_updateElements:function(t,e){var n=t.useElOptionsToUpdate();if(n){var a=this._elMap,s=this.group;c.each(n,function(t){var e=t.$action,n=t.id,l=a[n],u=t.parentId,h=null!=u?a[u]:s;t.hv&&t.hv[1]&&"text"===t.type&&(t.style=c.defaults({textBaseline:"middle"},t.style),t.style.textVerticalAlign=null);var d=o(t);e&&"merge"!==e?"replace"===e?(r(l,a),i(n,h,d,a)):"remove"===e&&r(l,a):l?l.attr(d):i(n,h,d,a),a[n]&&(a[n].__ecGraphicWidth=t.width,a[n].__ecGraphicHeight=t.height)})}},_relocate:function(t,e){for(var n=t.option.elements,i=this.group,r=this._elMap,o=n.length-1;o>=0;o--){var a=n[o],s=r[a.id];if(s){var l=s.parent,u=l===i?{width:e.getWidth(),height:e.getHeight()}:{width:l.__ecGraphicWidth||0,height:l.__ecGraphicHeight||0};p.positionElement(s,a,u,null,{hv:a.hv,boundingMode:a.bounding})}}},_clear:function(){var t=this._elMap;c.each(t,function(e){r(e,t)}),this._elMap={}},dispose:function(){this._clear()}})},function(t,e,n){n(32),n(119),n(55)},function(t,e,n){n(210),n(212),n(211);var i=n(2);i.registerProcessor(n(213))},function(t,e,n){"use strict";var i=n(1),r=n(10),o=n(2).extendComponentModel({type:"legend",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,n){this.mergeDefaultAndTheme(t,n),t.selected=t.selected||{}},mergeOption:function(t){o.superCall(this,"mergeOption",t)},optionUpdated:function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,n=0;n<t.length;n++){var i=t[n].get("name");if(this.isSelected(i)){this.select(i),e=!0;break}}!e&&this.select(t[0].get("name"))}},_updateData:function(t){var e=i.map(this.get("data")||[],function(t){return"string"!=typeof t&&"number"!=typeof t||(t={name:t}),new r(t,this,this.ecModel)},this);this._data=e;var n=i.map(t.getSeries(),function(t){return t.name});t.eachSeries(function(t){if(t.legendDataProvider){var e=t.legendDataProvider();n=n.concat(e.mapArray(e.getName))}}),this._availableNames=n},getData:function(){return this._data},select:function(t){var e=this.option.selected,n=this.get("selectedMode");if("single"===n){var r=this._data;i.each(r,function(t){e[t.get("name")]=!1})}e[t]=!0},unSelect:function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},isSelected:function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&i.indexOf(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:"top",align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,tooltip:{show:!1}}});t.exports=o},function(t,e,n){function i(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function r(t,e,n){var i=n.getZr().storage.getDisplayList()[0];i&&i.useHoverLayer||t.get("legendHoverLink")&&n.dispatchAction({type:"highlight",seriesName:t.name,name:e})}function o(t,e,n){var i=n.getZr().storage.getDisplayList()[0];i&&i.useHoverLayer||t.get("legendHoverLink")&&n.dispatchAction({type:"downplay",seriesName:t.name,name:e})}var a=n(1),s=n(24),l=n(3),u=n(129),h=a.curry;t.exports=n(2).extendComponentView({type:"legend",
-init:function(){this._symbolTypeStore={}},render:function(t,e,n){var s=this.group;if(s.removeAll(),t.get("show")){var c=t.get("selectedMode"),d=t.get("align");"auto"===d&&(d="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left");var f={};a.each(t.getData(),function(a){var u=a.get("name");if(""===u||"\n"===u)return void s.add(new l.Group({newline:!0}));var p=e.getSeriesByName(u)[0];if(!f[u])if(p){var g=p.getData(),v=g.getVisual("color");"function"==typeof v&&(v=v(p.getDataParams(0)));var m=g.getVisual("legendSymbol")||"roundRect",y=g.getVisual("symbol"),x=this._createItem(u,a,t,m,y,d,v,c);x.on("click",h(i,u,n)).on("mouseover",h(r,p,null,n)).on("mouseout",h(o,p,null,n)),f[u]=!0}else e.eachRawSeries(function(e){if(!f[u]&&e.legendDataProvider){var s=e.legendDataProvider(),l=s.indexOfName(u);if(l<0)return;var p=s.getItemVisual(l,"color"),g="roundRect",v=this._createItem(u,a,t,g,null,d,p,c);v.on("click",h(i,u,n)).on("mouseover",h(r,e,u,n)).on("mouseout",h(o,e,u,n)),f[u]=!0}},this)},this),u.layout(s,t,n),u.addBackground(s,t)}},_createItem:function(t,e,n,i,r,o,u,h){var c=n.get("itemWidth"),d=n.get("itemHeight"),f=n.get("inactiveColor"),p=n.isSelected(t),g=new l.Group,v=e.getModel("textStyle"),m=e.get("icon"),y=e.getModel("tooltip"),x=y.parentModel;if(i=m||i,g.add(s.createSymbol(i,0,0,c,d,p?u:f)),!m&&r&&(r!==i||"none"==r)){var _=.8*d;"none"===r&&(r="circle"),g.add(s.createSymbol(r,(c-_)/2,(d-_)/2,_,_,p?u:f))}var b="left"===o?c+5:-5,w=o,M=n.get("formatter"),S=t;"string"==typeof M&&M?S=M.replace("{name}",null!=t?t:""):"function"==typeof M&&(S=M(t));var T=new l.Text({style:{text:S,x:b,y:d/2,fill:p?v.getTextColor():f,textFont:v.getFont(),textAlign:w,textVerticalAlign:"middle"}});g.add(T);var A=new l.Rect({shape:g.getBoundingRect(),invisible:!0,tooltip:y.get("show")?a.extend({content:t,formatter:x.get("formatter",!0)||function(){return t},formatterParams:{componentType:"legend",legendIndex:n.componentIndex,name:t,$vars:["name"]}},y.option):null});return g.add(A),g.eachChild(function(t){t.silent=!0}),A.silent=!h,this.group.add(g),l.setHoverStyle(g),g}})},function(t,e,n){function i(t,e,n){var i,r={},a="toggleSelected"===t;return n.eachComponent("legend",function(n){a&&null!=i?n[i?"select":"unSelect"](e.name):(n[t](e.name),i=n.isSelected(e.name));var s=n.getData();o.each(s,function(t){var e=t.get("name");if("\n"!==e&&""!==e){var i=n.isSelected(e);e in r?r[e]=r[e]&&i:r[e]=i}})}),{name:e.name,selected:r}}var r=n(2),o=n(1);r.registerAction("legendToggleSelect","legendselectchanged",o.curry(i,"toggleSelected")),r.registerAction("legendSelect","legendselected",o.curry(i,"select")),r.registerAction("legendUnSelect","legendunselected",o.curry(i,"unSelect"))},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var n=0;n<e.length;n++)if(!e[n].isSelected(t.name))return!1;return!0})}},function(t,e,n){n(217),n(218),n(2).registerPreprocessor(function(t){t.markArea=t.markArea||{}})},function(t,e,n){n(219),n(220),n(2).registerPreprocessor(function(t){t.markLine=t.markLine||{}})},function(t,e,n){n(221),n(222),n(2).registerPreprocessor(function(t){t.markPoint=t.markPoint||{}})},function(t,e,n){t.exports=n(79).extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{normal:{show:!0,position:"top"},emphasis:{show:!0,position:"top"}},itemStyle:{normal:{borderWidth:0}}}})},function(t,e,n){function i(t){return!isNaN(t)&&!isFinite(t)}function r(t,e,n,r){var o=1-t;return i(e[o])&&i(n[o])}function o(t,e){var n=e.coord[0],i=e.coord[1];return!("cartesian2d"!==t.type||!n||!i||!r(1,n,i,t)&&!r(0,n,i,t))||(f.dataFilter(t,{coord:n,x:e.x0,y:e.y0})||f.dataFilter(t,{coord:i,x:e.x1,y:e.y1}))}function a(t,e,n,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),u=h.parsePercent(l.get(n[0]),o.getWidth()),c=h.parsePercent(l.get(n[1]),o.getHeight());if(isNaN(u)||isNaN(c)){if(r.getMarkerPosition)a=r.getMarkerPosition(t.getValues(n,e));else{var d=t.get(n[0],e),f=t.get(n[1],e);a=s.dataToPoint([d,f],!0)}if("cartesian2d"===s.type){var p=s.getAxis("x"),g=s.getAxis("y"),d=t.get(n[0],e),f=t.get(n[1],e);i(d)?a[0]=p.toGlobalCoord(p.getExtent()["x0"===n[0]?0:1]):i(f)&&(a[1]=g.toGlobalCoord(g.getExtent()["y0"===n[1]?0:1]))}isNaN(u)||(a[0]=u),isNaN(c)||(a[1]=c)}else a=[u,c];return a}function s(t,e,n){var i,r,a=["x0","y0","x1","y1"];t?(i=l.map(t&&t.dimensions,function(t){var n=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return n.name=t,n}),r=new u(l.map(a,function(t,e){return{name:t,type:i[e%2].type}}),n)):(i=[{name:"value",type:"float"}],r=new u(i,n));var s=l.map(n.get("data"),l.curry(p,e,t,n));t&&(s=l.filter(s,l.curry(o,t)));var h=t?function(t,e,n,i){return t.coord[Math.floor(i/2)][i%2]}:function(t){return t.value};return r.initData(s,null,h),r.hasItemOption=!0,r}var l=n(1),u=n(14),h=n(4),c=n(3),d=n(22),f=n(81),p=function(t,e,n,i){var r=f.dataTransform(t,i[0]),o=f.dataTransform(t,i[1]),a=l.retrieve,s=r.coord,u=o.coord;s[0]=a(s[0],-(1/0)),s[1]=a(s[1],-(1/0)),u[0]=a(u[0],1/0),u[1]=a(u[1],1/0);var h=l.mergeAll([{},r,o]);return h.coord=[r.coord,o.coord],h.x0=r.x,h.y0=r.y,h.x1=o.x,h.y1=o.y,h},g=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];n(80).extend({type:"markArea",updateLayout:function(t,e,n){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var i=e.getData();i.each(function(e){var r=l.map(g,function(r){return a(i,e,r,t,n)});i.setItemLayout(e,r);var o=i.getItemGraphicEl(e);o.setShape("points",r)})}},this)},renderSeries:function(t,e,n,i){var r=t.coordinateSystem,o=t.name,u=t.getData(),h=this.markerGroupMap,f=h[o];f||(f=h[o]={group:new c.Group}),this.group.add(f.group),f.__keep=!0;var p=s(r,t,e);e.setData(p),p.each(function(e){p.setItemLayout(e,l.map(g,function(n){return a(p,e,n,t,i)})),p.setItemVisual(e,{color:u.getVisual("color")})}),p.diff(f.__data).add(function(t){var e=new c.Polygon({shape:{points:p.getItemLayout(t)}});p.setItemGraphicEl(t,e),f.group.add(e)}).update(function(t,n){var i=f.__data.getItemGraphicEl(n);c.updateProps(i,{shape:{points:p.getItemLayout(t)}},e,t),f.group.add(i),p.setItemGraphicEl(t,i)}).remove(function(t){var e=f.__data.getItemGraphicEl(t);f.group.remove(e)}).execute(),p.eachItemGraphicEl(function(t,n){var i=p.getItemModel(n),r=i.getModel("label.normal"),o=i.getModel("label.emphasis"),a=p.getItemVisual(n,"color");t.useStyle(l.defaults(i.getModel("itemStyle.normal").getItemStyle(),{fill:d.modifyAlpha(a,.4),stroke:a})),t.hoverStyle=i.getModel("itemStyle.normal").getItemStyle();var s=p.getName(n)||"",u=a||t.style.fill;r.getShallow("show")?(c.setText(t.style,r,u),t.style.text=l.retrieve(e.getFormattedLabel(n,"normal"),s)):t.style.text="",o.getShallow("show")?(c.setText(t.hoverStyle,o,u),t.hoverStyle.text=l.retrieve(e.getFormattedLabel(n,"emphasis"),s)):t.hoverStyle.text="",c.setHoverStyle(t,{}),t.dataModel=e}),f.__data=p,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,n){t.exports=n(79).extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"end"},emphasis:{show:!0}},lineStyle:{normal:{type:"dashed"},emphasis:{width:3}},animationEasing:"linear"}})},function(t,e,n){function i(t){return!isNaN(t)&&!isFinite(t)}function r(t,e,n,r){var o=1-t,a=r.dimensions[t];return i(e[o])&&i(n[o])&&e[t]===n[t]&&r.getAxis(a).containData(e[t])}function o(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(r(1,n,i,t)||r(0,n,i,t)))return!0}return c.dataFilter(t,e[0])&&c.dataFilter(t,e[1])}function a(t,e,n,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),u=h.parsePercent(l.get("x"),o.getWidth()),c=h.parsePercent(l.get("y"),o.getHeight());if(isNaN(u)||isNaN(c)){if(r.getMarkerPosition)a=r.getMarkerPosition(t.getValues(t.dimensions,e));else{var d=s.dimensions,f=t.get(d[0],e),p=t.get(d[1],e);a=s.dataToPoint([f,p])}if("cartesian2d"===s.type){var g=s.getAxis("x"),v=s.getAxis("y"),d=s.dimensions;i(t.get(d[0],e))?a[0]=g.toGlobalCoord(g.getExtent()[n?0:1]):i(t.get(d[1],e))&&(a[1]=v.toGlobalCoord(v.getExtent()[n?0:1]))}isNaN(u)||(a[0]=u),isNaN(c)||(a[1]=c)}else a=[u,c];t.setItemLayout(e,a)}function s(t,e,n){var i;i=t?l.map(t&&t.dimensions,function(t){var n=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return n.name=t,n}):[{name:"value",type:"float"}];var r=new u(i,n),a=new u(i,n),s=new u([],n),h=l.map(n.get("data"),l.curry(f,e,t,n));t&&(h=l.filter(h,l.curry(o,t)));var d=t?c.dimValueGetter:function(t){return t.value};return r.initData(l.map(h,function(t){return t[0]}),null,d),a.initData(l.map(h,function(t){return t[1]}),null,d),s.initData(l.map(h,function(t){return t[2]})),s.hasItemOption=!0,{from:r,to:a,line:s}}var l=n(1),u=n(14),h=n(4),c=n(81),d=n(106),f=function(t,e,n,i){var r=t.getData(),o=i.type;if(!l.isArray(i)&&("min"===o||"max"===o||"average"===o||null!=i.xAxis||null!=i.yAxis)){var a,s,u;if(null!=i.yAxis||null!=i.xAxis)s=null!=i.yAxis?"y":"x",a=e.getAxis(s),u=l.retrieve(i.yAxis,i.xAxis);else{var h=c.getAxisInfo(i,r,e,t);s=h.valueDataDim,a=h.valueAxis,u=c.numCalculate(r,s,o)}var d="x"===s?0:1,f=1-d,p=l.clone(i),g={};p.type=null,p.coord=[],g.coord=[],p.coord[f]=-(1/0),g.coord[f]=1/0;var v=n.get("precision");v>=0&&"number"==typeof u&&(u=+u.toFixed(v)),p.coord[d]=g.coord[d]=u,i=[p,g,{type:o,valueIndex:i.valueIndex,value:u}]}return i=[c.dataTransform(t,i[0]),c.dataTransform(t,i[1]),l.extend({},i[2])],i[2].type=i[2].type||"",l.merge(i[2],i[0]),l.merge(i[2],i[1]),i};n(80).extend({type:"markLine",updateLayout:function(t,e,n){e.eachSeries(function(t){var e=t.markLineModel;if(e){var i=e.getData(),r=e.__from,o=e.__to;r.each(function(e){a(r,e,!0,t,n),a(o,e,!1,t,n)}),i.each(function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])}),this.markerGroupMap[t.name].updateLayout()}},this)},renderSeries:function(t,e,n,i){function r(e,n,r){var o=e.getItemModel(n);a(e,n,r,t,i),e.setItemVisual(n,{symbolSize:o.get("symbolSize")||x[r?0:1],symbol:o.get("symbol",!0)||y[r?0:1],color:o.get("itemStyle.normal.color")||h.getVisual("color")})}var o=t.coordinateSystem,u=t.name,h=t.getData(),c=this.markerGroupMap,f=c[u];f||(f=c[u]=new d),this.group.add(f.group);var p=s(o,t,e),g=p.from,v=p.to,m=p.line;e.__from=g,e.__to=v,e.setData(m);var y=e.get("symbol"),x=e.get("symbolSize");l.isArray(y)||(y=[y,y]),"number"==typeof x&&(x=[x,x]),p.from.each(function(t){r(g,t,!0),r(v,t,!1)}),m.each(function(t){var e=m.getItemModel(t).get("lineStyle.normal.color");m.setItemVisual(t,{color:e||g.getItemVisual(t,"color")}),m.setItemLayout(t,[g.getItemLayout(t),v.getItemLayout(t)]),m.setItemVisual(t,{fromSymbolSize:g.getItemVisual(t,"symbolSize"),fromSymbol:g.getItemVisual(t,"symbol"),toSymbolSize:v.getItemVisual(t,"symbolSize"),toSymbol:v.getItemVisual(t,"symbol")})}),f.updateData(m),p.line.eachItemGraphicEl(function(t,n){t.traverse(function(t){t.dataModel=e})}),f.__keep=!0,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,n){t.exports=n(79).extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"inside"},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:2}}}})},function(t,e,n){function i(t,e,n){var i=e.coordinateSystem;t.each(function(r){var o,a=t.getItemModel(r),l=s.parsePercent(a.get("x"),n.getWidth()),u=s.parsePercent(a.get("y"),n.getHeight());if(isNaN(l)||isNaN(u)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var h=t.get(i.dimensions[0],r),c=t.get(i.dimensions[1],r);o=i.dataToPoint([h,c])}}else o=[l,u];isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u),t.setItemLayout(r,o)})}function r(t,e,n){var i;i=t?a.map(t&&t.dimensions,function(t){var n=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return n.name=t,n}):[{name:"value",type:"float"}];var r=new l(i,n),o=a.map(n.get("data"),a.curry(u.dataTransform,e));return t&&(o=a.filter(o,a.curry(u.dataFilter,t))),r.initData(o,null,t?u.dimValueGetter:function(t){return t.value}),r}var o=n(44),a=n(1),s=n(4),l=n(14),u=n(81);n(80).extend({type:"markPoint",updateLayout:function(t,e,n){e.eachSeries(function(t){var e=t.markPointModel;e&&(i(e.getData(),t,n),this.markerGroupMap[t.name].updateLayout(e))},this)},renderSeries:function(t,e,n,a){var s=t.coordinateSystem,l=t.name,u=t.getData(),h=this.markerGroupMap,c=h[l];c||(c=h[l]=new o);var d=r(s,t,e);e.setData(d),i(e.getData(),t,a),d.each(function(t){var n=d.getItemModel(t),i=n.getShallow("symbolSize");"function"==typeof i&&(i=i(e.getRawValue(t),e.getDataParams(t))),d.setItemVisual(t,{symbolSize:i,color:n.get("itemStyle.normal.color")||u.getVisual("color"),symbol:n.getShallow("symbol")})}),c.updateData(d),this.group.add(c.group),d.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),c.__keep=!0,c.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,n){"use strict";var i=n(2),r=n(3),o=n(12);i.extendComponentModel({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),i.extendComponentView({type:"title",render:function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,a=t.getModel("textStyle"),s=t.getModel("subtextStyle"),l=t.get("textAlign"),u=t.get("textBaseline"),h=new r.Text({style:{text:t.get("text"),textFont:a.getFont(),fill:a.getTextColor()},z2:10}),c=h.getBoundingRect(),d=t.get("subtext"),f=new r.Text({style:{text:d,textFont:s.getFont(),fill:s.getTextColor(),y:c.height+t.get("itemGap"),textBaseline:"top"},z2:10}),p=t.get("link"),g=t.get("sublink");h.silent=!p,f.silent=!g,p&&h.on("click",function(){window.open(p,"_"+t.get("target"))}),g&&f.on("click",function(){window.open(g,"_"+t.get("subtarget"))}),i.add(h),d&&i.add(f);var v=i.getBoundingRect(),m=t.getBoxLayoutParams();m.width=v.width,m.height=v.height;var y=o.getLayoutRect(m,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));l||(l=t.get("left")||t.get("right"),"middle"===l&&(l="center"),"right"===l?y.x+=y.width:"center"===l&&(y.x+=y.width/2)),u||(u=t.get("top")||t.get("bottom"),"center"===u&&(u="middle"),"bottom"===u?y.y+=y.height:"middle"===u&&(y.y+=y.height/2),u=u||"top"),i.attr("position",[y.x,y.y]);var x={textAlign:l,textVerticalAlign:u};h.setStyle(x),f.setStyle(x),v=i.getBoundingRect();var _=y.margin,b=t.getItemStyle(["color","opacity"]);b.fill=t.get("backgroundColor");var w=new r.Rect({shape:{x:v.x-_[3],y:v.y-_[0],width:v.width+_[1]+_[3],height:v.height+_[0]+_[2]},style:b,silent:!0});r.subPixelOptimizeRect(w),i.add(w)}}})},function(t,e,n){n(225),n(226),n(231),n(229),n(227),n(228),n(230)},function(t,e,n){var i=n(29),r=n(1),o=n(2).extendComponentModel({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(t){o.superApply(this,"mergeDefaultAndTheme",arguments),r.each(this.option.feature,function(t,e){var n=i.get(e);n&&r.merge(t,n.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{normal:{borderColor:"#666",color:"none"},emphasis:{borderColor:"#3E98C5"}}}});t.exports=o},function(t,e,n){(function(e){function i(t){return 0===t.indexOf("my")}var r=n(29),o=n(1),a=n(3),s=n(10),l=n(48),u=n(129),h=n(16);t.exports=n(2).extendComponentView({type:"toolbox",render:function(t,e,n,c){function d(o,a){var l,u=y[o],h=y[a],d=v[u],p=new s(d,t,t.ecModel);if(u&&!h){if(i(u))l={model:p,onclick:p.option.onclick,featureName:u};else{var g=r.get(u);if(!g)return;l=new g(p,e,n)}m[u]=l}else{if(l=m[h],!l)return;l.model=p,l.ecModel=e,l.api=n}return!u&&h?void(l.dispose&&l.dispose(e,n)):!p.get("show")||l.unusable?void(l.remove&&l.remove(e,n)):(f(p,l,u),p.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&i[t].trigger(e)},void(l.render&&l.render(p,e,n,c)))}function f(i,r,s){var l=i.getModel("iconStyle"),u=r.getIcons?r.getIcons():i.get("icon"),h=i.get("title")||{};if("string"==typeof u){var c=u,d=h;u={},h={},u[s]=c,h[s]=d}var f=i.iconPaths={};o.each(u,function(s,u){var c=l.getModel("normal").getItemStyle(),d=l.getModel("emphasis").getItemStyle(),v={x:-g/2,y:-g/2,width:g,height:g},m=0===s.indexOf("image://")?(v.image=s.slice(8),new a.Image({style:v})):a.makePath(s.replace("path://",""),{style:c,hoverStyle:d,rectHover:!0},v,"center");a.setHoverStyle(m),t.get("showTitle")&&(m.__title=h[u],m.on("mouseover",function(){var t=l.getModel("emphasis").getItemStyle();m.setStyle({text:h[u],textPosition:t.textPosition||"bottom",textFill:t.fill||t.stroke||"#000",textAlign:t.textAlign||"center"})}).on("mouseout",function(){m.setStyle({textFill:null})})),m.trigger(i.get("iconStatus."+u)||"normal"),p.add(m),m.on("click",o.bind(r.onclick,r,e,n,u)),f[u]=m})}var p=this.group;if(p.removeAll(),t.get("show")){var g=+t.get("itemSize"),v=t.get("feature")||{},m=this._features||(this._features={}),y=[];o.each(v,function(t,e){y.push(e)}),new l(this._featureNames||[],y).add(d).update(d).remove(o.curry(d,null)).execute(),this._featureNames=y,u.layout(p,t,n),u.addBackground(p,t),p.eachChild(function(t){var e=t.__title,i=t.hoverStyle;if(i&&e){var r=h.getBoundingRect(e,i.font),o=t.position[0]+p.position[0],a=t.position[1]+p.position[1]+g,s=!1;a+r.height>n.getHeight()&&(i.textPosition="top",s=!0);var l=s?-5-r.height:g+8;o+r.width/2>n.getWidth()?(i.textPosition=["100%",l],i.textAlign="right"):o-r.width/2<0&&(i.textPosition=[0,l],i.textAlign="left")}})}},updateView:function(t,e,n,i){o.each(this._features,function(t){t.updateView&&t.updateView(t.model,e,n,i)})},updateLayout:function(t,e,n,i){o.each(this._features,function(t){t.updateLayout&&t.updateLayout(t.model,e,n,i)})},remove:function(t,e){o.each(this._features,function(n){n.remove&&n.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){o.each(this._features,function(n){n.dispose&&n.dispose(t,e)})}})}).call(e,n(188))},function(t,e,n){function i(t){var e={},n=[],i=[];return t.eachRawSeries(function(t){var r=t.coordinateSystem;if(!r||"cartesian2d"!==r.type&&"polar"!==r.type)n.push(t);else{var o=r.getBaseAxis();if("category"===o.type){var a=o.dim+"_"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},i.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else n.push(t)}}),{seriesGroupByCategoryAxis:e,other:n,meta:i}}function r(t){var e=[];return p.each(t,function(t,n){var i=t.categoryAxis,r=t.valueAxis,o=r.dim,a=[" "].concat(p.map(t.series,function(t){return t.name})),s=[i.model.getCategories()];p.each(t.series,function(t){s.push(t.getRawData().mapArray(o,function(t){return t}))});for(var l=[a.join(m)],u=0;u<s[0].length;u++){for(var h=[],c=0;c<s.length;c++)h.push(s[c][u]);l.push(h.join(m))}e.push(l.join("\n"))}),e.join("\n\n"+v+"\n\n")}function o(t){return p.map(t,function(t){var e=t.getRawData(),n=[t.name],i=[];return e.each(e.dimensions,function(){for(var t=arguments.length,r=arguments[t-1],o=e.getName(r),a=0;a<t-1;a++)i[a]=arguments[a];n.push((o?o+m:"")+i.join(m))}),n.join("\n")}).join("\n\n"+v+"\n\n")}function a(t){var e=i(t);return{value:p.filter([r(e.seriesGroupByCategoryAxis),o(e.other)],function(t){return t.replace(/[\n\t\s]/g,"")}).join("\n\n"+v+"\n\n"),meta:e.meta}}function s(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function l(t){var e=t.slice(0,t.indexOf("\n"));if(e.indexOf(m)>=0)return!0}function u(t){for(var e=t.split(/\n+/g),n=s(e.shift()).split(y),i=[],r=p.map(n,function(t){return{name:t,data:[]}}),o=0;o<e.length;o++){var a=s(e[o]).split(y);i.push(a.shift());for(var l=0;l<a.length;l++)r[l]&&(r[l].data[o]=a[l])}return{series:r,categories:i}}function h(t){for(var e=t.split(/\n+/g),n=s(e.shift()),i=[],r=0;r<e.length;r++){var o,a=s(e[r]).split(y),l="",u=!1;isNaN(a[0])?(u=!0,l=a[0],a=a.slice(1),i[r]={name:l,value:[]},o=i[r].value):o=i[r]=[];for(var h=0;h<a.length;h++)o.push(+a[h]);1===o.length&&(u?i[r].value=o[0]:i[r]=o[0])}return{name:n,data:i}}function c(t,e){var n=t.split(new RegExp("\n*"+v+"\n*","g")),i={series:[]};return p.each(n,function(t,n){if(l(t)){var r=u(t),o=e[n],a=o.axisDim+"Axis";o&&(i[a]=i[a]||[],i[a][o.axisIndex]={data:r.categories},i.series=i.series.concat(r.series))}else{var r=h(t);i.series.push(r)}}),i}function d(t){this._dom=null,this.model=t}function f(t,e){return p.map(t,function(t,n){var i=e&&e[n];return p.isObject(i)&&!p.isArray(i)?(p.isObject(t)&&!p.isArray(t)&&(t=t.value),p.defaults({value:t},i)):t})}var p=n(1),g=n(21),v=new Array(60).join("-"),m="\t",y=new RegExp("["+m+"]+","g");d.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:"数据视图",lang:["数据视图","关闭","刷新"],backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"},d.prototype.onclick=function(t,e){function n(){i.removeChild(o),S._dom=null}var i=e.getDom(),r=this.model;this._dom&&i.removeChild(this._dom);var o=document.createElement("div");o.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",o.style.backgroundColor=r.get("backgroundColor")||"#fff";var s=document.createElement("h4"),l=r.get("lang")||[];s.innerHTML=l[0]||r.get("title"),s.style.cssText="margin: 10px 20px;",s.style.color=r.get("textColor");var u=document.createElement("div"),h=document.createElement("textarea");u.style.cssText="display:block;width:100%;overflow:auto;";var d=r.get("optionToContent"),f=r.get("contentToOption"),v=a(t);if("function"==typeof d){var y=d(e.getOption());"string"==typeof y?u.innerHTML=y:p.isDom(y)&&u.appendChild(y)}else u.appendChild(h),h.readOnly=r.get("readOnly"),h.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",h.style.color=r.get("textColor"),h.style.borderColor=r.get("textareaBorderColor"),h.style.backgroundColor=r.get("textareaColor"),h.value=v.value;var x=v.meta,_=document.createElement("div");_.style.cssText="position:absolute;bottom:0;left:0;right:0;";var b="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",w=document.createElement("div"),M=document.createElement("div");b+=";background-color:"+r.get("buttonColor"),b+=";color:"+r.get("buttonTextColor");var S=this;g.addEventListener(w,"click",n),g.addEventListener(M,"click",function(){var t;try{t="function"==typeof f?f(u,e.getOption()):c(h.value,x)}catch(i){throw n(),new Error("Data view format error "+i)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),n()}),w.innerHTML=l[1],M.innerHTML=l[2],M.style.cssText=b,w.style.cssText=b,!r.get("readOnly")&&_.appendChild(M),_.appendChild(w),g.addEventListener(h,"keydown",function(t){if(9===(t.keyCode||t.which)){var e=this.value,n=this.selectionStart,i=this.selectionEnd;this.value=e.substring(0,n)+m+e.substring(i),this.selectionStart=this.selectionEnd=n+1,g.stop(t)}}),o.appendChild(s),o.appendChild(u),o.appendChild(_),u.style.height=i.clientHeight-80+"px",i.appendChild(o),this._dom=o},d.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},d.prototype.dispose=function(t,e){this.remove(t,e)},n(29).register("dataView",d),n(2).registerAction({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(t,e){var n=[];p.each(t.newOption.series,function(t){var i=e.getSeriesByName(t.name)[0];if(i){var r=i.get("data");n.push({name:t.name,data:f(t.data,r)})}else n.push(p.extend({type:"scatter"},t))}),e.mergeOption(p.defaults({series:n},t.newOption))}),t.exports=d},function(t,e,n){"use strict";function i(t,e,n){(this._brushController=new l(n.getZr())).on("brush",s.bind(this._onBrush,this)).mount(),this._isZoomActive}function r(t){var e={};return s.each(["xAxisIndex","yAxisIndex"],function(n){e[n]=t[n],null==e[n]&&(e[n]="all"),(e[n]===!1||"none"===e[n])&&(e[n]=[])}),e}function o(t,e){t.setIconStatus("back",h.count(e)>1?"emphasis":"normal")}function a(t,e,n,i,o){var a=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(a="dataZoomSelect"===i.key&&i.dataZoomSelectActive),n._isZoomActive=a,t.setIconStatus("zoom",a?"emphasis":"normal");var s=new u(r(t.option),e,{include:["grid"]});n._brushController.setPanels(s.makePanelOpts(o,function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"})).enableBrush(!!a&&{brushType:"auto",brushStyle:{lineWidth:0,fill:"rgba(0,0,0,0.2)"}})}var s=n(1),l=n(126),u=n(184),h=n(124),c=s.each;n(206);var d="\0_ec_\0toolbox-dataZoom_";i.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:{zoom:"区域缩放",back:"区域缩放还原"}};var f=i.prototype;f.render=function(t,e,n,i){this.model=t,this.ecModel=e,this.api=n,a(t,e,this,i,n),o(t,e)},f.onclick=function(t,e,n){p[n].call(this)},f.remove=function(t,e){this._brushController.unmount()},f.dispose=function(t,e){this._brushController.dispose()};var p={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(h.pop(this.ecModel))}};f._onBrush=function(t,e){function n(t,e,n){var r=i(t,e.getAxis(t).model,a);r&&(o[r.id]={dataZoomId:r.id,startValue:n[0],endValue:n[1]})}function i(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},function(n){var r=n.getAxisModel(t,e.componentIndex);r&&(i=n)}),i}if(e.isEnd&&t.length){var o={},a=this.ecModel;this._brushController.updateCovers([]);var s=new u(r(this.model.option),a,{include:["grid"]});s.matchOutputRanges(t,a,function(t,e,i){if("cartesian2d"===i.type){var r=t.brushType;"rect"===r?(n("x",i,e[0]),n("y",i,e[1])):n({lineX:"x",lineY:"y"}[r],i,e)}}),h.push(a,o),this._dispatchZoomAction(o)}},f._dispatchZoomAction=function(t){var e=[];c(t,function(t,n){e.push(s.clone(t))}),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},n(29).register("dataZoom",i),n(2).registerPreprocessor(function(t){function e(t,e){if(e){var r=t+"Index",o=e[r];null==o||"all"==o||s.isArray(o)||(o=o===!1||"none"===o?[]:[o]),n(t,function(e,n){if(null==o||"all"==o||s.indexOf(o,n)!==-1){var a={type:"select",$fromToolbox:!0,id:d+t+n};a[r]=n,i.push(a)}})}}function n(e,n){var i=t[e];s.isArray(i)||(i=i?[i]:[]),c(i,n)}if(t){var i=t.dataZoom||(t.dataZoom=[]);s.isArray(i)||(t.dataZoom=i=[i]);var r=t.toolbox;if(r&&(s.isArray(r)&&(r=r[0]),r&&r.feature)){var o=r.feature.dataZoom;e("xAxis",o),e("yAxis",o)}}}),t.exports=i},function(t,e,n){"use strict";function i(t){this.model=t}var r=n(1);i.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"},option:{},seriesIndex:{}};var o=i.prototype;o.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return r.each(t.get("type"),function(t){e[t]&&(n[t]=e[t])}),n};var a={line:function(t,e,n,i){if("bar"===t)return r.merge({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get("option.line")||{},!0)},bar:function(t,e,n,i){if("line"===t)return r.merge({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get("option.bar")||{},!0)},stack:function(t,e,n,i){if("line"===t||"bar"===t)return r.merge({id:e,stack:"__ec_magicType_stack__"},i.get("option.stack")||{},!0)},tiled:function(t,e,n,i){if("line"===t||"bar"===t)return r.merge({id:e,stack:""},i.get("option.tiled")||{},!0)}},s=[["line","bar"],["stack","tiled"]];o.onclick=function(t,e,n){var i=this.model,o=i.get("seriesIndex."+n);if(a[n]){var l={series:[]},u=function(e){var o=e.subType,s=e.id,u=a[n](o,s,e,i);u&&(r.defaults(u,e.option),l.series.push(u));var h=e.coordinateSystem;if(h&&"cartesian2d"===h.type&&("line"===n||"bar"===n)){var c=h.getAxesByScale("ordinal")[0];if(c){var d=c.dim,f=d+"Axis",p=t.queryComponents({mainType:f,index:e.get(name+"Index"),id:e.get(name+"Id")})[0],g=p.componentIndex;l[f]=l[f]||[];for(var v=0;v<=g;v++)l[f][g]=l[f][g]||{};l[f][g].boundaryGap="bar"===n}}};r.each(s,function(t){r.indexOf(t,n)>=0&&r.each(t,function(t){i.setIconStatus(t,"normal")})}),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==o?null:{seriesIndex:o}},u),e.dispatchAction({type:"changeMagicType",currentType:n,newOption:l})}};var l=n(2);l.registerAction({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),n(29).register("magicType",i),t.exports=i},function(t,e,n){"use strict";function i(t){this.model=t}var r=n(124);i.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:"还原"};var o=i.prototype;o.onclick=function(t,e,n){r.clear(t),e.dispatchAction({type:"restore",from:this.uid})},n(29).register("restore",i),n(2).registerAction({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")}),t.exports=i},function(t,e,n){function i(t){this.model=t}var r=n(9);i.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:"保存为图片",type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:["右键另存为图片"]},i.prototype.unusable=!r.canvasSupported;var o=i.prototype;o.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",o=document.createElement("a"),a=n.get("type",!0)||"png";o.download=i+"."+a,o.target="_blank";var s=e.getConnectedDataURL({type:a,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")});if(o.href=s,"function"!=typeof MouseEvent||r.browser.ie||r.browser.edge){var l=n.get("lang"),u='<body style="margin:0;"><img src="'+s+'" style="max-width:100%;" title="'+(l&&l[0]||"")+'" /></body>',h=window.open();h.document.write(u)}else{var c=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});o.dispatchEvent(c)}},n(29).register("saveAsImage",i),t.exports=i},function(t,e,n){n(55),n(234),n(235),n(2).registerAction({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),n(2).registerAction({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){})},function(t,e,n){function i(t){var e="cubic-bezier(0.23, 1, 0.32, 1)",n="left "+t+"s "+e+",top "+t+"s "+e;return s.map(p,function(t){return t+"transition:"+n}).join(";")}function r(t){var e=[],n=t.get("fontSize"),i=t.getTextColor();return i&&e.push("color:"+i),e.push("font:"+t.getFont()),n&&e.push("line-height:"+Math.round(3*n/2)+"px"),c(["decoration","align"],function(n){var i=t.get(n);i&&e.push("text-"+n+":"+i)}),e.join(";")}function o(t){var e=[],n=t.get("transitionDuration"),o=t.get("backgroundColor"),a=t.getModel("textStyle"),s=t.get("padding");return n&&e.push(i(n)),o&&(f.canvasSupported?e.push("background-Color:"+o):(e.push("background-Color:#"+l.toHex(o)),e.push("filter:alpha(opacity=70)"))),c(["width","color","radius"],function(n){var i="border-"+n,r=d(i),o=t.get(r);
-null!=o&&e.push(i+":"+o+("color"===n?"":"px"))}),e.push(r(a)),null!=s&&e.push("padding:"+h.normalizeCssArray(s).join("px ")+"px"),e.join(";")+";"}function a(t,e){var n=document.createElement("div"),i=this._zr=e.getZr();this.el=n,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(n),this._container=t,this._show=!1,this._hideTimeout;var r=this;n.onmouseenter=function(){r._enterable&&(clearTimeout(r._hideTimeout),r._show=!0),r._inContent=!0},n.onmousemove=function(e){if(e=e||window.event,!r._enterable){var n=i.handler;u.normalizeEvent(t,e,!0),n.dispatch("mousemove",e)}},n.onmouseleave=function(){r._enterable&&r._show&&r.hideLater(r._hideDelay),r._inContent=!1}}var s=n(1),l=n(22),u=n(21),h=n(7),c=s.each,d=h.toCamelCase,f=n(9),p=["","-webkit-","-moz-","-o-"],g="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;";a.prototype={constructor:a,_enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),n=t.style;"absolute"!==n.position&&"absolute"!==e.position&&(n.position="relative")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText=g+o(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),e.style.display=e.innerHTML?"block":"none",this._show=!0},setContent:function(t){this.el.innerHTML=null==t?"":t},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el;return[t.clientWidth,t.clientHeight]},moveTo:function(t,e){var n,i=this._zr;i&&i.painter&&(n=i.painter.getViewportRoot())&&(t+=n.offsetLeft||0,e+=n.offsetTop||0);var r=this.el.style;r.left=t+"px",r.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(s.bind(this.hide,this),t)):this.hide())},isShow:function(){return this._show}},t.exports=a},function(t,e,n){n(2).extendComponentModel({type:"tooltip",dependencies:["axisPointer"],defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#fff",fontSize:14}}})},function(t,e,n){function i(t){for(var e=t.pop();t.length;){var n=t.pop();n&&(n instanceof m&&(n=n.get("tooltip",!0)),"string"==typeof n&&(n={formatter:n}),e=new m(n,e,e.ecModel))}return e}function r(t,e){return t.dispatchAction||h.bind(e.dispatchAction,e)}function o(t,e,n,i,r,o,a){var s=n.clientWidth,l=n.clientHeight;return null!=o&&(t+s+o>i?t-=s+o:t+=o),null!=a&&(e+l+a>r?e-=l+a:e+=a),[t,e]}function a(t,e,n,i,r){var o=n.clientWidth,a=n.clientHeight;return t=Math.min(t+o,i)-o,e=Math.min(e+a,r)-a,t=Math.max(t,0),e=Math.max(e,0),[t,e]}function s(t,e,n){var i=n[0],r=n[1],o=5,a=0,s=0,l=e.width,u=e.height;switch(t){case"inside":a=e.x+l/2-i/2,s=e.y+u/2-r/2;break;case"top":a=e.x+l/2-i/2,s=e.y-r-o;break;case"bottom":a=e.x+l/2-i/2,s=e.y+u+o;break;case"left":a=e.x-i-o,s=e.y+u/2-r/2;break;case"right":a=e.x+l+o,s=e.y+u/2-r/2}return[a,s]}function l(t){return"center"===t||"middle"===t}var u=n(233),h=n(1),c=n(7),d=n(4),f=n(3),p=n(120),g=n(12),v=n(9),m=n(10),y=n(121),x=n(17),_=n(75),b=h.bind,w=h.each,M=d.parsePercent,S=new f.Rect({shape:{x:-1,y:-1,width:2,height:2}});n(2).extendComponentView({type:"tooltip",init:function(t,e){if(!v.node){var n=new u(e.getDom(),e);this._tooltipContent=n}},render:function(t,e,n){if(!v.node){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=n,this._lastDataByCoordSys=null,this._alwaysShowContent=t.get("alwaysShowContent");var i=this._tooltipContent;i.update(),i.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow()}},_initGlobalListener:function(){var t=this._tooltipModel,e=t.get("triggerOn");y.register("itemTooltip",this._api,b(function(t,n,i){"none"!==e&&(e.indexOf(t)>=0?this._tryShow(n,i):"leave"===t&&this._hide(i))},this))},_keepShow:function(){var t=this._tooltipModel,e=this._ecModel,n=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var i=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){i.manuallyShowTip(t,e,n,{x:i._lastX,y:i._lastY})})}},manuallyShowTip:function(t,e,n,i){if(i.from!==this.uid&&!v.node){var o=r(i,n);this._ticket="";var a=i.dataByCoordSys;if(i.tooltip&&null!=i.x&&null!=i.y){var s=S;s.position=[i.x,i.y],s.update(),s.tooltip=i.tooltip,this._tryShow({offsetX:i.x,offsetY:i.y,target:s},o)}else if(a)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,event:{},dataByCoordSys:i.dataByCoordSys,tooltipOption:i.tooltipOption},o);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var l=p(i,e),u=l.point[0],h=l.point[1];null!=u&&null!=h&&this._tryShow({offsetX:u,offsetY:h,position:i.position,target:l.el,event:{}},o)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target,event:{}},o))}},manuallyHideTip:function(t,e,n,i){var o=this._tooltipContent;this._alwaysShowContent||o.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=null,i.from!==this.uid&&this._hide(r(i,n))},_manuallyAxisShowTip:function(t,e,n,r){var o=r.seriesIndex,a=r.dataIndex,s=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=o&&null!=a&&null!=s){var l=e.getSeriesByIndex(o);if(l){var u=l.getData(),t=i([u.getItemModel(a),l,(l.coordinateSystem||{}).model,t]);if("axis"===t.get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:o,dataIndex:a}),!0}}},_tryShow:function(t,e){var n=t.target,i=this._tooltipModel;if(i){this._lastX=t.offsetX,this._lastY=t.offsetY;var r=t.dataByCoordSys;r&&r.length?this._showAxisTooltip(r,t):n&&null!=n.dataIndex?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(t,n,e)):n&&n.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(t,n,e)):(this._lastDataByCoordSys=null,this._hide(e))}},_showOrMove:function(t,e){var n=t.get("showDelay");e=h.bind(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},_showAxisTooltip:function(t,e){var n=this._ecModel,r=this._tooltipModel,o=[e.offsetX,e.offsetY],a=[],s=[],l=i([e.tooltipOption,r]);w(t,function(t){w(t.dataByAxis,function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),i=t.value,r=[];if(e&&null!=i){var o=_.getValueLabel(i,e.axis,n,t.seriesDataIndices,t.valueLabelOpt);h.each(t.seriesDataIndices,function(a){var l=n.getSeriesByIndex(a.seriesIndex),u=a.dataIndexInside,h=l&&l.getDataParams(u);h.axisDim=t.axisDim,h.axisIndex=t.axisIndex,h.axisType=t.axisType,h.axisId=t.axisId,h.axisValue=x.getAxisRawValue(e.axis,i),h.axisValueLabel=o,h&&(s.push(h),r.push(l.formatTooltip(u,!0)))});var l=o;a.push((l?c.encodeHTML(l)+"<br />":"")+r.join("<br />"))}})},this),a.reverse(),a=a.join("<br /><br />");var u=e.position;this._showOrMove(l,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(l,u,o[0],o[1],this._tooltipContent,s):this._showTooltipContent(l,a,s,Math.random(),o[0],o[1],u)})},_showSeriesItemTooltip:function(t,e,n){var r=this._ecModel,o=e.seriesIndex,a=r.getSeriesByIndex(o),s=e.dataModel||a,l=e.dataIndex,u=e.dataType,h=s.getData(),c=i([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model,this._tooltipModel]),d=c.get("trigger");if(null==d||"item"===d){var f=s.getDataParams(l,u),p=s.formatTooltip(l,!1,u),g="item_"+s.name+"_"+l;this._showOrMove(c,function(){this._showTooltipContent(c,p,f,g,t.offsetX,t.offsetY,t.position,t.target)}),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},_showComponentItemTooltip:function(t,e,n){var i=e.tooltip;if("string"==typeof i){var r=i;i={content:r,formatter:r}}var o=new m(i,this._tooltipModel,this._ecModel),a=o.get("content"),s=Math.random();this._showOrMove(o,function(){this._showTooltipContent(o,a,o.get("formatterParams")||{},s,t.offsetX,t.offsetY,t.position,e)}),n({type:"showTip",from:this.uid})},_showTooltipContent:function(t,e,n,i,r,o,a,s){if(this._ticket="",t.get("showContent")&&t.get("show")){var l=this._tooltipContent,u=t.get("formatter");a=a||t.get("position");var h=e;if(u&&"string"==typeof u)h=c.formatTpl(u,n,!0);else if("function"==typeof u){var d=b(function(e,i){e===this._ticket&&(l.setContent(i),this._updatePosition(t,a,r,o,l,n,s))},this);this._ticket=i,h=u(n,i,d)}l.setContent(h),l.show(t),this._updatePosition(t,a,r,o,l,n,s)}},_updatePosition:function(t,e,n,i,r,u,c){var d=this._api.getWidth(),f=this._api.getHeight();e=e||t.get("position");var p=r.getSize(),v=t.get("align"),m=t.get("verticalAlign"),y=c&&c.getBoundingRect().clone();if(c&&y.applyTransform(c.transform),"function"==typeof e&&(e=e([n,i],u,r.el,y,{viewSize:[d,f],contentSize:p.slice()})),h.isArray(e))n=M(e[0],d),i=M(e[1],f);else if(h.isObject(e)){e.width=p[0],e.height=p[1];var x=g.getLayoutRect(e,{width:d,height:f});n=x.x,i=x.y,v=null,m=null}else if("string"==typeof e&&c){var _=s(e,y,p);n=_[0],i=_[1]}else{var _=o(n,i,r.el,d,f,v?null:20,m?null:20);n=_[0],i=_[1]}if(v&&(n-=l(v)?p[0]/2:"right"===v?p[0]:0),m&&(i-=l(m)?p[1]/2:"bottom"===m?p[1]:0),t.get("confine")){var _=a(n,i,r.el,d,f);n=_[0],i=_[1]}r.moveTo(n,i)},_updateContentNotChangedOnAxis:function(t){var e=this._lastDataByCoordSys,n=!!e&&e.length===t.length;return w(e,function(e,i){var r=e.dataByAxis||{},o=t[i]||{},a=o.dataByAxis||[];n&=r.length===a.length,w(r,function(t,e){var i=a[e]||{},r=t.seriesDataIndices||[],o=i.seriesDataIndices||[];n&=t.value===i.value&&t.axisType===i.axisType&&t.axisId===i.axisId&&r.length===o.length,w(r,function(t,e){var i=o[e];n&=t.seriesIndex===i.seriesIndex&&t.dataIndex===i.dataIndex})})}),this._lastDataByCoordSys=t,!!n},_hide:function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},dispose:function(t,e){v.node||(this._tooltipContent.hide(),y.unregister("itemTooltip",e))}})},,function(t,e,n){function i(t){return parseInt(t,10)}function r(t,e){s.initVML(),this.root=t,this.storage=e;var n=document.createElement("div"),i=document.createElement("div");n.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",i.style.cssText="position:absolute;left:0;top:0;",t.appendChild(n),this._vmlRoot=i,this._vmlViewport=n,this.resize();var r=e.delFromStorage,o=e.addToStorage;e.delFromStorage=function(t){r.call(e,t),t&&t.onRemove&&t.onRemove(i)},e.addToStorage=function(t){t.onAdd&&t.onAdd(i),o.call(e,t)},this._firstPaint=!0}function o(t){return function(){a('In IE8.0 VML mode painter not support method "'+t+'"')}}var a=n(52),s=n(182);r.prototype={constructor:r,getViewportRoot:function(){return this._vmlViewport},refresh:function(){var t=this.storage.getDisplayList(!0,!0);this._paintList(t)},_paintList:function(t){for(var e=this._vmlRoot,n=0;n<t.length;n++){var i=t[n];i.invisible||i.ignore?(i.__alreadyNotVisible||i.onRemove(e),i.__alreadyNotVisible=!0):(i.__alreadyNotVisible&&i.onAdd(e),i.__alreadyNotVisible=!1,i.__dirty&&(i.beforeBrush&&i.beforeBrush(),(i.brushVML||i.brush).call(i,e),i.afterBrush&&i.afterBrush())),i.__dirty=!1}this._firstPaint&&(this._vmlViewport.appendChild(e),this._firstPaint=!1)},resize:function(t,e){var t=null==t?this._getWidth():t,e=null==e?this._getHeight():e;if(this._width!=t||this._height!=e){this._width=t,this._height=e;var n=this._vmlViewport.style;n.width=t+"px",n.height=e+"px"}},dispose:function(){this.root.innerHTML="",this._vmlRoot=this._vmlViewport=this.storage=null},getWidth:function(){return this._width},getHeight:function(){return this._height},clear:function(){this._vmlViewport&&this.root.removeChild(this._vmlViewport)},_getWidth:function(){var t=this.root,e=t.currentStyle;return(t.clientWidth||i(e.width))-i(e.paddingLeft)-i(e.paddingRight)|0},_getHeight:function(){var t=this.root,e=t.currentStyle;return(t.clientHeight||i(e.height))-i(e.paddingTop)-i(e.paddingBottom)|0}};for(var l=["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],u=0;u<l.length;u++){var h=l[u];r.prototype[h]=o(h)}t.exports=r},function(t,e,n){if(!n(9).canvasSupported){var i=n(5),r=n(11),o=n(27).CMD,a=n(22),s=n(16),l=n(86),u=n(38),h=n(53),c=n(85),d=n(8),f=n(27),p=n(39),g=n(182),v=Math.round,m=Math.sqrt,y=Math.abs,x=Math.cos,_=Math.sin,b=Math.max,w=i.applyTransform,M=",",S="progid:DXImageTransform.Microsoft",T=21600,A=T/2,I=1e5,C=1e3,P=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=T+","+T,t.coordorigin="0,0"},k=function(t){return String(t).replace(/&/g,"&amp;").replace(/"/g,"&quot;")},L=function(t,e,n){return"rgb("+[t,e,n].join(",")+")"},D=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},O=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},E=function(t,e,n){return(parseFloat(t)||0)*I+(parseFloat(e)||0)*C+n},z=function(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t},N=function(t,e,n){var i=a.parse(e);n=+n,isNaN(n)&&(n=1),i&&(t.color=L(i[0],i[1],i[2]),t.opacity=n*i[3])},R=function(t){var e=a.parse(t);return[L(e[0],e[1],e[2]),e[3]]},B=function(t,e,n){var i=e.fill;if(null!=i)if(i instanceof p){var r,o=0,a=[0,0],s=0,l=1,u=n.getBoundingRect(),h=u.width,c=u.height;if("linear"===i.type){r="gradient";var d=n.transform,f=[i.x*h,i.y*c],g=[i.x2*h,i.y2*c];d&&(w(f,f,d),w(g,g,d));var v=g[0]-f[0],m=g[1]-f[1];o=180*Math.atan2(v,m)/Math.PI,o<0&&(o+=360),o<1e-6&&(o=0)}else{r="gradientradial";var f=[i.x*h,i.y*c],d=n.transform,y=n.scale,x=h,_=c;a=[(f[0]-u.x)/x,(f[1]-u.y)/_],d&&w(f,f,d),x/=y[0]*T,_/=y[1]*T;var M=b(x,_);s=0/M,l=2*i.r/M-s}var S=i.colorStops.slice();S.sort(function(t,e){return t.offset-e.offset});for(var A=S.length,I=[],C=[],P=0;P<A;P++){var k=S[P],L=R(k.color);C.push(k.offset*l+s+" "+L[0]),0!==P&&P!==A-1||I.push(L)}if(A>=2){var D=I[0][0],O=I[1][0],E=I[0][1]*e.opacity,z=I[1][1]*e.opacity;t.type=r,t.method="none",t.focus="100%",t.angle=o,t.color=D,t.color2=O,t.colors=C.join(","),t.opacity=z,t.opacity2=E}"radial"===r&&(t.focusposition=a.join(","))}else N(t,i,e.opacity)},V=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof p||N(t,e.stroke,e.opacity)},F=function(t,e,n,i){var r="fill"==e,o=t.getElementsByTagName(e)[0];null!=n[e]&&"none"!==n[e]&&(r||!r&&n.lineWidth)?(t[r?"filled":"stroked"]="true",n[e]instanceof p&&O(t,o),o||(o=g.createNode(e)),r?B(o,n,i):V(o,n),D(t,o)):(t[r?"filled":"stroked"]="false",O(t,o))},G=[[],[],[]],H=function(t,e){var n,i,r,a,s,l,u=o.M,h=o.C,c=o.L,d=o.A,f=o.Q,p=[];for(a=0;a<t.length;){switch(r=t[a++],i="",n=0,r){case u:i=" m ",n=1,s=t[a++],l=t[a++],G[0][0]=s,G[0][1]=l;break;case c:i=" l ",n=1,s=t[a++],l=t[a++],G[0][0]=s,G[0][1]=l;break;case f:case h:i=" c ",n=3;var g,y,b=t[a++],S=t[a++],I=t[a++],C=t[a++];r===f?(g=I,y=C,I=(I+2*b)/3,C=(C+2*S)/3,b=(s+2*b)/3,S=(l+2*S)/3):(g=t[a++],y=t[a++]),G[0][0]=b,G[0][1]=S,G[1][0]=I,G[1][1]=C,G[2][0]=g,G[2][1]=y,s=g,l=y;break;case d:var P=0,k=0,L=1,D=1,O=0;e&&(P=e[4],k=e[5],L=m(e[0]*e[0]+e[1]*e[1]),D=m(e[2]*e[2]+e[3]*e[3]),O=Math.atan2(-e[1]/D,e[0]/L));var E=t[a++],z=t[a++],N=t[a++],R=t[a++],B=t[a++]+O,V=t[a++]+B+O;a++;var F=t[a++],H=E+x(B)*N,W=z+_(B)*R,b=E+x(V)*N,S=z+_(V)*R,Z=F?" wa ":" at ";Math.abs(H-b)<1e-4&&(Math.abs(V-B)>.01?F&&(H+=270/T):Math.abs(W-z)<1e-4?F&&H<E||!F&&H>E?S-=270/T:S+=270/T:F&&W<z||!F&&W>z?b+=270/T:b-=270/T),p.push(Z,v(((E-N)*L+P)*T-A),M,v(((z-R)*D+k)*T-A),M,v(((E+N)*L+P)*T-A),M,v(((z+R)*D+k)*T-A),M,v((H*L+P)*T-A),M,v((W*D+k)*T-A),M,v((b*L+P)*T-A),M,v((S*D+k)*T-A)),s=b,l=S;break;case o.R:var q=G[0],j=G[1];q[0]=t[a++],q[1]=t[a++],j[0]=q[0]+t[a++],j[1]=q[1]+t[a++],e&&(w(q,q,e),w(j,j,e)),q[0]=v(q[0]*T-A),j[0]=v(j[0]*T-A),q[1]=v(q[1]*T-A),j[1]=v(j[1]*T-A),p.push(" m ",q[0],M,q[1]," l ",j[0],M,q[1]," l ",j[0],M,j[1]," l ",q[0],M,j[1]);break;case o.Z:p.push(" x ")}if(n>0){p.push(i);for(var U=0;U<n;U++){var X=G[U];e&&w(X,X,e),p.push(v(X[0]*T-A),M,v(X[1]*T-A),U<n-1?M:"")}}}return p.join("")};d.prototype.brushVML=function(t){var e=this.style,n=this._vmlEl;n||(n=g.createNode("shape"),P(n),this._vmlEl=n),F(n,"fill",e,this),F(n,"stroke",e,this);var i=this.transform,r=null!=i,o=n.getElementsByTagName("stroke")[0];if(o){var a=e.lineWidth;if(r&&!e.strokeNoScale){var s=i[0]*i[3]-i[1]*i[2];a*=m(y(s))}o.weight=a+"px"}var l=this.path||(this.path=new f);this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),l.toStatic(),this.__dirtyPath=!1),n.path=H(l.data,this.transform),n.style.zIndex=E(this.zlevel,this.z,this.z2),D(t,n),null!=e.text?this.drawRectText(t,this.getBoundingRect()):this.removeRectText(t)},d.prototype.onRemove=function(t){O(t,this._vmlEl),this.removeRectText(t)},d.prototype.onAdd=function(t){D(t,this._vmlEl),this.appendRectText(t)};var W=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};h.prototype.brushVML=function(t){var e,n,i=this.style,r=i.image;if(W(r)){var o=r.src;if(o===this._imageSrc)e=this._imageWidth,n=this._imageHeight;else{var a=r.runtimeStyle,s=a.width,l=a.height;a.width="auto",a.height="auto",e=r.width,n=r.height,a.width=s,a.height=l,this._imageSrc=o,this._imageWidth=e,this._imageHeight=n}r=o}else r===this._imageSrc&&(e=this._imageWidth,n=this._imageHeight);if(r){var u=i.x||0,h=i.y||0,c=i.width,d=i.height,f=i.sWidth,p=i.sHeight,y=i.sx||0,x=i.sy||0,_=f&&p,T=this._vmlEl;T||(T=g.doc.createElement("div"),P(T),this._vmlEl=T);var A,I=T.style,C=!1,k=1,L=1;if(this.transform&&(A=this.transform,k=m(A[0]*A[0]+A[1]*A[1]),L=m(A[2]*A[2]+A[3]*A[3]),C=A[1]||A[2]),C){var O=[u,h],z=[u+c,h],N=[u,h+d],R=[u+c,h+d];w(O,O,A),w(z,z,A),w(N,N,A),w(R,R,A);var B=b(O[0],z[0],N[0],R[0]),V=b(O[1],z[1],N[1],R[1]),F=[];F.push("M11=",A[0]/k,M,"M12=",A[2]/L,M,"M21=",A[1]/k,M,"M22=",A[3]/L,M,"Dx=",v(u*k+A[4]),M,"Dy=",v(h*L+A[5])),I.padding="0 "+v(B)+"px "+v(V)+"px 0",I.filter=S+".Matrix("+F.join("")+", SizingMethod=clip)"}else A&&(u=u*k+A[4],h=h*L+A[5]),I.filter="",I.left=v(u)+"px",I.top=v(h)+"px";var G=this._imageEl,H=this._cropEl;G||(G=g.doc.createElement("div"),this._imageEl=G);var Z=G.style;if(_){if(e&&n)Z.width=v(k*e*c/f)+"px",Z.height=v(L*n*d/p)+"px";else{var q=new Image,j=this;q.onload=function(){q.onload=null,e=q.width,n=q.height,Z.width=v(k*e*c/f)+"px",Z.height=v(L*n*d/p)+"px",j._imageWidth=e,j._imageHeight=n,j._imageSrc=r},q.src=r}H||(H=g.doc.createElement("div"),H.style.overflow="hidden",this._cropEl=H);var U=H.style;U.width=v((c+y*c/f)*k),U.height=v((d+x*d/p)*L),U.filter=S+".Matrix(Dx="+-y*c/f*k+",Dy="+-x*d/p*L+")",H.parentNode||T.appendChild(H),G.parentNode!=H&&H.appendChild(G)}else Z.width=v(k*c)+"px",Z.height=v(L*d)+"px",T.appendChild(G),H&&H.parentNode&&(T.removeChild(H),this._cropEl=null);var X="",Y=i.opacity;Y<1&&(X+=".Alpha(opacity="+v(100*Y)+") "),X+=S+".AlphaImageLoader(src="+r+", SizingMethod=scale)",Z.filter=X,T.style.zIndex=E(this.zlevel,this.z,this.z2),D(t,T),null!=i.text&&this.drawRectText(t,this.getBoundingRect())}},h.prototype.onRemove=function(t){O(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},h.prototype.onAdd=function(t){D(t,this._vmlEl),this.appendRectText(t)};var Z,q="normal",j={},U=0,X=100,Y=document.createElement("div"),$=function(t){var e=j[t];if(!e){U>X&&(U=0,j={});var n,i=Y.style;try{i.font=t,n=i.fontFamily.split(",")[0]}catch(r){}e={style:i.fontStyle||q,variant:i.fontVariant||q,weight:i.fontWeight||q,size:0|parseFloat(i.fontSize||12),family:n||"Microsoft YaHei"},j[t]=e,U++}return e};s.measureText=function(t,e){var n=g.doc;Z||(Z=n.createElement("div"),Z.style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",g.doc.body.appendChild(Z));try{Z.style.font=e}catch(i){}return Z.innerHTML="",Z.appendChild(n.createTextNode(t)),{width:Z.offsetWidth}};for(var K=new r,Q=function(t,e,n,i){var r=this.style,o=r.text;if(null!=o&&(o+=""),o){var a,l,u=r.textAlign,h=$(r.textFont),c=h.style+" "+h.variant+" "+h.weight+" "+h.size+'px "'+h.family+'"',d=r.textBaseline,f=r.textVerticalAlign;n=n||s.getBoundingRect(o,c,u,d);var p=this.transform;if(p&&!i&&(K.copy(e),K.applyTransform(p),e=K),i)a=e.x,l=e.y;else{var m=r.textPosition,y=r.textDistance;if(m instanceof Array)a=e.x+z(m[0],e.width),l=e.y+z(m[1],e.height),u=u||"left",d=d||"top";else{var x=s.adjustTextPositionOnRect(m,e,n,y);a=x.x,l=x.y,u=u||x.textAlign,d=d||x.textBaseline}}if(f){switch(f){case"middle":l-=n.height/2;break;case"bottom":l-=n.height}d="top"}var _=h.size;switch(d){case"hanging":case"top":l+=_/1.75;break;case"middle":break;default:l-=_/2.25}switch(u){case"left":break;case"center":a-=n.width/2;break;case"right":a-=n.width}var b,S,T,A=g.createNode,I=this._textVmlEl;I?(T=I.firstChild,b=T.nextSibling,S=b.nextSibling):(I=A("line"),b=A("path"),S=A("textpath"),T=A("skew"),S.style["v-text-align"]="left",P(I),b.textpathok=!0,S.on=!0,I.from="0 0",I.to="1000 0.05",D(I,T),D(I,b),D(I,S),this._textVmlEl=I);var C=[a,l],L=I.style;p&&i?(w(C,C,p),T.on=!0,T.matrix=p[0].toFixed(3)+M+p[2].toFixed(3)+M+p[1].toFixed(3)+M+p[3].toFixed(3)+",0,0",T.offset=(v(C[0])||0)+","+(v(C[1])||0),T.origin="0 0",L.left="0px",L.top="0px"):(T.on=!1,L.left=v(a)+"px",L.top=v(l)+"px"),S.string=k(o);try{S.style.font=c}catch(O){}F(I,"fill",{fill:i?r.fill:r.textFill,opacity:r.opacity},this),F(I,"stroke",{stroke:i?r.stroke:r.textStroke,opacity:r.opacity,lineDash:r.lineDash},this),I.style.zIndex=E(this.zlevel,this.z,this.z2),D(t,I)}},J=function(t){O(t,this._textVmlEl),this._textVmlEl=null},tt=function(t){D(t,this._textVmlEl)},et=[l,u,h,d,c],nt=0;nt<et.length;nt++){var it=et[nt].prototype;it.drawRectText=Q,it.removeRectText=J,it.appendRectText=tt}c.prototype.brushVML=function(t){var e=this.style;null!=e.text?this.drawRectText(t,{x:e.x||0,y:e.y||0,width:0,height:0},this.getBoundingRect(),!0):this.removeRectText(t)},c.prototype.onRemove=function(t){this.removeRectText(t)},c.prototype.onAdd=function(t){this.appendRectText(t)}}},function(t,e,n){n(238),n(87).registerPainter("vml",n(237))}])});
\ No newline at end of file
+var r=n(71),o=n(9),a=n(1),s=n(152),l=n(155),u=n(156),h=n(163),c=!o.canvasSupported,d={canvas:n(154)},f={},p={};p.version="3.5.0",p.init=function(t,e){var n=new g(r(),t,e);return f[n.id]=n,n},p.dispose=function(t){if(t)t.dispose();else{for(var e in f)f.hasOwnProperty(e)&&f[e].dispose();f={}}return p},p.getInstance=function(t){return f[t]},p.registerPainter=function(t,e){d[t]=e};var g=function(t,e,n){n=n||{},this.dom=e,this.id=t;var i=this,r=new l,f=n.renderer;if(c){if(!d.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");f="vml"}else f&&d[f]||(f="canvas");var p=new d[f](e,r,n);this.storage=r,this.painter=p;var g=o.node?null:new h(p.getViewportRoot());this.handler=new s(r,p,g,p.root),this.animation=new u({stage:{update:a.bind(this.flush,this)}}),this.animation.start(),this._needsRefresh;var m=r.delFromStorage,v=r.addToStorage;r.delFromStorage=function(t){m.call(r,t),t&&t.removeSelfFromZr(i)},r.addToStorage=function(t){v.call(r,t),t.addSelfToZr(i)}};g.prototype={constructor:g,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,n){this.handler.on(t,e,n)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,i(this.id)}},t.exports=p},function(t,e,n){var i=n(2),r=n(1);t.exports=function(t,e){r.each(e,function(e){e.update="updateView",i.registerAction(e,function(n,i){var r={};return i.eachComponent({mainType:"series",subType:t,query:n},function(t){t[e.method]&&t[e.method](n.name);var i=t.getData();i.each(function(e){var n=i.getName(e);r[n]=t.isSelected(n)||!1})}),{name:n.name,selected:r}})})}},function(t,e,n){"use strict";var i=n(17),r=n(28);t.exports=i.extend({type:"series.__base_bar__",getInitialData:function(t,e){return r(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(t,!0),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size"),a=e.getBaseAxis().isHorizontal()?0:1;return n[a]+=r+o/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,itemStyle:{normal:{},emphasis:{}}}})},function(t,e,n){function i(t,e,n,i,r){o.setText(t,e,n),t.text=i,"outside"===t.textPosition&&(t.textPosition=r)}var r=n(1),o=n(3),a={};a.setLabel=function(t,e,n,o,a,s,l){var u=n.getModel("label.normal"),h=n.getModel("label.emphasis");u.get("show")?i(t,u,o,r.retrieve(a.getFormattedLabel(s,"normal"),a.getRawValue(s)),l):t.text="",h.get("show")?i(e,h,o,r.retrieve(a.getFormattedLabel(s,"emphasis"),a.getRawValue(s)),l):e.text=""},t.exports=a},function(t,e,n){var i=n(3),r=n(1),o=n(5),a={};a.findLabelValueDim=function(t){var e,n=o.otherDimToDataDim(t,"label");if(n.length)e=n[0];else for(var i,r=t.dimensions.slice();r.length&&(e=r.pop(),i=t.getDimensionInfo(e).type,"ordinal"===i||"time"===i););return e},a.setTextToStyle=function(t,e,n,o,a,s,l){null!=n&&s.getShallow("show")?(i.setText(o,s,l),o.text=r.retrieve(a.getFormattedLabel(e,"normal"),t.get(n,e))):o.text=""},t.exports=a},function(t,e,n){function i(t){return isNaN(t[0])||isNaN(t[1])}function r(t,e,n,r,o,a,g,m,v,y,x){for(var _=0,b=n,w=0;w<r;w++){var M=e[b];if(b>=o||b<0)break;if(i(M)){if(x){b+=a;continue}break}if(b===n)t[a>0?"moveTo":"lineTo"](M[0],M[1]),c(f,M);else if(v>0){var S=b+a,T=e[S];if(x)for(;T&&i(e[S]);)S+=a,T=e[S];var A=.5,I=e[_],T=e[S];if(!T||i(T))c(p,M);else{i(T)&&!x&&(T=M),s.sub(d,T,I);var C,P;if("x"===y||"y"===y){var D="x"===y?0:1;C=Math.abs(M[D]-I[D]),P=Math.abs(M[D]-T[D])}else C=s.dist(M,I),P=s.dist(M,T);A=P/(P+C),h(p,M,d,-v*(1-A))}l(f,f,m),u(f,f,g),l(p,p,m),u(p,p,g),t.bezierCurveTo(f[0],f[1],p[0],p[1],M[0],M[1]),h(f,M,d,v*A)}else t.lineTo(M[0],M[1]);_=b,b+=a}return w}function o(t,e){var n=[1/0,1/0],i=[-(1/0),-(1/0)];if(e)for(var r=0;r<t.length;r++){var o=t[r];o[0]<n[0]&&(n[0]=o[0]),o[1]<n[1]&&(n[1]=o[1]),o[0]>i[0]&&(i[0]=o[0]),o[1]>i[1]&&(i[1]=o[1])}return{min:e?n:i,max:e?i:n}}var a=n(8),s=n(6),l=s.min,u=s.max,h=s.scaleAndAdd,c=s.copy,d=[],f=[],p=[];t.exports={Polyline:a.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},buildPath:function(t,e){var n=e.points,a=0,s=n.length,l=o(n,e.smoothConstraint);if(e.connectNulls){for(;s>0&&i(n[s-1]);s--);for(;a<s&&i(n[a]);a++);}for(;a<s;)a+=r(t,n,a,s,s,1,l.min,l.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),Polygon:a.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},buildPath:function(t,e){var n=e.points,a=e.stackedOnPoints,s=0,l=n.length,u=e.smoothMonotone,h=o(n,e.smoothConstraint),c=o(a,e.smoothConstraint);if(e.connectNulls){for(;l>0&&i(n[l-1]);l--);for(;s<l&&i(n[s]);s++);}for(;s<l;){var d=r(t,n,s,l,l,1,h.min,h.max,e.smooth,u,e.connectNulls);r(t,a,s+d-1,d,l,-1,c.min,c.max,e.stackedOnSmooth,u,e.connectNulls),s+=d+1,t.closePath()}}})}},,function(t,e,n){function i(t){this.pointerChecker,this._zr=t,this._opt={};var e=d.bind,n=e(r,this),i=e(o,this),u=e(a,this),h=e(s,this),f=e(l,this);c.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(e,r){this.disable(),this._opt=d.defaults(d.clone(r)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}),null==e&&(e=!0),e!==!0&&"move"!==e&&"pan"!==e||(t.on("mousedown",n),t.on("mousemove",i),t.on("mouseup",u)),e!==!0&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",h),t.on("pinch",f))},this.disable=function(){t.off("mousedown",n),t.off("mousemove",i),t.off("mouseup",u),t.off("mousewheel",h),t.off("pinch",f)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function r(t){if(!t.target||!t.target.draggable){var e=t.offsetX,n=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,n)&&(this._x=e,this._y=n,this._dragging=!0)}}function o(t){if(h(this,"moveOnMouseMove",t)&&this._dragging&&"pinch"!==t.gestureEvent&&!p.isTaken(this._zr,"globalPan")){var e=t.offsetX,n=t.offsetY,i=this._x,r=this._y,o=e-i,a=n-r;this._x=e,this._y=n,this._opt.preventDefaultMouseMove&&f.stop(t.event),this.trigger("pan",o,a,i,r,e,n)}}function a(t){this._dragging=!1}function s(t){if(h(this,"zoomOnMouseWheel",t)&&0!==t.wheelDelta){var e=t.wheelDelta>0?1.1:1/1.1;u.call(this,t,e,t.offsetX,t.offsetY)}}function l(t){if(!p.isTaken(this._zr,"globalPan")){var e=t.pinchScale>1?1.1:1/1.1;u.call(this,t,e,t.pinchX,t.pinchY)}}function u(t,e,n,i){this.pointerChecker&&this.pointerChecker(t,n,i)&&(f.stop(t.event),this.trigger("zoom",e,n,i))}function h(t,e,n){var i=t._opt[e];return i&&(!d.isString(i)||n.event[i+"Key"])}var c=n(23),d=n(1),f=n(21),p=n(129);d.mixin(i,c),t.exports=i},function(t,e,n){var i=n(1),r={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,textStyle:{fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},o=i.merge({boundaryGap:!0,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},r),a=i.merge({boundaryGap:[0,0],splitNumber:5},r),s=i.defaults({scale:!0,min:"dataMin",max:"dataMax"},a),l=i.defaults({scale:!0,logBase:10},a);t.exports={categoryAxis:o,valueAxis:a,timeAxis:s,logAxis:l}},function(t,e){t.exports={containStroke:function(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0,u=t;if(a>e+s&&a>i+s||a<e-s&&a<i-s||o>t+s&&o>n+s||o<t-s&&o<n-s)return!1;if(t===n)return Math.abs(o-t)<=s/2;l=(e-i)/(t-n),u=(t*i-n*e)/(t-n);var h=l*o-a+u,c=h*h/(l*l+1);return c<=s/2*s/2}}},function(t,e,n){var i=n(20);t.exports={containStroke:function(t,e,n,r,o,a,s,l,u){if(0===s)return!1;var h=s;if(u>e+h&&u>r+h&&u>a+h||u<e-h&&u<r-h&&u<a-h||l>t+h&&l>n+h&&l>o+h||l<t-h&&l<n-h&&l<o-h)return!1;var c=i.quadraticProjectPoint(t,e,n,r,o,a,l,u,null);return c<=h/2}}},function(t,e){t.exports=function(t,e,n,i,r,o){if(o>e&&o>i||o<e&&o<i)return 0;if(i===e)return 0;var a=i<e?1:-1,s=(o-e)/(i-e);1!==s&&0!==s||(a=i<e?.5:-.5);var l=s*(n-t)+t;return l>r?a:0}},function(t,e,n){"use strict";var i=n(1),r=n(39),o=function(t,e,n,i,o,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==i?0:i,this.type="linear",this.global=a||!1,r.call(this,o)};o.prototype={constructor:o},i.inherits(o,r),t.exports=o},function(t,e,n){"use strict";function i(t){r.each(o,function(e){this[e]=r.bind(t[e],t)},this)}var r=n(1),o=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"];t.exports=i},function(t,e,n){var i=n(1);n(57),n(103),n(104);var r=n(82),o=n(2);o.registerLayout(i.curry(r,"bar")),o.registerVisual(function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),n(32)},function(t,e,n){t.exports=n(90).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"})},function(t,e,n){"use strict";function i(t,e,n){n.style.text="",l.updateProps(n,{shape:{width:0}},e,t,function(){n.parent&&n.parent.remove(n)})}function r(t,e,n){n.style.text="",l.updateProps(n,{shape:{r:n.shape.r0}},e,t,function(){n.parent&&n.parent.remove(n)})}function o(t,e,n,i,r,o,a,h){var c=e.getItemVisual(n,"color"),d=e.getItemVisual(n,"opacity"),f=i.getModel("itemStyle.normal"),p=i.getModel("itemStyle.emphasis").getBarItemStyle();!h&&a&&t.setShape("r",f.get("barBorderRadius")||0),t.useStyle(s.defaults({fill:c,opacity:d},f.getBarItemStyle()));var g=a?r.height>0?"bottom":"top":r.width>0?"left":"right";h||u.setLabel(t.style,p,i,c,o,n,g),l.setHoverStyle(t,p)}function a(t,e){var n=t.get(h)||0;return Math.min(n,Math.abs(e.width),Math.abs(e.height))}var s=n(1),l=n(3),u=n(91),h=["itemStyle","normal","barBorderWidth"];s.extend(n(10).prototype,n(105));var c=n(2).extendChartView({type:"bar",render:function(t,e,n){var i=t.get("coordinateSystem");return"cartesian2d"!==i&&"polar"!==i||this._render(t,e,n),this.group},dispose:s.noop,_render:function(t,e,n){var a,s=this.group,u=t.getData(),h=this._data,c=t.coordinateSystem,p=c.getBaseAxis();"cartesian2d"===c.type?a=p.isHorizontal():"polar"===c.type&&(a="angle"===p.dim);var g=t.isAnimationEnabled()?t:null;u.diff(h).add(function(e){if(u.hasValue(e)){var n=u.getItemModel(e),i=f[c.type](u,e,n),r=d[c.type](u,e,n,i,a,g);u.setItemGraphicEl(e,r),s.add(r),o(r,u,e,n,i,t,a,"polar"===c.type)}}).update(function(e,n){var i=h.getItemGraphicEl(n);if(!u.hasValue(e))return void s.remove(i);var r=u.getItemModel(e),p=f[c.type](u,e,r);i?l.updateProps(i,{shape:p},g,e):i=d[c.type](u,e,r,p,a,g,!0),u.setItemGraphicEl(e,i),s.add(i),o(i,u,e,r,p,t,a,"polar"===c.type)}).remove(function(t){var e=h.getItemGraphicEl(t);"cartesian2d"===c.type?e&&i(t,g,e):e&&r(t,g,e)}).execute(),this._data=u},remove:function(t,e){var n=this.group,o=this._data;t.get("animation")?o&&o.eachItemGraphicEl(function(e){"sector"===e.type?r(e.dataIndex,t,e):i(e.dataIndex,t,e)}):n.removeAll()}}),d={cartesian2d:function(t,e,n,i,r,o,a){var u=new l.Rect({shape:s.extend({},i)});if(o){var h=u.shape,c=r?"height":"width",d={};h[c]=0,d[c]=i[c],l[a?"updateProps":"initProps"](u,{shape:d},o,e)}return u},polar:function(t,e,n,i,r,o,a){var u=new l.Sector({shape:s.extend({},i)});if(o){var h=u.shape,c=r?"r":"endAngle",d={};h[c]=r?0:i.startAngle,d[c]=i[c],l[a?"updateProps":"initProps"](u,{shape:d},o,e)}return u}},f={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=a(n,i),o=i.width>0?1:-1,s=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+s*r/2,width:i.width-o*r,height:i.height-s*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle}}};t.exports=c},function(t,e,n){var i=n(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getBarItemStyle:function(t){var e=i.call(this,t);if(this.getBorderLineDash){var n=this.getBorderLineDash();n&&(e.lineDash=n)}return e}}},function(t,e,n){function i(t){return"_"+t+"Type"}function r(t,e,n){var i=e.getItemVisual(n,"color"),r=e.getItemVisual(n,t),o=e.getItemVisual(n,t+"Size");if(r&&"none"!==r){f.isArray(o)||(o=[o,o]);var a=u.createSymbol(r,-o[0]/2,-o[1]/2,o[0],o[1],i);return a.name=t,a}}function o(t){var e=new c({name:"line"});return a(e.shape,t),e}function a(t,e){var n=e[0],i=e[1],r=e[2];t.x1=n[0],t.y1=n[1],t.x2=i[0],t.y2=i[1],t.percent=1,r?(t.cpx1=r[0],t.cpy1=r[1]):(t.cpx1=NaN,t.cpy1=NaN)}function s(){var t=this,e=t.childOfName("fromSymbol"),n=t.childOfName("toSymbol"),i=t.childOfName("label");if(e||n||!i.ignore){for(var r=1,o=this.parent;o;)o.scale&&(r/=o.scale[0]),o=o.parent;var a=t.childOfName("line");if(this.__dirty||a.__dirty){var s=a.shape.percent,l=a.pointAt(0),u=a.pointAt(s),c=h.sub([],u,l);if(h.normalize(c,c),e){e.attr("position",l);var d=a.tangentAt(0);e.attr("rotation",Math.PI/2-Math.atan2(d[1],d[0])),e.attr("scale",[r*s,r*s])}if(n){n.attr("position",u);var d=a.tangentAt(1);n.attr("rotation",-Math.PI/2-Math.atan2(d[1],d[0])),n.attr("scale",[r*s,r*s])}if(!i.ignore){i.attr("position",u);var f,p,g,m=5*r;if("end"===i.__position)f=[c[0]*m+u[0],c[1]*m+u[1]],p=c[0]>.8?"left":c[0]<-.8?"right":"center",g=c[1]>.8?"top":c[1]<-.8?"bottom":"middle";else if("middle"===i.__position){var v=s/2,d=a.tangentAt(v),y=[d[1],-d[0]],x=a.pointAt(v);y[1]>0&&(y[0]=-y[0],y[1]=-y[1]),f=[x[0]+y[0]*m,x[1]+y[1]*m],p="center",g="bottom";var _=-Math.atan2(d[1],d[0]);u[0]<l[0]&&(_=Math.PI+_),i.attr("rotation",_)}else f=[-c[0]*m+l[0],-c[1]*m+l[1]],p=c[0]>.8?"right":c[0]<-.8?"left":"center",g=c[1]>.8?"bottom":c[1]<-.8?"top":"middle";i.attr({style:{textVerticalAlign:i.__verticalAlign||g,textAlign:i.__textAlign||p},position:f,scale:[r,r]})}}}}function l(t,e,n){d.Group.call(this),this._createLine(t,e,n)}var u=n(24),h=n(6),c=n(190),d=n(3),f=n(1),p=n(4),g=["fromSymbol","toSymbol"],m=l.prototype;m.beforeUpdate=s,m._createLine=function(t,e,n){var a=t.hostModel,s=t.getItemLayout(e),l=o(s);l.shape.percent=0,d.initProps(l,{shape:{percent:1}},a,e),this.add(l);var u=new d.Text({name:"label"});this.add(u),f.each(g,function(n){var o=r(n,t,e);this.add(o),this[i(n)]=t.getItemVisual(e,n)},this),this._updateCommonStl(t,e,n)},m.updateData=function(t,e,n){var o=t.hostModel,s=this.childOfName("line"),l=t.getItemLayout(e),u={shape:{}};a(u.shape,l),d.updateProps(s,u,o,e),f.each(g,function(n){var o=t.getItemVisual(e,n),a=i(n);if(this[a]!==o){this.remove(this.childOfName(n));var s=r(n,t,e);this.add(s)}this[a]=o},this),this._updateCommonStl(t,e,n)},m._updateCommonStl=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=n&&n.lineStyle,a=n&&n.hoverLineStyle,s=n&&n.labelModel,l=n&&n.hoverLabelModel;if(!n||t.hasItemOption){var u=t.getItemModel(e);o=u.getModel("lineStyle.normal").getLineStyle(),a=u.getModel("lineStyle.emphasis").getLineStyle(),s=u.getModel("label.normal"),l=u.getModel("label.emphasis")}var h=t.getItemVisual(e,"color"),c=f.retrieve(t.getItemVisual(e,"opacity"),o.opacity,1);r.useStyle(f.defaults({strokeNoScale:!0,fill:"none",stroke:h,opacity:c},o)),r.hoverStyle=a,f.each(g,function(t){var e=this.childOfName(t);e&&(e.setColor(h),e.setStyle({opacity:c}))},this);var m,v,y=s.getShallow("show"),x=l.getShallow("show"),_=this.childOfName("label");if(y||x){var b=i.getRawValue(e);v=null==b?v=t.getName(e):isFinite(b)?p.round(b):b,m=h||"#000"}if(y){var w=s.getModel("textStyle");_.setStyle({text:f.retrieve(i.getFormattedLabel(e,"normal",t.dataType),v),textFont:w.getFont(),fill:w.getTextColor()||m}),_.__textAlign=w.get("align"),_.__verticalAlign=w.get("baseline"),_.__position=s.get("position")}else _.setStyle("text","");if(x){var M=l.getModel("textStyle");_.hoverStyle={text:f.retrieve(i.getFormattedLabel(e,"emphasis",t.dataType),v),textFont:M.getFont(),fill:M.getTextColor()||m}}else _.hoverStyle={text:""};_.ignore=!y&&!x,d.setHoverStyle(this)},m.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},m.setLinePoints=function(t){var e=this.childOfName("line");a(e.shape,t),e.dirty()},f.inherits(l,d.Group),t.exports=l},function(t,e,n){function i(t){return isNaN(t[0])||isNaN(t[1])}function r(t){return!i(t[0])&&!i(t[1])}function o(t){this._ctor=t||s,this.group=new a.Group}var a=n(3),s=n(106),l=o.prototype;l.updateData=function(t){var e=this._lineData,n=this.group,i=this._ctor,o=t.hostModel,a={lineStyle:o.getModel("lineStyle.normal").getLineStyle(),hoverLineStyle:o.getModel("lineStyle.emphasis").getLineStyle(),labelModel:o.getModel("label.normal"),hoverLabelModel:o.getModel("label.emphasis")};t.diff(e).add(function(e){if(r(t.getItemLayout(e))){var o=new i(t,e,a);t.setItemGraphicEl(e,o),n.add(o)}}).update(function(o,s){var l=e.getItemGraphicEl(s);return r(t.getItemLayout(o))?(l?l.updateData(t,o,a):l=new i(t,o,a),t.setItemGraphicEl(o,l),void n.add(l)):void n.remove(l)}).remove(function(t){n.remove(e.getItemGraphicEl(t))}).execute(),this._lineData=t},l.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,n){e.updateLayout(t,n)},this)},l.remove=function(){this.group.removeAll()},t.exports=o},function(t,e,n){var i=n(1),r=n(2),o=r.PRIORITY;n(109),n(110),r.registerVisual(i.curry(n(50),"line","circle","line")),r.registerLayout(i.curry(n(61),"line")),r.registerProcessor(o.PROCESSOR.STATISTIC,i.curry(n(147),"line")),n(32)},function(t,e,n){"use strict";var i=n(28),r=n(17);t.exports=r.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return i(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}})},function(t,e,n){"use strict";function i(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++){var i=t[n],r=e[n];if(i[0]!==r[0]||i[1]!==r[1])return}return!0}}function r(t){return"number"==typeof t?t:t?.3:0}function o(t){var e=t.getGlobalExtent();if(t.onBand){var n=t.getBandWidth()/2-1,i=e[1]>e[0]?1:-1;e[0]+=i*n,e[1]-=i*n}return e}function a(t){return t>=0?1:-1}function s(t,e){var n=t.getBaseAxis(),i=t.getOtherAxis(n),r=n.onZero?0:i.scale.getExtent()[0],o=i.dim,s="x"===o||"radius"===o?1:0;return e.mapArray([o],function(i,l){for(var u,h=e.stackedOn;h&&a(h.get(o,l))===a(i);){u=h;break}var c=[];return c[s]=e.get(n.dim,l),c[1-s]=u?u.get(o,l,!0):r,t.dataToPoint(c)},!0)}function l(t,e,n){var i=o(t.getAxis("x")),r=o(t.getAxis("y")),a=t.getBaseAxis().isHorizontal(),s=Math.min(i[0],i[1]),l=Math.min(r[0],r[1]),u=Math.max(i[0],i[1])-s,h=Math.max(r[0],r[1])-l,c=n.get("lineStyle.normal.width")||2,d=n.get("clipOverflow")?c/2:Math.max(u,h);a?(l-=d,h+=2*d):(s-=d,u+=2*d);var f=new v.Rect({shape:{x:s,y:l,width:u,height:h}});return e&&(f.shape[a?"width":"height"]=0,v.initProps(f,{shape:{width:u,height:h}},n)),f}function u(t,e,n){var i=t.getAngleAxis(),r=t.getRadiusAxis(),o=r.getExtent(),a=i.getExtent(),s=Math.PI/180,l=new v.Sector({shape:{cx:t.cx,cy:t.cy,r0:o[0],r:o[1],startAngle:-a[0]*s,endAngle:-a[1]*s,clockwise:i.inverse}});return e&&(l.shape.endAngle=-a[0]*s,v.initProps(l,{shape:{endAngle:-a[1]*s}},n)),l}function h(t,e,n){return"polar"===t.type?u(t,e,n):l(t,e,n)}function c(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,o=[],a=0;a<t.length-1;a++){var s=t[a+1],l=t[a];o.push(l);var u=[];switch(n){case"end":u[r]=s[r],u[1-r]=l[1-r],o.push(u);break;case"middle":var h=(l[r]+s[r])/2,c=[];u[r]=c[r]=h,u[1-r]=l[1-r],c[1-r]=s[1-r],o.push(u),o.push(c);break;default:u[r]=l[r],u[1-r]=s[1-r],o.push(u)}}return t[a]&&o.push(t[a]),o}function d(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()){for(var i,r=n.length-1;r>=0;r--)if(n[r].dimension<2){i=n[r];break}if(i&&"cartesian2d"===e.type){var o=i.dimension,a=t.dimensions[o],s=e.getAxis(a),l=f.map(i.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),u=l.length,h=i.outerColors.slice();u&&l[0].coord>l[u-1].coord&&(l.reverse(),h.reverse());var c=10,d=l[0].coord-c,p=l[u-1].coord+c,g=p-d;if(g<.001)return"transparent";f.each(l,function(t){t.offset=(t.coord-d)/g}),l.push({offset:u?l[u-1].offset:.5,color:h[1]||"transparent"}),l.unshift({offset:u?l[0].offset:.5,color:h[0]||"transparent"});var m=new v.LinearGradient(0,0,0,0,l,(!0));return m[a]=d,m[a+"2"]=p,m}}}var f=n(1),p=n(44),g=n(54),m=n(111),v=n(3),y=n(5),x=n(93),_=n(30);t.exports=_.extend({type:"line",init:function(){var t=new v.Group,e=new p;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var o=t.coordinateSystem,a=this.group,l=t.getData(),u=t.getModel("lineStyle.normal"),p=t.getModel("areaStyle.normal"),g=l.mapArray(l.getItemLayout,!0),m="polar"===o.type,v=this._coordSys,y=this._symbolDraw,x=this._polyline,_=this._polygon,b=this._lineGroup,w=t.get("animation"),M=!p.isEmpty(),S=s(o,l),T=t.get("showSymbol"),A=T&&!m&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,o),I=this._data;I&&I.eachItemGraphicEl(function(t,e){t.__temp&&(a.remove(t),I.setItemGraphicEl(e,null))}),T||y.remove(),a.add(b);var C=!m&&t.get("step");x&&v.type===o.type&&C===this._step?(M&&!_?_=this._newPolygon(g,S,o,w):_&&!M&&(b.remove(_),_=this._polygon=null),b.setClipPath(h(o,!1,t)),T&&y.updateData(l,A),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),i(this._stackedOnPoints,S)&&i(this._points,g)||(w?this._updateAnimation(l,S,o,n,C):(C&&(g=c(g,o,C),S=c(S,o,C)),x.setShape({points:g}),_&&_.setShape({points:g,stackedOnPoints:S})))):(T&&y.updateData(l,A),C&&(g=c(g,o,C),S=c(S,o,C)),x=this._newPolyline(g,o,w),M&&(_=this._newPolygon(g,S,o,w)),b.setClipPath(h(o,!0,t)));var P=d(l,o)||l.getVisual("color");x.useStyle(f.defaults(u.getLineStyle(),{fill:"none",stroke:P,lineJoin:"bevel"}));var D=t.get("smooth");if(D=r(t.get("smooth")),x.setShape({smooth:D,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),_){var k=l.stackedOn,L=0;if(_.useStyle(f.defaults(p.getAreaStyle(),{fill:P,opacity:.7,lineJoin:"bevel"})),k){var O=k.hostModel;L=r(O.get("smooth"))}_.setShape({smooth:D,stackedOnSmooth:L,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=l,this._coordSys=o,this._stackedOnPoints=S,this._points=g,this._step=C},dispose:function(){},highlight:function(t,e,n,i){var r=t.getData(),o=y.queryDataIndex(r,i);if(!(o instanceof Array)&&null!=o&&o>=0){var a=r.getItemGraphicEl(o);if(!a){var s=r.getItemLayout(o);if(!s)return;a=new g(r,o),a.position=s,a.setZ(t.get("zlevel"),t.get("z")),a.ignore=isNaN(s[0])||isNaN(s[1]),a.__temp=!0,r.setItemGraphicEl(o,a),a.stopSymbolAnimation(!0),this.group.add(a)}a.highlight()}else _.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),o=y.queryDataIndex(r,i);if(null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else _.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new x.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new x.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n,n},_getSymbolIgnoreFunc:function(t,e){var n=e.getAxesByScale("ordinal")[0];if(n&&n.isLabelIgnored)return f.bind(n.isLabelIgnored,n)},_updateAnimation:function(t,e,n,i,r){var o=this._polyline,a=this._polygon,s=t.hostModel,l=m(this._data,t,this._stackedOnPoints,e,this._coordSys,n),u=l.current,h=l.stackedOnCurrent,d=l.next,f=l.stackedOnNext;r&&(u=c(l.current,n,r),h=c(l.stackedOnCurrent,n,r),d=c(l.next,n,r),f=c(l.stackedOnNext,n,r)),o.shape.__points=l.current,o.shape.points=u,v.updateProps(o,{shape:{points:d}},s),a&&(a.setShape({points:u,stackedOnPoints:h}),v.updateProps(a,{shape:{points:d,stackedOnPoints:f}},s));for(var p=[],g=l.status,y=0;y<g.length;y++){var x=g[y].cmd;if("="===x){var _=t.getItemGraphicEl(g[y].idx1);_&&p.push({el:_,ptIdx:y})}}o.animators&&o.animators.length&&o.animators[0].during(function(){for(var t=0;t<p.length;t++){var e=p[t].el;e.attr("position",o.shape.__points[p[t].ptIdx])}})},remove:function(t){var e=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl(function(t,i){t.__temp&&(e.remove(t),n.setItemGraphicEl(i,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}})},function(t,e){function n(t){return t>=0?1:-1}function i(t,e,i){for(var r,o=t.getBaseAxis(),a=t.getOtherAxis(o),s=o.onZero?0:a.scale.getExtent()[0],l=a.dim,u="x"===l||"radius"===l?1:0,h=e.stackedOn,c=e.get(l,i);h&&n(h.get(l,i))===n(c);){r=h;break}var d=[];return d[u]=e.get(o.dim,i),d[1-u]=r?r.get(l,i,!0):s,t.dataToPoint(d)}function r(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}t.exports=function(t,e,n,o,a,s){for(var l=r(t,e),u=[],h=[],c=[],d=[],f=[],p=[],g=[],m=s.dimensions,v=0;v<l.length;v++){var y=l[v],x=!0;switch(y.cmd){case"=":var _=t.getItemLayout(y.idx),b=e.getItemLayout(y.idx1);(isNaN(_[0])||isNaN(_[1]))&&(_=b.slice()),u.push(_),h.push(b),c.push(n[y.idx]),d.push(o[y.idx1]),g.push(e.getRawIndex(y.idx1));break;case"+":var w=y.idx;u.push(a.dataToPoint([e.get(m[0],w,!0),e.get(m[1],w,!0)])),h.push(e.getItemLayout(w).slice()),c.push(i(a,e,w)),d.push(o[w]),g.push(e.getRawIndex(w));break;case"-":var w=y.idx,M=t.getRawIndex(w);M!==w?(u.push(t.getItemLayout(w)),h.push(s.dataToPoint([t.get(m[0],w,!0),t.get(m[1],w,!0)])),c.push(n[w]),d.push(i(s,t,w)),g.push(M)):x=!1}x&&(f.push(y),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});for(var S=[],T=[],A=[],I=[],C=[],v=0;v<p.length;v++){var w=p[v];S[v]=u[w],T[v]=h[w],A[v]=c[w],I[v]=d[w],C[v]=f[w]}return{current:S,next:T,stackedOnCurrent:A,stackedOnNext:I,status:C}}},function(t,e,n){var i=n(1),r=n(2);n(113),n(114),n(89)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),r.registerVisual(i.curry(n(84),"pie")),r.registerLayout(i.curry(n(116),"pie")),r.registerProcessor(i.curry(n(63),"pie"))},function(t,e,n){"use strict";var i=n(14),r=n(1),o=n(5),a=n(25),s=n(78),l=n(2).extendSeriesModel({type:"series.pie",init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(t.data),this._defaultLabelLine(t)},mergeOption:function(t){l.superCall(this,"mergeOption",t),this.updateSelectedMap(this.option.data)},getInitialData:function(t,e){var n=a(["value"],t.data),r=new i(n,this);return r.initData(t.data),r},getDataParams:function(t){var e=this.getData(),n=l.superCall(this,"getDataParams",t),i=e.getSum("value");return n.percent=i?+(e.get("value",t)/i*100).toFixed(2):0,n.$vars.push("percent"),n},_defaultLabelLine:function(t){o.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,n=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,n.show=n.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,stillShowZeroSum:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderWidth:1},emphasis:{}},animationType:"expansion",animationEasing:"cubicOut",data:[]}});r.mixin(l,s),t.exports=l},function(t,e,n){function i(t,e,n,i){var o=e.getData(),a=this.dataIndex,s=o.getName(a),l=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),o.each(function(t){r(o.getItemGraphicEl(t),o.getItemLayout(t),e.isSelected(o.getName(t)),l,n)})}function r(t,e,n,i,r){var o=(e.startAngle+e.endAngle)/2,a=Math.cos(o),s=Math.sin(o),l=n?i:0,u=[a*l,s*l];r?t.animate().when(200,{position:u}).start("bounceOut"):t.attr("position",u)}function o(t,e){function n(){o.ignore=o.hoverIgnore,a.ignore=a.hoverIgnore}function i(){o.ignore=o.normalIgnore,a.ignore=a.normalIgnore}s.Group.call(this);var r=new s.Sector({z2:2}),o=new s.Polyline,a=new s.Text;this.add(r),this.add(o),this.add(a),this.updateData(t,e,!0),this.on("emphasis",n).on("normal",i).on("mouseover",n).on("mouseout",i)}function a(t,e,n,i,r){var o=i.getModel("textStyle"),a="inside"===r||"inner"===r;return{fill:o.getTextColor()||(a?"#fff":t.getItemVisual(e,"color")),opacity:t.getItemVisual(e,"opacity"),textFont:o.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,n),t.getName(e))}}var s=n(3),l=n(1),u=o.prototype;u.updateData=function(t,e,n){function i(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r+10}},300,"elasticOut")}function o(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r}},300,"elasticOut")}var a=this.childAt(0),u=t.hostModel,h=t.getItemModel(e),c=t.getItemLayout(e),d=l.extend({},c);if(d.label=null,n){a.setShape(d);var f=u.getShallow("animationType");"scale"===f?(a.shape.r=c.r0,s.initProps(a,{shape:{r:c.r}},u,e)):(a.shape.endAngle=c.startAngle,s.updateProps(a,{shape:{endAngle:c.endAngle}},u,e))}else s.updateProps(a,{shape:d},u,e);var p=h.getModel("itemStyle"),g=t.getItemVisual(e,"color");a.useStyle(l.defaults({lineJoin:"bevel",fill:g},p.getModel("normal").getItemStyle())),a.hoverStyle=p.getModel("emphasis").getItemStyle(),r(this,t.getItemLayout(e),h.get("selected"),u.get("selectedOffset"),u.get("animation")),a.off("mouseover").off("mouseout").off("emphasis").off("normal"),h.get("hoverAnimation")&&u.isAnimationEnabled()&&a.on("mouseover",i).on("mouseout",o).on("emphasis",i).on("normal",o),this._updateLabel(t,e),s.setHoverStyle(this)},u._updateLabel=function(t,e){
+var n=this.childAt(1),i=this.childAt(2),r=t.hostModel,o=t.getItemModel(e),l=t.getItemLayout(e),u=l.label,h=t.getItemVisual(e,"color");s.updateProps(n,{shape:{points:u.linePoints||[[u.x,u.y],[u.x,u.y],[u.x,u.y]]}},r,e),s.updateProps(i,{style:{x:u.x,y:u.y}},r,e),i.attr({style:{textVerticalAlign:u.verticalAlign,textAlign:u.textAlign,textFont:u.font},rotation:u.rotation,origin:[u.x,u.y],z2:10});var c=o.getModel("label.normal"),d=o.getModel("label.emphasis"),f=o.getModel("labelLine.normal"),p=o.getModel("labelLine.emphasis"),g=c.get("position")||d.get("position");i.setStyle(a(t,e,"normal",c,g)),i.ignore=i.normalIgnore=!c.get("show"),i.hoverIgnore=!d.get("show"),n.ignore=n.normalIgnore=!f.get("show"),n.hoverIgnore=!p.get("show"),n.setStyle({stroke:h,opacity:t.getItemVisual(e,"opacity")}),n.setStyle(f.getModel("lineStyle").getLineStyle()),i.hoverStyle=a(t,e,"emphasis",d,g),n.hoverStyle=p.getModel("lineStyle").getLineStyle();var m=f.get("smooth");m&&m===!0&&(m=.4),n.setShape({smooth:m})},l.inherits(o,s.Group);var h=n(30).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,n,r){if(!r||r.from!==this.uid){var a=t.getData(),s=this._data,u=this.group,h=e.get("animation"),c=!s,d=t.get("animationType"),f=l.curry(i,this.uid,t,h,n),p=t.get("selectedMode");if(a.diff(s).add(function(t){var e=new o(a,t);c&&"scale"!==d&&e.eachChild(function(t){t.stopAnimation(!0)}),p&&e.on("click",f),a.setItemGraphicEl(t,e),u.add(e)}).update(function(t,e){var n=s.getItemGraphicEl(e);n.updateData(a,t),n.off("click"),p&&n.on("click",f),u.add(n),a.setItemGraphicEl(t,n)}).remove(function(t){var e=s.getItemGraphicEl(t);u.remove(e)}).execute(),h&&c&&a.count()>0&&"scale"!==d){var g=a.getItemLayout(0),m=Math.max(n.getWidth(),n.getHeight())/2,v=l.bind(u.removeClipPath,u);u.setClipPath(this._createClipPath(g.cx,g.cy,m,g.startAngle,g.clockwise,v,t))}this._data=a}},dispose:function(){},_createClipPath:function(t,e,n,i,r,o,a){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return s.initProps(l,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},a,o),l},containPoint:function(t,e){var n=e.getData(),i=n.getItemLayout(0);if(i){var r=t[0]-i.cx,o=t[1]-i.cy,a=Math.sqrt(r*r+o*o);return a<=i.r&&a>=i.r0}}});t.exports=h},function(t,e,n){"use strict";function i(t,e,n,i,r,o,a){function s(e,n,i,r){for(var o=e;o<n;o++)if(t[o].y+=i,o>e&&o+1<n&&t[o+1].y>t[o].y+t[o].height)return void l(o,i/2);l(n-1,i/2)}function l(e,n){for(var i=e;i>=0&&(t[i].y-=n,!(i>0&&t[i].y>t[i-1].y+t[i-1].height));i--);}function u(t,e,n,i,r,o){for(var a=o>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var u=Math.abs(t[s].y-i),h=t[s].len,c=t[s].len2,d=u<r+h?Math.sqrt((r+h+c)*(r+h+c)-u*u):Math.abs(t[s].x-n);e&&d>=a&&(d=a-10),!e&&d<=a&&(d=a+10),t[s].x=n+d*o,a=d}}t.sort(function(t,e){return t.y-e.y});for(var h,c=0,d=t.length,f=[],p=[],g=0;g<d;g++)h=t[g].y-c,h<0&&s(g,d,-h,r),c=t[g].y+t[g].height;a-c<0&&l(d-1,c-a);for(var g=0;g<d;g++)t[g].y>=n?p.push(t[g]):f.push(t[g]);u(f,!1,e,n,i,r),u(p,!0,e,n,i,r)}function r(t,e,n,r,o,a){for(var s=[],l=[],u=0;u<t.length;u++)t[u].x<e?s.push(t[u]):l.push(t[u]);i(l,e,n,r,1,o,a),i(s,e,n,r,-1,o,a);for(var u=0;u<t.length;u++){var h=t[u].linePoints;if(h){var c=h[1][0]-h[2][0];t[u].x<e?h[2][0]=t[u].x+3:h[2][0]=t[u].x-3,h[1][1]=h[2][1]=t[u].y,h[1][0]=h[2][0]+c}}}var o=n(16);t.exports=function(t,e,n,i){var a,s,l=t.getData(),u=[],h=!1;l.each(function(n){var i,r,c,d,f=l.getItemLayout(n),p=l.getItemModel(n),g=p.getModel("label.normal"),m=g.get("position")||p.get("label.emphasis.position"),v=p.getModel("labelLine.normal"),y=v.get("length"),x=v.get("length2"),_=(f.startAngle+f.endAngle)/2,b=Math.cos(_),w=Math.sin(_);a=f.cx,s=f.cy;var M="inside"===m||"inner"===m;if("center"===m)i=f.cx,r=f.cy,d="center";else{var S=(M?(f.r+f.r0)/2*b:f.r*b)+a,T=(M?(f.r+f.r0)/2*w:f.r*w)+s;if(i=S+3*b,r=T+3*w,!M){var A=S+b*(y+e-f.r),I=T+w*(y+e-f.r),C=A+(b<0?-1:1)*x,P=I;i=C+(b<0?-5:5),r=P,c=[[S,T],[A,I],[C,P]]}d=M?"center":b>0?"left":"right"}var D=g.getModel("textStyle").getFont(),k=g.get("rotate")?b<0?-_+Math.PI:-_:0,L=t.getFormattedLabel(n,"normal")||l.getName(n),O=o.getBoundingRect(L,D,d,"top");h=!!k,f.label={x:i,y:r,position:m,height:O.height,len:y,len2:x,linePoints:c,textAlign:d,verticalAlign:"middle",font:D,rotation:k},M||u.push(f.label)}),!h&&t.get("avoidLabelOverlap")&&r(u,a,s,e,n,i)}},function(t,e,n){var i=n(4),r=i.parsePercent,o=n(115),a=n(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,n,u){e.eachSeriesByType(t,function(t){var e=t.get("center"),u=t.get("radius");a.isArray(u)||(u=[0,u]),a.isArray(e)||(e=[e,e]);var h=n.getWidth(),c=n.getHeight(),d=Math.min(h,c),f=r(e[0],h),p=r(e[1],c),g=r(u[0],d/2),m=r(u[1],d/2),v=t.getData(),y=-t.get("startAngle")*l,x=t.get("minAngle")*l,_=0;v.each("value",function(t){!isNaN(t)&&_++});var b=v.getSum("value"),w=Math.PI/(b||_)*2,M=t.get("clockwise"),S=t.get("roseType"),T=t.get("stillShowZeroSum"),A=v.getDataExtent("value");A[0]=0;var I=s,C=0,P=y,D=M?1:-1;if(v.each("value",function(t,e){var n;if(isNaN(t))return void v.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:M,cx:f,cy:p,r0:g,r:S?NaN:m});n="area"!==S?0===b&&T?w:t*w:s/_,n<x?(n=x,I-=x):C+=t;var r=P+D*n;v.setItemLayout(e,{angle:n,startAngle:P,endAngle:r,clockwise:M,cx:f,cy:p,r0:g,r:S?i.linearMap(t,A,[g,m]):m}),P=r},!0),I<s&&_)if(I<=.001){var k=s/_;v.each("value",function(t,e){if(!isNaN(t)){var n=v.getItemLayout(e);n.angle=k,n.startAngle=y+D*e*k,n.endAngle=y+D*(e+1)*k}})}else w=I/C,P=y,v.each("value",function(t,e){if(!isNaN(t)){var n=v.getItemLayout(e),i=n.angle===x?x:t*w;n.startAngle=P,n.endAngle=P+D*i,P+=D*i}});o(t,m,h,c)})}},function(t,e,n){"use strict";n(60),n(118)},function(t,e,n){var i=n(1),r=n(3),o=n(40),a=n(41),s=n(75),l=o.ifIgnoreOnTick,u=o.getInterval,h=["axisLine","axisLabel","axisTick","axisName"],c=["splitArea","splitLine"],d=a.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,n,a){this.group.removeAll();var l=this._axisGroup;if(this._axisGroup=new r.Group,this.group.add(this._axisGroup),t.get("show")){var u=t.getCoordSysModel(),f=s.layout(u,t),p=new o(t,f);i.each(h,p.add,p),this._axisGroup.add(p.getGroup()),i.each(c,function(e){t.get(e+".show")&&this["_"+e](t,u,f.labelInterval)},this),r.groupTransition(l,this._axisGroup,t),d.superCall(this,"render",t,e,n,a)}},_splitLine:function(t,e,n){var o=t.axis;if(!o.scale.isBlank()){var a=t.getModel("splitLine"),s=a.getModel("lineStyle"),h=s.get("color"),c=u(a,n);h=i.isArray(h)?h:[h];for(var d=e.coordinateSystem.getRect(),f=o.isHorizontal(),p=0,g=o.getTicksCoords(),m=o.scale.getTicks(),v=[],y=[],x=s.getLineStyle(),_=0;_<g.length;_++)if(!l(o,_,c)){var b=o.toGlobalCoord(g[_]);f?(v[0]=b,v[1]=d.y,y[0]=b,y[1]=d.y+d.height):(v[0]=d.x,v[1]=b,y[0]=d.x+d.width,y[1]=b);var w=p++%h.length;this._axisGroup.add(new r.Line(r.subPixelOptimizeLine({anid:"line_"+m[_],shape:{x1:v[0],y1:v[1],x2:y[0],y2:y[1]},style:i.defaults({stroke:h[w]},x),silent:!0})))}}},_splitArea:function(t,e,n){var o=t.axis;if(!o.scale.isBlank()){var a=t.getModel("splitArea"),s=a.getModel("areaStyle"),h=s.get("color"),c=e.coordinateSystem.getRect(),d=o.getTicksCoords(),f=o.scale.getTicks(),p=o.toGlobalCoord(d[0]),g=o.toGlobalCoord(d[0]),m=0,v=u(a,n),y=s.getAreaStyle();h=i.isArray(h)?h:[h];for(var x=1;x<d.length;x++)if(!l(o,x,v)){var _,b,w,M,S=o.toGlobalCoord(d[x]);o.isHorizontal()?(_=p,b=c.y,w=S-_,M=c.height):(_=c.x,b=g,w=c.width,M=S-b);var T=m++%h.length;this._axisGroup.add(new r.Rect({anid:"area_"+f[x],shape:{x:_,y:b,width:w,height:M},style:i.defaults({fill:h[T]},y),silent:!0})),p=_+w,g=b+M}}}});d.extend({type:"xAxis"}),d.extend({type:"yAxis"})},function(t,e,n){"use strict";function i(){}function r(t,e,n,i){o(f(n).lastProp,i)||(f(n).lastProp=i,e?d.updateProps(n,i,t):(n.stopAnimation(),n.attr(i)))}function o(t,e){if(h.isObject(t)&&h.isObject(e)){var n=!0;return h.each(e,function(e,i){n&=o(t[i],e)}),!!n}return t===e}function a(t,e){t[e.get("label.show")?"show":"hide"]()}function s(t){return{position:t.position.slice(),rotation:t.rotation||0}}function l(t,e){var n=t.get("icon"),i={x:-1,y:-1,width:2,height:2},r=h.extend({style:{strokeNoScale:!0},rectHover:!0,cursor:"move",draggable:!0},e);return 0===n.indexOf("image://")?(i.image=n.slice(8),r.style=i,new d.Image(r)):d.makePath(n.replace("path://",""),r,i,"center")}function u(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)})}var h=n(1),c=n(15),d=n(3),f=n(5).makeGetter(),p=n(45),g=n(21),m=n(37),v=h.clone,y=h.bind;i.prototype={_group:null,_lastGraphicKey:null,_handle:null,_dragging:!1,_lastValue:null,_lastStatus:null,_payloadInfo:null,animationThreshold:15,render:function(t,e,n,i){var o=e.get("value"),a=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==o||this._lastStatus!==a){this._lastValue=o,this._lastStatus=a;var s=this._group,l=this._handle;if(!a||"hide"===a)return s&&s.hide(),void(l&&l.hide());s&&s.show(),l&&l.show();var c={};this.makeElOption(c,o,t,e,n);var f=c.graphicKey;f!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=f;var p=this._moveAnimation=this.determineAnimation(t,e);if(s){var g=h.curry(r,e,p);this.updatePointerEl(s,c,g,e),this.updateLabelEl(s,c,g,e)}else s=this._group=new d.Group,this.createPointerEl(s,c,t,e),this.createLabelEl(s,c,t,e),n.getZr().add(s);u(s,e,!0),this._renderHandle(o)}},remove:function(t){this.clear(t)},dispose:function(t){this.clear(t)},determineAnimation:function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=p.getAxisInfo(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return n===!0},makeElOption:function(t,e,n,i,r){},createPointerEl:function(t,e,n,i){var r=e.pointer;if(r){var o=f(t).pointerEl=new d[r.type](v(e.pointer));t.add(o)}},createLabelEl:function(t,e,n,i){if(e.label){var r=f(t).labelEl=new d.Rect(v(e.label));t.add(r),a(r,i)}},updatePointerEl:function(t,e,n){var i=f(t).pointerEl;i&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,n,i){var r=f(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{shape:e.label.shape,position:e.label.position}),a(r,i))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e=this._axisPointerModel,n=this._api.getZr(),i=this._handle,r=e.getModel("handle"),o=e.get("status");if(!r.get("show")||!o||"hide"===o)return i&&n.remove(i),void(this._handle=null);var a;this._handle||(a=!0,i=this._handle=l(r,{onmousemove:function(t){g.stop(t.event)},onmousedown:y(this._onHandleDragMove,this,0,0),drift:y(this._onHandleDragMove,this),ondragend:y(this._onHandleDragEnd,this)}),n.add(i)),u(i,e,!1);var s=["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];i.setStyle(r.getItemStyle(null,s));var c=r.get("size");h.isArray(c)||(c=[c,c]),i.attr("scale",[c[0]/2,c[1]/2]),m.createOrUpdate(this,"_doDispatchAxisPointer",r.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,a)}},_moveHandleToValue:function(t,e){r(this._axisPointerModel,!e&&this._moveAnimation,this._handle,s(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(s(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(s(i)),f(n).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){var t=this._handle;if(t){var e=this._payloadInfo,n=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:e.cursorPoint[0],y:e.cursorPoint[1],tooltipOption:e.tooltipOption,axesInfo:[{axisDim:n.axis.dim,axisIndex:n.componentIndex}]})}},_onHandleDragEnd:function(t){this._dragging=!1;var e=this._handle;if(e){var n=this._axisPointerModel.get("value");this._moveHandleToValue(n),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,n){return n=n||0,{x:t[n],y:t[1-n],width:e[n],height:e[1-n]}}},i.prototype.constructor=i,c.enableClassExtend(i),t.exports=i},function(t,e,n){"use strict";function i(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}function r(t){return"x"===t.dim?0:1}var o=n(3),a=n(119),s=n(76),l=n(75),u=n(41),h=a.extend({makeElOption:function(t,e,n,r,o){var a=n.axis,u=a.grid,h=r.get("type"),d=i(u,a).getOtherAxis(a).getGlobalExtent(),f=a.toGlobalCoord(a.dataToCoord(e,!0));if(h&&"none"!==h){var p=s.buildElStyle(r),g=c[h](a,f,d,p);g.style=p,t.graphicKey=g.type,t.pointer=g}var m=l.layout(u.model,n);s.buildCartesianSingleLabelElOption(e,t,m,n,r,o)},getHandleTransform:function(t,e,n){var i=l.layout(e.axis.grid.model,e,{labelInside:!1});return i.labelMargin=n.get("handle.margin"),{position:s.getTransformedPosition(e.axis,t,i),rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,n,r){var o=n.axis,a=o.grid,s=o.getGlobalExtent(!0),l=i(a,o).getOtherAxis(o).getGlobalExtent(),u="x"===o.dim?0:1,h=t.position;h[u]+=e[u],h[u]=Math.min(s[1],h[u]),h[u]=Math.max(s[0],h[u]);var c=(l[1]+l[0])/2,d=[c,c];d[u]=h[u];var f=[{verticalAlign:"middle"},{align:"center"}];return{position:h,rotation:t.rotation,cursorPoint:d,tooltipOption:f[u]}}}),c={line:function(t,e,n,i){var a=s.makeLineShape([e,n[0]],[e,n[1]],r(t));return o.subPixelOptimizeLine({shape:a,style:i}),{type:"Line",shape:a}},shadow:function(t,e,n,i){var o=t.getBandWidth(),a=n[1]-n[0];return{type:"Rect",shape:s.makeRectShape([e-o/2,n[0]],[o,a],r(t))}}};u.registerAxisPointerClass("CartesianAxisPointer",h),t.exports=h},function(t,e,n){var i=n(1),r=n(5);t.exports=function(t,e){var n,o=[],a=t.seriesIndex;if(null==a||!(n=e.getSeriesByIndex(a)))return{point:[]};var s=n.getData(),l=r.queryDataIndex(s,t);if(null==l||i.isArray(l))return{point:[]};var u=s.getItemGraphicEl(l),h=n.coordinateSystem;if(n.getTooltipPosition)o=n.getTooltipPosition(l)||[];else if(h&&h.dataToPoint)o=h.dataToPoint(s.getValues(i.map(h.dimensions,function(t){return n.coordDimToDataDim(t)[0]}),l,!0))||[];else if(u){var c=u.getBoundingRect().clone();c.applyTransform(u.transform),o=[c.x+c.width/2,c.y+c.height/2]}return{point:o,el:u}}},function(t,e,n){function i(t,e){function n(n,i){t.on(n,function(n){var o=s(e);c(h(t).records,function(t){t&&i(t,n,o.dispatchAction)}),r(o.pendings,e)})}h(t).initialized||(h(t).initialized=!0,n("click",u.curry(a,"click")),n("mousemove",u.curry(a,"mousemove")),n("globalout",o))}function r(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]),n&&(n.dispatchAction=null,e.dispatchAction(n))}function o(t,e,n){t.handler("leave",null,n)}function a(t,e,n,i){e.handler(t,n,i)}function s(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}var l=n(9),u=n(1),h=n(5).makeGetter(),c=u.each,d={};d.register=function(t,e,n){if(!l.node){var r=e.getZr();h(r).records||(h(r).records={}),i(r,e);var o=h(r).records[t]||(h(r).records[t]={});o.handler=n}},d.unregister=function(t,e){if(!l.node){var n=e.getZr(),i=(h(n).records||{})[t];i&&(h(n).records[t]=null)}},t.exports=d},function(t,e,n){var i=n(1),r=n(77),o=n(2);o.registerAction("dataZoom",function(t,e){var n=r.createLinkedNodesFinder(i.bind(e.eachComponent,e,"dataZoom"),r.eachAxisDim,function(t,e){return t.get(e.axisIndex)}),o=[];e.eachComponent({mainType:"dataZoom",query:t},function(t,e){o.push.apply(o,n(t).nodes)}),i.each(o,function(e,n){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})})},function(t,e,n){function i(t,e,n){n.getAxisProxy(t.name,e).reset(n)}function r(t,e,n){n.getAxisProxy(t.name,e).filterData(n)}var o=n(2);o.registerProcessor(function(t,e){t.eachComponent("dataZoom",function(t){t.eachTargetAxis(i),t.eachTargetAxis(r)}),t.eachComponent("dataZoom",function(t){var e=t.findRepresentativeAxisProxy(),n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setRawRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]},!0)})})},function(t,e,n){function i(t){var e=t[a];return e||(e=t[a]=[{}]),e}var r=n(1),o=r.each,a="\0_ec_hist_store",s={push:function(t,e){var n=i(t);o(e,function(e,i){for(var r=n.length-1;r>=0;r--){var o=n[r];if(o[i])break}if(r<0){var a=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(a){var s=a.getPercentRange();n[0][i]={dataZoomId:i,start:s[0],end:s[1]}}}}),n.push(e)},pop:function(t){var e=i(t),n=e[e.length-1];e.length>1&&e.pop();var r={};return o(n,function(t,n){for(var i=e.length-1;i>=0;i--){var t=e[i][n];if(t){r[n]=t;break}}}),r},clear:function(t){t[a]=null},count:function(t){return i(t).length}};t.exports=s},function(t,e,n){n(13).registerSubTypeDefaulter("dataZoom",function(t){return"slider"})},function(t,e,n){function i(t){B.call(this),this._zr=t,this.group=new F.Group,this._brushType,this._brushOption,this._panels,this._track=[],this._dragging,this._covers=[],this._creatingCover,this._creatingPanel,this._enableGlobalPan,this._uid="brushController_"+nt++,this._handlers={},Z(it,function(t,e){this._handlers[e]=V.bind(t,this)},this)}function r(t,e){var n=t._zr;t._enableGlobalPan||G.take(n,Q,t._uid),Z(t._handlers,function(t,e){n.on(e,t)}),t._brushType=e.brushType,t._brushOption=V.merge(V.clone(et),e,!0)}function o(t){var e=t._zr;G.release(e,Q,t._uid),Z(t._handlers,function(t,n){e.off(n,t)}),t._brushType=t._brushOption=null}function a(t,e){var n=rt[e.brushType].createCover(t,e);return n.__brushOption=e,u(n,e),t.group.add(n),n}function s(t,e){var n=c(e);return n.endCreating&&(n.endCreating(t,e),u(e,e.__brushOption)),e}function l(t,e){var n=e.__brushOption;c(e).updateCoverShape(t,e,n.range,n)}function u(t,e){var n=e.z;null==n&&(n=Y),t.traverse(function(t){t.z=n,t.z2=n})}function h(t,e){c(e).updateCommon(t,e),l(t,e)}function c(t){return rt[t.__brushOption.brushType]}function d(t,e,n){var i=t._panels;if(!i)return!0;var r,o=t._transform;return Z(i,function(t){t.isTargetByCursor(e,n,o)&&(r=t)}),r}function f(t,e){var n=t._panels;if(!n)return!0;var i=e.__brushOption.panelId;return null==i||n[i]}function p(t){var e=t._covers,n=e.length;return Z(e,function(e){t.group.remove(e)},t),e.length=0,!!n}function g(t,e){var n=q(t._covers,function(t){var e=t.__brushOption,n=V.clone(e.range);return{brushType:e.brushType,panelId:e.panelId,range:n}});t.trigger("brush",n,{isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function m(t){var e=t._track;if(!e.length)return!1;var n=e[e.length-1],i=e[0],r=n[0]-i[0],o=n[1]-i[1],a=X(r*r+o*o,.5);return a>$}function v(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function y(t,e,n,i){var r=new F.Group;return r.add(new F.Rect({name:"main",style:w(n),silent:!0,draggable:!0,cursor:"move",drift:W(t,e,r,"nswe"),ondragend:W(g,e,{isEnd:!0})})),Z(i,function(n){r.add(new F.Rect({name:n,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:W(t,e,r,n),ondragend:W(g,e,{isEnd:!0})}))}),r}function x(t,e,n,i){var r=i.brushStyle.lineWidth||0,o=U(r,K),a=n[0][0],s=n[1][0],l=a-r/2,u=s-r/2,h=n[0][1],c=n[1][1],d=h-o+r/2,f=c-o+r/2,p=h-a,g=c-s,m=p+r,v=g+r;b(t,e,"main",a,s,p,g),i.transformable&&(b(t,e,"w",l,u,o,v),b(t,e,"e",d,u,o,v),b(t,e,"n",l,u,m,o),b(t,e,"s",l,f,m,o),b(t,e,"nw",l,u,o,o),b(t,e,"ne",d,u,o,o),b(t,e,"sw",l,f,o,o),b(t,e,"se",d,f,o,o))}function _(t,e){var n=e.__brushOption,i=n.transformable,r=e.childAt(0);r.useStyle(w(n)),r.attr({silent:!i,cursor:i?"move":"default"}),Z(["w","e","n","s","se","sw","ne","nw"],function(n){var r=e.childOfName(n),o=T(t,n);r&&r.attr({silent:!i,invisible:!i,cursor:i?tt[o]+"-resize":null})})}function b(t,e,n,i,r,o,a){var s=e.childOfName(n);s&&s.setShape(D(P(t,e,[[i,r],[i+o,r+a]])))}function w(t){return V.defaults({strokeNoScale:!0},t.brushStyle)}function M(t,e,n,i){var r=[j(t,n),j(e,i)],o=[U(t,n),U(e,i)];return[[r[0],o[0]],[r[1],o[1]]]}function S(t){return F.getTransform(t.group)}function T(t,e){if(e.length>1){e=e.split("");var n=[T(t,e[0]),T(t,e[1])];return("e"===n[0]||"w"===n[0])&&n.reverse(),n.join("")}var i={w:"left",e:"right",n:"top",s:"bottom"},r={left:"w",right:"e",top:"n",bottom:"s"},n=F.transformDirection(i[e],S(t));return r[n]}function A(t,e,n,i,r,o,a,s){var l=i.__brushOption,u=t(l.range),c=C(n,o,a);Z(r.split(""),function(t){var e=J[t];u[e[0]][e[1]]+=c[e[0]]}),l.range=e(M(u[0][0],u[1][0],u[0][1],u[1][1])),h(n,i),g(n,{isEnd:!1})}function I(t,e,n,i,r){var o=e.__brushOption.range,a=C(t,n,i);Z(o,function(t){t[0]+=a[0],t[1]+=a[1]}),h(t,e),g(t,{isEnd:!1})}function C(t,e,n){var i=t.group,r=i.transformCoordToLocal(e,n),o=i.transformCoordToLocal(0,0);return[r[0]-o[0],r[1]-o[1]]}function P(t,e,n){var i=f(t,e);return i&&i!==!0?i.clipPath(n,t._transform):V.clone(n)}function D(t){var e=j(t[0][0],t[1][0]),n=j(t[0][1],t[1][1]),i=U(t[0][0],t[1][0]),r=U(t[0][1],t[1][1]);return{x:e,y:n,width:i-e,height:r-n}}function k(t,e,n){if(t._brushType){var i=t._zr,r=t._covers,o=d(t,e,n);if(!t._dragging)for(var a=0;a<r.length;a++){var s=r[a].__brushOption;if(o&&(o===!0||s.panelId===o.panelId)&&rt[s.brushType].contain(r[a],n[0],n[1]))return}o&&i.setCursorStyle("crosshair")}}function L(t){var e=t.event;e.preventDefault&&e.preventDefault()}function O(t,e,n){return t.childOfName("main").contain(e,n)}function z(t,e,n,i){var r,o=t._creatingCover,u=t._creatingPanel,h=t._brushOption;if(t._track.push(n.slice()),m(t)||o){if(u&&!o){"single"===h.brushMode&&p(t);var c=V.clone(h);c.brushType=E(c.brushType,u),c.panelId=u===!0?null:u.panelId,o=t._creatingCover=a(t,c),t._covers.push(o)}if(o){var f=rt[E(t._brushType,u)],g=o.__brushOption;g.range=f.getCreatingRange(P(t,o,t._track)),i&&(s(t,o),f.updateCommon(t,o)),l(t,o),r={isEnd:i}}}else i&&"single"===h.brushMode&&h.removeOnClick&&d(t,e,n)&&p(t)&&(r={isEnd:i,removeOnClick:!0});return r}function E(t,e){return"auto"===t?e.defaultBrushType:t}function N(t){if(this._dragging){L(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY),n=z(this,t,e,!0);this._dragging=!1,this._track=[],this._creatingCover=null,n&&g(this,n)}}function R(t){return{createCover:function(e,n){return y(W(A,function(e){var n=[e,[0,100]];return t&&n.reverse(),n},function(e){return e[t]}),e,n,[["w","e"],["n","s"]][t])},getCreatingRange:function(e){var n=v(e),i=j(n[0][t],n[1][t]),r=U(n[0][t],n[1][t]);return[i,r]},updateCoverShape:function(e,n,i,r){var o,a=f(e,n);if(a!==!0&&a.getLinearBrushOtherExtent)o=a.getLinearBrushOtherExtent(t,e._transform);else{var s=e._zr;o=[0,[s.getWidth(),s.getHeight()][1-t]]}var l=[i,o];t&&l.reverse(),x(e,n,l,r)},updateCommon:_,contain:O}}var B=n(23),V=n(1),F=n(3),G=n(129),H=n(48),W=V.curry,Z=V.each,q=V.map,j=Math.min,U=Math.max,X=Math.pow,Y=1e4,$=6,K=6,Q="globalPan",J={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},tt={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},et={brushStyle:{lineWidth:2,stroke:"rgba(0,0,0,0.3)",fill:"rgba(0,0,0,0.1)"},transformable:!0,brushMode:"single",removeOnClick:!1},nt=0;i.prototype={constructor:i,enableBrush:function(t){return this._brushType&&o(this),t.brushType&&r(this,t),this},setPanels:function(t){if(t&&t.length){var e=this._panels={};V.each(t,function(t){e[t.panelId]=V.clone(t)})}else this._panels=null;return this},mount:function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({position:t.position||[0,0],rotation:t.rotation||0,scale:t.scale||[1,1]}),this._transform=e.getLocalTransform(),this},eachCover:function(t,e){Z(this._covers,t,e)},updateCovers:function(t){function e(t,e){return(null!=t.id?t.id:o+e)+"-"+t.brushType}function n(t,n){return e(t.__brushOption,n)}function i(e,n){var i=t[e];if(null!=n&&l[n]===d)u[e]=l[n];else{var r=u[e]=null!=n?(l[n].__brushOption=i,l[n]):s(c,a(c,i));h(c,r)}}function r(t){l[t]!==d&&c.group.remove(l[t])}t=V.map(t,function(t){return V.merge(V.clone(et),t,!0)});var o="\0-brush-index-",l=this._covers,u=this._covers=[],c=this,d=this._creatingCover;return new H(l,t,n,e).add(i).update(i).remove(r).execute(),this},unmount:function(){return this.enableBrush(!1),p(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},V.mixin(i,B);var it={mousedown:function(t){if(this._dragging)N.call(this,t);else if(!t.target||!t.target.draggable){L(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null;var n=this._creatingPanel=d(this,t,e);n&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);if(k(this,t,e),this._dragging){L(t);var n=z(this,t,e,!1);n&&g(this,n)}},mouseup:N},rt={lineX:R(0),lineY:R(1),rect:{createCover:function(t,e){return y(W(A,function(t){return t},function(t){return t}),t,e,["w","e","n","s","se","sw","ne","nw"])},getCreatingRange:function(t){var e=v(t);return M(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,n,i){x(t,e,n,i)},updateCommon:_,contain:O},polygon:{createCover:function(t,e){var n=new F.Group;return n.add(new F.Polyline({name:"main",style:w(e),silent:!0})),n},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new F.Polygon({name:"main",draggable:!0,drift:W(I,t,e),ondragend:W(g,t,{isEnd:!0})}))},updateCoverShape:function(t,e,n,i){e.childAt(0).setShape({points:P(t,e,n)})},updateCommon:_,contain:O}};t.exports=i},function(t,e){var n={},i={axisPointer:1,tooltip:1,brush:1};n.onIrrelevantElement=function(t,e,n){var r=e.getComponentByElement(t.topTarget),o=r&&r.coordinateSystem;return r&&r!==n&&!i[r.mainType]&&o&&o.model!==n},t.exports=n},function(t,e,n){function i(t){return t[r]||(t[r]={})}var r="\0_ec_interaction_mutex",o={take:function(t,e,n){var r=i(t);r[e]=n},release:function(t,e,n){var r=i(t),o=r[e];o===n&&(r[e]=null)},isTaken:function(t,e){return!!i(t)[e]}};n(2).registerAction({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),t.exports=o},function(t,e,n){function i(t,e,n){r.positionElement(t,e.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()},e.get("padding"))}var r=n(12),o=n(7),a=n(3);t.exports={layout:function(t,e,n){var o=r.getLayoutRect(e.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()},e.get("padding"));r.box(e.get("orient"),t,e.get("itemGap"),o.width,o.height),i(t,e,n)},addBackground:function(t,e){var n=o.normalizeCssArray(e.get("padding")),i=t.getBoundingRect(),r=e.getItemStyle(["color","opacity"]);r.fill=e.get("backgroundColor");var s=new a.Rect({shape:{x:i.x-n[3],y:i.y-n[0],width:i.width+n[1]+n[3],height:i.height+n[0]+n[2]},style:r,silent:!0,z2:-1});a.subPixelOptimizeRect(s),t.add(s)}}},function(t,e,n){var i=n(1),r=n(33),o=function(t,e,n,i,o){r.call(this,t,e,n),this.type=i||"value",this.position=o||"bottom"};o.prototype={constructor:o,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},i.inherits(o,r),t.exports=o},function(t,e,n){"use strict";function i(t){return this._axes[t]}var r=n(1),o=function(t){this._axes={},this._dimList=[],this.name=t||""};o.prototype={constructor:o,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return r.map(this._dimList,i,this)},getAxesByScale:function(t){return t=t.toLowerCase(),r.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var n=this._dimList,i=t instanceof Array?[]:{},r=0;r<n.length;r++){var o=n[r],a=this._axes[o];i[o]=a[e](t[o])}return i}},t.exports=o},function(t,e,n){"use strict";function i(t){o.call(this,t)}var r=n(1),o=n(132);i.prototype={constructor:i,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoints:function(t,e){return t.mapArray(["x","y"],function(t,e){return this.dataToPoint([t,e])},e,this)},dataToPoint:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return[n.toGlobalCoord(n.dataToCoord(t[0],e)),i.toGlobalCoord(i.dataToCoord(t[1],e))]},pointToData:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return[n.coordToData(n.toLocalCoord(t[0]),e),i.coordToData(i.toLocalCoord(t[1]),e)]},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},r.inherits(i,o),t.exports=i},function(t,e,n){"use strict";n(60);var i=n(13);t.exports=i.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}})},function(t,e,n){var i=n(28),r=n(24),o=n(18),a=n(42),s=n(10),l=n(1);t.exports={createList:function(t){var e=t.get("data");return i(e,t,t.ecModel)},completeDimensions:n(25),createSymbol:r.createSymbol,createScale:function(t,e){var n=e;e instanceof s||(n=new s(e),l.mixin(n,a));var i=o.createScaleByModel(n);return i.setExtent(t[0],t[1]),o.niceScaleExtent(i,n),i},mixinAxisModelCommonMethods:function(t){l.mixin(t,a)}}},function(t,e,n){var i=n(3),r=n(1),o=Math.PI;t.exports=function(t,e){e=e||{},r.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var n=new i.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),a=new i.Arc({shape:{startAngle:-o/2,endAngle:-o/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new i.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});a.animateShape(!0).when(1e3,{endAngle:3*o/2}).start("circularInOut"),a.animateShape(!0).when(1e3,{startAngle:3*o/2}).delay(300).start("circularInOut");var l=new i.Group;return l.add(a),l.add(s),l.add(n),l.resize=function(){var e=t.getWidth()/2,i=t.getHeight()/2;a.setShape({cx:e,cy:i});var r=a.shape.r;s.setShape({x:e-r,y:i-r,width:2*r,height:2*r}),n.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,n){function i(t,e){h.each(e,function(e,n){x.hasClass(n)||("object"==typeof e?t[n]=t[n]?h.merge(t[n],e,!1):h.clone(e):null==t[n]&&(t[n]=e))})}function r(t){t=t,this.option={},this.option[b]=1,this._componentsMap=h.createHashMap({series:[]}),this._seriesIndices=null,i(t,this._theme.option),h.merge(t,_,!1),this.mergeOption(t)}function o(t,e){h.isArray(e)||(e=e?[e]:[]);var n={};return f(e,function(e){n[e]=(t.get(e)||[]).slice()}),n}function a(t,e,n){var i=e.type?e.type:n?n.subType:x.determineSubType(t,e);return i}function s(t){return g(t,function(t){return t.componentIndex})||[]}function l(t,e){return e.hasOwnProperty("subType")?p(t,function(t){return t.subType===e.subType}):t}function u(t){}var h=n(1),c=n(5),d=n(10),f=h.each,p=h.filter,g=h.map,m=h.isArray,v=h.indexOf,y=h.isObject,x=n(13),_=n(139),b="\0_ec_inner",w=d.extend({constructor:w,
+init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new d(n),this._optionManager=i},setOption:function(t,e){h.assert(!(b in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,n=this._optionManager;if(!t||"recreate"===t){var i=n.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(i)):r.call(this,i),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=n.getTimelineOption(this);o&&(this.mergeOption(o),e=!0)}if(!t||"recreate"===t||"media"===t){var a=n.getMediaOption(this,this._api);a.length&&f(a,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,r){var l=c.normalizeToArray(t[e]),u=c.mappingToExists(i.get(e),l);c.makeIdAndName(u),f(u,function(t,n){var i=t.option;y(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=a(e,i,t.exist))});var d=o(i,r);n[e]=[],i.set(e,[]),f(u,function(t,r){var o=t.exist,a=t.option;if(h.assert(y(a)||o,"Empty component definition"),a){var s=x.getClass(e,t.keyInfo.subType,!0);if(o&&o instanceof s)o.name=t.keyInfo.name,o.mergeOption(a,this),o.optionUpdated(a,!1);else{var l=h.extend({dependentModels:d,componentIndex:r},t.keyInfo);o=new s(a,this,this,l),h.extend(o,l),o.init(a,this,this,l),o.optionUpdated(null,!0)}}else o.mergeOption({},this),o.optionUpdated({},!1);i.get(e)[r]=o,n[e][r]=o.option},this),"series"===e&&(this._seriesIndices=s(i.get("series")))}var n=this.option,i=this._componentsMap,r=[];f(t,function(t,e){null!=t&&(x.hasClass(e)?r.push(e):n[e]=null==n[e]?h.clone(t):h.merge(n[e],t,!0))}),x.topologicalTravel(r,x.getAllClassMainTypes(),e,this),this._seriesIndices=this._seriesIndices||[]},getOption:function(){var t=h.clone(this.option);return f(t,function(e,n){if(x.hasClass(n)){for(var e=c.normalizeToArray(e),i=e.length-1;i>=0;i--)c.isIdInner(e[i])&&e.splice(i,1);t[n]=e}}),delete t[b],t},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap.get(t);if(n)return n[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n=t.index,i=t.id,r=t.name,o=this._componentsMap.get(e);if(!o||!o.length)return[];var a;if(null!=n)m(n)||(n=[n]),a=p(g(n,function(t){return o[t]}),function(t){return!!t});else if(null!=i){var s=m(i);a=p(o,function(t){return s&&v(i,t.id)>=0||!s&&t.id===i})}else if(null!=r){var u=m(r);a=p(o,function(t){return u&&v(r,t.name)>=0||!u&&t.name===r})}else a=o.slice();return l(a,t)},findComponents:function(t){function e(t){var e=r+"Index",n=r+"Id",i=r+"Name";return!t||null==t[e]&&null==t[n]&&null==t[i]?null:{mainType:r,index:t[e],id:t[n],name:t[i]}}function n(e){return t.filter?p(e,t.filter):e}var i=t.query,r=t.mainType,o=e(i),a=o?this.queryComponents(o):this._componentsMap.get(r);return n(l(a,t))},eachComponent:function(t,e,n){var i=this._componentsMap;if("function"==typeof t)n=e,e=t,i.each(function(t,i){f(t,function(t,r){e.call(n,i,t,r)})});else if(h.isString(t))f(i.get(t),e,n);else if(y(t)){var r=this.findComponents(t);f(r,e,n)}},getSeriesByName:function(t){var e=this._componentsMap.get("series");return p(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(t){var e=this._componentsMap.get("series");return p(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.get("series").slice()},eachSeries:function(t,e){u(this),f(this._seriesIndices,function(n){var i=this._componentsMap.get("series")[n];t.call(e,i,n)},this)},eachRawSeries:function(t,e){f(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(t,e,n){u(this),f(this._seriesIndices,function(i){var r=this._componentsMap.get("series")[i];r.subType===t&&e.call(n,r,i)},this)},eachRawSeriesByType:function(t,e,n){return f(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return u(this),h.indexOf(this._seriesIndices,t.componentIndex)<0},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){u(this);var n=p(this._componentsMap.get("series"),t,e);this._seriesIndices=s(n)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=s(t.get("series"));var e=[];t.each(function(t,n){e.push(n)}),x.topologicalTravel(e,x.getAllClassMainTypes(),function(e,n){f(t.get(e),function(t){t.restoreData()})})}});h.mixin(w,n(62)),t.exports=w},function(t,e,n){function i(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function r(t,e,n){var i,r,o=[],a=[],s=t.timeline;if(t.baseOption&&(r=t.baseOption),(s||t.options)&&(r=r||{},o=(t.options||[]).slice()),t.media){r=r||{};var l=t.media;d(l,function(t){t&&t.option&&(t.query?a.push(t):i||(i=t))})}return r||(r=t),r.timeline||(r.timeline=s),d([r].concat(o).concat(u.map(a,function(t){return t.option})),function(t){d(e,function(e){e(t,n)})}),{baseOption:r,timelineOptions:o,mediaDefault:i,mediaList:a}}function o(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return u.each(t,function(t,e){var n=e.match(m);if(n&&n[1]&&n[2]){var o=n[1],s=n[2].toLowerCase();a(i[s],t,o)||(r=!1)}}),r}function a(t,e,n){return"min"===n?t>=e:"max"===n?t<=e:t===e}function s(t,e){return t.join(",")===e.join(",")}function l(t,e){e=e||{},d(e,function(e,n){if(null!=e){var i=t[n];if(c.hasClass(n)){e=h.normalizeToArray(e),i=h.normalizeToArray(i);var r=h.mappingToExists(i,e);t[n]=p(r,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[n]=g(i,e,!0)}})}var u=n(1),h=n(5),c=n(13),d=u.each,f=u.clone,p=u.map,g=u.merge,m=/^(min|max)?(.+)$/;i.prototype={constructor:i,setOption:function(t,e){t=f(t,!0);var n=this._optionBackup,i=r.call(this,t,e,!n);this._newBaseOption=i.baseOption,n?(l(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=p(e.timelineOptions,f),this._mediaList=p(e.mediaList,f),this._mediaDefault=f(e.mediaDefault),this._currentMediaIndices=[],f(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=f(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,a=[],l=[];if(!i.length&&!r)return l;for(var u=0,h=i.length;u<h;u++)o(i[u].query,e,n)&&a.push(u);return!a.length&&r&&(a=[-1]),a.length&&!s(a,this._currentMediaIndices)&&(l=p(a,function(t){return f(t===-1?r.option:i[t].option)})),this._currentMediaIndices=a,l}},t.exports=i},function(t,e){var n="";"undefined"!=typeof navigator&&(n=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],textStyle:{fontFamily:n.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1}},function(t,e,n){t.exports={getAreaStyle:n(31)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,n){var i=n(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]);t.exports={getItemStyle:function(t,e){var n=i.call(this,t,e),r=this.getBorderLineDash();return r&&(n.lineDash=r),n},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,n){var i=n(31)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=i.call(this,t),n=this.getLineDash(e.lineWidth);return n&&(e.lineDash=n),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),n=Math.max(t,2),i=4*t;return"solid"===e||null==e?null:"dashed"===e?[i,i]:[n,n]}}},function(t,e,n){var i=n(16),r=n(3);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){return r.getFont({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(t){return i.getBoundingRect(t,this.getFont(),this.getShallow("align"),this.getShallow("baseline"))},truncateText:function(t,e,n,r){return i.truncateText(t,e,this.getFont(),n,r)}}},function(t,e,n){function i(t,e){e=e.split(",");for(var n=t,i=0;i<e.length&&(n=n&&n[e[i]],null!=n);i++);return n}function r(t,e,n,i){e=e.split(",");for(var r,o=t,a=0;a<e.length-1;a++)r=e[a],null==o[r]&&(o[r]={}),o=o[r];(i||null==o[e[a]])&&(o[e[a]]=n)}function o(t){c(l,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}var a=n(1),s=n(146),l=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],u=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],h=["bar","boxplot","candlestick","chord","effectScatter","funnel","gauge","lines","graph","heatmap","line","map","parallel","pie","radar","sankey","scatter","treemap"],c=a.each;t.exports=function(t){c(t.series,function(t){if(a.isObject(t)){var e=t.type;if(s(t),"pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var n=i(t,"pointer.color");null!=n&&r(t,"itemStyle.normal.color",n)}for(var l=0;l<h.length;l++)if(h[l]===t.type){o(t);break}}}),t.dataRange&&(t.visualMap=t.dataRange),c(u,function(e){var n=t[e];n&&(a.isArray(n)||(n=[n]),c(n,function(t){o(t)}))})}},function(t,e,n){function i(t){var e=t&&t.itemStyle;e&&r.each(o,function(n){var i=e.normal,o=e.emphasis;i&&i[n]&&(t[n]=t[n]||{},t[n].normal?r.merge(t[n].normal,i[n]):t[n].normal=i[n],i[n]=null),o&&o[n]&&(t[n]=t[n]||{},t[n].emphasis?r.merge(t[n].emphasis,o[n]):t[n].emphasis=o[n],o[n]=null)})}var r=n(1),o=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];t.exports=function(t){if(t){i(t),i(t.markPoint),i(t.markLine);var e=t.data;if(e){for(var n=0;n<e.length;n++)i(e[n]);var o=t.markPoint;if(o&&o.data)for(var a=o.data,n=0;n<a.length;n++)i(a[n]);var s=t.markLine;if(s&&s.data)for(var l=s.data,n=0;n<l.length;n++)r.isArray(l[n])?(i(l[n][0]),i(l[n][1])):i(l[n])}}}},function(t,e){var n={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-(1/0),n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return e},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return e},nearest:function(t){return t[0]}},i=function(t,e){return Math.round(t.length/2)};t.exports=function(t,e,r){e.eachSeriesByType(t,function(t){var e=t.getData(),r=t.get("sampling"),o=t.coordinateSystem;if("cartesian2d"===o.type&&r){var a=o.getBaseAxis(),s=o.getOtherAxis(a),l=a.getExtent(),u=l[1]-l[0],h=Math.round(e.count()/u);if(h>1){var c;"string"==typeof r?c=n[r]:"function"==typeof r&&(c=r),c&&(e=e.downSample(s.dim,1/h,c,i),t.setData(e))}}},this)}},function(t,e,n){function i(t,e){return c(t,h(e))}var r=n(1),o=n(34),a=n(4),s=n(43),l=o.prototype,u=s.prototype,h=a.getPrecisionSafe,c=a.round,d=Math.floor,f=Math.ceil,p=Math.pow,g=Math.log,m=o.extend({type:"log",base:10,$constructor:function(){o.apply(this,arguments),this._originalScale=new s},getTicks:function(){var t=this._originalScale,e=this._extent,n=t.getExtent();return r.map(u.getTicks.call(this),function(r){var o=a.round(p(this.base,r));return o=r===e[0]&&t.__fixMin?i(o,n[0]):o,o=r===e[1]&&t.__fixMax?i(o,n[1]):o},this)},getLabel:u.getLabel,scale:function(t){return t=l.scale.call(this,t),p(this.base,t)},setExtent:function(t,e){var n=this.base;t=g(t)/g(n),e=g(e)/g(n),u.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=l.getExtent.call(this);e[0]=p(t,e[0]),e[1]=p(t,e[1]);var n=this._originalScale,r=n.getExtent();return n.__fixMin&&(e[0]=i(e[0],r[0])),n.__fixMax&&(e[1]=i(e[1],r[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=g(t[0])/g(e),t[1]=g(t[1])/g(e),l.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=a.quantity(n),r=t/n*i;for(r<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var o=[a.round(f(e[0]/i)*i),a.round(d(e[1]/i)*i)];this._interval=i,this._niceExtent=o}},niceExtent:function(t){u.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});r.each(["contain","normalize"],function(t){m.prototype[t]=function(e){return e=g(e)/g(this.base),l[t].call(this,e)}}),m.create=function(){return new m},t.exports=m},function(t,e,n){var i=n(1),r=n(34),o=r.prototype,a=r.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?i.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),o.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return o.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(o.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!1))},niceTicks:i.noop,niceExtent:i.noop});a.create=function(){return new a},t.exports=a},function(t,e,n){var i=n(1),r=n(4),o=n(7),a=n(64),s=n(43),l=s.prototype,u=Math.ceil,h=Math.floor,c=1e3,d=60*c,f=60*d,p=24*f,g=function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][2]<e?n=r+1:i=r}return n},m=s.extend({type:"time",getLabel:function(t){var e=this._stepLvl,n=new Date(t);return o.formatTime(e[0],n,this.getSetting("useUTC"))},niceExtent:function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=p,e[1]+=p),e[1]===-(1/0)&&e[0]===1/0){var n=new Date;e[1]=new Date(n.getFullYear(),n.getMonth(),n.getDate()),e[0]=e[1]-p}this.niceTicks(t.splitNumber);var i=this._interval;t.fixMin||(e[0]=r.round(h(e[0]/i)*i)),t.fixMax||(e[1]=r.round(u(e[1]/i)*i))},niceTicks:function(t){var e=this.getSetting("useUTC")?0:60*r.getTimezoneOffset()*1e3;t=t||10;var n=this._extent,i=n[1]-n[0],o=i/t,s=v.length,l=g(v,o,0,s),c=v[Math.min(l,s-1)],d=c[2];if("year"===c[0]){var f=i/d,p=r.nice(f/t,!0);d*=p}var m=[Math.round(u((n[0]-e)/d)*d+e),Math.round(h((n[1]-e)/d)*d+e)];a.fixExtent(m,n),this._stepLvl=c,this._interval=d,this._niceExtent=m},parse:function(t){return+r.parseDate(t)}});i.each(["contain","normalize"],function(t){m.prototype[t]=function(e){return l[t].call(this,this.parse(e))}});var v=[["hh:mm:ss",1,c],["hh:mm:ss",5,5*c],["hh:mm:ss",10,10*c],["hh:mm:ss",15,15*c],["hh:mm:ss",30,30*c],["hh:mm\nMM-dd",1,d],["hh:mm\nMM-dd",5,5*d],["hh:mm\nMM-dd",10,10*d],["hh:mm\nMM-dd",15,15*d],["hh:mm\nMM-dd",30,30*d],["hh:mm\nMM-dd",1,f],["hh:mm\nMM-dd",2,2*f],["hh:mm\nMM-dd",6,6*f],["hh:mm\nMM-dd",12,12*f],["MM-dd\nyyyy",1,p],["week",7,7*p],["month",1,31*p],["quarter",3,380*p/4],["half-year",6,380*p/2],["year",1,380*p]];m.create=function(t){return new m({useUTC:t.ecModel.get("useUTC")})},t.exports=m},function(t,e,n){var i=n(39);t.exports=function(t){function e(e){var n=(e.visualColorAccessPath||"itemStyle.normal.color").split("."),r=e.getData(),o=e.get(n)||e.getColorFromPalette(e.get("name"));r.setVisual("color",o),t.isSeriesFiltered(e)||("function"!=typeof o||o instanceof i||r.each(function(t){r.setItemVisual(t,"color",o(e.getDataParams(t)))}),r.each(function(t){var e=r.getItemModel(t),i=e.get(n,!0);null!=i&&r.setItemVisual(t,"color",i)}))}t.eachRawSeries(e)}},function(t,e,n){"use strict";function i(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch}}function r(){}function o(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i,r=t;r;){if(r.clipPath&&!r.clipPath.contain(e,n))return!1;r.silent&&(i=!0),r=r.parent}return!i||u}return!1}var a=n(1),s=n(179),l=n(23),u="silent";r.prototype.dispose=function(){};var h=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],c=function(t,e,n,i){l.call(this),this.storage=t,this.painter=e,this.painterRoot=i,n=n||new r,this.proxy=n,n.handler=this,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,s.call(this),a.each(h,function(t){n.on&&n.on(t,this[t],this)},this)};c.prototype={constructor:c,mousemove:function(t){var e=t.zrX,n=t.zrY,i=this._hovered,r=this._hovered=this.findHover(e,n),o=r.target,a=i.target,s=this.proxy;s.setCursor&&s.setCursor(o?o.cursor:"default"),a&&o!==a&&a.__zr&&this.dispatchToElement(i,"mouseout",t),this.dispatchToElement(r,"mousemove",t),o&&o!==a&&this.dispatchToElement(r,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,n=t.toElement||t.relatedTarget;do n=n&&n.parentNode;while(n&&9!=n.nodeType&&!(e=n===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var n=this[t];n&&n.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,n){t=t||{};for(var r="on"+e,o=i(e,t,n),a=t.target;a&&(a[r]&&(o.cancelBubble=a[r].call(a,o)),a.trigger(e,o),a=a.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)}))},findHover:function(t,e,n){for(var i=this.storage.getDisplayList(),r={},a=i.length-1;a>=0;a--){var s;if(i[a]!==n&&!i[a].ignore&&(s=o(i[a],t,e))&&(!r.topTarget&&(r.topTarget=i[a]),s!==u)){r.target=i[a];break}}return r}},a.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){c.prototype[t]=function(e){var n=this.findHover(e.zrX,e.zrY),i=n.target;if("mousedown"===t)this._downel=i,this._upel=i;else if("mosueup"===t)this._upel=i;else if("click"===t&&this._downel!==this._upel)return;this.dispatchToElement(n,t,e)}}),a.mixin(c,l),a.mixin(c,s),t.exports=c},function(t,e,n){function i(){return!1}function r(t,e,n,i){var r=document.createElement(e),o=n.getWidth(),a=n.getHeight(),s=r.style;return s.position="absolute",s.left=0,s.top=0,s.width=o+"px",s.height=a+"px",r.width=o*i,r.height=a*i,r.setAttribute("data-zr-dom-id",t),r}var o=n(1),a=n(35),s=n(73),l=n(72),u=function(t,e,n){var s;n=n||a.devicePixelRatio,"string"==typeof t?s=r(t,"canvas",e,n):o.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=i,l["-webkit-user-select"]="none",l["user-select"]="none",l["-webkit-touch-callout"]="none",l["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",l.padding=0,l.margin=0,l["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=n};u.prototype={constructor:u,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=r("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var n=this.dpr,i=this.dom,r=i.style,o=this.domBack;r.width=t+"px",r.height=e+"px",i.width=t*n,i.height=e*n,o&&(o.width=t*n,o.height=e*n,1!=n&&this.ctxBack.scale(n,n))},clear:function(t){var e=this.dom,n=this.ctx,i=e.width,r=e.height,o=this.clearColor,a=this.motionBlur&&!t,u=this.lastFrameAlpha,h=this.dpr;if(a&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,i/h,r/h)),n.clearRect(0,0,i,r),o){var c;o.colorStops?(c=o.__canvasGradient||s.getGradient(n,o,{x:0,y:0,width:i,height:r}),o.__canvasGradient=c):o.image&&(c=l.prototype.getCanvasPattern.call(o,n)),n.save(),n.fillStyle=c||o,n.fillRect(0,0,i,r),n.restore()}if(a){var d=this.domBack;n.save(),n.globalAlpha=u,n.drawImage(d,0,0,i,r),n.restore()}}},t.exports=u},function(t,e,n){"use strict";function i(t){return parseInt(t,10)}function r(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function o(t){t.__unusedCount++}function a(t){1==t.__unusedCount&&t.clear()}function s(t,e,n){return x.copy(t.getBoundingRect()),t.transform&&x.applyTransform(t.transform),_.width=e,_.height=n,!x.intersect(_)}function l(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0}function u(t,e){for(var n=0;n<t.length;n++){var i=t[n];i.setTransform(e),e.beginPath(),i.buildPath(e,i.shape),e.clip(),i.restoreTransform(e)}}function h(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}var c=n(35),d=n(1),f=n(52),p=n(11),g=n(51),m=n(153),v=n(68),y=5,x=new p(0,0,0,0),_=new p(0,0,0,0),b=function(t,e,n){var i=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=d.extend({},n||{}),this.dpr=n.devicePixelRatio||c.devicePixelRatio,this._singleCanvas=i,this.root=t;var r=t.style;r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]=r["user-select"]=r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var o=this._zlevelList=[],a=this._layers={};if(this._layerConfig={},i){null!=n.width&&(t.width=n.width),null!=n.height&&(t.height=n.height);var s=t.width,l=t.height;this._width=s,this._height=l;var u=new m(t,this,1);u.initContext(),a[0]=u,o.push(0),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var f=this._domRoot=h(this._width,this._height);t.appendChild(f)}this._progressiveLayers=[],this._hoverlayer,this._hoverElements=[]};b.prototype={constructor:b,isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},refresh:function(t){var e=this.storage.getDisplayList(!0),n=this._zlevelList;this._paintList(e,t);for(var i=0;i<n.length;i++){var r=n[i],o=this._layers[r];!o.__builtin__&&o.refresh&&o.refresh()}return this.refreshHover(),this._progressiveLayers.length&&this._startProgessive(),this},addHover:function(t,e){if(!t.__hoverMir){var n=new t.constructor({style:t.style,shape:t.shape});n.__from=t,t.__hoverMir=n,n.setStyle(e),this._hoverElements.push(n)}},removeHover:function(t){var e=t.__hoverMir,n=this._hoverElements,i=d.indexOf(n,e);i>=0&&n.splice(i,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,n=0;n<e.length;n++){var i=e[n].__from;i&&(i.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){g(t,this.storage.displayableSortFunc),n||(n=this._hoverlayer=this.getLayer(1e5));var i={};n.ctx.save();for(var r=0;r<e;){var o=t[r],a=o.__from;a&&a.__zr?(r++,a.invisible||(o.transform=a.transform,o.invTransform=a.invTransform,o.__clipPaths=a.__clipPaths,this._doPaintEl(o,n,!0,i))):(t.splice(r,1),a.__hoverMir=null,e--)}n.ctx.restore()}},_startProgessive:function(){function t(){n===e._progressiveToken&&e.storage&&(e._doPaintList(e.storage.getDisplayList()),e._furtherProgressive?(e._progress++,v(t)):e._progressiveToken=-1)}var e=this;if(e._furtherProgressive){var n=e._progressiveToken=+new Date;e._progress++,v(t)}},_clearProgressive:function(){this._progressiveToken=-1,this._progress=0,d.each(this._progressiveLayers,function(t){t.__dirty&&t.clear()})},_paintList:function(t,e){null==e&&(e=!1),this._updateLayerStatus(t),this._clearProgressive(),this.eachBuiltinLayer(o),this._doPaintList(t,e),this.eachBuiltinLayer(a)},_doPaintList:function(t,e){function n(t){var e=o.dpr||1;o.save(),o.globalAlpha=1,o.shadowBlur=0,i.__dirty=!0,o.setTransform(1,0,0,1,0,0),o.drawImage(t.dom,0,0,h*e,c*e),o.restore()}for(var i,r,o,a,s,l,u=0,h=this._width,c=this._height,p=this._progress,g=0,m=t.length;g<m;g++){var v=t[g],x=this._singleCanvas?0:v.zlevel,_=v.__frame;if(_<0&&s&&(n(s),s=null),r!==x&&(o&&o.restore(),a={},r=x,i=this.getLayer(r),i.__builtin__||f("ZLevel "+r+" has been used by unkown layer "+i.id),o=i.ctx,o.save(),i.__unusedCount=0,(i.__dirty||e)&&i.clear()),i.__dirty||e){if(_>=0){if(!s){if(s=this._progressiveLayers[Math.min(u++,y-1)],s.ctx.save(),s.renderScope={},s&&s.__progress>s.__maxProgress){g=s.__nextIdxNotProg-1;continue}l=s.__progress,s.__dirty||(p=l),s.__progress=p+1}_===p&&this._doPaintEl(v,s,!0,s.renderScope)}else this._doPaintEl(v,i,e,a);v.__dirty=!1}}s&&n(s),o&&o.restore(),this._furtherProgressive=!1,d.each(this._progressiveLayers,function(t){t.__maxProgress>=t.__progress&&(this._furtherProgressive=!0)},this)},_doPaintEl:function(t,e,n,i){var r=e.ctx,o=t.transform;if((e.__dirty||n)&&!t.invisible&&0!==t.style.opacity&&(!o||o[0]||o[3])&&(!t.culling||!s(t,this._width,this._height))){var a=t.__clipPaths;(i.prevClipLayer!==e||l(a,i.prevElClipPaths))&&(i.prevElClipPaths&&(i.prevClipLayer.ctx.restore(),i.prevClipLayer=i.prevElClipPaths=null,i.prevEl=null),a&&(r.save(),u(a,r),i.prevClipLayer=e,i.prevElClipPaths=a)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,i.prevEl||null),i.prevEl=t,t.afterBrush&&t.afterBrush(r)}},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new m("zr_"+t,this,this.dpr),e.__builtin__=!0,this._layerConfig[t]&&d.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var n=this._layers,i=this._zlevelList,o=i.length,a=null,s=-1,l=this._domRoot;if(n[t])return void f("ZLevel "+t+" has been used already");if(!r(e))return void f("Layer of zlevel "+t+" is not valid");if(o>0&&t>i[0]){for(s=0;s<o-1&&!(i[s]<t&&i[s+1]>t);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var u=a.dom;u.nextSibling?l.insertBefore(e.dom,u.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom)},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i<r.length;i++)n=r[i],t.call(e,this._layers[n],n)},eachBuiltinLayer:function(t,e){var n,i,r,o=this._zlevelList;for(r=0;r<o.length;r++)i=o[r],n=this._layers[i],n.__builtin__&&t.call(e,n,i)},eachOtherLayer:function(t,e){var n,i,r,o=this._zlevelList;for(r=0;r<o.length;r++)i=o[r],n=this._layers[i],n.__builtin__||t.call(e,n,i)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){var e=this._layers,n=this._progressiveLayers,i={},r={};this.eachBuiltinLayer(function(t,e){i[e]=t.elCount,t.elCount=0,t.__dirty=!1}),d.each(n,function(t,e){r[e]=t.elCount,t.elCount=0,t.__dirty=!1});for(var o,a,s=0,l=0,u=0,h=t.length;u<h;u++){var c=t[u],f=this._singleCanvas?0:c.zlevel,p=e[f],g=c.progressive;if(p&&(p.elCount++,p.__dirty=p.__dirty||c.__dirty),g>=0){a!==g&&(a=g,l++);var v=c.__frame=l-1;if(!o){var x=Math.min(s,y-1);o=n[x],o||(o=n[x]=new m("progressive",this,this.dpr),o.initContext()),o.__maxProgress=0}o.__dirty=o.__dirty||c.__dirty,o.elCount++,o.__maxProgress=Math.max(o.__maxProgress,v),o.__maxProgress>=o.__progress&&(p.__dirty=!0)}else c.__frame=-1,o&&(o.__nextIdxNotProg=u,s++,o=null)}o&&(s++,o.__nextIdxNotProg=u),this.eachBuiltinLayer(function(t,e){i[e]!==t.elCount&&(t.__dirty=!0)}),n.length=Math.min(s,y),d.each(n,function(t,e){r[e]!==t.elCount&&(c.__dirty=!0),t.__dirty&&(t.__progress=0)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?d.merge(n[t],e,!0):n[t]=e;var i=this._layers[t];i&&d.merge(i,n[t],!0)}},delLayer:function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(d.indexOf(n,t),1))},resize:function(t,e){var n=this._domRoot;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!=t||e!=this._height){n.style.width=t+"px",n.style.height=e+"px";for(var r in this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(t,e);d.each(this._progressiveLayers,function(n){n.resize(t,e)}),this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){function e(t,e){var i=a._zlevelList;null==t&&(t=-(1/0));for(var r,o=0;o<i.length;o++){var s=i[o],l=a._layers[s];if(!l.__builtin__&&s>t&&s<e){r=l;break}}r&&r.renderToCanvas&&(n.ctx.save(),r.renderToCanvas(n.ctx),n.ctx.restore())}if(t=t||{},this._singleCanvas)return this._layers[0].dom;var n=new m("image",this,t.pixelRatio||this.dpr);n.initContext(),n.clearColor=t.backgroundColor,n.clear();for(var i,r=this.storage.getDisplayList(!0),o={},a=this,s=0;s<r.length;s++){var l=r[s];l.zlevel!==i&&(e(i,l.zlevel),i=l.zlevel),this._doPaintEl(l,n,!0,o)}return e(i,1/0),n.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],r=["clientWidth","clientHeight"][t],o=["paddingLeft","paddingTop"][t],a=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var s=this.root,l=document.defaultView.getComputedStyle(s);return(s[r]||i(l[n])||i(s.style[n]))-(i(l[o])||0)-(i(l[a])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var i=document.createElement("canvas"),r=i.getContext("2d"),o=t.getBoundingRect(),a=t.style,s=a.shadowBlur,l=a.shadowOffsetX,u=a.shadowOffsetY,h=a.hasStroke()?a.lineWidth:0,c=Math.max(h/2,-l+s),d=Math.max(h/2,l+s),f=Math.max(h/2,-u+s),p=Math.max(h/2,u+s),g=o.width+c+d,m=o.height+f+p;i.width=g*e,i.height=m*e,r.scale(e,e),r.clearRect(0,0,g,m),r.dpr=e;var v={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[c-o.x,f-o.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(r);var y=n(53),x=new y({style:{x:0,y:0,image:i}});return null!=v.position&&(x.position=t.position=v.position),null!=v.rotation&&(x.rotation=t.rotation=v.rotation),null!=v.scale&&(x.scale=t.scale=v.scale),x}},t.exports=b},function(t,e,n){"use strict";function i(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var r=n(1),o=n(9),a=n(36),s=n(51),l=function(){this._roots=[],this._displayList=[],this._displayListLen=0};l.prototype={constructor:l,traverse:function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,r=0,a=e.length;r<a;r++)this._updateAndAddDisplayable(e[r],null,t);n.length=this._displayListLen,o.canvasSupported&&s(n,i)},_updateAndAddDisplayable:function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var i=t.clipPath;if(i){e=e?e.slice():[];for(var r=i,o=t;r;)r.parent=o,r.updateTransform(),e.push(r),o=r,r=r.clipPath}if(t.isGroup){for(var a=t._children,s=0;s<a.length;s++){var l=a[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,n)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t;
+}},addRoot:function(t){t.__storage!==this&&(t instanceof a&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var n=this._roots[e];n instanceof a&&n.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var e=0,i=t.length;e<i;e++)this.delRoot(t[e]);else{var o=r.indexOf(this._roots,t);o>=0&&(this.delFromStorage(t),this._roots.splice(o,1),t instanceof a&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t.__storage=this,t.dirty(!1),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:i},t.exports=l},function(t,e,n){"use strict";var i=n(1),r=n(21).Dispatcher,o=n(68),a=n(67),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,r.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),n=0;n<e.length;n++)this.addClip(e[n])},removeClip:function(t){var e=i.indexOf(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;n<e.length;n++)this.removeClip(e[n]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,n=this._clips,i=n.length,r=[],o=[],a=0;a<i;a++){var s=n[a],l=s.step(t,e);l&&(r.push(l),o.push(s))}for(var a=0;a<i;)n[a]._needsRemove?(n[a]=n[i-1],n.pop(),i--):a++;i=r.length;for(var a=0;a<i;a++)o[a].fire(r[a]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(o(t),!e._paused&&e._update())}var e=this;this._running=!0,o(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var n=new a(t,e.loop,e.getter,e.setter);return this.addAnimator(n),n}},i.mixin(s,r),t.exports=s},function(t,e,n){function i(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}var r=n(158);i.prototype={constructor:i,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)return void(this._pausedTime+=e);var n=(t-this._startTime-this._pausedTime)/this._life;if(!(n<0)){n=Math.min(n,1);var i=this.easing,o="string"==typeof i?r[i]:i,a="function"==typeof o?o(n):n;return this.fire("frame",a),1==n?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}},t.exports=i},function(t,e){var n={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),-(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)))},elasticOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?-.5*(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)):n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-n.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*n.bounceIn(2*t):.5*n.bounceOut(2*t-1)+.5}};t.exports=n},function(t,e,n){var i=n(69).normalizeRadian,r=2*Math.PI;t.exports={containStroke:function(t,e,n,o,a,s,l,u,h){if(0===l)return!1;var c=l;u-=t,h-=e;var d=Math.sqrt(u*u+h*h);if(d-c>n||d+c<n)return!1;if(Math.abs(o-a)%r<1e-4)return!0;if(s){var f=o;o=i(a),a=i(f)}else o=i(o),a=i(a);o>a&&(a+=r);var p=Math.atan2(h,u);return p<0&&(p+=r),p>=o&&p<=a||p+r>=o&&p+r<=a}}},function(t,e,n){var i=n(20);t.exports={containStroke:function(t,e,n,r,o,a,s,l,u,h,c){if(0===u)return!1;var d=u;if(c>e+d&&c>r+d&&c>a+d&&c>l+d||c<e-d&&c<r-d&&c<a-d&&c<l-d||h>t+d&&h>n+d&&h>o+d&&h>s+d||h<t-d&&h<n-d&&h<o-d&&h<s-d)return!1;var f=i.cubicProjectPoint(t,e,n,r,o,a,s,l,h,c,null);return f<=d/2}}},function(t,e,n){"use strict";function i(t,e){return Math.abs(t-e)<x}function r(){var t=b[0];b[0]=b[1],b[1]=t}function o(t,e,n,i,o,a,s,l,u,h){if(h>e&&h>i&&h>a&&h>l||h<e&&h<i&&h<a&&h<l)return 0;var c=g.cubicRootAt(e,i,a,l,h,_);if(0===c)return 0;for(var d,f,p=0,m=-1,v=0;v<c;v++){var y=_[v],x=0===y||1===y?.5:1,w=g.cubicAt(t,n,o,s,y);w<u||(m<0&&(m=g.cubicExtrema(e,i,a,l,b),b[1]<b[0]&&m>1&&r(),d=g.cubicAt(e,i,a,l,b[0]),m>1&&(f=g.cubicAt(e,i,a,l,b[1]))),p+=2==m?y<b[0]?d<e?x:-x:y<b[1]?f<d?x:-x:l<f?x:-x:y<b[0]?d<e?x:-x:l<d?x:-x)}return p}function a(t,e,n,i,r,o,a,s){if(s>e&&s>i&&s>o||s<e&&s<i&&s<o)return 0;var l=g.quadraticRootAt(e,i,o,s,_);if(0===l)return 0;var u=g.quadraticExtremum(e,i,o);if(u>=0&&u<=1){for(var h=0,c=g.quadraticAt(e,i,o,u),d=0;d<l;d++){var f=0===_[d]||1===_[d]?.5:1,p=g.quadraticAt(t,n,r,_[d]);p<a||(h+=_[d]<u?c<e?f:-f:o<c?f:-f)}return h}var f=0===_[0]||1===_[0]?.5:1,p=g.quadraticAt(t,n,r,_[0]);return p<a?0:o<e?f:-f}function s(t,e,n,i,r,o,a,s){if(s-=e,s>n||s<-n)return 0;var l=Math.sqrt(n*n-s*s);_[0]=-l,_[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u%y<1e-4){i=0,r=y;var h=o?1:-1;return a>=_[0]+t&&a<=_[1]+t?h:0}if(o){var l=i;i=p(r),r=p(l)}else i=p(i),r=p(r);i>r&&(r+=y);for(var c=0,d=0;d<2;d++){var f=_[d];if(f+t>a){var g=Math.atan2(s,f),h=o?1:-1;g<0&&(g=y+g),(g>=i&&g<=r||g+y>=i&&g+y<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),c+=h)}}return c}function l(t,e,n,r,l){for(var h=0,p=0,g=0,y=0,x=0,_=0;_<t.length;){var b=t[_++];switch(b===u.M&&_>1&&(n||(h+=m(p,g,y,x,r,l))),1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case u.M:y=t[_++],x=t[_++],p=y,g=x;break;case u.L:if(n){if(v(p,g,t[_],t[_+1],e,r,l))return!0}else h+=m(p,g,t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case u.C:if(n){if(c.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else h+=o(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case u.Q:if(n){if(d.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else h+=a(p,g,t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case u.A:var w=t[_++],M=t[_++],S=t[_++],T=t[_++],A=t[_++],I=t[_++],C=(t[_++],1-t[_++]),P=Math.cos(A)*S+w,D=Math.sin(A)*T+M;_>1?h+=m(p,g,P,D,r,l):(y=P,x=D);var k=(r-w)*T/S+w;if(n){if(f.containStroke(w,M,T,A,A+I,C,e,k,l))return!0}else h+=s(w,M,T,A,A+I,C,k,l);p=Math.cos(A+I)*S+w,g=Math.sin(A+I)*T+M;break;case u.R:y=p=t[_++],x=g=t[_++];var L=t[_++],O=t[_++],P=y+L,D=x+O;if(n){if(v(y,x,P,x,e,r,l)||v(P,x,P,D,e,r,l)||v(P,D,y,D,e,r,l)||v(y,D,y,x,e,r,l))return!0}else h+=m(P,x,P,D,r,l),h+=m(y,D,y,x,r,l);break;case u.Z:if(n){if(v(p,g,y,x,e,r,l))return!0}else h+=m(p,g,y,x,r,l);p=y,g=x}}return n||i(g,x)||(h+=m(p,g,y,x,r,l)||0),0!==h}var u=n(27).CMD,h=n(97),c=n(160),d=n(98),f=n(159),p=n(69).normalizeRadian,g=n(20),m=n(99),v=h.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,n){return l(t,0,!1,e,n)},containStroke:function(t,e,n,i){return l(t,e,!0,n,i)}}},function(t,e,n){"use strict";function i(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}function r(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var o=n(21),a=function(){this._track=[]};a.prototype={constructor:a,recognize:function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},a=0,s=i.length;a<s;a++){var l=i[a],u=o.clientToLocal(n,l,{});r.points.push([u.zrX,u.zrY]),r.touches.push(l)}this._track.push(r)}},_recognize:function(t){for(var e in s)if(s.hasOwnProperty(e)){var n=s[e](this._track,t);if(n)return n}}};var s={pinch:function(t,e){var n=t.length;if(n){var o=(t[n-1]||{}).points,a=(t[n-2]||{}).points||o;if(a&&a.length>1&&o&&o.length>1){var s=i(o)/i(a);!isFinite(s)&&(s=1),e.pinchScale=s;var l=r(o);return e.pinchX=l[0],e.pinchY=l[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=a},function(t,e,n){function i(t){return"mousewheel"===t&&d.browser.firefox?"DOMMouseScroll":t}function r(t,e,n){var i=t._gestureMgr;"start"===n&&i.clear();var r=i.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===n&&i.clear(),r){var o=r.type;e.gestureEvent=o,t.handler.dispatchToElement({target:r.target},o,r.event)}}function o(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function a(t){var e=t.pointerType;return"pen"===e||"touch"===e}function s(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}h.each(x,function(e){t._handlers[e]=h.bind(w[e],t)}),h.each(b,function(e){t._handlers[e]=h.bind(w[e],t)}),h.each(y,function(n){t._handlers[n]=e(w[n],t)})}function l(t){function e(e,n){h.each(e,function(e){p(t,i(e),n._handlers[e])},n)}c.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new f,this._handlers={},s(this),d.pointerEventsSupported?e(b,this):(d.touchEventsSupported&&e(x,this),e(y,this))}var u=n(21),h=n(1),c=n(23),d=n(9),f=n(162),p=u.addEventListener,g=u.removeEventListener,m=u.normalizeEvent,v=300,y=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],x=["touchstart","touchend","touchmove"],_={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},b=h.map(y,function(t){var e=t.replace("mouse","pointer");return _[e]?e:t}),w={mousemove:function(t){t=m(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){t=m(this.dom,t);var e=t.toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){t=m(this.dom,t),t.zrByTouch=!0,this._lastTouchMoment=new Date,r(this,t,"start"),w.mousemove.call(this,t),w.mousedown.call(this,t),o(this)},touchmove:function(t){t=m(this.dom,t),t.zrByTouch=!0,r(this,t,"change"),w.mousemove.call(this,t),o(this)},touchend:function(t){t=m(this.dom,t),t.zrByTouch=!0,r(this,t,"end"),w.mouseup.call(this,t),+new Date-this._lastTouchMoment<v&&w.click.call(this,t),o(this)},pointerdown:function(t){w.mousedown.call(this,t)},pointermove:function(t){a(t)||w.mousemove.call(this,t)},pointerup:function(t){w.mouseup.call(this,t)},pointerout:function(t){a(t)||w.mouseout.call(this,t)}};h.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){w[t]=function(e){e=m(this.dom,e),this.trigger(t,e)}});var M=l.prototype;M.dispose=function(){for(var t=y.concat(x),e=0;e<t.length;e++){var n=t[e];g(this.dom,i(n),this._handlers[n])}},M.setCursor=function(t){this.dom.style.cursor=t||"default"},h.mixin(l,c),t.exports=l},function(t,e,n){var i=n(8);t.exports=i.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,n=0;n<e.length;n++)t=t||e[n].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},afterBrush:function(){for(var t=this.shape.paths,e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),i.prototype.getBoundingRect.call(this)}})},function(t,e,n){"use strict";var i=n(1),r=n(39),o=function(t,e,n,i,o){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,this.type="radial",this.global=o||!1,r.call(this,i)};o.prototype={constructor:o},i.inherits(o,r),t.exports=o},function(t,e){t.exports={buildPath:function(t,e){var n,i,r,o,a=e.x,s=e.y,l=e.width,u=e.height,h=e.r;l<0&&(a+=l,l=-l),u<0&&(s+=u,u=-u),"number"==typeof h?n=i=r=o=h:h instanceof Array?1===h.length?n=i=r=o=h[0]:2===h.length?(n=r=h[0],i=o=h[1]):3===h.length?(n=h[0],i=o=h[1],r=h[2]):(n=h[0],i=h[1],r=h[2],o=h[3]):n=i=r=o=0;var c;n+i>l&&(c=n+i,n*=l/c,i*=l/c),r+o>l&&(c=r+o,r*=l/c,o*=l/c),i+r>u&&(c=i+r,i*=u/c,r*=u/c),n+o>u&&(c=n+o,n*=u/c,o*=u/c),t.moveTo(a+n,s),t.lineTo(a+l-i,s),0!==i&&t.quadraticCurveTo(a+l,s,a+l,s+i),t.lineTo(a+l,s+u-r),0!==r&&t.quadraticCurveTo(a+l,s+u,a+l-r,s+u),t.lineTo(a+o,s+u),0!==o&&t.quadraticCurveTo(a,s+u,a,s+u-o),t.lineTo(a,s+n),0!==n&&t.quadraticCurveTo(a,s,a+n,s)}}},function(t,e,n){var i=n(6),r=i.min,o=i.max,a=i.scale,s=i.distance,l=i.add;t.exports=function(t,e,n,u){var h,c,d,f,p=[],g=[],m=[],v=[];if(u){d=[1/0,1/0],f=[-(1/0),-(1/0)];for(var y=0,x=t.length;y<x;y++)r(d,d,t[y]),o(f,f,t[y]);r(d,d,u[0]),o(f,f,u[1])}for(var y=0,x=t.length;y<x;y++){var _=t[y];if(n)h=t[y?y-1:x-1],c=t[(y+1)%x];else{if(0===y||y===x-1){p.push(i.clone(t[y]));continue}h=t[y-1],c=t[y+1]}i.sub(g,c,h),a(g,g,e);var b=s(_,h),w=s(_,c),M=b+w;0!==M&&(b/=M,w/=M),a(m,g,-b),a(v,g,w);var S=l([],_,m),T=l([],_,v);u&&(o(S,S,d),r(S,S,f),o(T,T,d),r(T,T,f)),p.push(S),p.push(T)}return n&&p.push(p.shift()),p}},function(t,e,n){function i(t,e,n,i,r,o,a){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*a+(-3*(e-n)-2*s-l)*o+s*r+e}var r=n(6);t.exports=function(t,e){for(var n=t.length,o=[],a=0,s=1;s<n;s++)a+=r.distance(t[s-1],t[s]);var l=a/2;l=l<n?n:l;for(var s=0;s<l;s++){var u,h,c,d=s/(l-1)*(e?n:n-1),f=Math.floor(d),p=d-f,g=t[f%n];e?(u=t[(f-1+n)%n],h=t[(f+1)%n],c=t[(f+2)%n]):(u=t[0===f?f:f-1],h=t[f>n-2?n-1:f+1],c=t[f>n-3?n-1:f+2]);var m=p*p,v=p*m;o.push([i(u[0],g[0],h[0],c[0],p,m,v),i(u[1],g[1],h[1],c[1],p,m,v)])}return o}},function(t,e,n){t.exports=n(8).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),o=e.startAngle,a=e.endAngle,s=e.clockwise,l=Math.cos(o),u=Math.sin(o);t.moveTo(l*r+n,u*r+i),t.arc(n,i,r,o,a,!s)}})},function(t,e,n){"use strict";function i(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?c:u)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?c:u)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?h:l)(t.x1,t.cpx1,t.x2,e),(n?h:l)(t.y1,t.cpy1,t.y2,e)]}var r=n(20),o=n(6),a=r.quadraticSubdivide,s=r.cubicSubdivide,l=r.quadraticAt,u=r.cubicAt,h=r.quadraticDerivativeAt,c=r.cubicDerivativeAt,d=[];t.exports=n(8).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,o=e.y2,l=e.cpx1,u=e.cpy1,h=e.cpx2,c=e.cpy2,f=e.percent;0!==f&&(t.moveTo(n,i),null==h||null==c?(f<1&&(a(n,l,r,f,d),l=d[1],r=d[2],a(i,u,o,f,d),u=d[1],o=d[2]),t.quadraticCurveTo(l,u,r,o)):(f<1&&(s(n,l,h,r,f,d),l=d[1],h=d[2],r=d[3],s(i,u,c,o,f,d),u=d[1],c=d[2],o=d[3]),t.bezierCurveTo(l,u,h,c,r,o)))},pointAt:function(t){return i(this.shape,t,!1)},tangentAt:function(t){var e=i(this.shape,t,!0);return o.normalize(e,e)}})},function(t,e,n){"use strict";t.exports=n(8).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,n){t.exports=n(8).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,o=e.y2,a=e.percent;0!==a&&(t.moveTo(n,i),a<1&&(r=n*(1-a)+r*a,o=i*(1-a)+o*a),t.lineTo(r,o))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,n){var i=n(74);t.exports=n(8).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){i.buildPath(t,e,!0)}})},function(t,e,n){var i=n(74);t.exports=n(8).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){i.buildPath(t,e,!1)}})},function(t,e,n){var i=n(166);t.exports=n(8).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,r=e.y,o=e.width,a=e.height;e.r?i.buildPath(t,e):t.rect(n,r,o,a),t.closePath()}})},function(t,e,n){t.exports=n(8).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)}})},function(t,e,n){var i=n(9),r=n(8),o=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]];t.exports=r.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:i.browser.ie&&i.browser.version>=11?function(){var t,e=this.__clipPaths,n=this.style;if(e)for(var i=0;i<e.length;i++){var a=e[i]&&e[i].shape;if(a&&a.startAngle===a.endAngle){for(var s=0;s<o.length;s++)o[s][2]=n[o[s][0]],n[o[s][0]]=o[s][1];t=!0;break}}if(r.prototype.brush.apply(this,arguments),t)for(var s=0;s<o.length;s++)n[o[s][0]]=o[s][2]}:r.prototype.brush,buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=e.startAngle,s=e.endAngle,l=e.clockwise,u=Math.cos(a),h=Math.sin(a);t.moveTo(u*r+n,h*r+i),t.lineTo(u*o+n,h*o+i),t.arc(n,i,o,a,s,!l),t.lineTo(Math.cos(s)*r+n,Math.sin(s)*r+i),0!==r&&t.arc(n,i,r,s,a,l),t.closePath()}})},function(t,e,n){"use strict";var i=n(67),r=n(1),o=r.isString,a=r.isFunction,s=r.isObject,l=n(52),u=function(){this.animators=[]};u.prototype={constructor:u,animate:function(t,e){var n,o=!1,a=this,s=this.__zr;if(t){var u=t.split("."),h=a;o="shape"===u[0];for(var c=0,d=u.length;c<d;c++)h&&(h=h[u[c]]);h&&(n=h)}else n=a;if(!n)return void l('Property "'+t+'" is not existed in element '+a.id);var f=a.animators,p=new i(n,e);return p.during(function(t){a.dirty(o)}).done(function(){f.splice(r.indexOf(f,p),1)}),f.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,n=e.length,i=0;i<n;i++)e[i].stop(t);return e.length=0,this},animateTo:function(t,e,n,i,r){function s(){u--,u||r&&r()}o(n)?(r=i,i=n,n=0):a(i)?(r=i,i="linear",n=0):a(n)?(r=n,n=0):a(e)?(r=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,n,i,r);var l=this.animators.slice(),u=l.length;u||r&&r();for(var h=0;h<l.length;h++)l[h].done(s).start(i)},_animateToShallow:function(t,e,n,i,o){var a={},l=0;for(var u in n)if(n.hasOwnProperty(u))if(null!=e[u])s(n[u])&&!r.isArrayLike(n[u])?this._animateToShallow(t?t+"."+u:u,e[u],n[u],i,o):(a[u]=n[u],l++);else if(null!=n[u])if(t){var h={};h[t]={},h[t][u]=n[u],this.attr(h)}else this.attr(u,n[u]);return l>0&&this.animate(t,!1).when(null==i?500:i,a).delay(o||0),this}},t.exports=u},function(t,e){function n(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function i(t,e){return{target:t,topTarget:e&&e.topTarget}}n.prototype={constructor:n,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(i(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,r=t.offsetY,o=n-this._x,a=r-this._y;this._x=n,this._y=r,e.drift(o,a,t),this.dispatchToElement(i(e,t),"drag",t.event);var s=this.findHover(n,r,e).target,l=this._dropTarget;this._dropTarget=s,e!==s&&(l&&s!==l&&this.dispatchToElement(i(l,t),"dragleave",t.event),s&&s!==l&&this.dispatchToElement(i(s,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(i(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(i(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=n},function(t,e,n){function i(t,e,n,i,r,o,a,s,l,u,p){var v=l*(f/180),y=d(v)*(t-n)/2+c(v)*(e-i)/2,x=-1*c(v)*(t-n)/2+d(v)*(e-i)/2,_=y*y/(a*a)+x*x/(s*s);_>1&&(a*=h(_),s*=h(_));var b=(r===o?-1:1)*h((a*a*(s*s)-a*a*(x*x)-s*s*(y*y))/(a*a*(x*x)+s*s*(y*y)))||0,w=b*a*x/s,M=b*-s*y/a,S=(t+n)/2+d(v)*w-c(v)*M,T=(e+i)/2+c(v)*w+d(v)*M,A=m([1,0],[(y-w)/a,(x-M)/s]),I=[(y-w)/a,(x-M)/s],C=[(-1*y-w)/a,(-1*x-M)/s],P=m(I,C);g(I,C)<=-1&&(P=f),g(I,C)>=1&&(P=0),0===o&&P>0&&(P-=2*f),1===o&&P<0&&(P+=2*f),p.addData(u,S,T,a,s,A,P,v,o)}function r(t){if(!t)return[];var e,n=t.replace(/-/g," -").replace(/  /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e<u.length;e++)n=n.replace(new RegExp(u[e],"g"),"|"+u[e]);var r,o=n.split("|"),a=0,l=0,h=new s,c=s.CMD;for(e=1;e<o.length;e++){var d,f=o[e],p=f.charAt(0),g=0,m=f.slice(1).replace(/e,-/g,"e-").split(",");m.length>0&&""===m[0]&&m.shift();for(var v=0;v<m.length;v++)m[v]=parseFloat(m[v]);for(;g<m.length&&!isNaN(m[g])&&!isNaN(m[0]);){var y,x,_,b,w,M,S,T=a,A=l;switch(p){case"l":a+=m[g++],l+=m[g++],d=c.L,h.addData(d,a,l);break;case"L":a=m[g++],l=m[g++],d=c.L,h.addData(d,a,l);break;case"m":a+=m[g++],l+=m[g++],d=c.M,h.addData(d,a,l),p="l";break;case"M":a=m[g++],l=m[g++],d=c.M,h.addData(d,a,l),p="L";break;case"h":a+=m[g++],d=c.L,h.addData(d,a,l);break;case"H":a=m[g++],d=c.L,h.addData(d,a,l);break;case"v":l+=m[g++],d=c.L,h.addData(d,a,l);break;case"V":l=m[g++],d=c.L,h.addData(d,a,l);break;case"C":d=c.C,h.addData(d,m[g++],m[g++],m[g++],m[g++],m[g++],m[g++]),a=m[g-2],l=m[g-1];break;case"c":d=c.C,h.addData(d,m[g++]+a,m[g++]+l,m[g++]+a,m[g++]+l,m[g++]+a,m[g++]+l),a+=m[g-2],l+=m[g-1];break;case"S":y=a,x=l;var I=h.len(),C=h.data;r===c.C&&(y+=a-C[I-4],x+=l-C[I-3]),d=c.C,T=m[g++],A=m[g++],a=m[g++],l=m[g++],h.addData(d,y,x,T,A,a,l);break;case"s":y=a,x=l;var I=h.len(),C=h.data;r===c.C&&(y+=a-C[I-4],x+=l-C[I-3]),d=c.C,T=a+m[g++],A=l+m[g++],a+=m[g++],l+=m[g++],h.addData(d,y,x,T,A,a,l);break;case"Q":T=m[g++],A=m[g++],a=m[g++],l=m[g++],d=c.Q,h.addData(d,T,A,a,l);break;case"q":T=m[g++]+a,A=m[g++]+l,a+=m[g++],l+=m[g++],d=c.Q,h.addData(d,T,A,a,l);break;case"T":y=a,x=l;var I=h.len(),C=h.data;r===c.Q&&(y+=a-C[I-4],x+=l-C[I-3]),a=m[g++],l=m[g++],d=c.Q,h.addData(d,y,x,a,l);break;case"t":y=a,x=l;var I=h.len(),C=h.data;r===c.Q&&(y+=a-C[I-4],x+=l-C[I-3]),a+=m[g++],l+=m[g++],d=c.Q,h.addData(d,y,x,a,l);break;case"A":_=m[g++],b=m[g++],w=m[g++],M=m[g++],S=m[g++],T=a,A=l,a=m[g++],l=m[g++],d=c.A,i(T,A,a,l,M,S,_,b,w,d,h);break;case"a":_=m[g++],b=m[g++],w=m[g++],M=m[g++],S=m[g++],T=a,A=l,a+=m[g++],l+=m[g++],d=c.A,i(T,A,a,l,M,S,_,b,w,d,h)}}"z"!==p&&"Z"!==p||(d=c.Z,h.addData(d)),r=d}return h.toStatic(),h}function o(t,e){var n=r(t);return e=e||{},e.buildPath=function(t){if(t.setData){t.setData(n.data);var e=t.getContext();e&&t.rebuildPath(e)}else{var e=t;n.rebuildPath(e)}},e.applyTransform=function(t){l(n,t),this.dirty(!0)},e}var a=n(8),s=n(27),l=n(181),u=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],h=Math.sqrt,c=Math.sin,d=Math.cos,f=Math.PI,p=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},g=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(p(t)*p(e))},m=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(g(t,e))};t.exports={createFromString:function(t,e){return new a(o(t,e))},extendFromString:function(t,e){return a.extend(o(t,e))},mergePath:function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var o=t[r];o.path||o.createPathProxy(),o.__dirtyPath&&o.buildPath(o.path,o.shape,!0),n.push(o.path)}var s=new a(e);return s.createPathProxy(),s.buildPath=function(t){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,n){function i(t,e){var n,i,o,h,c,d,f=t.data,p=r.M,g=r.C,m=r.L,v=r.R,y=r.A,x=r.Q;for(o=0,h=0;o<f.length;){switch(n=f[o++],h=o,i=0,n){case p:i=1;break;case m:i=1;break;case g:i=3;break;case x:i=2;break;case y:var _=e[4],b=e[5],w=l(e[0]*e[0]+e[1]*e[1]),M=l(e[2]*e[2]+e[3]*e[3]),S=u(-e[1]/M,e[0]/w);f[o]*=w,f[o++]+=_,f[o]*=M,f[o++]+=b,f[o++]*=w,f[o++]*=M,f[o++]+=S,f[o++]+=S,o+=2,h=o;break;case v:d[0]=f[o++],d[1]=f[o++],a(d,d,e),f[h++]=d[0],f[h++]=d[1],d[0]+=f[o++],d[1]+=f[o++],a(d,d,e),f[h++]=d[0],f[h++]=d[1]}for(c=0;c<i;c++){var d=s[c];d[0]=f[o++],d[1]=f[o++],a(d,d,e),f[h++]=d[0],f[h++]=d[1]}}}var r=n(27).CMD,o=n(6),a=o.applyTransform,s=[[],[],[]],l=Math.sqrt,u=Math.atan2;t.exports=i},function(t,e,n){if(!n(9).canvasSupported){var i,r="urn:schemas-microsoft-com:vml",o=window,a=o.document,s=!1;try{!a.namespaces.zrvml&&a.namespaces.add("zrvml",r),i=function(t){return a.createElement("<zrvml:"+t+' class="zrvml">')}}catch(l){i=function(t){return a.createElement("<"+t+' xmlns="'+r+'" class="zrvml">')}}var u=function(){if(!s){s=!0;var t=a.styleSheets;t.length<31?a.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}};t.exports={doc:a,initVML:u,createNode:i}}},,function(t,e,n){function i(t,e,n){var i=this._targetInfoList=[],r={},a=o(e,t);p(_,function(t,e){(!n||!n.include||g(n.include,e)>=0)&&t(a,i,r)})}function r(t){return t[0]>t[1]&&t.reverse(),t}function o(t,e){return d.parseFinder(t,e,{includeMainTypes:y})}function a(t,e,n,i){var o=n.getAxis(["x","y"][t]),a=r(h.map([0,1],function(t){return e?o.coordToData(o.toLocalCoord(i[t])):o.toGlobalCoord(o.dataToCoord(i[t]))})),s=[];return s[t]=a,s[1-t]=[NaN,NaN],{values:a,xyMinMax:s}}function s(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function l(t,e){var n=u(t),i=u(e),r=[n[0]/i[0],n[1]/i[1]];return isNaN(r[0])&&(r[0]=1),isNaN(r[1])&&(r[1]=1),r}function u(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var h=n(1),c=n(3),d=n(5),f=n(185),p=h.each,g=h.indexOf,m=h.curry,v=["dataToPoint","pointToData"],y=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],x=i.prototype;x.setOutputRanges=function(t,e){this.matchOutputRanges(t,e,function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=M[t.brushType](0,n,e);t.__rangeOffset={offset:S[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})},x.matchOutputRanges=function(t,e,n){p(t,function(t){var i=this.findTargetInfo(t,e);i&&i!==!0&&h.each(i.coordSyses,function(i){var r=M[t.brushType](1,i,t.range);n(t,r.values,i,e)})},this)},x.setInputRanges=function(t,e){p(t,function(t){var n=this.findTargetInfo(t,e);if(t.range=t.range||[],n&&n!==!0){t.panelId=n.panelId;var i=M[t.brushType](0,n.coordSys,t.coordRange),r=t.__rangeOffset;t.range=r?S[t.brushType](i.values,r.offset,l(i.xyMinMax,r.xyMinMax)):i.values}},this)},x.makePanelOpts=function(t,e){return h.map(this._targetInfoList,function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e&&e(n),clipPath:f.makeRectPanelClipPath(i),isTargetByCursor:f.makeRectIsTargetByCursor(i,t,n.coordSysModel),getLinearBrushOtherExtent:f.makeLinearBrushOtherExtent(i)}})},x.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return i===!0||i&&g(i.coordSyses,e.coordinateSystem)>=0},x.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=o(e,t),r=0;r<n.length;r++){var a=n[r],s=t.panelId;if(s){if(a.panelId===s)return a}else for(var r=0;r<b.length;r++)if(b[r](i,a))return a}return!0};var _={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=h.createHashMap(),a={},s={};(n||i||r)&&(p(n,function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0}),p(i,function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0}),p(r,function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0}),o.each(function(t){var r=t.coordinateSystem,o=[];p(r.getCartesians(),function(t,e){(g(n,t.getAxis("x").model)>=0||g(i,t.getAxis("y").model)>=0)&&o.push(t)}),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:w.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})}))},geo:function(t,e){p(t.geoModels,function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:w.geo})})}},b=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],w={grid:function(){return this.coordSys.grid.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(c.getTransform(t)),e}},M={lineX:m(a,0),lineY:m(a,1),rect:function(t,e,n){var i=e[v[t]]([n[0][0],n[1][0]]),o=e[v[t]]([n[0][1],n[1][1]]),a=[r([i[0],o[0]]),r([i[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n){var i=[[1/0,-(1/0)],[1/0,-(1/0)]],r=h.map(n,function(n){var r=e[v[t]](n);return i[0][0]=Math.min(i[0][0],r[0]),i[1][0]=Math.min(i[1][0],r[1]),i[0][1]=Math.max(i[0][1],r[0]),i[1][1]=Math.max(i[1][1],r[1]),r});return{values:r,xyMinMax:i}}},S={lineX:m(s,0),lineY:m(s,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return h.map(t,function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]})}};t.exports=i},function(t,e,n){function i(t){return o.create(t)}var r=n(128),o=n(11),a=n(3),s={};s.makeRectPanelClipPath=function(t){return t=i(t),function(e,n){return a.clipPointsByRect(e,t)}},s.makeLinearBrushOtherExtent=function(t,e){return t=i(t),function(n){var i=null!=e?e:n,r=i?t.width:t.height,o=i?t.x:t.y;return[o,o+(r||0)]}},s.makeRectIsTargetByCursor=function(t,e,n){return t=i(t),function(i,o,a){return t.contain(o[0],o[1])&&!r.onIrrelevantElement(i,e,n)}},t.exports=s},,,function(t,e){function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function r(t){if(h===setTimeout)return setTimeout(t,0);if((h===n||!h)&&setTimeout)return h=setTimeout,setTimeout(t,0);try{return h(t,0)}catch(e){try{return h.call(null,t,0)}catch(e){return h.call(this,t,0)}}}function o(t){if(c===clearTimeout)return clearTimeout(t);if((c===i||!c)&&clearTimeout)return c=clearTimeout,clearTimeout(t);try{return c(t)}catch(e){try{return c.call(null,t)}catch(e){return c.call(this,t)}}}function a(){g&&f&&(g=!1,f.length?p=f.concat(p):m=-1,p.length&&s())}function s(){if(!g){var t=r(a);g=!0;for(var e=p.length;e;){for(f=p,p=[];++m<e;)f&&f[m].run();m=-1,e=p.length}f=null,g=!1,o(t)}}function l(t,e){this.fun=t,this.array=e}function u(){}var h,c,d=t.exports={};
+!function(){try{h="function"==typeof setTimeout?setTimeout:n}catch(t){h=n}try{c="function"==typeof clearTimeout?clearTimeout:i}catch(t){c=i}}();var f,p=[],g=!1,m=-1;d.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];p.push(new l(t,e)),1!==p.length||g||r(s)},l.prototype.run=function(){this.fun.apply(null,this.array)},d.title="browser",d.browser=!0,d.env={},d.argv=[],d.version="",d.versions={},d.on=u,d.addListener=u,d.once=u,d.off=u,d.removeListener=u,d.removeAllListeners=u,d.emit=u,d.binding=function(t){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(t){throw new Error("process.chdir is not supported")},d.umask=function(){return 0}},function(t,e,n){function i(){this.group=new r.Group,this._symbolEl=new a({})}var r=n(3),o=n(24),a=r.extendShape({shape:{points:null,sizes:null},symbolProxy:null,buildPath:function(t,e){for(var n=e.points,i=e.sizes,r=this.symbolProxy,o=r.shape,a=0;a<n.length;a++){var s=n[a],l=i[a];l[0]<4?t.rect(s[0]-l[0]/2,s[1]-l[1]/2,l[0],l[1]):(o.x=s[0]-l[0]/2,o.y=s[1]-l[1]/2,o.width=l[0],o.height=l[1],r.buildPath(t,o,!0))}},findDataIndex:function(t,e){for(var n=this.shape,i=n.points,r=n.sizes,o=i.length-1;o>=0;o--){var a=i[o],s=r[o],l=a[0]-s[0]/2,u=a[1]-s[1]/2;if(t>=l&&e>=u&&t<=l+s[0]&&e<=u+s[1])return o}return-1}}),s=i.prototype;s.updateData=function(t){this.group.removeAll();var e=this._symbolEl,n=t.hostModel;e.setShape({points:t.mapArray(t.getItemLayout),sizes:t.mapArray(function(e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array||(n=[n,n]),n})}),e.symbolProxy=o.createSymbol(t.getVisual("symbol"),0,0,0,0),e.setColor=e.symbolProxy.setColor,e.useStyle(n.getModel("itemStyle.normal").getItemStyle(["color"]));var i=t.getVisual("color");i&&e.setColor(i),e.seriesIndex=n.seriesIndex,e.on("mousemove",function(t){e.dataIndex=null;var n=e.findDataIndex(t.offsetX,t.offsetY);n>0&&(e.dataIndex=n)}),this.group.add(e)},s.updateLayout=function(t){var e=t.getData();this._symbolEl.setShape({points:e.mapArray(e.getItemLayout)})},s.remove=function(){this.group.removeAll()},t.exports=i},function(t,e,n){function i(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var r=n(3),o=n(6),a=r.Line.prototype,s=r.BezierCurve.prototype;t.exports=r.extendShape({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(i(e)?a:s).buildPath(t,e)},pointAt:function(t){return i(this.shape)?a.pointAt.call(this,t):s.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,n=i(e)?[e.x2-e.x1,e.y2-e.y1]:s.tangentAt.call(this,t);return o.normalize(n,n)}})},function(t,e,n){var i=n(1),r=n(2);n(192),n(193),r.registerVisual(i.curry(n(50),"scatter","circle",null)),r.registerLayout(i.curry(n(61),"scatter")),n(32)},function(t,e,n){"use strict";var i=n(28),r=n(17);t.exports=r.extend({type:"series.scatter",dependencies:["grid","polar","geo","singleAxis","calendar"],getInitialData:function(t,e){return i(t.data,this,e)},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{normal:{opacity:.8}}}})},function(t,e,n){var i=n(44),r=n(189);n(2).extendChartView({type:"scatter",init:function(){this._normalSymbolDraw=new i,this._largeSymbolDraw=new r},render:function(t,e,n){var i=t.getData(),r=this._largeSymbolDraw,o=this._normalSymbolDraw,a=this.group,s=t.get("large")&&i.count()>t.get("largeThreshold")?r:o;this._symbolDraw=s,s.updateData(i),a.add(s.group),a.remove(s===r?o.group:r.group)},updateLayout:function(t){this._symbolDraw.updateLayout(t)},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e,!0)},dispose:function(){}})},function(t,e,n){var i=n(2),r=i.extendComponentModel({type:"axisPointer",coordSysAxesInfo:null,defaultOption:{show:"auto",triggerOn:null,zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#aaa",width:1,type:"solid"},shadowStyle:{color:"rgba(150,150,150,0.3)"},label:{show:!0,formatter:null,precision:"auto",margin:3,textStyle:{color:"#fff"},padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,shadowBlur:3,shadowColor:"#aaa"},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}}});t.exports=r},function(t,e,n){var i=n(122),r=n(2).extendComponentView({type:"axisPointer",render:function(t,e,n){var r=e.getComponent("tooltip"),o=t.get("triggerOn")||r&&r.get("triggerOn")||"mousemove|click";i.register("axisPointer",n,function(t,e,n){"none"!==o&&("leave"===t||o.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})})},remove:function(t,e){i.disopse(e.getZr(),"axisPointer"),r.superApply(this._model,"remove",arguments)},dispose:function(t,e){i.unregister("axisPointer",e),r.superApply(this._model,"dispose",arguments)}})},function(t,e,n){function i(t,e,n,i,o,p,g,m){i=i||{},f(n)&&(n=v({seriesIndex:i.seriesIndex,dataIndex:i.dataIndex},p).point);var _=f(n),b=i.axesInfo,w=t.axesInfo,M="leave"===e||f(n),S={},T={},A={list:[],map:{}},I={showPointer:x(a,T),showTooltip:x(s,A)};y(t.coordSysMap,function(e,i){var o=_||e.containPoint(n);y(t.coordSysAxesInfo[i],function(t,e){var i=t.axis,a=c(b,t);if(!M&&o&&(!b||a)){var s=a&&a.value;null!=s||_||(s=i.pointToData(n)),null!=s&&r(t,s,I,!1,S)}})});var C={};return y(w,function(t,e){var n=t.linkGroup;n&&!T[e]&&y(n.axesInfo,function(e,i){var r=T[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,d(e),d(t)))),C[t.key]=o}})}),y(C,function(t,e){r(w[e],t,I,!0,S)}),l(T,w,S),u(A,n,m,o),h(w,o,g),S}function r(t,e,n,i,r){var a=t.axis;if(!a.scale.isBlank()&&a.containData(e)){if(!t.involveSeries)return void n.showPointer(t,e);var s=o(e,t),l=s.payloadBatch,u=s.snapToValue;l[0]&&null==r.seriesIndex&&p.extend(r,l[0]),!i&&t.snap&&a.containData(u)&&null!=u&&(e=u),n.showPointer(t,e,l,r),n.showTooltip(t,s,u)}}function o(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return y(e.seriesModels,function(e,l){var u,h,c=e.coordDimToDataDim(i);if(e.getAxisTooltipData){var d=e.getAxisTooltipData(c,t,n);h=d.dataIndices,u=d.nestestValue}else{if(h=e.getData().indicesOfNearest(c[0],t,!1,"category"===n.type?.5:null),!h.length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var f=t-u,p=Math.abs(f);p<=a&&((p<a||f>=0&&s<0)&&(a=p,s=f,r=u,o.length=0),y(h,function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})}))}}),{payloadBatch:o,snapToValue:r}}function a(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function s(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=m.makeKey(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get("label.precision"),formatter:s.get("label.formatter")},seriesDataIndices:r.slice()})}}function l(t,e,n){var i=n.axesInfo=[];y(e,function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})})}function u(t,e,n,i){if(f(e)||!t.list.length)return void i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}function h(t,e,n){var i=n.getZr(),r="axisPointerLastHighlights",o=_(i)[r]||{},a=_(i)[r]={};y(t,function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&y(n.seriesDataIndices,function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t})});var s=[],l=[];p.each(o,function(t,e){!a[e]&&l.push(t)}),p.each(a,function(t,e){!o[e]&&s.push(t)}),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,batch:s})}function c(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}function d(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function f(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}var p=n(1),g=n(5),m=n(45),v=n(121),y=p.each,x=p.curry,_=g.makeGetter();t.exports=i},function(t,e,n){n(126),n(46),n(47),n(203),n(204),n(199),n(200),n(124),n(123)},function(t,e,n){function i(t,e,n){var i=[1/0,-(1/0)];return h(n,function(t){var n=t.getData();n&&h(t.coordDimToDataDim(e),function(t){var e=n.getDataExtent(t);e[0]<i[0]&&(i[0]=e[0]),e[1]>i[1]&&(i[1]=e[1])})}),i[1]<i[0]&&(i=[NaN,NaN]),r(t,i),i}function r(t,e){var n=t.getAxisModel(),i=n.getMin(!0),r="category"===n.get("type"),o=r&&(n.get("data")||[]).length;null!=i&&"dataMin"!==i?e[0]=i:r&&(e[0]=o>0?0:NaN);var a=n.getMax(!0);return null!=a&&"dataMax"!==a?e[1]=a:r&&(e[1]=o>0?o-1:NaN),n.get("scale",!0)||(e[0]>0&&(e[0]=0),e[1]<0&&(e[1]=0)),e}function o(t,e){var n=t.getAxisModel(),i=t._percentWindow,r=t._valueWindow;if(i){var o=l.getPixelPrecision(r,[0,500]),a=e||0===i[0]&&100===i[1];n.setRange(a?null:+r[0].toFixed(o),a?null:+r[1].toFixed(o))}}function a(t){var e=t._minMaxSpan={},n=t._dataZoomModel;h(["min","max"],function(i){e[i+"Span"]=n.get(i+"Span");var r=n.get(i+"ValueSpan");null!=r&&(e[i+"ValueSpan"]=r,r=t.getAxisModel().axis.scale.parse(r),null!=r&&(e[i+"Span"]=l.linearMap(r,t._dataExtent,[0,100],!0)))})}var s=n(1),l=n(4),u=n(77),h=s.each,c=l.asc,d=function(t,e,n,i){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this._minMaxSpan,this.ecModel=i,this._dataZoomModel=n};d.prototype={constructor:d,hostedBy:function(t){return this._dataZoomModel===t},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[],e=this.ecModel;return e.eachSeries(function(n){if(u.isCoordSupported(n.get("coordinateSystem"))){var i=this._dimName,r=e.queryComponents({mainType:i+"Axis",index:n.get(i+"AxisIndex"),id:n.get(i+"AxisId")})[0];this._axisIndex===(r&&r.componentIndex)&&t.push(n)}},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,n=this._dimName,i=this.ecModel,r=this.getAxisModel(),o="x"===n||"y"===n;o?(e="gridIndex",t="x"===n?"y":"x"):(e="polarIndex",t="angle"===n?"radius":"angle");var a;return i.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(r.get(e)||0)&&(a=t)}),a},getMinMaxSpan:function(){return s.clone(this._minMaxSpan)},calculateDataWindow:function(t){var e=this._dataExtent,n=this.getAxisModel(),i=n.axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[t.start,t.end],s=[];return h(["startValue","endValue"],function(e){s.push(null!=t[e]?i.parse(t[e]):null)}),h([0,1],function(t){var n=s[t],u=a[t];"percent"===r[t]?(null==u&&(u=o[t]),n=i.parse(l.linearMap(u,o,e,!0))):u=l.linearMap(n,e,o,!0),s[t]=n,a[t]=u}),{valueWindow:c(s),percentWindow:c(a)}},reset:function(t){if(t===this._dataZoomModel){this._dataExtent=i(this,this._dimName,this.getTargetSeriesModels());var e=this.calculateDataWindow(t.option);this._valueWindow=e.valueWindow,this._percentWindow=e.percentWindow,a(this),o(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,o(this,!0))},filterData:function(t){function e(t){return t>=o[0]&&t<=o[1]}if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow;if("none"!==r){var a=this.getOtherAxisModel();t.get("$fromToolbox")&&a&&"category"===a.get("type")&&(r="empty"),h(i,function(t){var i=t.getData(),a=t.coordDimToDataDim(n);"weakFilter"===r?i&&i.filterSelf(function(t){for(var e,n,r,s=0;s<a.length;s++){var l=i.get(a[s],t),u=!isNaN(l),h=l<o[0],c=l>o[1];if(u&&!h&&!c)return!0;u&&(r=!0),h&&(e=!0),c&&(n=!0)}return r&&e&&n}):i&&h(a,function(n){"empty"===r?t.setData(i.map(n,function(t){return e(t)?t:NaN})):i.filterSelf(n,e)})})}}}},t.exports=d},function(t,e,n){t.exports=n(46).extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}})},function(t,e,n){var i=n(47),r=n(1),o=n(56),a=n(205),s=r.bind,l=i.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,n,i){l.superApply(this,"render",arguments),a.shouldRecordRange(i,t.id)&&(this._range=t.getPercentRange()),r.each(this.getTargetCoordInfo(),function(e,i){var o=r.map(e,function(t){return a.generateCoordId(t.model)});r.each(e,function(e){var r=e.model,l=t.option;a.register(n,{coordId:a.generateCoordId(r),allCoordIds:o,containsPoint:function(t,e,n){return r.coordinateSystem.containPoint([e,n])},dataZoomId:t.id,throttleRate:t.get("throttle",!0),panGetRange:s(this._onPan,this,e,i),zoomGetRange:s(this._onZoom,this,e,i),zoomLock:l.zoomLock,disabled:l.disabled,roamControllerOpt:{zoomOnMouseWheel:l.zoomOnMouseWheel,moveOnMouseMove:l.moveOnMouseMove,preventDefaultMouseMove:l.preventDefaultMouseMove}})},this)},this)},dispose:function(){a.unregister(this.api,this.dataZoomModel.id),l.superApply(this,"dispose",arguments),this._range=null},_onPan:function(t,e,n,i,r,a,s,l,h){var c=this._range.slice(),d=t.axisModels[0];if(d){var f=u[e]([a,s],[l,h],d,n,t),p=f.signal*(c[1]-c[0])*f.pixel/f.pixelLength;return o(p,c,[0,100],"all"),this._range=c}},_onZoom:function(t,e,n,i,r,a){var s=this._range.slice(),l=t.axisModels[0];if(l){var h=u[e](null,[r,a],l,n,t),c=(h.pixel-h.pixelStart)/h.pixelLength*(s[1]-s[0])+s[0];i=Math.max(1/i,0),s[0]=(s[0]-c)*i+c,s[1]=(s[1]-c)*i+c;var d=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return o(0,s,[0,100],0,d.minSpan,d.maxSpan),this._range=s}}}),u={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};t.exports=l},function(t,e,n){var i=n(46);t.exports=i.extend({type:"dataZoom.select"})},function(t,e,n){t.exports=n(47).extend({type:"dataZoom.select"})},function(t,e,n){var i=n(46),r=i.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}});t.exports=r},function(t,e,n){function i(t){var e={x:"y",y:"x",radius:"angle",angle:"radius"};return e[t]}var r=n(1),o=n(3),a=n(37),s=n(47),l=o.Rect,u=n(4),h=u.linearMap,c=n(12),d=n(56),f=n(21),p=u.asc,g=r.bind,m=r.each,v=7,y=1,x=30,_="horizontal",b="vertical",w=5,M=["line","bar","candlestick","scatter"],S=s.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,n,i){return S.superApply(this,"render",arguments),a.createOrUpdate(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),this.dataZoomModel.get("show")===!1?void this.group.removeAll():(i&&"dataZoom"===i.type&&i.from===this.uid||this._buildView(),void this._updateView())},remove:function(){S.superApply(this,"remove",arguments),a.clear(this,"_dispatchZoomAction")},dispose:function(){S.superApply(this,"dispose",arguments),a.clear(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new o.Group;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,n=this._findCoordRect(),i={width:e.getWidth(),height:e.getHeight()},o=this._orient===_?{right:i.width-n.x-n.width,top:i.height-x-v,width:n.width,height:x}:{right:v,top:n.y,width:x,height:n.height},a=c.getLayoutParams(t.option);r.each(["right","top","width","height"],function(t){"ph"===a[t]&&(a[t]=o[t])});var s=c.getLayoutRect(a,i,t.padding);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===b&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.barGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==_||r?n===_&&r?{scale:a?[-1,1]:[-1,-1]}:n!==b||r?{scale:a?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:a?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:a?[1,1]:[1,-1]});var s=t.getBoundingRect([o]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.barGroup;n.add(new l({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40})),n.add(new l({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:r.bind(this._onClickPanelClick,this)}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,n=t.series,i=n.getRawData(),a=n.getShadowDim?n.getShadowDim():t.otherDim;if(null!=a){var s=i.getDataExtent(a),l=.3*(s[1]-s[0]);s=[s[0]-l,s[1]+l];var u,c=[0,e[1]],d=[0,e[0]],f=[[e[0],0],[0,0]],p=[],g=d[1]/(i.count()-1),m=0,v=Math.round(i.count()/e[0]);i.each([a],function(t,e){if(v>0&&e%v)return void(m+=g);var n=null==t||isNaN(t)||""===t,i=n?0:h(t,s,c,!0);n&&!u&&e?(f.push([f[f.length-1][0],0]),p.push([p[p.length-1][0],0])):!n&&u&&(f.push([m,0]),p.push([m,0])),f.push([m,i]),p.push([m,i]),m+=g,u=n});var y=this.dataZoomModel;this._displayables.barGroup.add(new o.Polygon({shape:{points:f},style:r.defaults({fill:y.get("dataBackgroundColor")},y.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new o.Polyline({shape:{points:p},style:y.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(e!==!1){var n,o=this.ecModel;return t.eachTargetAxis(function(a,s){var l=t.getAxisProxy(a.name,s).getTargetSeriesModels();r.each(l,function(t){if(!(n||e!==!0&&r.indexOf(M,t.get("type"))<0)){var l,u=o.getComponent(a.axis,s).axis,h=i(a.name),c=t.coordinateSystem;null!=h&&c.getOtherAxis&&(l=c.getOtherAxis(u).inverse),n={thisAxis:u,series:t,thisDim:a.name,otherDim:h,otherAxisInverse:l}}},this)},this),n}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],n=t.handleLabels=[],i=this._displayables.barGroup,r=this._size,a=this.dataZoomModel;i.add(t.filler=new l({draggable:!0,cursor:"move",drift:g(this._onDragMove,this,"all"),onmousemove:function(t){f.stop(t.event)},ondragstart:g(this._showDataInfo,this,!0),ondragend:g(this._onDragEnd,this),onmouseover:g(this._showDataInfo,this,!0),onmouseout:g(this._showDataInfo,this,!1),style:{fill:a.get("fillerColor"),textPosition:"inside"}})),i.add(new l(o.subPixelOptimizeRect({silent:!0,shape:{x:0,y:0,width:r[0],height:r[1]},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:y,fill:"rgba(0,0,0,0)"}})));var s=a.get("handleIcon");m([0,1],function(t){var r={style:{strokeNoScale:!0},rectHover:!0,cursor:"vertical"===this._orient?"ns-resize":"ew-resize",draggable:!0,drift:g(this._onDragMove,this,t),onmousemove:function(t){f.stop(t.event)},ondragend:g(this._onDragEnd,this),onmouseover:g(this._showDataInfo,this,!0),onmouseout:g(this._showDataInfo,this,!1)},l={x:-1,y:0,width:2,height:2},h=0===s.indexOf("image://")?(l.image=s.slice(8),r.style=l,new o.Image(r)):o.makePath(s.replace("path://",""),r,l,"center"),c=h.getBoundingRect();this._handleHeight=u.parsePercent(a.get("handleSize"),this._size[1]),this._handleWidth=c.width/c.height*this._handleHeight,h.setStyle(a.getModel("handleStyle").getItemStyle());var d=a.get("handleColor");null!=d&&(h.style.fill=d),i.add(e[t]=h);var p=a.textStyleModel;this.group.add(n[t]=new o.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",fill:p.getTextColor(),textFont:p.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[h(t[0],[0,100],e,!0),h(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];d(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?h(o.minSpan,a,r,!0):null,null!=o.maxSpan?h(o.maxSpan,a,r,!0):null),this._range=p([h(i[0],r,a,!0),h(i[1],r,a,!0)])},_updateView:function(t){var e=this._displayables,n=this._handleEnds,i=p(n.slice()),r=this._size;m([0,1],function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scale:[o/2,o/2],position:[n[t],r[1]/2-o/2]})},this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]}),this._updateDataInfo(t)},_updateDataInfo:function(t){function e(t){var e=o.getTransform(i.handles[t].parent,this.group),n=o.transformDirection(0===t?"right":"left",e),l=this._handleWidth/2+w,u=o.applyTransform([d[t]+(0===t?-l:l),this._size[1]/2],e);r[t].setStyle({x:u[0],y:u[1],textVerticalAlign:a===_?"middle":n,textAlign:a===_?n:"center",text:s[t]})}var n=this.dataZoomModel,i=this._displayables,r=i.handleLabels,a=this._orient,s=["",""];if(n.get("showDetail")){var l=n.findRepresentativeAxisProxy();if(l){var u=l.getAxisModel().axis,h=this._range,c=t?l.calculateDataWindow({start:h[0],end:h[1]}).valueWindow:l.getDataValueWindow();s=[this._formatLabel(c[0],u),this._formatLabel(c[1],u)]}}var d=p(this._handleEnds.slice());e.call(this,0),e.call(this,1)},_formatLabel:function(t,e){var n=this.dataZoomModel,i=n.get("labelFormatter"),o=n.get("labelPrecision");null!=o&&"auto"!==o||(o=e.getPixelPrecision());var a=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(o,20));return r.isFunction(i)?i(t,a):r.isString(i)?i.replace("{value}",a):a},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,n){this._dragging=!0;var i=this._displayables.barGroup.getLocalTransform(),r=o.applyTransform([e,n],i,!0);this._updateInterval(t,r[0]);var a=this.dataZoomModel.get("realtime");this._updateView(!a),a&&a&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),this._dispatchZoomAction()},_onClickPanelClick:function(t){var e=this._size,n=this._displayables.barGroup.transformCoordToLocal(t.offsetX,t.offsetY);if(!(n[0]<0||n[0]>e[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2;this._updateInterval("all",n[0]-r),this._updateView(),this._dispatchZoomAction()}},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_findCoordRect:function(){var t;if(m(this.getTargetCoordInfo(),function(e){if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}}),!t){var e=this.api.getWidth(),n=this.api.getHeight();t={x:.2*e,y:.2*n,width:.6*e,height:.6*n}}return t}});t.exports=S},function(t,e,n){function i(t){var e=t.getZr();return e[p]||(e[p]={})}function r(t,e){var n=new c(t.getZr());return n.on("pan",f(a,e)),n.on("zoom",f(s,e)),n}function o(t){h.each(t,function(e,n){e.count||(e.controller.dispose(),delete t[n])})}function a(t,e,n,i,r,o,a){l(t,function(s){return s.panGetRange(t.controller,e,n,i,r,o,a)})}function s(t,e,n,i){l(t,function(r){return r.zoomGetRange(t.controller,e,n,i)})}function l(t,e){var n=[];h.each(t.dataZoomInfos,function(t){var i=e(t);i&&n.push({dataZoomId:t.dataZoomId,start:i[0],end:i[1]})}),t.dispatchAction(n)}function u(t,e){t.dispatchAction({type:"dataZoom",batch:e})}var h=n(1),c=n(95),d=n(37),f=h.curry,p="\0_ec_dataZoom_roams",g={register:function(t,e){var n=i(t),a=e.dataZoomId,s=e.coordId;h.each(n,function(t,n){var i=t.dataZoomInfos;i[a]&&h.indexOf(e.allCoordIds,s)<0&&(delete i[a],t.count--)}),o(n);var l=n[s];l||(l=n[s]={coordId:s,dataZoomInfos:{},count:0},l.controller=r(t,l),l.dispatchAction=h.curry(u,t)),l.controller.enable(!e.disabled&&(!e.zoomLock||"move"),e.roamControllerOpt),l.controller.setPointerChecker(e.containsPoint),d.createOrUpdate(l,"dispatchAction",e.throttleRate,"fixRate"),!l.dataZoomInfos[a]&&l.count++,l.dataZoomInfos[a]=e},unregister:function(t,e){var n=i(t);h.each(n,function(t){t.controller.dispose();var n=t.dataZoomInfos;n[e]&&(delete n[e],t.count--)}),o(n)},shouldRecordRange:function(t,e){if(t&&"dataZoom"===t.type&&t.batch)for(var n=0,i=t.batch.length;n<i;n++)if(t.batch[n].dataZoomId===e)return!1;return!0},generateCoordId:function(t){return t.type+"\0_"+t.id}};t.exports=g},function(t,e,n){n(126),n(46),n(47),n(201),n(202),n(124),n(123)},function(t,e,n){function i(t,e,n,i){var r=n.type,o=f[r.charAt(0).toUpperCase()+r.slice(1)],a=new o(n);e.add(a),i.set(t,a),a.__ecGraphicId=t}function r(t,e){var n=t&&t.parent;n&&("group"===t.type&&t.traverse(function(t){r(t,e)}),e.removeKey(t.__ecGraphicId),n.remove(t))}function o(t){return t=c.extend({},t),c.each(["id","parentId","$action","hv","bounding"].concat(p.LOCATION_PARAMS),function(e){delete t[e]}),t}function a(t,e){var n;return c.each(e,function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)}),n}function s(t,e){var n=t.exist;if(e.id=t.keyInfo.id,!e.type&&n&&(e.type=n.type),null==e.parentId){var i=e.parentOption;i?e.parentId=i.id:n&&(e.parentId=n.parentId)}e.parentOption=null}function l(t,e,n){var i=c.extend({},n),r=t[e],o=n.$action||"merge";if("merge"===o)if(r){c.merge(r,i,!0),p.mergeLayoutParam(r,i,{ignoreSize:!0}),p.copyLayoutParams(n,r)}else t[e]=i;else"replace"===o?t[e]=i:"remove"===o&&r&&(t[e]=null)}function u(t,e){t&&(t.hv=e.hv=[a(e,["left","right"]),a(e,["top","bottom"])],"group"===t.type&&(null==t.width&&(t.width=e.width=0),null==t.height&&(t.height=e.height=0)))}var h=n(2),c=n(1),d=n(5),f=n(3),p=n(12);h.registerPreprocessor(function(t){var e=t.graphic;c.isArray(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])});var g=h.extendComponentModel({type:"graphic",defaultOption:{elements:[],parentId:null},_elOptionsToUpdate:null,mergeOption:function(t){var e=this.option.elements;this.option.elements=null,g.superApply(this,"mergeOption",arguments),this.option.elements=e},optionUpdated:function(t,e){var n=this.option,i=(e?n:t).elements,r=n.elements=e?[]:n.elements,o=[];this._flatten(i,o);var a=d.mappingToExists(r,o);d.makeIdAndName(a);var h=this._elOptionsToUpdate=[];c.each(a,function(t,e){var n=t.option;n&&(h.push(n),s(t,n),l(r,e,n),u(r[e],n))},this);for(var f=r.length-1;f>=0;f--)null==r[f]?r.splice(f,1):delete r[f].$action},_flatten:function(t,e,n){c.each(t,function(t){if(t){n&&(t.parentOption=n),e.push(t);var i=t.children;"group"===t.type&&i&&this._flatten(i,e,t),delete t.children}},this)},useElOptionsToUpdate:function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t}});h.extendComponentView({type:"graphic",init:function(t,e){this._elMap=c.createHashMap(),this._lastGraphicModel},render:function(t,e,n){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t,n),this._relocate(t,n)},_updateElements:function(t,e){var n=t.useElOptionsToUpdate();if(n){var a=this._elMap,s=this.group;c.each(n,function(t){var e=t.$action,n=t.id,l=a.get(n),u=t.parentId,h=null!=u?a.get(u):s;t.hv&&t.hv[1]&&"text"===t.type&&(t.style=c.defaults({textBaseline:"middle"},t.style),t.style.textVerticalAlign=null);var d=o(t);e&&"merge"!==e?"replace"===e?(r(l,a),i(n,h,d,a)):"remove"===e&&r(l,a):l?l.attr(d):i(n,h,d,a);var f=a.get(n);f&&(f.__ecGraphicWidth=t.width,f.__ecGraphicHeight=t.height)})}},_relocate:function(t,e){for(var n=t.option.elements,i=this.group,r=this._elMap,o=n.length-1;o>=0;o--){var a=n[o],s=r.get(a.id);if(s){var l=s.parent,u=l===i?{width:e.getWidth(),height:e.getHeight()}:{width:l.__ecGraphicWidth||0,height:l.__ecGraphicHeight||0};p.positionElement(s,a,u,null,{hv:a.hv,boundingMode:a.bounding})}}},_clear:function(){var t=this._elMap;t.each(function(e){r(e,t)}),this._elMap=c.createHashMap()},dispose:function(){this._clear()}})},function(t,e,n){n(32),n(120),n(55)},function(t,e,n){n(210),n(212),n(211);var i=n(2);i.registerProcessor(n(213))},function(t,e,n){"use strict";var i=n(1),r=n(10),o=n(2).extendComponentModel({type:"legend",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,n){this.mergeDefaultAndTheme(t,n),t.selected=t.selected||{}},mergeOption:function(t){o.superCall(this,"mergeOption",t)},optionUpdated:function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,n=0;n<t.length;n++){var i=t[n].get("name");if(this.isSelected(i)){this.select(i),e=!0;break}}!e&&this.select(t[0].get("name"))}},_updateData:function(t){var e=i.map(this.get("data")||[],function(t){return"string"!=typeof t&&"number"!=typeof t||(t={name:t}),new r(t,this,this.ecModel)},this);this._data=e;var n=i.map(t.getSeries(),function(t){return t.name});t.eachSeries(function(t){if(t.legendDataProvider){var e=t.legendDataProvider();n=n.concat(e.mapArray(e.getName))}}),this._availableNames=n},getData:function(){return this._data},select:function(t){var e=this.option.selected,n=this.get("selectedMode");if("single"===n){var r=this._data;i.each(r,function(t){e[t.get("name")]=!1})}e[t]=!0},unSelect:function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},isSelected:function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&i.indexOf(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:"top",align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,
+tooltip:{show:!1}}});t.exports=o},function(t,e,n){function i(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function r(t,e,n){var i=n.getZr().storage.getDisplayList()[0];i&&i.useHoverLayer||t.get("legendHoverLink")&&n.dispatchAction({type:"highlight",seriesName:t.name,name:e})}function o(t,e,n){var i=n.getZr().storage.getDisplayList()[0];i&&i.useHoverLayer||t.get("legendHoverLink")&&n.dispatchAction({type:"downplay",seriesName:t.name,name:e})}var a=n(1),s=n(24),l=n(3),u=n(130),h=a.curry;t.exports=n(2).extendComponentView({type:"legend",init:function(){this._symbolTypeStore={}},render:function(t,e,n){var s=this.group;if(s.removeAll(),t.get("show")){var c=t.get("selectedMode"),d=t.get("align");"auto"===d&&(d="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left");var f=a.createHashMap();a.each(t.getData(),function(a){var u=a.get("name");if(""===u||"\n"===u)return void s.add(new l.Group({newline:!0}));var p=e.getSeriesByName(u)[0];if(!f.get(u))if(p){var g=p.getData(),m=g.getVisual("color");"function"==typeof m&&(m=m(p.getDataParams(0)));var v=g.getVisual("legendSymbol")||"roundRect",y=g.getVisual("symbol"),x=this._createItem(u,a,t,v,y,d,m,c);x.on("click",h(i,u,n)).on("mouseover",h(r,p,null,n)).on("mouseout",h(o,p,null,n)),f.set(u,!0)}else e.eachRawSeries(function(e){if(!f.get(u)&&e.legendDataProvider){var s=e.legendDataProvider(),l=s.indexOfName(u);if(l<0)return;var p=s.getItemVisual(l,"color"),g="roundRect",m=this._createItem(u,a,t,g,null,d,p,c);m.on("click",h(i,u,n)).on("mouseover",h(r,e,u,n)).on("mouseout",h(o,e,u,n)),f.set(u,!0)}},this)},this),u.layout(s,t,n),u.addBackground(s,t)}},_createItem:function(t,e,n,i,r,o,u,h){var c=n.get("itemWidth"),d=n.get("itemHeight"),f=n.get("inactiveColor"),p=n.isSelected(t),g=new l.Group,m=e.getModel("textStyle"),v=e.get("icon"),y=e.getModel("tooltip"),x=y.parentModel;if(i=v||i,g.add(s.createSymbol(i,0,0,c,d,p?u:f)),!v&&r&&(r!==i||"none"==r)){var _=.8*d;"none"===r&&(r="circle"),g.add(s.createSymbol(r,(c-_)/2,(d-_)/2,_,_,p?u:f))}var b="left"===o?c+5:-5,w=o,M=n.get("formatter"),S=t;"string"==typeof M&&M?S=M.replace("{name}",null!=t?t:""):"function"==typeof M&&(S=M(t));var T=new l.Text({style:{text:S,x:b,y:d/2,fill:p?m.getTextColor():f,textFont:m.getFont(),textAlign:w,textVerticalAlign:"middle"}});g.add(T);var A=new l.Rect({shape:g.getBoundingRect(),invisible:!0,tooltip:y.get("show")?a.extend({content:t,formatter:x.get("formatter",!0)||function(){return t},formatterParams:{componentType:"legend",legendIndex:n.componentIndex,name:t,$vars:["name"]}},y.option):null});return g.add(A),g.eachChild(function(t){t.silent=!0}),A.silent=!h,this.group.add(g),l.setHoverStyle(g),g}})},function(t,e,n){function i(t,e,n){var i,r={},a="toggleSelected"===t;return n.eachComponent("legend",function(n){a&&null!=i?n[i?"select":"unSelect"](e.name):(n[t](e.name),i=n.isSelected(e.name));var s=n.getData();o.each(s,function(t){var e=t.get("name");if("\n"!==e&&""!==e){var i=n.isSelected(e);r.hasOwnProperty(e)?r[e]=r[e]&&i:r[e]=i}})}),{name:e.name,selected:r}}var r=n(2),o=n(1);r.registerAction("legendToggleSelect","legendselectchanged",o.curry(i,"toggleSelected")),r.registerAction("legendSelect","legendselected",o.curry(i,"select")),r.registerAction("legendUnSelect","legendunselected",o.curry(i,"unSelect"))},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var n=0;n<e.length;n++)if(!e[n].isSelected(t.name))return!1;return!0})}},function(t,e,n){n(217),n(218),n(2).registerPreprocessor(function(t){t.markArea=t.markArea||{}})},function(t,e,n){n(219),n(220),n(2).registerPreprocessor(function(t){t.markLine=t.markLine||{}})},function(t,e,n){n(221),n(222),n(2).registerPreprocessor(function(t){t.markPoint=t.markPoint||{}})},function(t,e,n){t.exports=n(79).extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{normal:{show:!0,position:"top"},emphasis:{show:!0,position:"top"}},itemStyle:{normal:{borderWidth:0}}}})},function(t,e,n){function i(t){return!isNaN(t)&&!isFinite(t)}function r(t,e,n,r){var o=1-t;return i(e[o])&&i(n[o])}function o(t,e){var n=e.coord[0],i=e.coord[1];return!("cartesian2d"!==t.type||!n||!i||!r(1,n,i,t)&&!r(0,n,i,t))||(f.dataFilter(t,{coord:n,x:e.x0,y:e.y0})||f.dataFilter(t,{coord:i,x:e.x1,y:e.y1}))}function a(t,e,n,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),u=h.parsePercent(l.get(n[0]),o.getWidth()),c=h.parsePercent(l.get(n[1]),o.getHeight());if(isNaN(u)||isNaN(c)){if(r.getMarkerPosition)a=r.getMarkerPosition(t.getValues(n,e));else{var d=t.get(n[0],e),f=t.get(n[1],e);a=s.dataToPoint([d,f],!0)}if("cartesian2d"===s.type){var p=s.getAxis("x"),g=s.getAxis("y"),d=t.get(n[0],e),f=t.get(n[1],e);i(d)?a[0]=p.toGlobalCoord(p.getExtent()["x0"===n[0]?0:1]):i(f)&&(a[1]=g.toGlobalCoord(g.getExtent()["y0"===n[1]?0:1]))}isNaN(u)||(a[0]=u),isNaN(c)||(a[1]=c)}else a=[u,c];return a}function s(t,e,n){var i,r,a=["x0","y0","x1","y1"];t?(i=l.map(t&&t.dimensions,function(t){var n=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return n.name=t,n}),r=new u(l.map(a,function(t,e){return{name:t,type:i[e%2].type}}),n)):(i=[{name:"value",type:"float"}],r=new u(i,n));var s=l.map(n.get("data"),l.curry(p,e,t,n));t&&(s=l.filter(s,l.curry(o,t)));var h=t?function(t,e,n,i){return t.coord[Math.floor(i/2)][i%2]}:function(t){return t.value};return r.initData(s,null,h),r.hasItemOption=!0,r}var l=n(1),u=n(14),h=n(4),c=n(3),d=n(22),f=n(81),p=function(t,e,n,i){var r=f.dataTransform(t,i[0]),o=f.dataTransform(t,i[1]),a=l.retrieve,s=r.coord,u=o.coord;s[0]=a(s[0],-(1/0)),s[1]=a(s[1],-(1/0)),u[0]=a(u[0],1/0),u[1]=a(u[1],1/0);var h=l.mergeAll([{},r,o]);return h.coord=[r.coord,o.coord],h.x0=r.x,h.y0=r.y,h.x1=o.x,h.y1=o.y,h},g=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];n(80).extend({type:"markArea",updateLayout:function(t,e,n){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var i=e.getData();i.each(function(e){var r=l.map(g,function(r){return a(i,e,r,t,n)});i.setItemLayout(e,r);var o=i.getItemGraphicEl(e);o.setShape("points",r)})}},this)},renderSeries:function(t,e,n,i){var r=t.coordinateSystem,o=t.name,u=t.getData(),h=this.markerGroupMap,f=h.get(o)||h.set(o,{group:new c.Group});this.group.add(f.group),f.__keep=!0;var p=s(r,t,e);e.setData(p),p.each(function(e){p.setItemLayout(e,l.map(g,function(n){return a(p,e,n,t,i)})),p.setItemVisual(e,{color:u.getVisual("color")})}),p.diff(f.__data).add(function(t){var e=new c.Polygon({shape:{points:p.getItemLayout(t)}});p.setItemGraphicEl(t,e),f.group.add(e)}).update(function(t,n){var i=f.__data.getItemGraphicEl(n);c.updateProps(i,{shape:{points:p.getItemLayout(t)}},e,t),f.group.add(i),p.setItemGraphicEl(t,i)}).remove(function(t){var e=f.__data.getItemGraphicEl(t);f.group.remove(e)}).execute(),p.eachItemGraphicEl(function(t,n){var i=p.getItemModel(n),r=i.getModel("label.normal"),o=i.getModel("label.emphasis"),a=p.getItemVisual(n,"color");t.useStyle(l.defaults(i.getModel("itemStyle.normal").getItemStyle(),{fill:d.modifyAlpha(a,.4),stroke:a})),t.hoverStyle=i.getModel("itemStyle.normal").getItemStyle();var s=p.getName(n)||"",u=a||t.style.fill;r.getShallow("show")?(c.setText(t.style,r,u),t.style.text=l.retrieve(e.getFormattedLabel(n,"normal"),s)):t.style.text="",o.getShallow("show")?(c.setText(t.hoverStyle,o,u),t.hoverStyle.text=l.retrieve(e.getFormattedLabel(n,"emphasis"),s)):t.hoverStyle.text="",c.setHoverStyle(t,{}),t.dataModel=e}),f.__data=p,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,n){t.exports=n(79).extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"end"},emphasis:{show:!0}},lineStyle:{normal:{type:"dashed"},emphasis:{width:3}},animationEasing:"linear"}})},function(t,e,n){function i(t){return!isNaN(t)&&!isFinite(t)}function r(t,e,n,r){var o=1-t,a=r.dimensions[t];return i(e[o])&&i(n[o])&&e[t]===n[t]&&r.getAxis(a).containData(e[t])}function o(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(r(1,n,i,t)||r(0,n,i,t)))return!0}return c.dataFilter(t,e[0])&&c.dataFilter(t,e[1])}function a(t,e,n,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),u=h.parsePercent(l.get("x"),o.getWidth()),c=h.parsePercent(l.get("y"),o.getHeight());if(isNaN(u)||isNaN(c)){if(r.getMarkerPosition)a=r.getMarkerPosition(t.getValues(t.dimensions,e));else{var d=s.dimensions,f=t.get(d[0],e),p=t.get(d[1],e);a=s.dataToPoint([f,p])}if("cartesian2d"===s.type){var g=s.getAxis("x"),m=s.getAxis("y"),d=s.dimensions;i(t.get(d[0],e))?a[0]=g.toGlobalCoord(g.getExtent()[n?0:1]):i(t.get(d[1],e))&&(a[1]=m.toGlobalCoord(m.getExtent()[n?0:1]))}isNaN(u)||(a[0]=u),isNaN(c)||(a[1]=c)}else a=[u,c];t.setItemLayout(e,a)}function s(t,e,n){var i;i=t?l.map(t&&t.dimensions,function(t){var n=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return n.name=t,n}):[{name:"value",type:"float"}];var r=new u(i,n),a=new u(i,n),s=new u([],n),h=l.map(n.get("data"),l.curry(f,e,t,n));t&&(h=l.filter(h,l.curry(o,t)));var d=t?c.dimValueGetter:function(t){return t.value};return r.initData(l.map(h,function(t){return t[0]}),null,d),a.initData(l.map(h,function(t){return t[1]}),null,d),s.initData(l.map(h,function(t){return t[2]})),s.hasItemOption=!0,{from:r,to:a,line:s}}var l=n(1),u=n(14),h=n(4),c=n(81),d=n(107),f=function(t,e,n,i){var r=t.getData(),o=i.type;if(!l.isArray(i)&&("min"===o||"max"===o||"average"===o||null!=i.xAxis||null!=i.yAxis)){var a,s,u;if(null!=i.yAxis||null!=i.xAxis)s=null!=i.yAxis?"y":"x",a=e.getAxis(s),u=l.retrieve(i.yAxis,i.xAxis);else{var h=c.getAxisInfo(i,r,e,t);s=h.valueDataDim,a=h.valueAxis,u=c.numCalculate(r,s,o)}var d="x"===s?0:1,f=1-d,p=l.clone(i),g={};p.type=null,p.coord=[],g.coord=[],p.coord[f]=-(1/0),g.coord[f]=1/0;var m=n.get("precision");m>=0&&"number"==typeof u&&(u=+u.toFixed(m)),p.coord[d]=g.coord[d]=u,i=[p,g,{type:o,valueIndex:i.valueIndex,value:u}]}return i=[c.dataTransform(t,i[0]),c.dataTransform(t,i[1]),l.extend({},i[2])],i[2].type=i[2].type||"",l.merge(i[2],i[0]),l.merge(i[2],i[1]),i};n(80).extend({type:"markLine",updateLayout:function(t,e,n){e.eachSeries(function(t){var e=t.markLineModel;if(e){var i=e.getData(),r=e.__from,o=e.__to;r.each(function(e){a(r,e,!0,t,n),a(o,e,!1,t,n)}),i.each(function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])}),this.markerGroupMap.get(t.name).updateLayout()}},this)},renderSeries:function(t,e,n,i){function r(e,n,r){var o=e.getItemModel(n);a(e,n,r,t,i),e.setItemVisual(n,{symbolSize:o.get("symbolSize")||x[r?0:1],symbol:o.get("symbol",!0)||y[r?0:1],color:o.get("itemStyle.normal.color")||h.getVisual("color")})}var o=t.coordinateSystem,u=t.name,h=t.getData(),c=this.markerGroupMap,f=c.get(u)||c.set(u,new d);this.group.add(f.group);var p=s(o,t,e),g=p.from,m=p.to,v=p.line;e.__from=g,e.__to=m,e.setData(v);var y=e.get("symbol"),x=e.get("symbolSize");l.isArray(y)||(y=[y,y]),"number"==typeof x&&(x=[x,x]),p.from.each(function(t){r(g,t,!0),r(m,t,!1)}),v.each(function(t){var e=v.getItemModel(t).get("lineStyle.normal.color");v.setItemVisual(t,{color:e||g.getItemVisual(t,"color")}),v.setItemLayout(t,[g.getItemLayout(t),m.getItemLayout(t)]),v.setItemVisual(t,{fromSymbolSize:g.getItemVisual(t,"symbolSize"),fromSymbol:g.getItemVisual(t,"symbol"),toSymbolSize:m.getItemVisual(t,"symbolSize"),toSymbol:m.getItemVisual(t,"symbol")})}),f.updateData(v),p.line.eachItemGraphicEl(function(t,n){t.traverse(function(t){t.dataModel=e})}),f.__keep=!0,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,n){t.exports=n(79).extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"inside"},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:2}}}})},function(t,e,n){function i(t,e,n){var i=e.coordinateSystem;t.each(function(r){var o,a=t.getItemModel(r),l=s.parsePercent(a.get("x"),n.getWidth()),u=s.parsePercent(a.get("y"),n.getHeight());if(isNaN(l)||isNaN(u)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var h=t.get(i.dimensions[0],r),c=t.get(i.dimensions[1],r);o=i.dataToPoint([h,c])}}else o=[l,u];isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u),t.setItemLayout(r,o)})}function r(t,e,n){var i;i=t?a.map(t&&t.dimensions,function(t){var n=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return n.name=t,n}):[{name:"value",type:"float"}];var r=new l(i,n),o=a.map(n.get("data"),a.curry(u.dataTransform,e));return t&&(o=a.filter(o,a.curry(u.dataFilter,t))),r.initData(o,null,t?u.dimValueGetter:function(t){return t.value}),r}var o=n(44),a=n(1),s=n(4),l=n(14),u=n(81);n(80).extend({type:"markPoint",updateLayout:function(t,e,n){e.eachSeries(function(t){var e=t.markPointModel;e&&(i(e.getData(),t,n),this.markerGroupMap.get(t.name).updateLayout(e))},this)},renderSeries:function(t,e,n,a){var s=t.coordinateSystem,l=t.name,u=t.getData(),h=this.markerGroupMap,c=h.get(l)||h.set(l,new o),d=r(s,t,e);e.setData(d),i(e.getData(),t,a),d.each(function(t){var n=d.getItemModel(t),i=n.getShallow("symbolSize");"function"==typeof i&&(i=i(e.getRawValue(t),e.getDataParams(t))),d.setItemVisual(t,{symbolSize:i,color:n.get("itemStyle.normal.color")||u.getVisual("color"),symbol:n.getShallow("symbol")})}),c.updateData(d),this.group.add(c.group),d.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),c.__keep=!0,c.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,n){"use strict";var i=n(2),r=n(3),o=n(12);i.extendComponentModel({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),i.extendComponentView({type:"title",render:function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,a=t.getModel("textStyle"),s=t.getModel("subtextStyle"),l=t.get("textAlign"),u=t.get("textBaseline"),h=new r.Text({style:{text:t.get("text"),textFont:a.getFont(),fill:a.getTextColor()},z2:10}),c=h.getBoundingRect(),d=t.get("subtext"),f=new r.Text({style:{text:d,textFont:s.getFont(),fill:s.getTextColor(),y:c.height+t.get("itemGap"),textBaseline:"top"},z2:10}),p=t.get("link"),g=t.get("sublink");h.silent=!p,f.silent=!g,p&&h.on("click",function(){window.open(p,"_"+t.get("target"))}),g&&f.on("click",function(){window.open(g,"_"+t.get("subtarget"))}),i.add(h),d&&i.add(f);var m=i.getBoundingRect(),v=t.getBoxLayoutParams();v.width=m.width,v.height=m.height;var y=o.getLayoutRect(v,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));l||(l=t.get("left")||t.get("right"),"middle"===l&&(l="center"),"right"===l?y.x+=y.width:"center"===l&&(y.x+=y.width/2)),u||(u=t.get("top")||t.get("bottom"),"center"===u&&(u="middle"),"bottom"===u?y.y+=y.height:"middle"===u&&(y.y+=y.height/2),u=u||"top"),i.attr("position",[y.x,y.y]);var x={textAlign:l,textVerticalAlign:u};h.setStyle(x),f.setStyle(x),m=i.getBoundingRect();var _=y.margin,b=t.getItemStyle(["color","opacity"]);b.fill=t.get("backgroundColor");var w=new r.Rect({shape:{x:m.x-_[3],y:m.y-_[0],width:m.width+_[1]+_[3],height:m.height+_[0]+_[2]},style:b,silent:!0});r.subPixelOptimizeRect(w),i.add(w)}}})},function(t,e,n){n(225),n(226),n(231),n(229),n(227),n(228),n(230)},function(t,e,n){var i=n(29),r=n(1),o=n(2).extendComponentModel({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(t){o.superApply(this,"mergeDefaultAndTheme",arguments),r.each(this.option.feature,function(t,e){var n=i.get(e);n&&r.merge(t,n.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{normal:{borderColor:"#666",color:"none"},emphasis:{borderColor:"#3E98C5"}}}});t.exports=o},function(t,e,n){(function(e){function i(t){return 0===t.indexOf("my")}var r=n(29),o=n(1),a=n(3),s=n(10),l=n(48),u=n(130),h=n(16);t.exports=n(2).extendComponentView({type:"toolbox",render:function(t,e,n,c){function d(o,a){var l,u=y[o],h=y[a],d=m[u],p=new s(d,t,t.ecModel);if(u&&!h){if(i(u))l={model:p,onclick:p.option.onclick,featureName:u};else{var g=r.get(u);if(!g)return;l=new g(p,e,n)}v[u]=l}else{if(l=v[h],!l)return;l.model=p,l.ecModel=e,l.api=n}return!u&&h?void(l.dispose&&l.dispose(e,n)):!p.get("show")||l.unusable?void(l.remove&&l.remove(e,n)):(f(p,l,u),p.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&i[t].trigger(e)},void(l.render&&l.render(p,e,n,c)))}function f(i,r,s){var l=i.getModel("iconStyle"),u=r.getIcons?r.getIcons():i.get("icon"),h=i.get("title")||{};if("string"==typeof u){var c=u,d=h;u={},h={},u[s]=c,h[s]=d}var f=i.iconPaths={};o.each(u,function(s,u){var c=l.getModel("normal").getItemStyle(),d=l.getModel("emphasis").getItemStyle(),m={x:-g/2,y:-g/2,width:g,height:g},v=0===s.indexOf("image://")?(m.image=s.slice(8),new a.Image({style:m})):a.makePath(s.replace("path://",""),{style:c,hoverStyle:d,rectHover:!0},m,"center");a.setHoverStyle(v),t.get("showTitle")&&(v.__title=h[u],v.on("mouseover",function(){var t=l.getModel("emphasis").getItemStyle();v.setStyle({text:h[u],textPosition:t.textPosition||"bottom",textFill:t.fill||t.stroke||"#000",textAlign:t.textAlign||"center"})}).on("mouseout",function(){v.setStyle({textFill:null})})),v.trigger(i.get("iconStatus."+u)||"normal"),p.add(v),v.on("click",o.bind(r.onclick,r,e,n,u)),f[u]=v})}var p=this.group;if(p.removeAll(),t.get("show")){var g=+t.get("itemSize"),m=t.get("feature")||{},v=this._features||(this._features={}),y=[];o.each(m,function(t,e){y.push(e)}),new l(this._featureNames||[],y).add(d).update(d).remove(o.curry(d,null)).execute(),this._featureNames=y,u.layout(p,t,n),u.addBackground(p,t),p.eachChild(function(t){var e=t.__title,i=t.hoverStyle;if(i&&e){var r=h.getBoundingRect(e,i.font),o=t.position[0]+p.position[0],a=t.position[1]+p.position[1]+g,s=!1;a+r.height>n.getHeight()&&(i.textPosition="top",s=!0);var l=s?-5-r.height:g+8;o+r.width/2>n.getWidth()?(i.textPosition=["100%",l],i.textAlign="right"):o-r.width/2<0&&(i.textPosition=[0,l],i.textAlign="left")}})}},updateView:function(t,e,n,i){o.each(this._features,function(t){t.updateView&&t.updateView(t.model,e,n,i)})},updateLayout:function(t,e,n,i){o.each(this._features,function(t){t.updateLayout&&t.updateLayout(t.model,e,n,i)})},remove:function(t,e){o.each(this._features,function(n){n.remove&&n.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){o.each(this._features,function(n){n.dispose&&n.dispose(t,e)})}})}).call(e,n(188))},function(t,e,n){function i(t){var e={},n=[],i=[];return t.eachRawSeries(function(t){var r=t.coordinateSystem;if(!r||"cartesian2d"!==r.type&&"polar"!==r.type)n.push(t);else{var o=r.getBaseAxis();if("category"===o.type){var a=o.dim+"_"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},i.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else n.push(t)}}),{seriesGroupByCategoryAxis:e,other:n,meta:i}}function r(t){var e=[];return p.each(t,function(t,n){var i=t.categoryAxis,r=t.valueAxis,o=r.dim,a=[" "].concat(p.map(t.series,function(t){return t.name})),s=[i.model.getCategories()];p.each(t.series,function(t){s.push(t.getRawData().mapArray(o,function(t){return t}))});for(var l=[a.join(v)],u=0;u<s[0].length;u++){for(var h=[],c=0;c<s.length;c++)h.push(s[c][u]);l.push(h.join(v))}e.push(l.join("\n"))}),e.join("\n\n"+m+"\n\n")}function o(t){return p.map(t,function(t){var e=t.getRawData(),n=[t.name],i=[];return e.each(e.dimensions,function(){for(var t=arguments.length,r=arguments[t-1],o=e.getName(r),a=0;a<t-1;a++)i[a]=arguments[a];n.push((o?o+v:"")+i.join(v))}),n.join("\n")}).join("\n\n"+m+"\n\n")}function a(t){var e=i(t);return{value:p.filter([r(e.seriesGroupByCategoryAxis),o(e.other)],function(t){return t.replace(/[\n\t\s]/g,"")}).join("\n\n"+m+"\n\n"),meta:e.meta}}function s(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function l(t){var e=t.slice(0,t.indexOf("\n"));if(e.indexOf(v)>=0)return!0}function u(t){for(var e=t.split(/\n+/g),n=s(e.shift()).split(y),i=[],r=p.map(n,function(t){return{name:t,data:[]}}),o=0;o<e.length;o++){var a=s(e[o]).split(y);i.push(a.shift());for(var l=0;l<a.length;l++)r[l]&&(r[l].data[o]=a[l])}return{series:r,categories:i}}function h(t){for(var e=t.split(/\n+/g),n=s(e.shift()),i=[],r=0;r<e.length;r++){var o,a=s(e[r]).split(y),l="",u=!1;isNaN(a[0])?(u=!0,l=a[0],a=a.slice(1),i[r]={name:l,value:[]},o=i[r].value):o=i[r]=[];for(var h=0;h<a.length;h++)o.push(+a[h]);1===o.length&&(u?i[r].value=o[0]:i[r]=o[0])}return{name:n,data:i}}function c(t,e){var n=t.split(new RegExp("\n*"+m+"\n*","g")),i={series:[]};return p.each(n,function(t,n){if(l(t)){var r=u(t),o=e[n],a=o.axisDim+"Axis";o&&(i[a]=i[a]||[],i[a][o.axisIndex]={data:r.categories},i.series=i.series.concat(r.series))}else{var r=h(t);i.series.push(r)}}),i}function d(t){this._dom=null,this.model=t}function f(t,e){return p.map(t,function(t,n){var i=e&&e[n];return p.isObject(i)&&!p.isArray(i)?(p.isObject(t)&&!p.isArray(t)&&(t=t.value),p.defaults({value:t},i)):t})}var p=n(1),g=n(21),m=new Array(60).join("-"),v="\t",y=new RegExp("["+v+"]+","g");d.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:"数据视图",lang:["数据视图","关闭","刷新"],backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"},d.prototype.onclick=function(t,e){function n(){i.removeChild(o),S._dom=null}var i=e.getDom(),r=this.model;this._dom&&i.removeChild(this._dom);var o=document.createElement("div");o.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",o.style.backgroundColor=r.get("backgroundColor")||"#fff";var s=document.createElement("h4"),l=r.get("lang")||[];s.innerHTML=l[0]||r.get("title"),s.style.cssText="margin: 10px 20px;",s.style.color=r.get("textColor");var u=document.createElement("div"),h=document.createElement("textarea");u.style.cssText="display:block;width:100%;overflow:auto;";var d=r.get("optionToContent"),f=r.get("contentToOption"),m=a(t);if("function"==typeof d){var y=d(e.getOption());"string"==typeof y?u.innerHTML=y:p.isDom(y)&&u.appendChild(y)}else u.appendChild(h),h.readOnly=r.get("readOnly"),h.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",h.style.color=r.get("textColor"),h.style.borderColor=r.get("textareaBorderColor"),h.style.backgroundColor=r.get("textareaColor"),h.value=m.value;var x=m.meta,_=document.createElement("div");_.style.cssText="position:absolute;bottom:0;left:0;right:0;";var b="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",w=document.createElement("div"),M=document.createElement("div");b+=";background-color:"+r.get("buttonColor"),b+=";color:"+r.get("buttonTextColor");var S=this;g.addEventListener(w,"click",n),g.addEventListener(M,"click",function(){var t;try{t="function"==typeof f?f(u,e.getOption()):c(h.value,x)}catch(i){throw n(),new Error("Data view format error "+i)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),n()}),w.innerHTML=l[1],M.innerHTML=l[2],M.style.cssText=b,w.style.cssText=b,!r.get("readOnly")&&_.appendChild(M),_.appendChild(w),g.addEventListener(h,"keydown",function(t){if(9===(t.keyCode||t.which)){var e=this.value,n=this.selectionStart,i=this.selectionEnd;this.value=e.substring(0,n)+v+e.substring(i),this.selectionStart=this.selectionEnd=n+1,g.stop(t)}}),o.appendChild(s),o.appendChild(u),o.appendChild(_),u.style.height=i.clientHeight-80+"px",i.appendChild(o),this._dom=o},d.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},d.prototype.dispose=function(t,e){this.remove(t,e)},n(29).register("dataView",d),n(2).registerAction({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(t,e){var n=[];p.each(t.newOption.series,function(t){var i=e.getSeriesByName(t.name)[0];if(i){var r=i.get("data");n.push({name:t.name,data:f(t.data,r)})}else n.push(p.extend({type:"scatter"},t))}),e.mergeOption(p.defaults({series:n},t.newOption))}),t.exports=d},function(t,e,n){"use strict";function i(t,e,n){(this._brushController=new l(n.getZr())).on("brush",s.bind(this._onBrush,this)).mount(),this._isZoomActive}function r(t){var e={};return s.each(["xAxisIndex","yAxisIndex"],function(n){e[n]=t[n],null==e[n]&&(e[n]="all"),(e[n]===!1||"none"===e[n])&&(e[n]=[])}),e}function o(t,e){t.setIconStatus("back",h.count(e)>1?"emphasis":"normal")}function a(t,e,n,i,o){var a=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(a="dataZoomSelect"===i.key&&i.dataZoomSelectActive),n._isZoomActive=a,t.setIconStatus("zoom",a?"emphasis":"normal");var s=new u(r(t.option),e,{include:["grid"]});n._brushController.setPanels(s.makePanelOpts(o,function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"})).enableBrush(!!a&&{brushType:"auto",brushStyle:{lineWidth:0,fill:"rgba(0,0,0,0.2)"}})}var s=n(1),l=n(127),u=n(184),h=n(125),c=n(56),d=s.each;n(206);var f="\0_ec_\0toolbox-dataZoom_";i.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:{zoom:"区域缩放",back:"区域缩放还原"}};var p=i.prototype;p.render=function(t,e,n,i){this.model=t,this.ecModel=e,this.api=n,a(t,e,this,i,n),o(t,e)},p.onclick=function(t,e,n){g[n].call(this)},p.remove=function(t,e){this._brushController.unmount()},p.dispose=function(t,e){this._brushController.dispose()};var g={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(h.pop(this.ecModel))}};p._onBrush=function(t,e){function n(t,e,n){var r=e.getAxis(t),s=r.model,l=i(t,s,a),u=l.findRepresentativeAxisProxy(s).getMinMaxSpan();null==u.minValueSpan&&null==u.maxValueSpan||(n=c(0,n.slice(),r.scale.getExtent(),0,u.minValueSpan,u.maxValueSpan)),l&&(o[l.id]={dataZoomId:l.id,startValue:n[0],endValue:n[1]})}function i(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},function(n){var r=n.getAxisModel(t,e.componentIndex);r&&(i=n)}),i}if(e.isEnd&&t.length){var o={},a=this.ecModel;this._brushController.updateCovers([]);var s=new u(r(this.model.option),a,{include:["grid"]});s.matchOutputRanges(t,a,function(t,e,i){if("cartesian2d"===i.type){var r=t.brushType;"rect"===r?(n("x",i,e[0]),n("y",i,e[1])):n({lineX:"x",lineY:"y"}[r],i,e)}}),h.push(a,o),this._dispatchZoomAction(o)}},p._dispatchZoomAction=function(t){var e=[];d(t,function(t,n){e.push(s.clone(t))}),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},n(29).register("dataZoom",i),n(2).registerPreprocessor(function(t){function e(t,e){if(e){var r=t+"Index",o=e[r];null==o||"all"==o||s.isArray(o)||(o=o===!1||"none"===o?[]:[o]),n(t,function(e,n){if(null==o||"all"==o||s.indexOf(o,n)!==-1){var a={type:"select",$fromToolbox:!0,id:f+t+n};a[r]=n,i.push(a)}})}}function n(e,n){var i=t[e];s.isArray(i)||(i=i?[i]:[]),d(i,n)}if(t){var i=t.dataZoom||(t.dataZoom=[]);s.isArray(i)||(t.dataZoom=i=[i]);var r=t.toolbox;if(r&&(s.isArray(r)&&(r=r[0]),r&&r.feature)){var o=r.feature.dataZoom;e("xAxis",o),e("yAxis",o)}}}),t.exports=i},function(t,e,n){"use strict";function i(t){this.model=t}var r=n(1);i.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"},option:{},seriesIndex:{}};var o=i.prototype;o.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return r.each(t.get("type"),function(t){e[t]&&(n[t]=e[t])}),n};var a={line:function(t,e,n,i){if("bar"===t)return r.merge({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get("option.line")||{},!0)},bar:function(t,e,n,i){if("line"===t)return r.merge({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get("option.bar")||{},!0)},stack:function(t,e,n,i){if("line"===t||"bar"===t)return r.merge({id:e,stack:"__ec_magicType_stack__"},i.get("option.stack")||{},!0)},tiled:function(t,e,n,i){if("line"===t||"bar"===t)return r.merge({id:e,stack:""},i.get("option.tiled")||{},!0)}},s=[["line","bar"],["stack","tiled"]];o.onclick=function(t,e,n){var i=this.model,o=i.get("seriesIndex."+n);if(a[n]){var l={series:[]},u=function(e){var o=e.subType,s=e.id,u=a[n](o,s,e,i);u&&(r.defaults(u,e.option),l.series.push(u));var h=e.coordinateSystem;if(h&&"cartesian2d"===h.type&&("line"===n||"bar"===n)){var c=h.getAxesByScale("ordinal")[0];if(c){var d=c.dim,f=d+"Axis",p=t.queryComponents({mainType:f,index:e.get(name+"Index"),id:e.get(name+"Id")})[0],g=p.componentIndex;l[f]=l[f]||[];for(var m=0;m<=g;m++)l[f][g]=l[f][g]||{};l[f][g].boundaryGap="bar"===n}}};r.each(s,function(t){r.indexOf(t,n)>=0&&r.each(t,function(t){i.setIconStatus(t,"normal")})}),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==o?null:{seriesIndex:o}},u),e.dispatchAction({type:"changeMagicType",currentType:n,newOption:l})}};var l=n(2);l.registerAction({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),n(29).register("magicType",i),t.exports=i},function(t,e,n){"use strict";function i(t){this.model=t}var r=n(125);i.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:"还原"};var o=i.prototype;o.onclick=function(t,e,n){r.clear(t),e.dispatchAction({type:"restore",from:this.uid})},n(29).register("restore",i),n(2).registerAction({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")}),t.exports=i},function(t,e,n){function i(t){this.model=t}var r=n(9);i.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:"保存为图片",type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:["右键另存为图片"]},i.prototype.unusable=!r.canvasSupported;var o=i.prototype;o.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",o=document.createElement("a"),a=n.get("type",!0)||"png";o.download=i+"."+a,o.target="_blank";var s=e.getConnectedDataURL({type:a,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")});if(o.href=s,"function"!=typeof MouseEvent||r.browser.ie||r.browser.edge){var l=n.get("lang"),u='<body style="margin:0;"><img src="'+s+'" style="max-width:100%;" title="'+(l&&l[0]||"")+'" /></body>',h=window.open();h.document.write(u)}else{var c=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});o.dispatchEvent(c)}},n(29).register("saveAsImage",i),t.exports=i},function(t,e,n){n(55),n(234),n(235),n(2).registerAction({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),n(2).registerAction({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"
+},function(){})},function(t,e,n){function i(t){var e="cubic-bezier(0.23, 1, 0.32, 1)",n="left "+t+"s "+e+",top "+t+"s "+e;return s.map(p,function(t){return t+"transition:"+n}).join(";")}function r(t){var e=[],n=t.get("fontSize"),i=t.getTextColor();return i&&e.push("color:"+i),e.push("font:"+t.getFont()),n&&e.push("line-height:"+Math.round(3*n/2)+"px"),c(["decoration","align"],function(n){var i=t.get(n);i&&e.push("text-"+n+":"+i)}),e.join(";")}function o(t){var e=[],n=t.get("transitionDuration"),o=t.get("backgroundColor"),a=t.getModel("textStyle"),s=t.get("padding");return n&&e.push(i(n)),o&&(f.canvasSupported?e.push("background-Color:"+o):(e.push("background-Color:#"+l.toHex(o)),e.push("filter:alpha(opacity=70)"))),c(["width","color","radius"],function(n){var i="border-"+n,r=d(i),o=t.get(r);null!=o&&e.push(i+":"+o+("color"===n?"":"px"))}),e.push(r(a)),null!=s&&e.push("padding:"+h.normalizeCssArray(s).join("px ")+"px"),e.join(";")+";"}function a(t,e){var n=document.createElement("div"),i=this._zr=e.getZr();this.el=n,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(n),this._container=t,this._show=!1,this._hideTimeout;var r=this;n.onmouseenter=function(){r._enterable&&(clearTimeout(r._hideTimeout),r._show=!0),r._inContent=!0},n.onmousemove=function(e){if(e=e||window.event,!r._enterable){var n=i.handler;u.normalizeEvent(t,e,!0),n.dispatch("mousemove",e)}},n.onmouseleave=function(){r._enterable&&r._show&&r.hideLater(r._hideDelay),r._inContent=!1}}var s=n(1),l=n(22),u=n(21),h=n(7),c=s.each,d=h.toCamelCase,f=n(9),p=["","-webkit-","-moz-","-o-"],g="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;";a.prototype={constructor:a,_enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),n=t.style;"absolute"!==n.position&&"absolute"!==e.position&&(n.position="relative")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText=g+o(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),e.style.display=e.innerHTML?"block":"none",this._show=!0},setContent:function(t){this.el.innerHTML=null==t?"":t},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el;return[t.clientWidth,t.clientHeight]},moveTo:function(t,e){var n,i=this._zr;i&&i.painter&&(n=i.painter.getViewportRoot())&&(t+=n.offsetLeft||0,e+=n.offsetTop||0);var r=this.el.style;r.left=t+"px",r.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(s.bind(this.hide,this),t)):this.hide())},isShow:function(){return this._show}},t.exports=a},function(t,e,n){n(2).extendComponentModel({type:"tooltip",dependencies:["axisPointer"],defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#fff",fontSize:14}}})},function(t,e,n){function i(t){for(var e=t.pop();t.length;){var n=t.pop();n&&(n instanceof v&&(n=n.get("tooltip",!0)),"string"==typeof n&&(n={formatter:n}),e=new v(n,e,e.ecModel))}return e}function r(t,e){return t.dispatchAction||h.bind(e.dispatchAction,e)}function o(t,e,n,i,r,o,a){var s=n.clientWidth,l=n.clientHeight;return null!=o&&(t+s+o>i?t-=s+o:t+=o),null!=a&&(e+l+a>r?e-=l+a:e+=a),[t,e]}function a(t,e,n,i,r){var o=n.clientWidth,a=n.clientHeight;return t=Math.min(t+o,i)-o,e=Math.min(e+a,r)-a,t=Math.max(t,0),e=Math.max(e,0),[t,e]}function s(t,e,n){var i=n[0],r=n[1],o=5,a=0,s=0,l=e.width,u=e.height;switch(t){case"inside":a=e.x+l/2-i/2,s=e.y+u/2-r/2;break;case"top":a=e.x+l/2-i/2,s=e.y-r-o;break;case"bottom":a=e.x+l/2-i/2,s=e.y+u+o;break;case"left":a=e.x-i-o,s=e.y+u/2-r/2;break;case"right":a=e.x+l+o,s=e.y+u/2-r/2}return[a,s]}function l(t){return"center"===t||"middle"===t}var u=n(233),h=n(1),c=n(7),d=n(4),f=n(3),p=n(121),g=n(12),m=n(9),v=n(10),y=n(122),x=n(18),_=n(76),b=h.bind,w=h.each,M=d.parsePercent,S=new f.Rect({shape:{x:-1,y:-1,width:2,height:2}});n(2).extendComponentView({type:"tooltip",init:function(t,e){if(!m.node){var n=new u(e.getDom(),e);this._tooltipContent=n}},render:function(t,e,n){if(!m.node){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=n,this._lastDataByCoordSys=null,this._alwaysShowContent=t.get("alwaysShowContent");var i=this._tooltipContent;i.update(),i.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow()}},_initGlobalListener:function(){var t=this._tooltipModel,e=t.get("triggerOn");y.register("itemTooltip",this._api,b(function(t,n,i){"none"!==e&&(e.indexOf(t)>=0?this._tryShow(n,i):"leave"===t&&this._hide(i))},this))},_keepShow:function(){var t=this._tooltipModel,e=this._ecModel,n=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var i=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){i.manuallyShowTip(t,e,n,{x:i._lastX,y:i._lastY})})}},manuallyShowTip:function(t,e,n,i){if(i.from!==this.uid&&!m.node){var o=r(i,n);this._ticket="";var a=i.dataByCoordSys;if(i.tooltip&&null!=i.x&&null!=i.y){var s=S;s.position=[i.x,i.y],s.update(),s.tooltip=i.tooltip,this._tryShow({offsetX:i.x,offsetY:i.y,target:s},o)}else if(a)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,event:{},dataByCoordSys:i.dataByCoordSys,tooltipOption:i.tooltipOption},o);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var l=p(i,e),u=l.point[0],h=l.point[1];null!=u&&null!=h&&this._tryShow({offsetX:u,offsetY:h,position:i.position,target:l.el,event:{}},o)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target,event:{}},o))}},manuallyHideTip:function(t,e,n,i){var o=this._tooltipContent;this._alwaysShowContent||o.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=null,i.from!==this.uid&&this._hide(r(i,n))},_manuallyAxisShowTip:function(t,e,n,r){var o=r.seriesIndex,a=r.dataIndex,s=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=o&&null!=a&&null!=s){var l=e.getSeriesByIndex(o);if(l){var u=l.getData(),t=i([u.getItemModel(a),l,(l.coordinateSystem||{}).model,t]);if("axis"===t.get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:o,dataIndex:a}),!0}}},_tryShow:function(t,e){var n=t.target,i=this._tooltipModel;if(i){this._lastX=t.offsetX,this._lastY=t.offsetY;var r=t.dataByCoordSys;r&&r.length?this._showAxisTooltip(r,t):n&&null!=n.dataIndex?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(t,n,e)):n&&n.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(t,n,e)):(this._lastDataByCoordSys=null,this._hide(e))}},_showOrMove:function(t,e){var n=t.get("showDelay");e=h.bind(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},_showAxisTooltip:function(t,e){var n=this._ecModel,r=this._tooltipModel,o=[e.offsetX,e.offsetY],a=[],s=[],l=i([e.tooltipOption,r]);w(t,function(t){w(t.dataByAxis,function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),i=t.value,r=[];if(e&&null!=i){var o=_.getValueLabel(i,e.axis,n,t.seriesDataIndices,t.valueLabelOpt);h.each(t.seriesDataIndices,function(a){var l=n.getSeriesByIndex(a.seriesIndex),u=a.dataIndexInside,h=l&&l.getDataParams(u);h.axisDim=t.axisDim,h.axisIndex=t.axisIndex,h.axisType=t.axisType,h.axisId=t.axisId,h.axisValue=x.getAxisRawValue(e.axis,i),h.axisValueLabel=o,h&&(s.push(h),r.push(l.formatTooltip(u,!0)))});var l=o;a.push((l?c.encodeHTML(l)+"<br />":"")+r.join("<br />"))}})},this),a.reverse(),a=a.join("<br /><br />");var u=e.position;this._showOrMove(l,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(l,u,o[0],o[1],this._tooltipContent,s):this._showTooltipContent(l,a,s,Math.random(),o[0],o[1],u)})},_showSeriesItemTooltip:function(t,e,n){var r=this._ecModel,o=e.seriesIndex,a=r.getSeriesByIndex(o),s=e.dataModel||a,l=e.dataIndex,u=e.dataType,h=s.getData(),c=i([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model,this._tooltipModel]),d=c.get("trigger");if(null==d||"item"===d){var f=s.getDataParams(l,u),p=s.formatTooltip(l,!1,u),g="item_"+s.name+"_"+l;this._showOrMove(c,function(){this._showTooltipContent(c,p,f,g,t.offsetX,t.offsetY,t.position,t.target)}),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},_showComponentItemTooltip:function(t,e,n){var i=e.tooltip;if("string"==typeof i){var r=i;i={content:r,formatter:r}}var o=new v(i,this._tooltipModel,this._ecModel),a=o.get("content"),s=Math.random();this._showOrMove(o,function(){this._showTooltipContent(o,a,o.get("formatterParams")||{},s,t.offsetX,t.offsetY,t.position,e)}),n({type:"showTip",from:this.uid})},_showTooltipContent:function(t,e,n,i,r,o,a,s){if(this._ticket="",t.get("showContent")&&t.get("show")){var l=this._tooltipContent,u=t.get("formatter");a=a||t.get("position");var h=e;if(u&&"string"==typeof u)h=c.formatTpl(u,n,!0);else if("function"==typeof u){var d=b(function(e,i){e===this._ticket&&(l.setContent(i),this._updatePosition(t,a,r,o,l,n,s))},this);this._ticket=i,h=u(n,i,d)}l.setContent(h),l.show(t),this._updatePosition(t,a,r,o,l,n,s)}},_updatePosition:function(t,e,n,i,r,u,c){var d=this._api.getWidth(),f=this._api.getHeight();e=e||t.get("position");var p=r.getSize(),m=t.get("align"),v=t.get("verticalAlign"),y=c&&c.getBoundingRect().clone();if(c&&y.applyTransform(c.transform),"function"==typeof e&&(e=e([n,i],u,r.el,y,{viewSize:[d,f],contentSize:p.slice()})),h.isArray(e))n=M(e[0],d),i=M(e[1],f);else if(h.isObject(e)){e.width=p[0],e.height=p[1];var x=g.getLayoutRect(e,{width:d,height:f});n=x.x,i=x.y,m=null,v=null}else if("string"==typeof e&&c){var _=s(e,y,p);n=_[0],i=_[1]}else{var _=o(n,i,r.el,d,f,m?null:20,v?null:20);n=_[0],i=_[1]}if(m&&(n-=l(m)?p[0]/2:"right"===m?p[0]:0),v&&(i-=l(v)?p[1]/2:"bottom"===v?p[1]:0),t.get("confine")){var _=a(n,i,r.el,d,f);n=_[0],i=_[1]}r.moveTo(n,i)},_updateContentNotChangedOnAxis:function(t){var e=this._lastDataByCoordSys,n=!!e&&e.length===t.length;return n&&w(e,function(e,i){var r=e.dataByAxis||{},o=t[i]||{},a=o.dataByAxis||[];n&=r.length===a.length,n&&w(r,function(t,e){var i=a[e]||{},r=t.seriesDataIndices||[],o=i.seriesDataIndices||[];n&=t.value===i.value&&t.axisType===i.axisType&&t.axisId===i.axisId&&r.length===o.length,n&&w(r,function(t,e){var i=o[e];n&=t.seriesIndex===i.seriesIndex&&t.dataIndex===i.dataIndex})})}),this._lastDataByCoordSys=t,!!n},_hide:function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},dispose:function(t,e){m.node||(this._tooltipContent.hide(),y.unregister("itemTooltip",e))}})},,function(t,e,n){function i(t){return parseInt(t,10)}function r(t,e){s.initVML(),this.root=t,this.storage=e;var n=document.createElement("div"),i=document.createElement("div");n.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",i.style.cssText="position:absolute;left:0;top:0;",t.appendChild(n),this._vmlRoot=i,this._vmlViewport=n,this.resize();var r=e.delFromStorage,o=e.addToStorage;e.delFromStorage=function(t){r.call(e,t),t&&t.onRemove&&t.onRemove(i)},e.addToStorage=function(t){t.onAdd&&t.onAdd(i),o.call(e,t)},this._firstPaint=!0}function o(t){return function(){a('In IE8.0 VML mode painter not support method "'+t+'"')}}var a=n(52),s=n(182);r.prototype={constructor:r,getViewportRoot:function(){return this._vmlViewport},refresh:function(){var t=this.storage.getDisplayList(!0,!0);this._paintList(t)},_paintList:function(t){for(var e=this._vmlRoot,n=0;n<t.length;n++){var i=t[n];i.invisible||i.ignore?(i.__alreadyNotVisible||i.onRemove(e),i.__alreadyNotVisible=!0):(i.__alreadyNotVisible&&i.onAdd(e),i.__alreadyNotVisible=!1,i.__dirty&&(i.beforeBrush&&i.beforeBrush(),(i.brushVML||i.brush).call(i,e),i.afterBrush&&i.afterBrush())),i.__dirty=!1}this._firstPaint&&(this._vmlViewport.appendChild(e),this._firstPaint=!1)},resize:function(t,e){var t=null==t?this._getWidth():t,e=null==e?this._getHeight():e;if(this._width!=t||this._height!=e){this._width=t,this._height=e;var n=this._vmlViewport.style;n.width=t+"px",n.height=e+"px"}},dispose:function(){this.root.innerHTML="",this._vmlRoot=this._vmlViewport=this.storage=null},getWidth:function(){return this._width},getHeight:function(){return this._height},clear:function(){this._vmlViewport&&this.root.removeChild(this._vmlViewport)},_getWidth:function(){var t=this.root,e=t.currentStyle;return(t.clientWidth||i(e.width))-i(e.paddingLeft)-i(e.paddingRight)|0},_getHeight:function(){var t=this.root,e=t.currentStyle;return(t.clientHeight||i(e.height))-i(e.paddingTop)-i(e.paddingBottom)|0}};for(var l=["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],u=0;u<l.length;u++){var h=l[u];r.prototype[h]=o(h)}t.exports=r},function(t,e,n){if(!n(9).canvasSupported){var i=n(6),r=n(11),o=n(27).CMD,a=n(22),s=n(16),l=n(87),u=n(38),h=n(53),c=n(86),d=n(8),f=n(27),p=n(39),g=n(182),m=Math.round,v=Math.sqrt,y=Math.abs,x=Math.cos,_=Math.sin,b=Math.max,w=i.applyTransform,M=",",S="progid:DXImageTransform.Microsoft",T=21600,A=T/2,I=1e5,C=1e3,P=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=T+","+T,t.coordorigin="0,0"},D=function(t){return String(t).replace(/&/g,"&amp;").replace(/"/g,"&quot;")},k=function(t,e,n){return"rgb("+[t,e,n].join(",")+")"},L=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},O=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},z=function(t,e,n){return(parseFloat(t)||0)*I+(parseFloat(e)||0)*C+n},E=function(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t},N=function(t,e,n){var i=a.parse(e);n=+n,isNaN(n)&&(n=1),i&&(t.color=k(i[0],i[1],i[2]),t.opacity=n*i[3])},R=function(t){var e=a.parse(t);return[k(e[0],e[1],e[2]),e[3]]},B=function(t,e,n){var i=e.fill;if(null!=i)if(i instanceof p){var r,o=0,a=[0,0],s=0,l=1,u=n.getBoundingRect(),h=u.width,c=u.height;if("linear"===i.type){r="gradient";var d=n.transform,f=[i.x*h,i.y*c],g=[i.x2*h,i.y2*c];d&&(w(f,f,d),w(g,g,d));var m=g[0]-f[0],v=g[1]-f[1];o=180*Math.atan2(m,v)/Math.PI,o<0&&(o+=360),o<1e-6&&(o=0)}else{r="gradientradial";var f=[i.x*h,i.y*c],d=n.transform,y=n.scale,x=h,_=c;a=[(f[0]-u.x)/x,(f[1]-u.y)/_],d&&w(f,f,d),x/=y[0]*T,_/=y[1]*T;var M=b(x,_);s=0/M,l=2*i.r/M-s}var S=i.colorStops.slice();S.sort(function(t,e){return t.offset-e.offset});for(var A=S.length,I=[],C=[],P=0;P<A;P++){var D=S[P],k=R(D.color);C.push(D.offset*l+s+" "+k[0]),0!==P&&P!==A-1||I.push(k)}if(A>=2){var L=I[0][0],O=I[1][0],z=I[0][1]*e.opacity,E=I[1][1]*e.opacity;t.type=r,t.method="none",t.focus="100%",t.angle=o,t.color=L,t.color2=O,t.colors=C.join(","),t.opacity=E,t.opacity2=z}"radial"===r&&(t.focusposition=a.join(","))}else N(t,i,e.opacity)},V=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof p||N(t,e.stroke,e.opacity)},F=function(t,e,n,i){var r="fill"==e,o=t.getElementsByTagName(e)[0];null!=n[e]&&"none"!==n[e]&&(r||!r&&n.lineWidth)?(t[r?"filled":"stroked"]="true",n[e]instanceof p&&O(t,o),o||(o=g.createNode(e)),r?B(o,n,i):V(o,n),L(t,o)):(t[r?"filled":"stroked"]="false",O(t,o))},G=[[],[],[]],H=function(t,e){var n,i,r,a,s,l,u=o.M,h=o.C,c=o.L,d=o.A,f=o.Q,p=[];for(a=0;a<t.length;){switch(r=t[a++],i="",n=0,r){case u:i=" m ",n=1,s=t[a++],l=t[a++],G[0][0]=s,G[0][1]=l;break;case c:i=" l ",n=1,s=t[a++],l=t[a++],G[0][0]=s,G[0][1]=l;break;case f:case h:i=" c ",n=3;var g,y,b=t[a++],S=t[a++],I=t[a++],C=t[a++];r===f?(g=I,y=C,I=(I+2*b)/3,C=(C+2*S)/3,b=(s+2*b)/3,S=(l+2*S)/3):(g=t[a++],y=t[a++]),G[0][0]=b,G[0][1]=S,G[1][0]=I,G[1][1]=C,G[2][0]=g,G[2][1]=y,s=g,l=y;break;case d:var P=0,D=0,k=1,L=1,O=0;e&&(P=e[4],D=e[5],k=v(e[0]*e[0]+e[1]*e[1]),L=v(e[2]*e[2]+e[3]*e[3]),O=Math.atan2(-e[1]/L,e[0]/k));var z=t[a++],E=t[a++],N=t[a++],R=t[a++],B=t[a++]+O,V=t[a++]+B+O;a++;var F=t[a++],H=z+x(B)*N,W=E+_(B)*R,b=z+x(V)*N,S=E+_(V)*R,Z=F?" wa ":" at ";Math.abs(H-b)<1e-4&&(Math.abs(V-B)>.01?F&&(H+=270/T):Math.abs(W-E)<1e-4?F&&H<z||!F&&H>z?S-=270/T:S+=270/T:F&&W<E||!F&&W>E?b+=270/T:b-=270/T),p.push(Z,m(((z-N)*k+P)*T-A),M,m(((E-R)*L+D)*T-A),M,m(((z+N)*k+P)*T-A),M,m(((E+R)*L+D)*T-A),M,m((H*k+P)*T-A),M,m((W*L+D)*T-A),M,m((b*k+P)*T-A),M,m((S*L+D)*T-A)),s=b,l=S;break;case o.R:var q=G[0],j=G[1];q[0]=t[a++],q[1]=t[a++],j[0]=q[0]+t[a++],j[1]=q[1]+t[a++],e&&(w(q,q,e),w(j,j,e)),q[0]=m(q[0]*T-A),j[0]=m(j[0]*T-A),q[1]=m(q[1]*T-A),j[1]=m(j[1]*T-A),p.push(" m ",q[0],M,q[1]," l ",j[0],M,q[1]," l ",j[0],M,j[1]," l ",q[0],M,j[1]);break;case o.Z:p.push(" x ")}if(n>0){p.push(i);for(var U=0;U<n;U++){var X=G[U];e&&w(X,X,e),p.push(m(X[0]*T-A),M,m(X[1]*T-A),U<n-1?M:"")}}}return p.join("")};d.prototype.brushVML=function(t){var e=this.style,n=this._vmlEl;n||(n=g.createNode("shape"),P(n),this._vmlEl=n),F(n,"fill",e,this),F(n,"stroke",e,this);var i=this.transform,r=null!=i,o=n.getElementsByTagName("stroke")[0];if(o){var a=e.lineWidth;if(r&&!e.strokeNoScale){var s=i[0]*i[3]-i[1]*i[2];a*=v(y(s))}o.weight=a+"px"}var l=this.path||(this.path=new f);this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),l.toStatic(),this.__dirtyPath=!1),n.path=H(l.data,this.transform),n.style.zIndex=z(this.zlevel,this.z,this.z2),L(t,n),null!=e.text?this.drawRectText(t,this.getBoundingRect()):this.removeRectText(t)},d.prototype.onRemove=function(t){O(t,this._vmlEl),this.removeRectText(t)},d.prototype.onAdd=function(t){L(t,this._vmlEl),this.appendRectText(t)};var W=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};h.prototype.brushVML=function(t){var e,n,i=this.style,r=i.image;if(W(r)){var o=r.src;if(o===this._imageSrc)e=this._imageWidth,n=this._imageHeight;else{var a=r.runtimeStyle,s=a.width,l=a.height;a.width="auto",a.height="auto",e=r.width,n=r.height,a.width=s,a.height=l,this._imageSrc=o,this._imageWidth=e,this._imageHeight=n}r=o}else r===this._imageSrc&&(e=this._imageWidth,n=this._imageHeight);if(r){var u=i.x||0,h=i.y||0,c=i.width,d=i.height,f=i.sWidth,p=i.sHeight,y=i.sx||0,x=i.sy||0,_=f&&p,T=this._vmlEl;T||(T=g.doc.createElement("div"),P(T),this._vmlEl=T);var A,I=T.style,C=!1,D=1,k=1;if(this.transform&&(A=this.transform,D=v(A[0]*A[0]+A[1]*A[1]),k=v(A[2]*A[2]+A[3]*A[3]),C=A[1]||A[2]),C){var O=[u,h],E=[u+c,h],N=[u,h+d],R=[u+c,h+d];w(O,O,A),w(E,E,A),w(N,N,A),w(R,R,A);var B=b(O[0],E[0],N[0],R[0]),V=b(O[1],E[1],N[1],R[1]),F=[];F.push("M11=",A[0]/D,M,"M12=",A[2]/k,M,"M21=",A[1]/D,M,"M22=",A[3]/k,M,"Dx=",m(u*D+A[4]),M,"Dy=",m(h*k+A[5])),I.padding="0 "+m(B)+"px "+m(V)+"px 0",I.filter=S+".Matrix("+F.join("")+", SizingMethod=clip)"}else A&&(u=u*D+A[4],h=h*k+A[5]),I.filter="",I.left=m(u)+"px",I.top=m(h)+"px";var G=this._imageEl,H=this._cropEl;G||(G=g.doc.createElement("div"),this._imageEl=G);var Z=G.style;if(_){if(e&&n)Z.width=m(D*e*c/f)+"px",Z.height=m(k*n*d/p)+"px";else{var q=new Image,j=this;q.onload=function(){q.onload=null,e=q.width,n=q.height,Z.width=m(D*e*c/f)+"px",Z.height=m(k*n*d/p)+"px",j._imageWidth=e,j._imageHeight=n,j._imageSrc=r},q.src=r}H||(H=g.doc.createElement("div"),H.style.overflow="hidden",this._cropEl=H);var U=H.style;U.width=m((c+y*c/f)*D),U.height=m((d+x*d/p)*k),U.filter=S+".Matrix(Dx="+-y*c/f*D+",Dy="+-x*d/p*k+")",H.parentNode||T.appendChild(H),G.parentNode!=H&&H.appendChild(G)}else Z.width=m(D*c)+"px",Z.height=m(k*d)+"px",T.appendChild(G),H&&H.parentNode&&(T.removeChild(H),this._cropEl=null);var X="",Y=i.opacity;Y<1&&(X+=".Alpha(opacity="+m(100*Y)+") "),X+=S+".AlphaImageLoader(src="+r+", SizingMethod=scale)",Z.filter=X,T.style.zIndex=z(this.zlevel,this.z,this.z2),L(t,T),null!=i.text&&this.drawRectText(t,this.getBoundingRect())}},h.prototype.onRemove=function(t){O(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},h.prototype.onAdd=function(t){L(t,this._vmlEl),this.appendRectText(t)};var Z,q="normal",j={},U=0,X=100,Y=document.createElement("div"),$=function(t){var e=j[t];if(!e){U>X&&(U=0,j={});var n,i=Y.style;try{i.font=t,n=i.fontFamily.split(",")[0]}catch(r){}e={style:i.fontStyle||q,variant:i.fontVariant||q,weight:i.fontWeight||q,size:0|parseFloat(i.fontSize||12),family:n||"Microsoft YaHei"},j[t]=e,U++}return e};s.measureText=function(t,e){var n=g.doc;Z||(Z=n.createElement("div"),Z.style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",g.doc.body.appendChild(Z));try{Z.style.font=e}catch(i){}return Z.innerHTML="",Z.appendChild(n.createTextNode(t)),{width:Z.offsetWidth}};for(var K=new r,Q=function(t,e,n,i){var r=this.style,o=r.text;if(null!=o&&(o+=""),o){var a,l,u=r.textAlign,h=$(r.textFont),c=h.style+" "+h.variant+" "+h.weight+" "+h.size+'px "'+h.family+'"',d=r.textBaseline,f=r.textVerticalAlign;n=n||s.getBoundingRect(o,c,u,d);var p=this.transform;if(p&&!i&&(K.copy(e),K.applyTransform(p),e=K),i)a=e.x,l=e.y;else{var v=r.textPosition,y=r.textDistance;if(v instanceof Array)a=e.x+E(v[0],e.width),l=e.y+E(v[1],e.height),u=u||"left",d=d||"top";else{var x=s.adjustTextPositionOnRect(v,e,n,y);a=x.x,l=x.y,u=u||x.textAlign,d=d||x.textBaseline}}if(f){switch(f){case"middle":l-=n.height/2;break;case"bottom":l-=n.height}d="top"}var _=h.size;switch(d){case"hanging":case"top":l+=_/1.75;break;case"middle":break;default:l-=_/2.25}switch(u){case"left":break;case"center":a-=n.width/2;break;case"right":a-=n.width}var b,S,T,A=g.createNode,I=this._textVmlEl;I?(T=I.firstChild,b=T.nextSibling,S=b.nextSibling):(I=A("line"),b=A("path"),S=A("textpath"),T=A("skew"),S.style["v-text-align"]="left",P(I),b.textpathok=!0,S.on=!0,I.from="0 0",I.to="1000 0.05",L(I,T),L(I,b),L(I,S),this._textVmlEl=I);var C=[a,l],k=I.style;p&&i?(w(C,C,p),T.on=!0,T.matrix=p[0].toFixed(3)+M+p[2].toFixed(3)+M+p[1].toFixed(3)+M+p[3].toFixed(3)+",0,0",T.offset=(m(C[0])||0)+","+(m(C[1])||0),T.origin="0 0",k.left="0px",k.top="0px"):(T.on=!1,k.left=m(a)+"px",k.top=m(l)+"px"),S.string=D(o);try{S.style.font=c}catch(O){}F(I,"fill",{fill:i?r.fill:r.textFill,opacity:r.opacity},this),F(I,"stroke",{stroke:i?r.stroke:r.textStroke,opacity:r.opacity,lineDash:r.lineDash},this),I.style.zIndex=z(this.zlevel,this.z,this.z2),L(t,I)}},J=function(t){O(t,this._textVmlEl),this._textVmlEl=null},tt=function(t){L(t,this._textVmlEl)},et=[l,u,h,d,c],nt=0;nt<et.length;nt++){var it=et[nt].prototype;it.drawRectText=Q,it.removeRectText=J,it.appendRectText=tt}c.prototype.brushVML=function(t){var e=this.style;null!=e.text?this.drawRectText(t,{x:e.x||0,y:e.y||0,width:0,height:0},this.getBoundingRect(),!0):this.removeRectText(t)},c.prototype.onRemove=function(t){this.removeRectText(t)},c.prototype.onAdd=function(t){this.appendRectText(t)}}},function(t,e,n){n(238),n(88).registerPainter("vml",n(237))}])});
\ No newline at end of file
diff --git a/dist/echarts.js b/dist/echarts.js
index 1c1cb05..0d78c4a 100644
--- a/dist/echarts.js
+++ b/dist/echarts.js
@@ -80,32 +80,33 @@
 	__webpack_require__(282);
 	__webpack_require__(286);
 	__webpack_require__(289);
-
 	__webpack_require__(312);
-	__webpack_require__(313);
-	__webpack_require__(314);
+
+	__webpack_require__(318);
+	__webpack_require__(319);
 	__webpack_require__(320);
+	__webpack_require__(326);
 	__webpack_require__(297);
-	__webpack_require__(324);
-	__webpack_require__(336);
+	__webpack_require__(330);
+	__webpack_require__(343);
 	__webpack_require__(234);
 	__webpack_require__(290);
-	__webpack_require__(339);
-	__webpack_require__(350);
+	__webpack_require__(346);
+	__webpack_require__(357);
 
-	__webpack_require__(354);
+	__webpack_require__(361);
 
-	__webpack_require__(355);
-	__webpack_require__(368);
+	__webpack_require__(362);
+	__webpack_require__(375);
 
-	__webpack_require__(383);
-	__webpack_require__(389);
-	__webpack_require__(392);
+	__webpack_require__(390);
+	__webpack_require__(396);
+	__webpack_require__(399);
 
-	__webpack_require__(395);
-	__webpack_require__(404);
+	__webpack_require__(402);
+	__webpack_require__(411);
 
-	__webpack_require__(416);
+	__webpack_require__(423);
 
 
 /***/ },
@@ -144,23 +145,23 @@
 	    var env = __webpack_require__(2);
 
 	    var GlobalModel = __webpack_require__(3);
-	    var ExtensionAPI = __webpack_require__(25);
-	    var CoordinateSystemManager = __webpack_require__(26);
-	    var OptionManager = __webpack_require__(27);
+	    var ExtensionAPI = __webpack_require__(75);
+	    var CoordinateSystemManager = __webpack_require__(76);
+	    var OptionManager = __webpack_require__(77);
 
-	    var ComponentModel = __webpack_require__(19);
-	    var SeriesModel = __webpack_require__(28);
+	    var ComponentModel = __webpack_require__(69);
+	    var SeriesModel = __webpack_require__(78);
 
-	    var ComponentView = __webpack_require__(29);
-	    var ChartView = __webpack_require__(43);
-	    var graphic = __webpack_require__(44);
+	    var ComponentView = __webpack_require__(79);
+	    var ChartView = __webpack_require__(80);
+	    var graphic = __webpack_require__(18);
 	    var modelUtil = __webpack_require__(5);
 	    var throttle = __webpack_require__(81);
 
 	    var zrender = __webpack_require__(82);
 	    var zrUtil = __webpack_require__(4);
-	    var colorTool = __webpack_require__(39);
-	    var Eventful = __webpack_require__(33);
+	    var colorTool = __webpack_require__(31);
+	    var Eventful = __webpack_require__(25);
 	    var timsort = __webpack_require__(86);
 
 	    var each = zrUtil.each;
@@ -390,14 +391,7 @@
 	            ecModel.init(null, null, theme, optionManager);
 	        }
 
-	        // FIXME
-	        // ugly
-	        this.__lastOnlyGraphic = !!(option && option.graphic);
-	        zrUtil.each(option, function (o, mainType) {
-	            mainType !== 'graphic' && (this.__lastOnlyGraphic = false);
-	        }, this);
-
-	        this._model.setOption(option, optionPreprocessorFuncs, this.__lastOnlyGraphic);
+	        this._model.setOption(option, optionPreprocessorFuncs);
 
 	        if (lazyUpdate) {
 	            this[OPTION_UPDATED] = {silent: silent};
@@ -923,21 +917,7 @@
 
 	            prepareView.call(this, 'chart', ecModel);
 
-	            // FIXME
-	            // ugly
-	            if (this.__lastOnlyGraphic) {
-	                each(this._componentsViews, function (componentView) {
-	                    var componentModel = componentView.__model;
-	                    if (componentModel && componentModel.mainType === 'graphic') {
-	                        componentView.render(componentModel, ecModel, this._api, payload);
-	                        updateZ(componentModel, componentView);
-	                    }
-	                }, this);
-	                this.__lastOnlyGraphic = false;
-	            }
-	            else {
-	                updateMethods.update.call(this, payload);
-	            }
+	            updateMethods.update.call(this, payload);
 	        }
 	    };
 
@@ -1254,7 +1234,7 @@
 	            }
 
 	            // Consider: id same and type changed.
-	            var viewId = model.id + '_' + model.type;
+	            var viewId = '_ec_' + model.id + '_' + model.type;
 	            var view = viewMap[viewId];
 	            if (!view) {
 	                var classType = parseClassType(model.type);
@@ -1320,7 +1300,8 @@
 	            var data = series.getData();
 	            if (stack && data.type === 'list') {
 	                var previousStack = stackedDataMap[stack];
-	                if (previousStack) {
+	                // Avoid conflict with Object.prototype
+	                if (stackedDataMap.hasOwnProperty(stack) && previousStack) {
 	                    data.stackedOn = previousStack;
 	                }
 	                stackedDataMap[stack] = data;
@@ -1642,6 +1623,7 @@
 	    var idBase = new Date() - 0;
 	    var groupIdBase = new Date() - 0;
 	    var DOM_ATTRIBUTE_KEY = '_echarts_instance_';
+
 	    /**
 	     * @alias module:echarts
 	     */
@@ -1649,9 +1631,9 @@
 	        /**
 	         * @type {number}
 	         */
-	        version: '3.5.4',
+	        version: '3.6.0',
 	        dependencies: {
-	            zrender: '3.4.4'
+	            zrender: '3.5.0'
 	        }
 	    };
 
@@ -1718,9 +1700,21 @@
 	                    + echarts.dependencies.zrender + '+'
 	                );
 	            }
+
 	            if (!dom) {
 	                throw new Error('Initialize failed: invalid dom.');
 	            }
+	        }
+
+	        var existInstance = echarts.getInstanceByDom(dom);
+	        if (existInstance) {
+	            if (true) {
+	                console.warn('There is a chart instance already initialized on the dom.');
+	            }
+	            return existInstance;
+	        }
+
+	        if (true) {
 	            if (zrUtil.isDom(dom)
 	                && dom.nodeName.toUpperCase() !== 'CANVAS'
 	                && (
@@ -1736,8 +1730,12 @@
 	        chart.id = 'ec_' + idBase++;
 	        instances[chart.id] = chart;
 
-	        dom.setAttribute &&
+	        if (dom.setAttribute) {
 	            dom.setAttribute(DOM_ATTRIBUTE_KEY, chart.id);
+	        }
+	        else {
+	            dom[DOM_ATTRIBUTE_KEY] = chart.id;
+	        }
 
 	        enableConnect(chart);
 
@@ -1785,12 +1783,13 @@
 	     * @param  {module:echarts~ECharts|HTMLDomElement|string} chart
 	     */
 	    echarts.dispose = function (chart) {
-	        if (zrUtil.isDom(chart)) {
-	            chart = echarts.getInstanceByDom(chart);
-	        }
-	        else if (typeof chart === 'string') {
+	        if (typeof chart === 'string') {
 	            chart = instances[chart];
 	        }
+	        else if (!(chart instanceof ECharts)){
+	            // Try to treat as dom
+	            chart = echarts.getInstanceByDom(chart);
+	        }
 	        if ((chart instanceof ECharts) && !chart.isDisposed()) {
 	            chart.dispose();
 	        }
@@ -1801,9 +1800,16 @@
 	     * @return {echarts~ECharts}
 	     */
 	    echarts.getInstanceByDom = function (dom) {
-	        var key = dom.getAttribute(DOM_ATTRIBUTE_KEY);
+	        var key;
+	        if (dom.getAttribute) {
+	            key = dom.getAttribute(DOM_ATTRIBUTE_KEY);
+	        }
+	        else {
+	            key = dom[DOM_ATTRIBUTE_KEY];
+	        }
 	        return instances[key];
 	    };
+
 	    /**
 	     * @param {string} key
 	     * @return {echarts~ECharts}
@@ -2056,13 +2062,13 @@
 
 	    echarts.Axis = __webpack_require__(100);
 
-	    echarts.graphic = __webpack_require__(44);
+	    echarts.graphic = __webpack_require__(18);
 	    echarts.number = __webpack_require__(7);
 	    echarts.format = __webpack_require__(6);
 	    echarts.throttle = throttle.throttle;
 	    echarts.matrix = __webpack_require__(11);
 	    echarts.vector = __webpack_require__(10);
-	    echarts.color = __webpack_require__(39);
+	    echarts.color = __webpack_require__(31);
 
 	    echarts.util = {};
 	    each([
@@ -2075,7 +2081,7 @@
 	        }
 	    );
 
-	    echarts.helper = __webpack_require__(101);
+	    echarts.helper = __webpack_require__(108);
 
 
 	    // PRIORITY
@@ -2265,9 +2271,9 @@
 	    var indexOf = zrUtil.indexOf;
 	    var isObject = zrUtil.isObject;
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 
-	    var globalDefault = __webpack_require__(23);
+	    var globalDefault = __webpack_require__(73);
 
 	    var OPTION_INNER_KEY = '\0_ec_inner';
 
@@ -2299,7 +2305,7 @@
 	            this._optionManager = optionManager;
 	        },
 
-	        setOption: function (option, optionPreprocessorFuncs, onlyGraphic) {
+	        setOption: function (option, optionPreprocessorFuncs) {
 	            zrUtil.assert(
 	                !(OPTION_INNER_KEY in option),
 	                'please use chart.getOption()'
@@ -2307,7 +2313,7 @@
 
 	            this._optionManager.setOption(option, optionPreprocessorFuncs);
 
-	            this.resetOption(null, onlyGraphic);
+	            this.resetOption(null);
 	        },
 
 	        /**
@@ -2317,7 +2323,7 @@
 	         *                      'media': only reset media query option
 	         * @return {boolean} Whether option changed.
 	         */
-	        resetOption: function (type, onlyGraphic) {
+	        resetOption: function (type) {
 	            var optionChanged = false;
 	            var optionManager = this._optionManager;
 
@@ -2328,11 +2334,7 @@
 	                    initBase.call(this, baseOption);
 	                }
 	                else {
-	                    // If only graphic, other series and component will not
-	                    // go through update process, data should not be restored.
-	                    // Otherwise grphic els mounted on data will be eliminated
-	                    // and downplay will not work.
-	                    !onlyGraphic && this.restoreData();
+	                    this.restoreData();
 	                    this.mergeOption(baseOption);
 	                }
 	                optionChanged = true;
@@ -2394,7 +2396,7 @@
 	                var newCptOptionList = modelUtil.normalizeToArray(newOption[mainType]);
 
 	                var mapResult = modelUtil.mappingToExists(
-	                    componentsMap[mainType], newCptOptionList
+	                    componentsMap.get(mainType), newCptOptionList
 	                );
 
 	                modelUtil.makeIdAndName(mapResult);
@@ -2413,7 +2415,7 @@
 	                );
 
 	                option[mainType] = [];
-	                componentsMap[mainType] = [];
+	                componentsMap.set(mainType, []);
 
 	                each(mapResult, function (resultItem, index) {
 	                    var componentModel = resultItem.exist;
@@ -2463,13 +2465,13 @@
 	                        }
 	                    }
 
-	                    componentsMap[mainType][index] = componentModel;
+	                    componentsMap.get(mainType)[index] = componentModel;
 	                    option[mainType][index] = componentModel.option;
 	                }, this);
 
 	                // Backup series for filtering.
 	                if (mainType === 'series') {
-	                    this._seriesIndices = createSeriesIndices(componentsMap.series);
+	                    this._seriesIndices = createSeriesIndices(componentsMap.get('series'));
 	                }
 	            }
 	        },
@@ -2513,7 +2515,7 @@
 	         * @return {module:echarts/model/Component}
 	         */
 	        getComponent: function (mainType, idx) {
-	            var list = this._componentsMap[mainType];
+	            var list = this._componentsMap.get(mainType);
 	            if (list) {
 	                return list[idx || 0];
 	            }
@@ -2539,7 +2541,7 @@
 	            var id = condition.id;
 	            var name = condition.name;
 
-	            var cpts = this._componentsMap[mainType];
+	            var cpts = this._componentsMap.get(mainType);
 
 	            if (!cpts || !cpts.length) {
 	                return [];
@@ -2614,7 +2616,7 @@
 	            var queryCond = getQueryCond(query);
 	            var result = queryCond
 	                ? this.queryComponents(queryCond)
-	                : this._componentsMap[mainType];
+	                : this._componentsMap.get(mainType);
 
 	            return doFilter(filterBySubType(result, condition));
 
@@ -2673,14 +2675,14 @@
 	            if (typeof mainType === 'function') {
 	                context = cb;
 	                cb = mainType;
-	                each(componentsMap, function (components, componentType) {
+	                componentsMap.each(function (components, componentType) {
 	                    each(components, function (component, index) {
 	                        cb.call(context, componentType, component, index);
 	                    });
 	                });
 	            }
 	            else if (zrUtil.isString(mainType)) {
-	                each(componentsMap[mainType], cb, context);
+	                each(componentsMap.get(mainType), cb, context);
 	            }
 	            else if (isObject(mainType)) {
 	                var queryResult = this.findComponents(mainType);
@@ -2693,7 +2695,7 @@
 	         * @return {Array.<module:echarts/model/Series>}
 	         */
 	        getSeriesByName: function (name) {
-	            var series = this._componentsMap.series;
+	            var series = this._componentsMap.get('series');
 	            return filter(series, function (oneSeries) {
 	                return oneSeries.name === name;
 	            });
@@ -2704,7 +2706,7 @@
 	         * @return {module:echarts/model/Series}
 	         */
 	        getSeriesByIndex: function (seriesIndex) {
-	            return this._componentsMap.series[seriesIndex];
+	            return this._componentsMap.get('series')[seriesIndex];
 	        },
 
 	        /**
@@ -2712,7 +2714,7 @@
 	         * @return {Array.<module:echarts/model/Series>}
 	         */
 	        getSeriesByType: function (subType) {
-	            var series = this._componentsMap.series;
+	            var series = this._componentsMap.get('series');
 	            return filter(series, function (oneSeries) {
 	                return oneSeries.subType === subType;
 	            });
@@ -2722,7 +2724,7 @@
 	         * @return {Array.<module:echarts/model/Series>}
 	         */
 	        getSeries: function () {
-	            return this._componentsMap.series.slice();
+	            return this._componentsMap.get('series').slice();
 	        },
 
 	        /**
@@ -2735,7 +2737,7 @@
 	        eachSeries: function (cb, context) {
 	            assertSeriesInitialized(this);
 	            each(this._seriesIndices, function (rawSeriesIndex) {
-	                var series = this._componentsMap.series[rawSeriesIndex];
+	                var series = this._componentsMap.get('series')[rawSeriesIndex];
 	                cb.call(context, series, rawSeriesIndex);
 	            }, this);
 	        },
@@ -2747,7 +2749,7 @@
 	         * @param {*} context
 	         */
 	        eachRawSeries: function (cb, context) {
-	            each(this._componentsMap.series, cb, context);
+	            each(this._componentsMap.get('series'), cb, context);
 	        },
 
 	        /**
@@ -2761,7 +2763,7 @@
 	        eachSeriesByType: function (subType, cb, context) {
 	            assertSeriesInitialized(this);
 	            each(this._seriesIndices, function (rawSeriesIndex) {
-	                var series = this._componentsMap.series[rawSeriesIndex];
+	                var series = this._componentsMap.get('series')[rawSeriesIndex];
 	                if (series.subType === subType) {
 	                    cb.call(context, series, rawSeriesIndex);
 	                }
@@ -2788,13 +2790,20 @@
 	        },
 
 	        /**
+	         * @return {Array.<number>}
+	         */
+	        getCurrentSeriesIndices: function () {
+	            return (this._seriesIndices || []).slice();
+	        },
+
+	        /**
 	         * @param {Function} cb
 	         * @param {*} context
 	         */
 	        filterSeries: function (cb, context) {
 	            assertSeriesInitialized(this);
 	            var filteredSeries = filter(
-	                this._componentsMap.series, cb, context
+	                this._componentsMap.get('series'), cb, context
 	            );
 	            this._seriesIndices = createSeriesIndices(filteredSeries);
 	        },
@@ -2802,10 +2811,10 @@
 	        restoreData: function () {
 	            var componentsMap = this._componentsMap;
 
-	            this._seriesIndices = createSeriesIndices(componentsMap.series);
+	            this._seriesIndices = createSeriesIndices(componentsMap.get('series'));
 
 	            var componentTypes = [];
-	            each(componentsMap, function (components, componentType) {
+	            componentsMap.each(function (components, componentType) {
 	                componentTypes.push(componentType);
 	            });
 
@@ -2813,7 +2822,7 @@
 	                componentTypes,
 	                ComponentModel.getAllClassMainTypes(),
 	                function (componentType, dependencies) {
-	                    each(componentsMap[componentType], function (component) {
+	                    each(componentsMap.get(componentType), function (component) {
 	                        component.restoreData();
 	                    });
 	                }
@@ -2857,7 +2866,7 @@
 	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
 	         * @private
 	         */
-	        this._componentsMap = {series: []};
+	        this._componentsMap = zrUtil.createHashMap({series: []});
 
 	        /**
 	         * Mapping between filtered series list and raw series list.
@@ -2887,7 +2896,7 @@
 
 	        var ret = {};
 	        each(types, function (type) {
-	            ret[type] = (componentsMap[type] || []).slice();
+	            ret[type] = (componentsMap.get(type) || []).slice();
 	        });
 
 	        return ret;
@@ -2938,12 +2947,12 @@
 	        // which make sure that their initialization is after series.
 	        if (true) {
 	            if (!ecModel._seriesIndices) {
-	                throw new Error('Series has not been initialized yet.');
+	                throw new Error('Option should contains series.');
 	            }
 	        }
 	    }
 
-	    zrUtil.mixin(GlobalModel, __webpack_require__(24));
+	    zrUtil.mixin(GlobalModel, __webpack_require__(74));
 
 	    module.exports = GlobalModel;
 
@@ -3464,9 +3473,12 @@
 
 	    /**
 	     * @constructor
+	     * @param {Object} obj Only apply `ownProperty`.
 	     */
 	    function HashMap(obj) {
-	        obj && extend(this, obj);
+	        obj && each(obj, function (value, key) {
+	            this.set(key, value);
+	        }, this);
 	    }
 
 	    // Add prefix to avoid conflict with Object.prototype.
@@ -3502,8 +3514,8 @@
 	        }
 	    };
 
-	    function createHashMap() {
-	        return new HashMap();
+	    function createHashMap(obj) {
+	        return new HashMap(obj);
 	    }
 
 	    var util = {
@@ -3694,6 +3706,7 @@
 	            var rawDataIndex = data.getRawIndex(dataIndex);
 	            var name = data.getName(dataIndex, true);
 	            var itemOpt = data.getRawDataItem(dataIndex);
+	            var color = data.getItemVisual(dataIndex, 'color');
 
 	            return {
 	                componentType: this.mainType,
@@ -3707,7 +3720,8 @@
 	                data: itemOpt,
 	                dataType: dataType,
 	                value: rawValue,
-	                color: data.getItemVisual(dataIndex, 'color'),
+	                color: color,
+	                marker: formatUtil.getTooltipMarker(color),
 
 	                // Param name list for mapping `a`, `b`, `c`, `d`, `e`
 	                $vars: ['seriesName', 'name', 'value']
@@ -3882,22 +3896,22 @@
 	        // to specify multi components (like series) by one name.
 
 	        // Ensure that each id is distinct.
-	        var idMap = {};
+	        var idMap = zrUtil.createHashMap();
 
 	        each(mapResult, function (item, index) {
 	            var existCpt = item.exist;
-	            existCpt && (idMap[existCpt.id] = item);
+	            existCpt && idMap.set(existCpt.id, item);
 	        });
 
 	        each(mapResult, function (item, index) {
 	            var opt = item.option;
 
 	            zrUtil.assert(
-	                !opt || opt.id == null || !idMap[opt.id] || idMap[opt.id] === item,
+	                !opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item,
 	                'id duplicates: ' + (opt && opt.id)
 	            );
 
-	            opt && opt.id != null && (idMap[opt.id] = item);
+	            opt && opt.id != null && idMap.set(opt.id, item);
 	            !item.keyInfo && (item.keyInfo = {});
 	        });
 
@@ -3937,10 +3951,10 @@
 	                do {
 	                    keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++;
 	                }
-	                while (idMap[keyInfo.id]);
+	                while (idMap.get(keyInfo.id));
 	            }
 
-	            idMap[keyInfo.id] = item;
+	            idMap.set(keyInfo.id, item);
 	        });
 	    };
 
@@ -4146,6 +4160,60 @@
 	        return result;
 	    };
 
+	    /**
+	     * @see {module:echarts/data/helper/completeDimensions}
+	     * @param {module:echarts/data/List} data
+	     * @param {string|number} dataDim
+	     * @return {string}
+	     */
+	    modelUtil.dataDimToCoordDim = function (data, dataDim) {
+	        var dimensions = data.dimensions;
+	        dataDim = data.getDimension(dataDim);
+	        for (var i = 0; i < dimensions.length; i++) {
+	            var dimItem = data.getDimensionInfo(dimensions[i]);
+	            if (dimItem.name === dataDim) {
+	                return dimItem.coordDim;
+	            }
+	        }
+	    };
+
+	    /**
+	     * @see {module:echarts/data/helper/completeDimensions}
+	     * @param {module:echarts/data/List} data
+	     * @param {string} coordDim
+	     * @return {Array.<string>} data dimensions on the coordDim.
+	     */
+	    modelUtil.coordDimToDataDim = function (data, coordDim) {
+	        var dataDim = [];
+	        each(data.dimensions, function (dimName) {
+	            var dimItem = data.getDimensionInfo(dimName);
+	            if (dimItem.coordDim === coordDim) {
+	                dataDim[dimItem.coordDimIndex] = dimItem.name;
+	            }
+	        });
+	        return dataDim;
+	    };
+
+	    /**
+	     * @see {module:echarts/data/helper/completeDimensions}
+	     * @param {module:echarts/data/List} data
+	     * @param {string} otherDim Can be `otherDims`
+	     *                        like 'label' or 'tooltip'.
+	     * @return {Array.<string>} data dimensions on the otherDim.
+	     */
+	    modelUtil.otherDimToDataDim = function (data, otherDim) {
+	        var dataDim = [];
+	        each(data.dimensions, function (dimName) {
+	            var dimItem = data.getDimensionInfo(dimName);
+	            var otherDims = dimItem.otherDims;
+	            var dimIndex = otherDims[otherDim];
+	            if (dimIndex != null && dimIndex !== false) {
+	                dataDim[dimIndex] = dimItem.name;
+	            }
+	        });
+	        return dataDim;
+	    };
+
 	    function has(obj, prop) {
 	        return obj && obj.hasOwnProperty(prop);
 	    }
@@ -4289,6 +4357,18 @@
 	        return tpl;
 	    };
 
+	    /**
+	     * @param {string} color
+	     * @param {string} [extraCssText]
+	     * @return {string}
+	     */
+	    formatUtil.getTooltipMarker = function (color, extraCssText) {
+	        return color
+	            ? '<span style="display:inline-block;margin-right:5px;'
+	                + 'border-radius:10px;width:9px;height:9px;background-color:'
+	                + formatUtil.encodeHTML(color) + ';' + (extraCssText || '') + '"></span>'
+	            : '';
+	    };
 
 	    /**
 	     * @param {string} str
@@ -5900,7 +5980,7 @@
 	    mixin(Model, __webpack_require__(14));
 	    mixin(Model, __webpack_require__(16));
 	    mixin(Model, __webpack_require__(17));
-	    mixin(Model, __webpack_require__(18));
+	    mixin(Model, __webpack_require__(68));
 
 	    module.exports = Model;
 
@@ -6276,10 +6356,7 @@
 	
 
 	    var textContain = __webpack_require__(8);
-
-	    function getShallow(model, path) {
-	        return model && model.getShallow(path);
-	    }
+	    var graphicUtil = __webpack_require__(18);
 
 	    module.exports = {
 	        /**
@@ -6297,15 +6374,12 @@
 	         * @return {string}
 	         */
 	        getFont: function () {
-	            var ecModel = this.ecModel;
-	            var gTextStyleModel = ecModel && ecModel.getModel('textStyle');
-	            return [
-	                // FIXME in node-canvas fontWeight is before fontStyle
-	                this.getShallow('fontStyle') || getShallow(gTextStyleModel, 'fontStyle'),
-	                this.getShallow('fontWeight') || getShallow(gTextStyleModel, 'fontWeight'),
-	                (this.getShallow('fontSize') || getShallow(gTextStyleModel, 'fontSize') || 12) + 'px',
-	                this.getShallow('fontFamily') || getShallow(gTextStyleModel, 'fontFamily') || 'sans-serif'
-	            ].join(' ');
+	            return graphicUtil.getFont({
+	                fontStyle: this.getShallow('fontStyle'),
+	                fontWeight: this.getShallow('fontWeight'),
+	                fontSize: this.getShallow('fontSize'),
+	                fontFamily: this.getShallow('fontFamily')
+	            }, this.ecModel);
 	        },
 
 	        getTextRect: function (text) {
@@ -6329,2254 +6403,2040 @@
 /* 18 */
 /***/ function(module, exports, __webpack_require__) {
 
-	
-	    var getItemStyle = __webpack_require__(15)(
-	        [
-	            ['fill', 'color'],
-	            ['stroke', 'borderColor'],
-	            ['lineWidth', 'borderWidth'],
-	            ['opacity'],
-	            ['shadowBlur'],
-	            ['shadowOffsetX'],
-	            ['shadowOffsetY'],
-	            ['shadowColor'],
-	            ['textPosition'],
-	            ['textAlign']
-	        ]
-	    );
-	    module.exports = {
-	        getItemStyle: function (excludes, includes) {
-	            var style = getItemStyle.call(this, excludes, includes);
-	            var lineDash = this.getBorderLineDash();
-	            lineDash && (style.lineDash = lineDash);
-	            return style;
-	        },
+	'use strict';
 
-	        getBorderLineDash: function () {
-	            var lineType = this.get('borderType');
-	            return (lineType === 'solid' || lineType == null) ? null
-	                : (lineType === 'dashed' ? [5, 5] : [1, 1]);
+
+	    var zrUtil = __webpack_require__(4);
+
+	    var pathTool = __webpack_require__(19);
+	    var Path = __webpack_require__(20);
+	    var colorTool = __webpack_require__(31);
+	    var matrix = __webpack_require__(11);
+	    var vector = __webpack_require__(10);
+	    var Transformable = __webpack_require__(26);
+	    var BoundingRect = __webpack_require__(9);
+
+	    var round = Math.round;
+	    var mathMax = Math.max;
+	    var mathMin = Math.min;
+
+	    var graphic = {};
+
+	    graphic.Group = __webpack_require__(48);
+
+	    graphic.Image = __webpack_require__(49);
+
+	    graphic.Text = __webpack_require__(50);
+
+	    graphic.Circle = __webpack_require__(51);
+
+	    graphic.Sector = __webpack_require__(52);
+
+	    graphic.Ring = __webpack_require__(53);
+
+	    graphic.Polygon = __webpack_require__(54);
+
+	    graphic.Polyline = __webpack_require__(58);
+
+	    graphic.Rect = __webpack_require__(59);
+
+	    graphic.Line = __webpack_require__(61);
+
+	    graphic.BezierCurve = __webpack_require__(62);
+
+	    graphic.Arc = __webpack_require__(63);
+
+	    graphic.CompoundPath = __webpack_require__(64);
+
+	    graphic.LinearGradient = __webpack_require__(65);
+
+	    graphic.RadialGradient = __webpack_require__(67);
+
+	    graphic.BoundingRect = BoundingRect;
+
+	    /**
+	     * Extend shape with parameters
+	     */
+	    graphic.extendShape = function (opts) {
+	        return Path.extend(opts);
+	    };
+
+	    /**
+	     * Extend path
+	     */
+	    graphic.extendPath = function (pathData, opts) {
+	        return pathTool.extendFromString(pathData, opts);
+	    };
+
+	    /**
+	     * Create a path element from path data string
+	     * @param {string} pathData
+	     * @param {Object} opts
+	     * @param {module:zrender/core/BoundingRect} rect
+	     * @param {string} [layout=cover] 'center' or 'cover'
+	     */
+	    graphic.makePath = function (pathData, opts, rect, layout) {
+	        var path = pathTool.createFromString(pathData, opts);
+	        var boundingRect = path.getBoundingRect();
+	        if (rect) {
+	            var aspect = boundingRect.width / boundingRect.height;
+
+	            if (layout === 'center') {
+	                // Set rect to center, keep width / height ratio.
+	                var width = rect.height * aspect;
+	                var height;
+	                if (width <= rect.width) {
+	                    height = rect.height;
+	                }
+	                else {
+	                    width = rect.width;
+	                    height = width / aspect;
+	                }
+	                var cx = rect.x + rect.width / 2;
+	                var cy = rect.y + rect.height / 2;
+
+	                rect.x = cx - width / 2;
+	                rect.y = cy - height / 2;
+	                rect.width = width;
+	                rect.height = height;
+	            }
+
+	            graphic.resizePath(path, rect);
+	        }
+	        return path;
+	    };
+
+	    graphic.mergePath = pathTool.mergePath,
+
+	    /**
+	     * Resize a path to fit the rect
+	     * @param {module:zrender/graphic/Path} path
+	     * @param {Object} rect
+	     */
+	    graphic.resizePath = function (path, rect) {
+	        if (!path.applyTransform) {
+	            return;
+	        }
+
+	        var pathRect = path.getBoundingRect();
+
+	        var m = pathRect.calculateTransform(rect);
+
+	        path.applyTransform(m);
+	    };
+
+	    /**
+	     * Sub pixel optimize line for canvas
+	     *
+	     * @param {Object} param
+	     * @param {Object} [param.shape]
+	     * @param {number} [param.shape.x1]
+	     * @param {number} [param.shape.y1]
+	     * @param {number} [param.shape.x2]
+	     * @param {number} [param.shape.y2]
+	     * @param {Object} [param.style]
+	     * @param {number} [param.style.lineWidth]
+	     * @return {Object} Modified param
+	     */
+	    graphic.subPixelOptimizeLine = function (param) {
+	        var subPixelOptimize = graphic.subPixelOptimize;
+	        var shape = param.shape;
+	        var lineWidth = param.style.lineWidth;
+
+	        if (round(shape.x1 * 2) === round(shape.x2 * 2)) {
+	            shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);
+	        }
+	        if (round(shape.y1 * 2) === round(shape.y2 * 2)) {
+	            shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);
+	        }
+	        return param;
+	    };
+
+	    /**
+	     * Sub pixel optimize rect for canvas
+	     *
+	     * @param {Object} param
+	     * @param {Object} [param.shape]
+	     * @param {number} [param.shape.x]
+	     * @param {number} [param.shape.y]
+	     * @param {number} [param.shape.width]
+	     * @param {number} [param.shape.height]
+	     * @param {Object} [param.style]
+	     * @param {number} [param.style.lineWidth]
+	     * @return {Object} Modified param
+	     */
+	    graphic.subPixelOptimizeRect = function (param) {
+	        var subPixelOptimize = graphic.subPixelOptimize;
+	        var shape = param.shape;
+	        var lineWidth = param.style.lineWidth;
+	        var originX = shape.x;
+	        var originY = shape.y;
+	        var originWidth = shape.width;
+	        var originHeight = shape.height;
+	        shape.x = subPixelOptimize(shape.x, lineWidth, true);
+	        shape.y = subPixelOptimize(shape.y, lineWidth, true);
+	        shape.width = Math.max(
+	            subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x,
+	            originWidth === 0 ? 0 : 1
+	        );
+	        shape.height = Math.max(
+	            subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y,
+	            originHeight === 0 ? 0 : 1
+	        );
+	        return param;
+	    };
+
+	    /**
+	     * Sub pixel optimize for canvas
+	     *
+	     * @param {number} position Coordinate, such as x, y
+	     * @param {number} lineWidth Should be nonnegative integer.
+	     * @param {boolean=} positiveOrNegative Default false (negative).
+	     * @return {number} Optimized position.
+	     */
+	    graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) {
+	        // Assure that (position + lineWidth / 2) is near integer edge,
+	        // otherwise line will be fuzzy in canvas.
+	        var doubledPosition = round(position * 2);
+	        return (doubledPosition + round(lineWidth)) % 2 === 0
+	            ? doubledPosition / 2
+	            : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;
+	    };
+
+	    function hasFillOrStroke(fillOrStroke) {
+	        return fillOrStroke != null && fillOrStroke != 'none';
+	    }
+
+	    function liftColor(color) {
+	        return typeof color === 'string' ? colorTool.lift(color, -0.1) : color;
+	    }
+
+	    /**
+	     * @private
+	     */
+	    function cacheElementStl(el) {
+	        if (el.__hoverStlDirty) {
+	            var stroke = el.style.stroke;
+	            var fill = el.style.fill;
+
+	            // Create hoverStyle on mouseover
+	            var hoverStyle = el.__hoverStl;
+	            hoverStyle.fill = hoverStyle.fill
+	                || (hasFillOrStroke(fill) ? liftColor(fill) : null);
+	            hoverStyle.stroke = hoverStyle.stroke
+	                || (hasFillOrStroke(stroke) ? liftColor(stroke) : null);
+
+	            var normalStyle = {};
+	            for (var name in hoverStyle) {
+	                if (hoverStyle.hasOwnProperty(name)) {
+	                    normalStyle[name] = el.style[name];
+	                }
+	            }
+
+	            el.__normalStl = normalStyle;
+
+	            el.__hoverStlDirty = false;
+	        }
+	    }
+
+	    /**
+	     * @private
+	     */
+	    function doSingleEnterHover(el) {
+	        if (el.__isHover) {
+	            return;
+	        }
+
+	        cacheElementStl(el);
+
+	        if (el.useHoverLayer) {
+	            el.__zr && el.__zr.addHover(el, el.__hoverStl);
+	        }
+	        else {
+	            el.setStyle(el.__hoverStl);
+	            el.z2 += 1;
+	        }
+
+	        el.__isHover = true;
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function doSingleLeaveHover(el) {
+	        if (!el.__isHover) {
+	            return;
+	        }
+
+	        var normalStl = el.__normalStl;
+	        if (el.useHoverLayer) {
+	            el.__zr && el.__zr.removeHover(el);
+	        }
+	        else {
+	            normalStl && el.setStyle(normalStl);
+	            el.z2 -= 1;
+	        }
+
+	        el.__isHover = false;
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function doEnterHover(el) {
+	        el.type === 'group'
+	            ? el.traverse(function (child) {
+	                if (child.type !== 'group') {
+	                    doSingleEnterHover(child);
+	                }
+	            })
+	            : doSingleEnterHover(el);
+	    }
+
+	    function doLeaveHover(el) {
+	        el.type === 'group'
+	            ? el.traverse(function (child) {
+	                if (child.type !== 'group') {
+	                    doSingleLeaveHover(child);
+	                }
+	            })
+	            : doSingleLeaveHover(el);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function setElementHoverStl(el, hoverStl) {
+	        // If element has sepcified hoverStyle, then use it instead of given hoverStyle
+	        // Often used when item group has a label element and it's hoverStyle is different
+	        el.__hoverStl = el.hoverStyle || hoverStl || {};
+	        el.__hoverStlDirty = true;
+
+	        if (el.__isHover) {
+	            cacheElementStl(el);
+	        }
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function onElementMouseOver(e) {
+	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
+	            return;
+	        }
+
+	        // Only if element is not in emphasis status
+	        !this.__isEmphasis && doEnterHover(this);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function onElementMouseOut(e) {
+	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
+	            return;
+	        }
+
+	        // Only if element is not in emphasis status
+	        !this.__isEmphasis && doLeaveHover(this);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function enterEmphasis() {
+	        this.__isEmphasis = true;
+	        doEnterHover(this);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function leaveEmphasis() {
+	        this.__isEmphasis = false;
+	        doLeaveHover(this);
+	    }
+
+	    /**
+	     * Set hover style of element.
+	     * This method can be called repeatly without side-effects.
+	     * @param {module:zrender/Element} el
+	     * @param {Object} [hoverStyle]
+	     * @param {Object} [opt]
+	     * @param {boolean} [opt.hoverSilentOnTouch=false]
+	     *        In touch device, mouseover event will be trigger on touchstart event
+	     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
+	     *        conviniently use hoverStyle when tap on touch screen without additional
+	     *        code for compatibility.
+	     *        But if the chart/component has select feature, which usually also use
+	     *        hoverStyle, there might be conflict between 'select-highlight' and
+	     *        'hover-highlight' especially when roam is enabled (see geo for example).
+	     *        In this case, hoverSilentOnTouch should be used to disable hover-highlight
+	     *        on touch device.
+	     */
+	    graphic.setHoverStyle = function (el, hoverStyle, opt) {
+	        el.__hoverSilentOnTouch = opt && opt.hoverSilentOnTouch;
+
+	        el.type === 'group'
+	            ? el.traverse(function (child) {
+	                if (child.type !== 'group') {
+	                    setElementHoverStl(child, hoverStyle);
+	                }
+	            })
+	            : setElementHoverStl(el, hoverStyle);
+
+	        // Duplicated function will be auto-ignored, see Eventful.js.
+	        el.on('mouseover', onElementMouseOver)
+	          .on('mouseout', onElementMouseOut);
+
+	        // Emphasis, normal can be triggered manually
+	        el.on('emphasis', enterEmphasis)
+	          .on('normal', leaveEmphasis);
+	    };
+
+	    /**
+	     * Set text option in the style
+	     * @param {Object} textStyle
+	     * @param {module:echarts/model/Model} labelModel
+	     * @param {string} color
+	     */
+	    graphic.setText = function (textStyle, labelModel, color) {
+	        var labelPosition = labelModel.getShallow('position') || 'inside';
+	        var labelOffset = labelModel.getShallow('offset');
+	        var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color;
+	        var textStyleModel = labelModel.getModel('textStyle');
+	        zrUtil.extend(textStyle, {
+	            textDistance: labelModel.getShallow('distance') || 5,
+	            textFont: textStyleModel.getFont(),
+	            textPosition: labelPosition,
+	            textOffset: labelOffset,
+	            textFill: textStyleModel.getTextColor() || labelColor
+	        });
+	    };
+
+	    graphic.getFont = function (opt, ecModel) {
+	        var gTextStyleModel = ecModel && ecModel.getModel('textStyle');
+	        return [
+	            // FIXME in node-canvas fontWeight is before fontStyle
+	            opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '',
+	            opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '',
+	            (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px',
+	            opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'
+	        ].join(' ');
+	    };
+
+	    function animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {
+	        if (typeof dataIndex === 'function') {
+	            cb = dataIndex;
+	            dataIndex = null;
+	        }
+	        // Do not check 'animation' property directly here. Consider this case:
+	        // animation model is an `itemModel`, whose does not have `isAnimationEnabled`
+	        // but its parent model (`seriesModel`) does.
+	        var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();
+
+	        if (animationEnabled) {
+	            var postfix = isUpdate ? 'Update' : '';
+	            var duration = animatableModel.getShallow('animationDuration' + postfix);
+	            var animationEasing = animatableModel.getShallow('animationEasing' + postfix);
+	            var animationDelay = animatableModel.getShallow('animationDelay' + postfix);
+	            if (typeof animationDelay === 'function') {
+	                animationDelay = animationDelay(
+	                    dataIndex,
+	                    animatableModel.getAnimationDelayParams
+	                        ? animatableModel.getAnimationDelayParams(el, dataIndex)
+	                        : null
+	                );
+	            }
+	            if (typeof duration === 'function') {
+	                duration = duration(dataIndex);
+	            }
+
+	            duration > 0
+	                ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb)
+	                : (el.stopAnimation(), el.attr(props), cb && cb());
+	        }
+	        else {
+	            el.stopAnimation();
+	            el.attr(props);
+	            cb && cb();
+	        }
+	    }
+
+	    /**
+	     * Update graphic element properties with or without animation according to the configuration in series
+	     * @param {module:zrender/Element} el
+	     * @param {Object} props
+	     * @param {module:echarts/model/Model} [animatableModel]
+	     * @param {number} [dataIndex]
+	     * @param {Function} [cb]
+	     * @example
+	     *     graphic.updateProps(el, {
+	     *         position: [100, 100]
+	     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
+	     *     // Or
+	     *     graphic.updateProps(el, {
+	     *         position: [100, 100]
+	     *     }, seriesModel, function () { console.log('Animation done!'); });
+	     */
+	    graphic.updateProps = function (el, props, animatableModel, dataIndex, cb) {
+	        animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);
+	    };
+
+	    /**
+	     * Init graphic element properties with or without animation according to the configuration in series
+	     * @param {module:zrender/Element} el
+	     * @param {Object} props
+	     * @param {module:echarts/model/Model} [animatableModel]
+	     * @param {number} [dataIndex]
+	     * @param {Function} cb
+	     */
+	    graphic.initProps = function (el, props, animatableModel, dataIndex, cb) {
+	        animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);
+	    };
+
+	    /**
+	     * Get transform matrix of target (param target),
+	     * in coordinate of its ancestor (param ancestor)
+	     *
+	     * @param {module:zrender/mixin/Transformable} target
+	     * @param {module:zrender/mixin/Transformable} [ancestor]
+	     */
+	    graphic.getTransform = function (target, ancestor) {
+	        var mat = matrix.identity([]);
+
+	        while (target && target !== ancestor) {
+	            matrix.mul(mat, target.getLocalTransform(), mat);
+	            target = target.parent;
+	        }
+
+	        return mat;
+	    };
+
+	    /**
+	     * Apply transform to an vertex.
+	     * @param {Array.<number>} target [x, y]
+	     * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:
+	     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
+	     *      + {position, rotation, scale}, the same as `zrender/Transformable`.
+	     * @param {boolean=} invert Whether use invert matrix.
+	     * @return {Array.<number>} [x, y]
+	     */
+	    graphic.applyTransform = function (target, transform, invert) {
+	        if (transform && !zrUtil.isArrayLike(transform)) {
+	            transform = Transformable.getLocalTransform(transform);
+	        }
+
+	        if (invert) {
+	            transform = matrix.invert([], transform);
+	        }
+	        return vector.applyTransform([], target, transform);
+	    };
+
+	    /**
+	     * @param {string} direction 'left' 'right' 'top' 'bottom'
+	     * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]
+	     * @param {boolean=} invert Whether use invert matrix.
+	     * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'
+	     */
+	    graphic.transformDirection = function (direction, transform, invert) {
+
+	        // Pick a base, ensure that transform result will not be (0, 0).
+	        var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0)
+	            ? 1 : Math.abs(2 * transform[4] / transform[0]);
+	        var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0)
+	            ? 1 : Math.abs(2 * transform[4] / transform[2]);
+
+	        var vertex = [
+	            direction === 'left' ? -hBase : direction === 'right' ? hBase : 0,
+	            direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0
+	        ];
+
+	        vertex = graphic.applyTransform(vertex, transform, invert);
+
+	        return Math.abs(vertex[0]) > Math.abs(vertex[1])
+	            ? (vertex[0] > 0 ? 'right' : 'left')
+	            : (vertex[1] > 0 ? 'bottom' : 'top');
+	    };
+
+	    /**
+	     * Apply group transition animation from g1 to g2.
+	     * If no animatableModel, no animation.
+	     */
+	    graphic.groupTransition = function (g1, g2, animatableModel, cb) {
+	        if (!g1 || !g2) {
+	            return;
+	        }
+
+	        function getElMap(g) {
+	            var elMap = {};
+	            g.traverse(function (el) {
+	                if (!el.isGroup && el.anid) {
+	                    elMap[el.anid] = el;
+	                }
+	            });
+	            return elMap;
+	        }
+	        function getAnimatableProps(el) {
+	            var obj = {
+	                position: vector.clone(el.position),
+	                rotation: el.rotation
+	            };
+	            if (el.shape) {
+	                obj.shape = zrUtil.extend({}, el.shape);
+	            }
+	            return obj;
+	        }
+	        var elMap1 = getElMap(g1);
+
+	        g2.traverse(function (el) {
+	            if (!el.isGroup && el.anid) {
+	                var oldEl = elMap1[el.anid];
+	                if (oldEl) {
+	                    var newProp = getAnimatableProps(el);
+	                    el.attr(getAnimatableProps(oldEl));
+	                    graphic.updateProps(el, newProp, animatableModel, el.dataIndex);
+	                }
+	                // else {
+	                //     if (el.previousProps) {
+	                //         graphic.updateProps
+	                //     }
+	                // }
+	            }
+	        });
+	    };
+
+	    /**
+	     * @param {Array.<Array.<number>>} points Like: [[23, 44], [53, 66], ...]
+	     * @param {Object} rect {x, y, width, height}
+	     * @return {Array.<Array.<number>>} A new clipped points.
+	     */
+	    graphic.clipPointsByRect = function (points, rect) {
+	        return zrUtil.map(points, function (point) {
+	            var x = point[0];
+	            x = mathMax(x, rect.x);
+	            x = mathMin(x, rect.x + rect.width);
+	            var y = point[1];
+	            y = mathMax(y, rect.y);
+	            y = mathMin(y, rect.y + rect.height);
+	            return [x, y];
+	        });
+	    };
+
+	    /**
+	     * @param {Object} targetRect {x, y, width, height}
+	     * @param {Object} rect {x, y, width, height}
+	     * @return {Object} A new clipped rect. If rect size are negative, return undefined.
+	     */
+	    graphic.clipRectByRect = function (targetRect, rect) {
+	        var x = mathMax(targetRect.x, rect.x);
+	        var x2 = mathMin(targetRect.x + targetRect.width, rect.x + rect.width);
+	        var y = mathMax(targetRect.y, rect.y);
+	        var y2 = mathMin(targetRect.y + targetRect.height, rect.y + rect.height);
+
+	        if (x2 >= x && y2 >= y) {
+	            return {
+	                x: x,
+	                y: y,
+	                width: x2 - x,
+	                height: y2 - y
+	            };
 	        }
 	    };
 
+	    module.exports = graphic;
+
+
 
 /***/ },
 /* 19 */
 /***/ function(module, exports, __webpack_require__) {
 
-	/**
-	 * Component model
-	 *
-	 * @module echarts/model/Component
-	 */
+	
 
+	    var Path = __webpack_require__(20);
+	    var PathProxy = __webpack_require__(36);
+	    var transformPath = __webpack_require__(47);
 
-	    var Model = __webpack_require__(12);
-	    var zrUtil = __webpack_require__(4);
-	    var arrayPush = Array.prototype.push;
-	    var componentUtil = __webpack_require__(20);
-	    var clazzUtil = __webpack_require__(13);
-	    var layout = __webpack_require__(21);
+	    // command chars
+	    var cc = [
+	        'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z',
+	        'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'
+	    ];
 
-	    /**
-	     * @alias module:echarts/model/Component
-	     * @constructor
-	     * @param {Object} option
-	     * @param {module:echarts/model/Model} parentModel
-	     * @param {module:echarts/model/Model} ecModel
-	     */
-	    var ComponentModel = Model.extend({
+	    var mathSqrt = Math.sqrt;
+	    var mathSin = Math.sin;
+	    var mathCos = Math.cos;
+	    var PI = Math.PI;
 
-	        type: 'component',
+	    var vMag = function(v) {
+	        return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
+	    };
+	    var vRatio = function(u, v) {
+	        return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
+	    };
+	    var vAngle = function(u, v) {
+	        return (u[0] * v[1] < u[1] * v[0] ? -1 : 1)
+	                * Math.acos(vRatio(u, v));
+	    };
 
-	        /**
-	         * @readOnly
-	         * @type {string}
-	         */
-	        id: '',
+	    function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {
+	        var psi = psiDeg * (PI / 180.0);
+	        var xp = mathCos(psi) * (x1 - x2) / 2.0
+	                 + mathSin(psi) * (y1 - y2) / 2.0;
+	        var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0
+	                 + mathCos(psi) * (y1 - y2) / 2.0;
 
-	        /**
-	         * @readOnly
-	         */
-	        name: '',
+	        var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);
 
-	        /**
-	         * @readOnly
-	         * @type {string}
-	         */
-	        mainType: '',
-
-	        /**
-	         * @readOnly
-	         * @type {string}
-	         */
-	        subType: '',
-
-	        /**
-	         * @readOnly
-	         * @type {number}
-	         */
-	        componentIndex: 0,
-
-	        /**
-	         * @type {Object}
-	         * @protected
-	         */
-	        defaultOption: null,
-
-	        /**
-	         * @type {module:echarts/model/Global}
-	         * @readOnly
-	         */
-	        ecModel: null,
-
-	        /**
-	         * key: componentType
-	         * value:  Component model list, can not be null.
-	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
-	         * @readOnly
-	         */
-	        dependentModels: [],
-
-	        /**
-	         * @type {string}
-	         * @readOnly
-	         */
-	        uid: null,
-
-	        /**
-	         * Support merge layout params.
-	         * Only support 'box' now (left/right/top/bottom/width/height).
-	         * @type {string|Object} Object can be {ignoreSize: true}
-	         * @readOnly
-	         */
-	        layoutMode: null,
-
-	        $constructor: function (option, parentModel, ecModel, extraOpt) {
-	            Model.call(this, option, parentModel, ecModel, extraOpt);
-
-	            this.uid = componentUtil.getUID('componentModel');
-	        },
-
-
-	        init: function (option, parentModel, ecModel, extraOpt) {
-	            this.mergeDefaultAndTheme(option, ecModel);
-	        },
-
-	        mergeDefaultAndTheme: function (option, ecModel) {
-	            var layoutMode = this.layoutMode;
-	            var inputPositionParams = layoutMode
-	                ? layout.getLayoutParams(option) : {};
-
-	            var themeModel = ecModel.getTheme();
-	            zrUtil.merge(option, themeModel.get(this.mainType));
-	            zrUtil.merge(option, this.getDefaultOption());
-
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
-	            }
-	        },
-
-	        mergeOption: function (option, extraOpt) {
-	            zrUtil.merge(this.option, option, true);
-
-	            var layoutMode = this.layoutMode;
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(this.option, option, layoutMode);
-	            }
-	        },
-
-	        // Hooker after init or mergeOption
-	        optionUpdated: function (newCptOption, isInit) {},
-
-	        getDefaultOption: function () {
-	            if (!clazzUtil.hasOwn(this, '__defaultOption')) {
-	                var optList = [];
-	                var Class = this.constructor;
-	                while (Class) {
-	                    var opt = Class.prototype.defaultOption;
-	                    opt && optList.push(opt);
-	                    Class = Class.superClass;
-	                }
-
-	                var defaultOption = {};
-	                for (var i = optList.length - 1; i >= 0; i--) {
-	                    defaultOption = zrUtil.merge(defaultOption, optList[i], true);
-	                }
-	                clazzUtil.set(this, '__defaultOption', defaultOption);
-	            }
-	            return clazzUtil.get(this, '__defaultOption');
-	        },
-
-	        getReferringComponents: function (mainType) {
-	            return this.ecModel.queryComponents({
-	                mainType: mainType,
-	                index: this.get(mainType + 'Index', true),
-	                id: this.get(mainType + 'Id', true)
-	            });
+	        if (lambda > 1) {
+	            rx *= mathSqrt(lambda);
+	            ry *= mathSqrt(lambda);
 	        }
 
-	    });
+	        var f = (fa === fs ? -1 : 1)
+	            * mathSqrt((((rx * rx) * (ry * ry))
+	                    - ((rx * rx) * (yp * yp))
+	                    - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp)
+	                    + (ry * ry) * (xp * xp))
+	                ) || 0;
 
-	    // Reset ComponentModel.extend, add preConstruct.
-	    // clazzUtil.enableClassExtend(
-	    //     ComponentModel,
-	    //     function (option, parentModel, ecModel, extraOpt) {
-	    //         // Set dependentModels, componentIndex, name, id, mainType, subType.
-	    //         zrUtil.extend(this, extraOpt);
+	        var cxp = f * rx * yp / ry;
+	        var cyp = f * -ry * xp / rx;
 
-	    //         this.uid = componentUtil.getUID('componentModel');
+	        var cx = (x1 + x2) / 2.0
+	                 + mathCos(psi) * cxp
+	                 - mathSin(psi) * cyp;
+	        var cy = (y1 + y2) / 2.0
+	                + mathSin(psi) * cxp
+	                + mathCos(psi) * cyp;
 
-	    //         // this.setReadOnly([
-	    //         //     'type', 'id', 'uid', 'name', 'mainType', 'subType',
-	    //         //     'dependentModels', 'componentIndex'
-	    //         // ]);
-	    //     }
-	    // );
+	        var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]);
+	        var u = [ (xp - cxp) / rx, (yp - cyp) / ry ];
+	        var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ];
+	        var dTheta = vAngle(u, v);
 
-	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
-	    clazzUtil.enableClassManagement(
-	        ComponentModel, {registerWhenExtend: true}
-	    );
-	    componentUtil.enableSubTypeDefaulter(ComponentModel);
+	        if (vRatio(u, v) <= -1) {
+	            dTheta = PI;
+	        }
+	        if (vRatio(u, v) >= 1) {
+	            dTheta = 0;
+	        }
+	        if (fs === 0 && dTheta > 0) {
+	            dTheta = dTheta - 2 * PI;
+	        }
+	        if (fs === 1 && dTheta < 0) {
+	            dTheta = dTheta + 2 * PI;
+	        }
 
-	    // Add capability of ComponentModel.topologicalTravel.
-	    componentUtil.enableTopologicalTravel(ComponentModel, getDependencies);
-
-	    function getDependencies(componentType) {
-	        var deps = [];
-	        zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
-	            arrayPush.apply(deps, Clazz.prototype.dependencies || []);
-	        });
-	        // Ensure main type
-	        return zrUtil.map(deps, function (type) {
-	            return clazzUtil.parseClassType(type).main;
-	        });
+	        path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);
 	    }
 
-	    zrUtil.mixin(ComponentModel, __webpack_require__(22));
+	    function createPathProxyFromString(data) {
+	        if (!data) {
+	            return [];
+	        }
 
-	    module.exports = ComponentModel;
+	        // command string
+	        var cs = data.replace(/-/g, ' -')
+	            .replace(/  /g, ' ')
+	            .replace(/ /g, ',')
+	            .replace(/,,/g, ',');
+
+	        var n;
+	        // create pipes so that we can split the data
+	        for (n = 0; n < cc.length; n++) {
+	            cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
+	        }
+
+	        // create array
+	        var arr = cs.split('|');
+	        // init context point
+	        var cpx = 0;
+	        var cpy = 0;
+
+	        var path = new PathProxy();
+	        var CMD = PathProxy.CMD;
+
+	        var prevCmd;
+	        for (n = 1; n < arr.length; n++) {
+	            var str = arr[n];
+	            var c = str.charAt(0);
+	            var off = 0;
+	            var p = str.slice(1).replace(/e,-/g, 'e-').split(',');
+	            var cmd;
+
+	            if (p.length > 0 && p[0] === '') {
+	                p.shift();
+	            }
+
+	            for (var i = 0; i < p.length; i++) {
+	                p[i] = parseFloat(p[i]);
+	            }
+	            while (off < p.length && !isNaN(p[off])) {
+	                if (isNaN(p[0])) {
+	                    break;
+	                }
+	                var ctlPtx;
+	                var ctlPty;
+
+	                var rx;
+	                var ry;
+	                var psi;
+	                var fa;
+	                var fs;
+
+	                var x1 = cpx;
+	                var y1 = cpy;
+
+	                // convert l, H, h, V, and v to L
+	                switch (c) {
+	                    case 'l':
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'L':
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'm':
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.M;
+	                        path.addData(cmd, cpx, cpy);
+	                        c = 'l';
+	                        break;
+	                    case 'M':
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.M;
+	                        path.addData(cmd, cpx, cpy);
+	                        c = 'L';
+	                        break;
+	                    case 'h':
+	                        cpx += p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'H':
+	                        cpx = p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'v':
+	                        cpy += p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'V':
+	                        cpy = p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'C':
+	                        cmd = CMD.C;
+	                        path.addData(
+	                            cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]
+	                        );
+	                        cpx = p[off - 2];
+	                        cpy = p[off - 1];
+	                        break;
+	                    case 'c':
+	                        cmd = CMD.C;
+	                        path.addData(
+	                            cmd,
+	                            p[off++] + cpx, p[off++] + cpy,
+	                            p[off++] + cpx, p[off++] + cpy,
+	                            p[off++] + cpx, p[off++] + cpy
+	                        );
+	                        cpx += p[off - 2];
+	                        cpy += p[off - 1];
+	                        break;
+	                    case 'S':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.C) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cmd = CMD.C;
+	                        x1 = p[off++];
+	                        y1 = p[off++];
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
+	                        break;
+	                    case 's':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.C) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cmd = CMD.C;
+	                        x1 = cpx + p[off++];
+	                        y1 = cpy + p[off++];
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
+	                        break;
+	                    case 'Q':
+	                        x1 = p[off++];
+	                        y1 = p[off++];
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, x1, y1, cpx, cpy);
+	                        break;
+	                    case 'q':
+	                        x1 = p[off++] + cpx;
+	                        y1 = p[off++] + cpy;
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, x1, y1, cpx, cpy);
+	                        break;
+	                    case 'T':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.Q) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
+	                        break;
+	                    case 't':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.Q) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
+	                        break;
+	                    case 'A':
+	                        rx = p[off++];
+	                        ry = p[off++];
+	                        psi = p[off++];
+	                        fa = p[off++];
+	                        fs = p[off++];
+
+	                        x1 = cpx, y1 = cpy;
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.A;
+	                        processArc(
+	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
+	                        );
+	                        break;
+	                    case 'a':
+	                        rx = p[off++];
+	                        ry = p[off++];
+	                        psi = p[off++];
+	                        fa = p[off++];
+	                        fs = p[off++];
+
+	                        x1 = cpx, y1 = cpy;
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.A;
+	                        processArc(
+	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
+	                        );
+	                        break;
+	                }
+	            }
+
+	            if (c === 'z' || c === 'Z') {
+	                cmd = CMD.Z;
+	                path.addData(cmd);
+	            }
+
+	            prevCmd = cmd;
+	        }
+
+	        path.toStatic();
+
+	        return path;
+	    }
+
+	    // TODO Optimize double memory cost problem
+	    function createPathOptions(str, opts) {
+	        var pathProxy = createPathProxyFromString(str);
+	        opts = opts || {};
+	        opts.buildPath = function (path) {
+	            if (path.setData) {
+	                path.setData(pathProxy.data);
+	                // Svg and vml renderer don't have context
+	                var ctx = path.getContext();
+	                if (ctx) {
+	                    path.rebuildPath(ctx);
+	                }
+	            }
+	            else {
+	                var ctx = path;
+	                pathProxy.rebuildPath(ctx);
+	            }
+	        };
+
+	        opts.applyTransform = function (m) {
+	            transformPath(pathProxy, m);
+
+	            this.dirty(true);
+	        };
+
+	        return opts;
+	    }
+
+	    module.exports = {
+	        /**
+	         * Create a Path object from path string data
+	         * http://www.w3.org/TR/SVG/paths.html#PathData
+	         * @param  {Object} opts Other options
+	         */
+	        createFromString: function (str, opts) {
+	            return new Path(createPathOptions(str, opts));
+	        },
+
+	        /**
+	         * Create a Path class from path string data
+	         * @param  {string} str
+	         * @param  {Object} opts Other options
+	         */
+	        extendFromString: function (str, opts) {
+	            return Path.extend(createPathOptions(str, opts));
+	        },
+
+	        /**
+	         * Merge multiple paths
+	         */
+	        // TODO Apply transform
+	        // TODO stroke dash
+	        // TODO Optimize double memory cost problem
+	        mergePath: function (pathEls, opts) {
+	            var pathList = [];
+	            var len = pathEls.length;
+	            for (var i = 0; i < len; i++) {
+	                var pathEl = pathEls[i];
+	                if (!pathEl.path) {
+	                    pathEl.createPathProxy();
+	                }
+	                if (pathEl.__dirtyPath) {
+	                    pathEl.buildPath(pathEl.path, pathEl.shape, true);
+	                }
+	                pathList.push(pathEl.path);
+	            }
+
+	            var pathBundle = new Path(opts);
+	            // Need path proxy.
+	            pathBundle.createPathProxy();
+	            pathBundle.buildPath = function (path) {
+	                path.appendPath(pathList);
+	                // Svg and vml renderer don't have context
+	                var ctx = path.getContext();
+	                if (ctx) {
+	                    path.rebuildPath(ctx);
+	                }
+	            };
+
+	            return pathBundle;
+	        }
+	    };
 
 
 /***/ },
 /* 20 */
 /***/ function(module, exports, __webpack_require__) {
 
-	
+	/**
+	 * Path element
+	 * @module zrender/graphic/Path
+	 */
 
+
+
+	    var Displayable = __webpack_require__(21);
 	    var zrUtil = __webpack_require__(4);
-	    var clazz = __webpack_require__(13);
+	    var PathProxy = __webpack_require__(36);
+	    var pathContain = __webpack_require__(39);
 
-	    var parseClassType = clazz.parseClassType;
+	    var Pattern = __webpack_require__(46);
+	    var getCanvasPattern = Pattern.prototype.getCanvasPattern;
 
-	    var base = 0;
+	    var abs = Math.abs;
 
-	    var componentUtil = {};
-
-	    var DELIMITER = '_';
-
+	    var pathProxyForDraw = new PathProxy(true);
 	    /**
-	     * @public
-	     * @param {string} type
-	     * @return {string}
+	     * @alias module:zrender/graphic/Path
+	     * @extends module:zrender/graphic/Displayable
+	     * @constructor
+	     * @param {Object} opts
 	     */
-	    componentUtil.getUID = function (type) {
-	        // Considering the case of crossing js context,
-	        // use Math.random to make id as unique as possible.
-	        return [(type || ''), base++, Math.random()].join(DELIMITER);
-	    };
-
-	    /**
-	     * @inner
-	     */
-	    componentUtil.enableSubTypeDefaulter = function (entity) {
-
-	        var subTypeDefaulters = {};
-
-	        entity.registerSubTypeDefaulter = function (componentType, defaulter) {
-	            componentType = parseClassType(componentType);
-	            subTypeDefaulters[componentType.main] = defaulter;
-	        };
-
-	        entity.determineSubType = function (componentType, option) {
-	            var type = option.type;
-	            if (!type) {
-	                var componentTypeMain = parseClassType(componentType).main;
-	                if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {
-	                    type = subTypeDefaulters[componentTypeMain](option);
-	                }
-	            }
-	            return type;
-	        };
-
-	        return entity;
-	    };
-
-	    /**
-	     * Topological travel on Activity Network (Activity On Vertices).
-	     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
-	     *
-	     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
-	     *
-	     * If there is circle dependencey, Error will be thrown.
-	     *
-	     */
-	    componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) {
+	    function Path(opts) {
+	        Displayable.call(this, opts);
 
 	        /**
-	         * @public
-	         * @param {Array.<string>} targetNameList Target Component type list.
-	         *                                           Can be ['aa', 'bb', 'aa.xx']
-	         * @param {Array.<string>} fullNameList By which we can build dependency graph.
-	         * @param {Function} callback Params: componentType, dependencies.
-	         * @param {Object} context Scope of callback.
+	         * @type {module:zrender/core/PathProxy}
+	         * @readOnly
 	         */
-	        entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {
-	            if (!targetNameList.length) {
-	                return;
-	            }
+	        this.path = null;
+	    }
 
-	            var result = makeDepndencyGraph(fullNameList);
-	            var graph = result.graph;
-	            var stack = result.noEntryList;
+	    Path.prototype = {
 
-	            var targetNameSet = {};
-	            zrUtil.each(targetNameList, function (name) {
-	                targetNameSet[name] = true;
-	            });
+	        constructor: Path,
 
-	            while (stack.length) {
-	                var currComponentType = stack.pop();
-	                var currVertex = graph[currComponentType];
-	                var isInTargetNameSet = !!targetNameSet[currComponentType];
-	                if (isInTargetNameSet) {
-	                    callback.call(context, currComponentType, currVertex.originalDeps.slice());
-	                    delete targetNameSet[currComponentType];
+	        type: 'path',
+
+	        __dirtyPath: true,
+
+	        strokeContainThreshold: 5,
+
+	        brush: function (ctx, prevEl) {
+	            var style = this.style;
+	            var path = this.path || pathProxyForDraw;
+	            var hasStroke = style.hasStroke();
+	            var hasFill = style.hasFill();
+	            var fill = style.fill;
+	            var stroke = style.stroke;
+	            var hasFillGradient = hasFill && !!(fill.colorStops);
+	            var hasStrokeGradient = hasStroke && !!(stroke.colorStops);
+	            var hasFillPattern = hasFill && !!(fill.image);
+	            var hasStrokePattern = hasStroke && !!(stroke.image);
+
+	            style.bind(ctx, this, prevEl);
+	            this.setTransform(ctx);
+
+	            if (this.__dirty) {
+	                var rect;
+	                // Update gradient because bounding rect may changed
+	                if (hasFillGradient) {
+	                    rect = rect || this.getBoundingRect();
+	                    this._fillGradient = style.getGradient(ctx, fill, rect);
 	                }
-	                zrUtil.each(
-	                    currVertex.successor,
-	                    isInTargetNameSet ? removeEdgeAndAdd : removeEdge
-	                );
-	            }
-
-	            zrUtil.each(targetNameSet, function () {
-	                throw new Error('Circle dependency may exists');
-	            });
-
-	            function removeEdge(succComponentType) {
-	                graph[succComponentType].entryCount--;
-	                if (graph[succComponentType].entryCount === 0) {
-	                    stack.push(succComponentType);
+	                if (hasStrokeGradient) {
+	                    rect = rect || this.getBoundingRect();
+	                    this._strokeGradient = style.getGradient(ctx, stroke, rect);
 	                }
 	            }
-
-	            // Consider this case: legend depends on series, and we call
-	            // chart.setOption({series: [...]}), where only series is in option.
-	            // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will
-	            // not be called, but only sereis.mergeOption is called. Thus legend
-	            // have no chance to update its local record about series (like which
-	            // name of series is available in legend).
-	            function removeEdgeAndAdd(succComponentType) {
-	                targetNameSet[succComponentType] = true;
-	                removeEdge(succComponentType);
+	            // Use the gradient or pattern
+	            if (hasFillGradient) {
+	                // PENDING If may have affect the state
+	                ctx.fillStyle = this._fillGradient;
 	            }
-	        };
+	            else if (hasFillPattern) {
+	                ctx.fillStyle = getCanvasPattern.call(fill, ctx);
+	            }
+	            if (hasStrokeGradient) {
+	                ctx.strokeStyle = this._strokeGradient;
+	            }
+	            else if (hasStrokePattern) {
+	                ctx.strokeStyle = getCanvasPattern.call(stroke, ctx);
+	            }
+
+	            var lineDash = style.lineDash;
+	            var lineDashOffset = style.lineDashOffset;
+
+	            var ctxLineDash = !!ctx.setLineDash;
+
+	            // Update path sx, sy
+	            var scale = this.getGlobalScale();
+	            path.setScale(scale[0], scale[1]);
+
+	            // Proxy context
+	            // Rebuild path in following 2 cases
+	            // 1. Path is dirty
+	            // 2. Path needs javascript implemented lineDash stroking.
+	            //    In this case, lineDash information will not be saved in PathProxy
+	            if (this.__dirtyPath
+	                || (lineDash && !ctxLineDash && hasStroke)
+	            ) {
+	                path.beginPath(ctx);
+
+	                // Setting line dash before build path
+	                if (lineDash && !ctxLineDash) {
+	                    path.setLineDash(lineDash);
+	                    path.setLineDashOffset(lineDashOffset);
+	                }
+
+	                this.buildPath(path, this.shape, false);
+
+	                // Clear path dirty flag
+	                if (this.path) {
+	                    this.__dirtyPath = false;
+	                }
+	            }
+	            else {
+	                // Replay path building
+	                ctx.beginPath();
+	                this.path.rebuildPath(ctx);
+	            }
+
+	            hasFill && path.fill(ctx);
+
+	            if (lineDash && ctxLineDash) {
+	                ctx.setLineDash(lineDash);
+	                ctx.lineDashOffset = lineDashOffset;
+	            }
+
+	            hasStroke && path.stroke(ctx);
+
+	            if (lineDash && ctxLineDash) {
+	                // PENDING
+	                // Remove lineDash
+	                ctx.setLineDash([]);
+	            }
+
+
+	            this.restoreTransform(ctx);
+
+	            // Draw rect text
+	            if (style.text != null) {
+	                // var rect = this.getBoundingRect();
+	                this.drawRectText(ctx, this.getBoundingRect());
+	            }
+	        },
+
+	        // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath
+	        // Like in circle
+	        buildPath: function (ctx, shapeCfg, inBundle) {},
+
+	        createPathProxy: function () {
+	            this.path = new PathProxy();
+	        },
+
+	        getBoundingRect: function () {
+	            var rect = this._rect;
+	            var style = this.style;
+	            var needsUpdateRect = !rect;
+	            if (needsUpdateRect) {
+	                var path = this.path;
+	                if (!path) {
+	                    // Create path on demand.
+	                    path = this.path = new PathProxy();
+	                }
+	                if (this.__dirtyPath) {
+	                    path.beginPath();
+	                    this.buildPath(path, this.shape, false);
+	                }
+	                rect = path.getBoundingRect();
+	            }
+	            this._rect = rect;
+
+	            if (style.hasStroke()) {
+	                // Needs update rect with stroke lineWidth when
+	                // 1. Element changes scale or lineWidth
+	                // 2. Shape is changed
+	                var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone());
+	                if (this.__dirty || needsUpdateRect) {
+	                    rectWithStroke.copy(rect);
+	                    // FIXME Must after updateTransform
+	                    var w = style.lineWidth;
+	                    // PENDING, Min line width is needed when line is horizontal or vertical
+	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
+
+	                    // Only add extra hover lineWidth when there are no fill
+	                    if (!style.hasFill()) {
+	                        w = Math.max(w, this.strokeContainThreshold || 4);
+	                    }
+	                    // Consider line width
+	                    // Line scale can't be 0;
+	                    if (lineScale > 1e-10) {
+	                        rectWithStroke.width += w / lineScale;
+	                        rectWithStroke.height += w / lineScale;
+	                        rectWithStroke.x -= w / lineScale / 2;
+	                        rectWithStroke.y -= w / lineScale / 2;
+	                    }
+	                }
+
+	                // Return rect with stroke
+	                return rectWithStroke;
+	            }
+
+	            return rect;
+	        },
+
+	        contain: function (x, y) {
+	            var localPos = this.transformCoordToLocal(x, y);
+	            var rect = this.getBoundingRect();
+	            var style = this.style;
+	            x = localPos[0];
+	            y = localPos[1];
+
+	            if (rect.contain(x, y)) {
+	                var pathData = this.path.data;
+	                if (style.hasStroke()) {
+	                    var lineWidth = style.lineWidth;
+	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
+	                    // Line scale can't be 0;
+	                    if (lineScale > 1e-10) {
+	                        // Only add extra hover lineWidth when there are no fill
+	                        if (!style.hasFill()) {
+	                            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);
+	                        }
+	                        if (pathContain.containStroke(
+	                            pathData, lineWidth / lineScale, x, y
+	                        )) {
+	                            return true;
+	                        }
+	                    }
+	                }
+	                if (style.hasFill()) {
+	                    return pathContain.contain(pathData, x, y);
+	                }
+	            }
+	            return false;
+	        },
 
 	        /**
-	         * DepndencyGraph: {Object}
-	         * key: conponentType,
-	         * value: {
-	         *     successor: [conponentTypes...],
-	         *     originalDeps: [conponentTypes...],
-	         *     entryCount: {number}
-	         * }
+	         * @param  {boolean} dirtyPath
 	         */
-	        function makeDepndencyGraph(fullNameList) {
-	            var graph = {};
-	            var noEntryList = [];
-
-	            zrUtil.each(fullNameList, function (name) {
-
-	                var thisItem = createDependencyGraphItem(graph, name);
-	                var originalDeps = thisItem.originalDeps = dependencyGetter(name);
-
-	                var availableDeps = getAvailableDependencies(originalDeps, fullNameList);
-	                thisItem.entryCount = availableDeps.length;
-	                if (thisItem.entryCount === 0) {
-	                    noEntryList.push(name);
-	                }
-
-	                zrUtil.each(availableDeps, function (dependentName) {
-	                    if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) {
-	                        thisItem.predecessor.push(dependentName);
-	                    }
-	                    var thatItem = createDependencyGraphItem(graph, dependentName);
-	                    if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) {
-	                        thatItem.successor.push(name);
-	                    }
-	                });
-	            });
-
-	            return {graph: graph, noEntryList: noEntryList};
-	        }
-
-	        function createDependencyGraphItem(graph, name) {
-	            if (!graph[name]) {
-	                graph[name] = {predecessor: [], successor: []};
+	        dirty: function (dirtyPath) {
+	            if (dirtyPath == null) {
+	                dirtyPath = true;
 	            }
-	            return graph[name];
-	        }
+	            // Only mark dirty, not mark clean
+	            if (dirtyPath) {
+	                this.__dirtyPath = dirtyPath;
+	                this._rect = null;
+	            }
 
-	        function getAvailableDependencies(originalDeps, fullNameList) {
-	            var availableDeps = [];
-	            zrUtil.each(originalDeps, function (dep) {
-	                zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);
-	            });
-	            return availableDeps;
+	            this.__dirty = true;
+
+	            this.__zr && this.__zr.refresh();
+
+	            // Used as a clipping path
+	            if (this.__clipTarget) {
+	                this.__clipTarget.dirty();
+	            }
+	        },
+
+	        /**
+	         * Alias for animate('shape')
+	         * @param {boolean} loop
+	         */
+	        animateShape: function (loop) {
+	            return this.animate('shape', loop);
+	        },
+
+	        // Overwrite attrKV
+	        attrKV: function (key, value) {
+	            // FIXME
+	            if (key === 'shape') {
+	                this.setShape(value);
+	                this.__dirtyPath = true;
+	                this._rect = null;
+	            }
+	            else {
+	                Displayable.prototype.attrKV.call(this, key, value);
+	            }
+	        },
+
+	        /**
+	         * @param {Object|string} key
+	         * @param {*} value
+	         */
+	        setShape: function (key, value) {
+	            var shape = this.shape;
+	            // Path from string may not have shape
+	            if (shape) {
+	                if (zrUtil.isObject(key)) {
+	                    for (var name in key) {
+	                        if (key.hasOwnProperty(name)) {
+	                            shape[name] = key[name];
+	                        }
+	                    }
+	                }
+	                else {
+	                    shape[key] = value;
+	                }
+	                this.dirty(true);
+	            }
+	            return this;
+	        },
+
+	        getLineScale: function () {
+	            var m = this.transform;
+	            // Get the line scale.
+	            // Determinant of `m` means how much the area is enlarged by the
+	            // transformation. So its square root can be used as a scale factor
+	            // for width.
+	            return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10
+	                ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1]))
+	                : 1;
 	        }
 	    };
 
-	    module.exports = componentUtil;
+	    /**
+	     * 扩展一个 Path element, 比如星形，圆等。
+	     * Extend a path element
+	     * @param {Object} props
+	     * @param {string} props.type Path type
+	     * @param {Function} props.init Initialize
+	     * @param {Function} props.buildPath Overwrite buildPath method
+	     * @param {Object} [props.style] Extended default style config
+	     * @param {Object} [props.shape] Extended default shape config
+	     */
+	    Path.extend = function (defaults) {
+	        var Sub = function (opts) {
+	            Path.call(this, opts);
+
+	            if (defaults.style) {
+	                // Extend default style
+	                this.style.extendFrom(defaults.style, false);
+	            }
+
+	            // Extend default shape
+	            var defaultShape = defaults.shape;
+	            if (defaultShape) {
+	                this.shape = this.shape || {};
+	                var thisShape = this.shape;
+	                for (var name in defaultShape) {
+	                    if (
+	                        ! thisShape.hasOwnProperty(name)
+	                        && defaultShape.hasOwnProperty(name)
+	                    ) {
+	                        thisShape[name] = defaultShape[name];
+	                    }
+	                }
+	            }
+
+	            defaults.init && defaults.init.call(this, opts);
+	        };
+
+	        zrUtil.inherits(Sub, Path);
+
+	        // FIXME 不能 extend position, rotation 等引用对象
+	        for (var name in defaults) {
+	            // Extending prototype values and methods
+	            if (name !== 'style' && name !== 'shape') {
+	                Sub.prototype[name] = defaults[name];
+	            }
+	        }
+
+	        return Sub;
+	    };
+
+	    zrUtil.inherits(Path, Displayable);
+
+	    module.exports = Path;
 
 
 /***/ },
 /* 21 */
 /***/ function(module, exports, __webpack_require__) {
 
-	'use strict';
-	// Layout helpers for each component positioning
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var BoundingRect = __webpack_require__(9);
-	    var numberUtil = __webpack_require__(7);
-	    var formatUtil = __webpack_require__(6);
-	    var parsePercent = numberUtil.parsePercent;
-	    var each = zrUtil.each;
-
-	    var layout = {};
-
-	    /**
-	     * @public
-	     */
-	    var LOCATION_PARAMS = layout.LOCATION_PARAMS = [
-	        'left', 'right', 'top', 'bottom', 'width', 'height'
-	    ];
-
-	    /**
-	     * @public
-	     */
-	    var HV_NAMES = layout.HV_NAMES = [
-	        ['width', 'left', 'right'],
-	        ['height', 'top', 'bottom']
-	    ];
-
-	    function boxLayout(orient, group, gap, maxWidth, maxHeight) {
-	        var x = 0;
-	        var y = 0;
-	        if (maxWidth == null) {
-	            maxWidth = Infinity;
-	        }
-	        if (maxHeight == null) {
-	            maxHeight = Infinity;
-	        }
-	        var currentLineMaxSize = 0;
-	        group.eachChild(function (child, idx) {
-	            var position = child.position;
-	            var rect = child.getBoundingRect();
-	            var nextChild = group.childAt(idx + 1);
-	            var nextChildRect = nextChild && nextChild.getBoundingRect();
-	            var nextX;
-	            var nextY;
-	            if (orient === 'horizontal') {
-	                var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0);
-	                nextX = x + moveX;
-	                // Wrap when width exceeds maxWidth or meet a `newline` group
-	                if (nextX > maxWidth || child.newline) {
-	                    x = 0;
-	                    nextX = moveX;
-	                    y += currentLineMaxSize + gap;
-	                    currentLineMaxSize = rect.height;
-	                }
-	                else {
-	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);
-	                }
-	            }
-	            else {
-	                var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0);
-	                nextY = y + moveY;
-	                // Wrap when width exceeds maxHeight or meet a `newline` group
-	                if (nextY > maxHeight || child.newline) {
-	                    x += currentLineMaxSize + gap;
-	                    y = 0;
-	                    nextY = moveY;
-	                    currentLineMaxSize = rect.width;
-	                }
-	                else {
-	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);
-	                }
-	            }
-
-	            if (child.newline) {
-	                return;
-	            }
-
-	            position[0] = x;
-	            position[1] = y;
-
-	            orient === 'horizontal'
-	                ? (x = nextX + gap)
-	                : (y = nextY + gap);
-	        });
-	    }
-
-	    /**
-	     * VBox or HBox layouting
-	     * @param {string} orient
-	     * @param {module:zrender/container/Group} group
-	     * @param {number} gap
-	     * @param {number} [width=Infinity]
-	     * @param {number} [height=Infinity]
-	     */
-	    layout.box = boxLayout;
-
-	    /**
-	     * VBox layouting
-	     * @param {module:zrender/container/Group} group
-	     * @param {number} gap
-	     * @param {number} [width=Infinity]
-	     * @param {number} [height=Infinity]
-	     */
-	    layout.vbox = zrUtil.curry(boxLayout, 'vertical');
-
-	    /**
-	     * HBox layouting
-	     * @param {module:zrender/container/Group} group
-	     * @param {number} gap
-	     * @param {number} [width=Infinity]
-	     * @param {number} [height=Infinity]
-	     */
-	    layout.hbox = zrUtil.curry(boxLayout, 'horizontal');
-
-	    /**
-	     * If x or x2 is not specified or 'center' 'left' 'right',
-	     * the width would be as long as possible.
-	     * If y or y2 is not specified or 'middle' 'top' 'bottom',
-	     * the height would be as long as possible.
-	     *
-	     * @param {Object} positionInfo
-	     * @param {number|string} [positionInfo.x]
-	     * @param {number|string} [positionInfo.y]
-	     * @param {number|string} [positionInfo.x2]
-	     * @param {number|string} [positionInfo.y2]
-	     * @param {Object} containerRect
-	     * @param {string|number} margin
-	     * @return {Object} {width, height}
-	     */
-	    layout.getAvailableSize = function (positionInfo, containerRect, margin) {
-	        var containerWidth = containerRect.width;
-	        var containerHeight = containerRect.height;
-
-	        var x = parsePercent(positionInfo.x, containerWidth);
-	        var y = parsePercent(positionInfo.y, containerHeight);
-	        var x2 = parsePercent(positionInfo.x2, containerWidth);
-	        var y2 = parsePercent(positionInfo.y2, containerHeight);
-
-	        (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);
-	        (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);
-	        (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);
-	        (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);
-
-	        margin = formatUtil.normalizeCssArray(margin || 0);
-
-	        return {
-	            width: Math.max(x2 - x - margin[1] - margin[3], 0),
-	            height: Math.max(y2 - y - margin[0] - margin[2], 0)
-	        };
-	    };
-
-	    /**
-	     * Parse position info.
-	     *
-	     * @param {Object} positionInfo
-	     * @param {number|string} [positionInfo.left]
-	     * @param {number|string} [positionInfo.top]
-	     * @param {number|string} [positionInfo.right]
-	     * @param {number|string} [positionInfo.bottom]
-	     * @param {number|string} [positionInfo.width]
-	     * @param {number|string} [positionInfo.height]
-	     * @param {number|string} [positionInfo.aspect] Aspect is width / height
-	     * @param {Object} containerRect
-	     * @param {string|number} [margin]
-	     *
-	     * @return {module:zrender/core/BoundingRect}
-	     */
-	    layout.getLayoutRect = function (
-	        positionInfo, containerRect, margin
-	    ) {
-	        margin = formatUtil.normalizeCssArray(margin || 0);
-
-	        var containerWidth = containerRect.width;
-	        var containerHeight = containerRect.height;
-
-	        var left = parsePercent(positionInfo.left, containerWidth);
-	        var top = parsePercent(positionInfo.top, containerHeight);
-	        var right = parsePercent(positionInfo.right, containerWidth);
-	        var bottom = parsePercent(positionInfo.bottom, containerHeight);
-	        var width = parsePercent(positionInfo.width, containerWidth);
-	        var height = parsePercent(positionInfo.height, containerHeight);
-
-	        var verticalMargin = margin[2] + margin[0];
-	        var horizontalMargin = margin[1] + margin[3];
-	        var aspect = positionInfo.aspect;
-
-	        // If width is not specified, calculate width from left and right
-	        if (isNaN(width)) {
-	            width = containerWidth - right - horizontalMargin - left;
-	        }
-	        if (isNaN(height)) {
-	            height = containerHeight - bottom - verticalMargin - top;
-	        }
-
-	        // If width and height are not given
-	        // 1. Graph should not exceeds the container
-	        // 2. Aspect must be keeped
-	        // 3. Graph should take the space as more as possible
-	        if (isNaN(width) && isNaN(height)) {
-	            if (aspect > containerWidth / containerHeight) {
-	                width = containerWidth * 0.8;
-	            }
-	            else {
-	                height = containerHeight * 0.8;
-	            }
-	        }
-
-	        if (aspect != null) {
-	            // Calculate width or height with given aspect
-	            if (isNaN(width)) {
-	                width = aspect * height;
-	            }
-	            if (isNaN(height)) {
-	                height = width / aspect;
-	            }
-	        }
-
-	        // If left is not specified, calculate left from right and width
-	        if (isNaN(left)) {
-	            left = containerWidth - right - width - horizontalMargin;
-	        }
-	        if (isNaN(top)) {
-	            top = containerHeight - bottom - height - verticalMargin;
-	        }
-
-	        // Align left and top
-	        switch (positionInfo.left || positionInfo.right) {
-	            case 'center':
-	                left = containerWidth / 2 - width / 2 - margin[3];
-	                break;
-	            case 'right':
-	                left = containerWidth - width - horizontalMargin;
-	                break;
-	        }
-	        switch (positionInfo.top || positionInfo.bottom) {
-	            case 'middle':
-	            case 'center':
-	                top = containerHeight / 2 - height / 2 - margin[0];
-	                break;
-	            case 'bottom':
-	                top = containerHeight - height - verticalMargin;
-	                break;
-	        }
-	        // If something is wrong and left, top, width, height are calculated as NaN
-	        left = left || 0;
-	        top = top || 0;
-	        if (isNaN(width)) {
-	            // Width may be NaN if only one value is given except width
-	            width = containerWidth - left - (right || 0);
-	        }
-	        if (isNaN(height)) {
-	            // Height may be NaN if only one value is given except height
-	            height = containerHeight - top - (bottom || 0);
-	        }
-
-	        var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);
-	        rect.margin = margin;
-	        return rect;
-	    };
-
-
-	    /**
-	     * Position a zr element in viewport
-	     *  Group position is specified by either
-	     *  {left, top}, {right, bottom}
-	     *  If all properties exists, right and bottom will be igonred.
-	     *
-	     * Logic:
-	     *     1. Scale (against origin point in parent coord)
-	     *     2. Rotate (against origin point in parent coord)
-	     *     3. Traslate (with el.position by this method)
-	     * So this method only fixes the last step 'Traslate', which does not affect
-	     * scaling and rotating.
-	     *
-	     * If be called repeatly with the same input el, the same result will be gotten.
-	     *
-	     * @param {module:zrender/Element} el Should have `getBoundingRect` method.
-	     * @param {Object} positionInfo
-	     * @param {number|string} [positionInfo.left]
-	     * @param {number|string} [positionInfo.top]
-	     * @param {number|string} [positionInfo.right]
-	     * @param {number|string} [positionInfo.bottom]
-	     * @param {Object} containerRect
-	     * @param {string|number} margin
-	     * @param {Object} [opt]
-	     * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.
-	     * @param {Array.<number>} [opt.boundingMode='all']
-	     *        Specify how to calculate boundingRect when locating.
-	     *        'all': Position the boundingRect that is transformed and uioned
-	     *               both itself and its descendants.
-	     *               This mode simplies confine the elements in the bounding
-	     *               of their container (e.g., using 'right: 0').
-	     *        'raw': Position the boundingRect that is not transformed and only itself.
-	     *               This mode is useful when you want a element can overflow its
-	     *               container. (Consider a rotated circle needs to be located in a corner.)
-	     *               In this mode positionInfo.width/height can only be number.
-	     */
-	    layout.positionElement = function (el, positionInfo, containerRect, margin, opt) {
-	        var h = !opt || !opt.hv || opt.hv[0];
-	        var v = !opt || !opt.hv || opt.hv[1];
-	        var boundingMode = opt && opt.boundingMode || 'all';
-
-	        if (!h && !v) {
-	            return;
-	        }
-
-	        var rect;
-	        if (boundingMode === 'raw') {
-	            rect = el.type === 'group'
-	                ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0)
-	                : el.getBoundingRect();
-	        }
-	        else {
-	            rect = el.getBoundingRect();
-	            if (el.needLocalTransform()) {
-	                var transform = el.getLocalTransform();
-	                // Notice: raw rect may be inner object of el,
-	                // which should not be modified.
-	                rect = rect.clone();
-	                rect.applyTransform(transform);
-	            }
-	        }
-
-	        positionInfo = layout.getLayoutRect(
-	            zrUtil.defaults(
-	                {width: rect.width, height: rect.height},
-	                positionInfo
-	            ),
-	            containerRect,
-	            margin
-	        );
-
-	        // Because 'tranlate' is the last step in transform
-	        // (see zrender/core/Transformable#getLocalTransfrom),
-	        // we can just only modify el.position to get final result.
-	        var elPos = el.position;
-	        var dx = h ? positionInfo.x - rect.x : 0;
-	        var dy = v ? positionInfo.y - rect.y : 0;
-
-	        el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);
-	    };
-
-	    /**
-	     * @param {Object} option Contains some of the properties in HV_NAMES.
-	     * @param {number} hvIdx 0: horizontal; 1: vertical.
-	     */
-	    layout.sizeCalculable = function (option, hvIdx) {
-	        return option[HV_NAMES[hvIdx][0]] != null
-	            || (option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null);
-	    };
-
-	    /**
-	     * Consider Case:
-	     * When defulat option has {left: 0, width: 100}, and we set {right: 0}
-	     * through setOption or media query, using normal zrUtil.merge will cause
-	     * {right: 0} does not take effect.
-	     *
-	     * @example
-	     * ComponentModel.extend({
-	     *     init: function () {
-	     *         ...
-	     *         var inputPositionParams = layout.getLayoutParams(option);
-	     *         this.mergeOption(inputPositionParams);
-	     *     },
-	     *     mergeOption: function (newOption) {
-	     *         newOption && zrUtil.merge(thisOption, newOption, true);
-	     *         layout.mergeLayoutParam(thisOption, newOption);
-	     *     }
-	     * });
-	     *
-	     * @param {Object} targetOption
-	     * @param {Object} newOption
-	     * @param {Object|string} [opt]
-	     * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Some component must has width and height.
-	     */
-	    layout.mergeLayoutParam = function (targetOption, newOption, opt) {
-	        !zrUtil.isObject(opt) && (opt = {});
-
-	        var ignoreSize = opt.ignoreSize;
-	        !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);
-
-	        var hResult = merge(HV_NAMES[0], 0);
-	        var vResult = merge(HV_NAMES[1], 1);
-
-	        copy(HV_NAMES[0], targetOption, hResult);
-	        copy(HV_NAMES[1], targetOption, vResult);
-
-	        function merge(names, hvIdx) {
-	            var newParams = {};
-	            var newValueCount = 0;
-	            var merged = {};
-	            var mergedValueCount = 0;
-	            var enoughParamNumber = 2;
-
-	            each(names, function (name) {
-	                merged[name] = targetOption[name];
-	            });
-	            each(names, function (name) {
-	                // Consider case: newOption.width is null, which is
-	                // set by user for removing width setting.
-	                hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);
-	                hasValue(newParams, name) && newValueCount++;
-	                hasValue(merged, name) && mergedValueCount++;
-	            });
-
-	            if (ignoreSize[hvIdx]) {
-	                // Only one of left/right is premitted to exist.
-	                if (hasValue(newOption, names[1])) {
-	                    merged[names[2]] = null;
-	                }
-	                else if (hasValue(newOption, names[2])) {
-	                    merged[names[1]] = null;
-	                }
-	                return merged;
-	            }
-
-	            // Case: newOption: {width: ..., right: ...},
-	            // or targetOption: {right: ...} and newOption: {width: ...},
-	            // There is no conflict when merged only has params count
-	            // little than enoughParamNumber.
-	            if (mergedValueCount === enoughParamNumber || !newValueCount) {
-	                return merged;
-	            }
-	            // Case: newOption: {width: ..., right: ...},
-	            // Than we can make sure user only want those two, and ignore
-	            // all origin params in targetOption.
-	            else if (newValueCount >= enoughParamNumber) {
-	                return newParams;
-	            }
-	            else {
-	                // Chose another param from targetOption by priority.
-	                for (var i = 0; i < names.length; i++) {
-	                    var name = names[i];
-	                    if (!hasProp(newParams, name) && hasProp(targetOption, name)) {
-	                        newParams[name] = targetOption[name];
-	                        break;
-	                    }
-	                }
-	                return newParams;
-	            }
-	        }
-
-	        function hasProp(obj, name) {
-	            return obj.hasOwnProperty(name);
-	        }
-
-	        function hasValue(obj, name) {
-	            return obj[name] != null && obj[name] !== 'auto';
-	        }
-
-	        function copy(names, target, source) {
-	            each(names, function (name) {
-	                target[name] = source[name];
-	            });
-	        }
-	    };
-
-	    /**
-	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
-	     * @param {Object} source
-	     * @return {Object} Result contains those props.
-	     */
-	    layout.getLayoutParams = function (source) {
-	        return layout.copyLayoutParams({}, source);
-	    };
-
-	    /**
-	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
-	     * @param {Object} source
-	     * @return {Object} Result contains those props.
-	     */
-	    layout.copyLayoutParams = function (target, source) {
-	        source && target && each(LOCATION_PARAMS, function (name) {
-	            source.hasOwnProperty(name) && (target[name] = source[name]);
-	        });
-	        return target;
-	    };
-
-	    module.exports = layout;
-
-
-
-/***/ },
-/* 22 */
-/***/ function(module, exports) {
-
-	
-
-	    module.exports = {
-	        getBoxLayoutParams: function () {
-	            return {
-	                left: this.get('left'),
-	                top: this.get('top'),
-	                right: this.get('right'),
-	                bottom: this.get('bottom'),
-	                width: this.get('width'),
-	                height: this.get('height')
-	            };
-	        }
-	    };
-
-
-/***/ },
-/* 23 */
-/***/ function(module, exports) {
-
-	
-	    var platform = '';
-	    // Navigator not exists in node
-	    if (typeof navigator !== 'undefined') {
-	        platform = navigator.platform || '';
-	    }
-	    module.exports = {
-	        // 全图默认背景
-	        // backgroundColor: 'rgba(0,0,0,0)',
-
-	        // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization
-	        // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'],
-	        // 浅色
-	        // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'],
-	        // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'],
-	        // 深色
-	        color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83',  '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'],
-
-	        // 默认需要 Grid 配置项
-	        // grid: {},
-	        // 主题，主题
-	        textStyle: {
-	            // color: '#000',
-	            // decoration: 'none',
-	            // PENDING
-	            fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',
-	            // fontFamily: 'Arial, Verdana, sans-serif',
-	            fontSize: 12,
-	            fontStyle: 'normal',
-	            fontWeight: 'normal'
-	        },
-
-	        // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/
-	        // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
-	        // Default is source-over
-	        blendMode: null,
-
-	        animation: 'auto',
-	        animationDuration: 1000,
-	        animationDurationUpdate: 300,
-	        animationEasing: 'exponentialOut',
-	        animationEasingUpdate: 'cubicOut',
-
-	        animationThreshold: 2000,
-	        // Configuration for progressive/incremental rendering
-	        progressiveThreshold: 3000,
-	        progressive: 400,
-
-	        // Threshold of if use single hover layer to optimize.
-	        // It is recommended that `hoverLayerThreshold` is equivalent to or less than
-	        // `progressiveThreshold`, otherwise hover will cause restart of progressive,
-	        // which is unexpected.
-	        // see example <echarts/test/heatmap-large.html>.
-	        hoverLayerThreshold: 3000,
-
-	        // See: module:echarts/scale/Time
-	        useUTC: false
-	    };
-
-
-/***/ },
-/* 24 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var classUtil = __webpack_require__(13);
-	    var set = classUtil.set;
-	    var get = classUtil.get;
-
-	    module.exports = {
-	        clearColorPalette: function () {
-	            set(this, 'colorIdx', 0);
-	            set(this, 'colorNameMap', {});
-	        },
-
-	        getColorFromPalette: function (name, scope) {
-	            scope = scope || this;
-	            var colorIdx = get(scope, 'colorIdx') || 0;
-	            var colorNameMap = get(scope, 'colorNameMap') || set(scope, 'colorNameMap', {});
-	            if (colorNameMap[name]) {
-	                return colorNameMap[name];
-	            }
-	            var colorPalette = this.get('color', true) || [];
-	            if (!colorPalette.length) {
-	                return;
-	            }
-
-	            var color = colorPalette[colorIdx];
-	            if (name) {
-	                colorNameMap[name] = color;
-	            }
-	            set(scope, 'colorIdx', (colorIdx + 1) % colorPalette.length);
-
-	            return color;
-	        }
-	    };
-
-
-/***/ },
-/* 25 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var echartsAPIList = [
-	        'getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed',
-	        'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption',
-	        'getViewOfComponentModel', 'getViewOfSeriesModel'
-	    ];
-	    // And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js
-
-	    function ExtensionAPI(chartInstance) {
-	        zrUtil.each(echartsAPIList, function (name) {
-	            this[name] = zrUtil.bind(chartInstance[name], chartInstance);
-	        }, this);
-	    }
-
-	    module.exports = ExtensionAPI;
-
-
-/***/ },
-/* 26 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var coordinateSystemCreators = {};
-
-	    function CoordinateSystemManager() {
-
-	        this._coordinateSystems = [];
-	    }
-
-	    CoordinateSystemManager.prototype = {
-
-	        constructor: CoordinateSystemManager,
-
-	        create: function (ecModel, api) {
-	            var coordinateSystems = [];
-	            zrUtil.each(coordinateSystemCreators, function (creater, type) {
-	                var list = creater.create(ecModel, api);
-	                coordinateSystems = coordinateSystems.concat(list || []);
-	            });
-
-	            this._coordinateSystems = coordinateSystems;
-	        },
-
-	        update: function (ecModel, api) {
-	            zrUtil.each(this._coordinateSystems, function (coordSys) {
-	                // FIXME MUST have
-	                coordSys.update && coordSys.update(ecModel, api);
-	            });
-	        },
-
-	        getCoordinateSystems: function () {
-	            return this._coordinateSystems.slice();
-	        }
-	    };
-
-	    CoordinateSystemManager.register = function (type, coordinateSystemCreator) {
-	        coordinateSystemCreators[type] = coordinateSystemCreator;
-	    };
-
-	    CoordinateSystemManager.get = function (type) {
-	        return coordinateSystemCreators[type];
-	    };
-
-	    module.exports = CoordinateSystemManager;
-
-
-/***/ },
-/* 27 */
-/***/ function(module, exports, __webpack_require__) {
-
 	/**
-	 * ECharts option manager
-	 *
-	 * @module {echarts/model/OptionManager}
+	 * 可绘制的图形基类
+	 * Base class of all displayable graphic objects
+	 * @module zrender/graphic/Displayable
 	 */
 
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var modelUtil = __webpack_require__(5);
-	    var ComponentModel = __webpack_require__(19);
-	    var each = zrUtil.each;
-	    var clone = zrUtil.clone;
-	    var map = zrUtil.map;
-	    var merge = zrUtil.merge;
 
-	    var QUERY_REG = /^(min|max)?(.+)$/;
+	    var Style = __webpack_require__(22);
+
+	    var Element = __webpack_require__(23);
+	    var RectText = __webpack_require__(35);
+	    // var Stateful = require('./mixin/Stateful');
 
 	    /**
-	     * TERM EXPLANATIONS:
-	     *
-	     * [option]:
-	     *
-	     *     An object that contains definitions of components. For example:
-	     *     var option = {
-	     *         title: {...},
-	     *         legend: {...},
-	     *         visualMap: {...},
-	     *         series: [
-	     *             {data: [...]},
-	     *             {data: [...]},
-	     *             ...
-	     *         ]
-	     *     };
-	     *
-	     * [rawOption]:
-	     *
-	     *     An object input to echarts.setOption. 'rawOption' may be an
-	     *     'option', or may be an object contains multi-options. For example:
-	     *     var option = {
-	     *         baseOption: {
-	     *             title: {...},
-	     *             legend: {...},
-	     *             series: [
-	     *                 {data: [...]},
-	     *                 {data: [...]},
-	     *                 ...
-	     *             ]
-	     *         },
-	     *         timeline: {...},
-	     *         options: [
-	     *             {title: {...}, series: {data: [...]}},
-	     *             {title: {...}, series: {data: [...]}},
-	     *             ...
-	     *         ],
-	     *         media: [
-	     *             {
-	     *                 query: {maxWidth: 320},
-	     *                 option: {series: {x: 20}, visualMap: {show: false}}
-	     *             },
-	     *             {
-	     *                 query: {minWidth: 320, maxWidth: 720},
-	     *                 option: {series: {x: 500}, visualMap: {show: true}}
-	     *             },
-	     *             {
-	     *                 option: {series: {x: 1200}, visualMap: {show: true}}
-	     *             }
-	     *         ]
-	     *     };
-	     *
-	     * @alias module:echarts/model/OptionManager
-	     * @param {module:echarts/ExtensionAPI} api
+	     * @alias module:zrender/graphic/Displayable
+	     * @extends module:zrender/Element
+	     * @extends module:zrender/graphic/mixin/RectText
 	     */
-	    function OptionManager(api) {
-
-	        /**
-	         * @private
-	         * @type {module:echarts/ExtensionAPI}
-	         */
-	        this._api = api;
-
-	        /**
-	         * @private
-	         * @type {Array.<number>}
-	         */
-	        this._timelineOptions = [];
-
-	        /**
-	         * @private
-	         * @type {Array.<Object>}
-	         */
-	        this._mediaList = [];
-
-	        /**
-	         * @private
-	         * @type {Object}
-	         */
-	        this._mediaDefault;
-
-	        /**
-	         * -1, means default.
-	         * empty means no media.
-	         * @private
-	         * @type {Array.<number>}
-	         */
-	        this._currentMediaIndices = [];
-
-	        /**
-	         * @private
-	         * @type {Object}
-	         */
-	        this._optionBackup;
-
-	        /**
-	         * @private
-	         * @type {Object}
-	         */
-	        this._newBaseOption;
-	    }
-
-	    // timeline.notMerge is not supported in ec3. Firstly there is rearly
-	    // case that notMerge is needed. Secondly supporting 'notMerge' requires
-	    // rawOption cloned and backuped when timeline changed, which does no
-	    // good to performance. What's more, that both timeline and setOption
-	    // method supply 'notMerge' brings complex and some problems.
-	    // Consider this case:
-	    // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);
-	    // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);
-
-	    OptionManager.prototype = {
-
-	        constructor: OptionManager,
-
-	        /**
-	         * @public
-	         * @param {Object} rawOption Raw option.
-	         * @param {module:echarts/model/Global} ecModel
-	         * @param {Array.<Function>} optionPreprocessorFuncs
-	         * @return {Object} Init option
-	         */
-	        setOption: function (rawOption, optionPreprocessorFuncs) {
-	            rawOption = clone(rawOption, true);
-
-	            // FIXME
-	            // 如果 timeline options 或者 media 中设置了某个属性，而baseOption中没有设置，则进行警告。
-
-	            var oldOptionBackup = this._optionBackup;
-	            var newParsedOption = parseRawOption.call(
-	                this, rawOption, optionPreprocessorFuncs, !oldOptionBackup
-	            );
-	            this._newBaseOption = newParsedOption.baseOption;
-
-	            // For setOption at second time (using merge mode);
-	            if (oldOptionBackup) {
-	                // Only baseOption can be merged.
-	                mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption);
-
-	                // For simplicity, timeline options and media options do not support merge,
-	                // that is, if you `setOption` twice and both has timeline options, the latter
-	                // timeline opitons will not be merged to the formers, but just substitude them.
-	                if (newParsedOption.timelineOptions.length) {
-	                    oldOptionBackup.timelineOptions = newParsedOption.timelineOptions;
-	                }
-	                if (newParsedOption.mediaList.length) {
-	                    oldOptionBackup.mediaList = newParsedOption.mediaList;
-	                }
-	                if (newParsedOption.mediaDefault) {
-	                    oldOptionBackup.mediaDefault = newParsedOption.mediaDefault;
-	                }
-	            }
-	            else {
-	                this._optionBackup = newParsedOption;
-	            }
-	        },
-
-	        /**
-	         * @param {boolean} isRecreate
-	         * @return {Object}
-	         */
-	        mountOption: function (isRecreate) {
-	            var optionBackup = this._optionBackup;
-
-	            // TODO
-	            // 如果没有reset功能则不clone。
-
-	            this._timelineOptions = map(optionBackup.timelineOptions, clone);
-	            this._mediaList = map(optionBackup.mediaList, clone);
-	            this._mediaDefault = clone(optionBackup.mediaDefault);
-	            this._currentMediaIndices = [];
-
-	            return clone(isRecreate
-	                // this._optionBackup.baseOption, which is created at the first `setOption`
-	                // called, and is merged into every new option by inner method `mergeOption`
-	                // each time `setOption` called, can be only used in `isRecreate`, because
-	                // its reliability is under suspicion. In other cases option merge is
-	                // performed by `model.mergeOption`.
-	                ? optionBackup.baseOption : this._newBaseOption
-	            );
-	        },
-
-	        /**
-	         * @param {module:echarts/model/Global} ecModel
-	         * @return {Object}
-	         */
-	        getTimelineOption: function (ecModel) {
-	            var option;
-	            var timelineOptions = this._timelineOptions;
-
-	            if (timelineOptions.length) {
-	                // getTimelineOption can only be called after ecModel inited,
-	                // so we can get currentIndex from timelineModel.
-	                var timelineModel = ecModel.getComponent('timeline');
-	                if (timelineModel) {
-	                    option = clone(
-	                        timelineOptions[timelineModel.getCurrentIndex()],
-	                        true
-	                    );
-	                }
-	            }
-
-	            return option;
-	        },
-
-	        /**
-	         * @param {module:echarts/model/Global} ecModel
-	         * @return {Array.<Object>}
-	         */
-	        getMediaOption: function (ecModel) {
-	            var ecWidth = this._api.getWidth();
-	            var ecHeight = this._api.getHeight();
-	            var mediaList = this._mediaList;
-	            var mediaDefault = this._mediaDefault;
-	            var indices = [];
-	            var result = [];
-
-	            // No media defined.
-	            if (!mediaList.length && !mediaDefault) {
-	                return result;
-	            }
-
-	            // Multi media may be applied, the latter defined media has higher priority.
-	            for (var i = 0, len = mediaList.length; i < len; i++) {
-	                if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {
-	                    indices.push(i);
-	                }
-	            }
-
-	            // FIXME
-	            // 是否mediaDefault应该强制用户设置，否则可能修改不能回归。
-	            if (!indices.length && mediaDefault) {
-	                indices = [-1];
-	            }
-
-	            if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {
-	                result = map(indices, function (index) {
-	                    return clone(
-	                        index === -1 ? mediaDefault.option : mediaList[index].option
-	                    );
-	                });
-	            }
-	            // Otherwise return nothing.
-
-	            this._currentMediaIndices = indices;
-
-	            return result;
-	        }
-	    };
-
-	    function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) {
-	        var timelineOptions = [];
-	        var mediaList = [];
-	        var mediaDefault;
-	        var baseOption;
-
-	        // Compatible with ec2.
-	        var timelineOpt = rawOption.timeline;
-
-	        if (rawOption.baseOption) {
-	            baseOption = rawOption.baseOption;
-	        }
-
-	        // For timeline
-	        if (timelineOpt || rawOption.options) {
-	            baseOption = baseOption || {};
-	            timelineOptions = (rawOption.options || []).slice();
-	        }
-
-	        // For media query
-	        if (rawOption.media) {
-	            baseOption = baseOption || {};
-	            var media = rawOption.media;
-	            each(media, function (singleMedia) {
-	                if (singleMedia && singleMedia.option) {
-	                    if (singleMedia.query) {
-	                        mediaList.push(singleMedia);
-	                    }
-	                    else if (!mediaDefault) {
-	                        // Use the first media default.
-	                        mediaDefault = singleMedia;
-	                    }
-	                }
-	            });
-	        }
-
-	        // For normal option
-	        if (!baseOption) {
-	            baseOption = rawOption;
-	        }
-
-	        // Set timelineOpt to baseOption in ec3,
-	        // which is convenient for merge option.
-	        if (!baseOption.timeline) {
-	            baseOption.timeline = timelineOpt;
-	        }
-
-	        // Preprocess.
-	        each([baseOption].concat(timelineOptions)
-	            .concat(zrUtil.map(mediaList, function (media) {
-	                return media.option;
-	            })),
-	            function (option) {
-	                each(optionPreprocessorFuncs, function (preProcess) {
-	                    preProcess(option, isNew);
-	                });
-	            }
-	        );
-
-	        return {
-	            baseOption: baseOption,
-	            timelineOptions: timelineOptions,
-	            mediaDefault: mediaDefault,
-	            mediaList: mediaList
-	        };
-	    }
-
-	    /**
-	     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
-	     * Support: width, height, aspectRatio
-	     * Can use max or min as prefix.
-	     */
-	    function applyMediaQuery(query, ecWidth, ecHeight) {
-	        var realMap = {
-	            width: ecWidth,
-	            height: ecHeight,
-	            aspectratio: ecWidth / ecHeight // lowser case for convenientce.
-	        };
-
-	        var applicatable = true;
-
-	        zrUtil.each(query, function (value, attr) {
-	            var matched = attr.match(QUERY_REG);
-
-	            if (!matched || !matched[1] || !matched[2]) {
-	                return;
-	            }
-
-	            var operator = matched[1];
-	            var realAttr = matched[2].toLowerCase();
-
-	            if (!compare(realMap[realAttr], value, operator)) {
-	                applicatable = false;
-	            }
-	        });
-
-	        return applicatable;
-	    }
-
-	    function compare(real, expect, operator) {
-	        if (operator === 'min') {
-	            return real >= expect;
-	        }
-	        else if (operator === 'max') {
-	            return real <= expect;
-	        }
-	        else { // Equals
-	            return real === expect;
-	        }
-	    }
-
-	    function indicesEquals(indices1, indices2) {
-	        // indices is always order by asc and has only finite number.
-	        return indices1.join(',') === indices2.join(',');
-	    }
-
-	    /**
-	     * Consider case:
-	     * `chart.setOption(opt1);`
-	     * Then user do some interaction like dataZoom, dataView changing.
-	     * `chart.setOption(opt2);`
-	     * Then user press 'reset button' in toolbox.
-	     *
-	     * After doing that all of the interaction effects should be reset, the
-	     * chart should be the same as the result of invoke
-	     * `chart.setOption(opt1); chart.setOption(opt2);`.
-	     *
-	     * Although it is not able ensure that
-	     * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to
-	     * `chart.setOption(merge(opt1, opt2));` exactly,
-	     * this might be the only simple way to implement that feature.
-	     *
-	     * MEMO: We've considered some other approaches:
-	     * 1. Each model handle its self restoration but not uniform treatment.
-	     *     (Too complex in logic and error-prone)
-	     * 2. Use a shadow ecModel. (Performace expensive)
-	     */
-	    function mergeOption(oldOption, newOption) {
-	        newOption = newOption || {};
-
-	        each(newOption, function (newCptOpt, mainType) {
-	            if (newCptOpt == null) {
-	                return;
-	            }
-
-	            var oldCptOpt = oldOption[mainType];
-
-	            if (!ComponentModel.hasClass(mainType)) {
-	                oldOption[mainType] = merge(oldCptOpt, newCptOpt, true);
-	            }
-	            else {
-	                newCptOpt = modelUtil.normalizeToArray(newCptOpt);
-	                oldCptOpt = modelUtil.normalizeToArray(oldCptOpt);
-
-	                var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt);
-
-	                oldOption[mainType] = map(mapResult, function (item) {
-	                    return (item.option && item.exist)
-	                        ? merge(item.exist, item.option, true)
-	                        : (item.exist || item.option);
-	                });
-	            }
-	        });
-	    }
-
-	    module.exports = OptionManager;
-
-
-/***/ },
-/* 28 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var formatUtil = __webpack_require__(6);
-	    var classUtil = __webpack_require__(13);
-	    var modelUtil = __webpack_require__(5);
-	    var ComponentModel = __webpack_require__(19);
-	    var colorPaletteMixin = __webpack_require__(24);
-	    var env = __webpack_require__(2);
-	    var layout = __webpack_require__(21);
-
-	    var set = classUtil.set;
-	    var get = classUtil.get;
-	    var encodeHTML = formatUtil.encodeHTML;
-	    var addCommas = formatUtil.addCommas;
-
-	    var SeriesModel = ComponentModel.extend({
-
-	        type: 'series.__base__',
-
-	        /**
-	         * @readOnly
-	         */
-	        seriesIndex: 0,
-
-	        // coodinateSystem will be injected in the echarts/CoordinateSystem
-	        coordinateSystem: null,
-
-	        /**
-	         * @type {Object}
-	         * @protected
-	         */
-	        defaultOption: null,
-
-	        /**
-	         * Data provided for legend
-	         * @type {Function}
-	         */
-	        // PENDING
-	        legendDataProvider: null,
-
-	        /**
-	         * Access path of color for visual
-	         */
-	        visualColorAccessPath: 'itemStyle.normal.color',
-
-	        /**
-	         * Support merge layout params.
-	         * Only support 'box' now (left/right/top/bottom/width/height).
-	         * @type {string|Object} Object can be {ignoreSize: true}
-	         * @readOnly
-	         */
-	        layoutMode: null,
-
-	        init: function (option, parentModel, ecModel, extraOpt) {
-
-	            /**
-	             * @type {number}
-	             * @readOnly
-	             */
-	            this.seriesIndex = this.componentIndex;
-
-	            this.mergeDefaultAndTheme(option, ecModel);
-
-	            var data = this.getInitialData(option, ecModel);
-	            if (true) {
-	                zrUtil.assert(data, 'getInitialData returned invalid data.');
-	            }
-	            /**
-	             * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph}
-	             * @private
-	             */
-	            set(this, 'dataBeforeProcessed', data);
-
-	            // If we reverse the order (make data firstly, and then make
-	            // dataBeforeProcessed by cloneShallow), cloneShallow will
-	            // cause data.graph.data !== data when using
-	            // module:echarts/data/Graph or module:echarts/data/Tree.
-	            // See module:echarts/data/helper/linkList
-	            this.restoreData();
-	        },
-
-	        /**
-	         * Util for merge default and theme to option
-	         * @param  {Object} option
-	         * @param  {module:echarts/model/Global} ecModel
-	         */
-	        mergeDefaultAndTheme: function (option, ecModel) {
-	            var layoutMode = this.layoutMode;
-	            var inputPositionParams = layoutMode
-	                ? layout.getLayoutParams(option) : {};
-
-	            zrUtil.merge(
-	                option,
-	                ecModel.getTheme().get(this.subType)
-	            );
-	            zrUtil.merge(option, this.getDefaultOption());
-
-	            // Default label emphasis `position` and `show`
-	            // FIXME Set label in mergeOption
-	            modelUtil.defaultEmphasis(option.label, modelUtil.LABEL_OPTIONS);
-
-	            this.fillDataTextStyle(option.data);
-
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
-	            }
-	        },
-
-	        mergeOption: function (newSeriesOption, ecModel) {
-	            newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);
-	            this.fillDataTextStyle(newSeriesOption.data);
-
-	            var layoutMode = this.layoutMode;
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(this.option, newSeriesOption, layoutMode);
-	            }
-
-	            var data = this.getInitialData(newSeriesOption, ecModel);
-	            // TODO Merge data?
-	            if (data) {
-	                set(this, 'data', data);
-	                set(this, 'dataBeforeProcessed', data.cloneShallow());
-	            }
-	        },
-
-	        fillDataTextStyle: function (data) {
-	            // Default data label emphasis `position` and `show`
-	            // FIXME Tree structure data ?
-	            // FIXME Performance ?
-	            if (data) {
-	                for (var i = 0; i < data.length; i++) {
-	                    if (data[i] && data[i].label) {
-	                        modelUtil.defaultEmphasis(data[i].label, modelUtil.LABEL_OPTIONS);
-	                    }
-	                }
-	            }
-	        },
-
-	        /**
-	         * Init a data structure from data related option in series
-	         * Must be overwritten
-	         */
-	        getInitialData: function () {},
-
-	        /**
-	         * @param {string} [dataType]
-	         * @return {module:echarts/data/List}
-	         */
-	        getData: function (dataType) {
-	            var data = get(this, 'data');
-	            return dataType == null ? data : data.getLinkedData(dataType);
-	        },
-
-	        /**
-	         * @param {module:echarts/data/List} data
-	         */
-	        setData: function (data) {
-	            set(this, 'data', data);
-	        },
-
-	        /**
-	         * Get data before processed
-	         * @return {module:echarts/data/List}
-	         */
-	        getRawData: function () {
-	            return get(this, 'dataBeforeProcessed');
-	        },
-
-	        /**
-	         * Coord dimension to data dimension.
-	         *
-	         * By default the result is the same as dimensions of series data.
-	         * But in some series data dimensions are different from coord dimensions (i.e.
-	         * candlestick and boxplot). Override this method to handle those cases.
-	         *
-	         * Coord dimension to data dimension can be one-to-many
-	         *
-	         * @param {string} coordDim
-	         * @return {Array.<string>} dimensions on the axis.
-	         */
-	        coordDimToDataDim: function (coordDim) {
-	            return [coordDim];
-	        },
-
-	        /**
-	         * Convert data dimension to coord dimension.
-	         *
-	         * @param {string|number} dataDim
-	         * @return {string}
-	         */
-	        dataDimToCoordDim: function (dataDim) {
-	            return dataDim;
-	        },
-
-	        /**
-	         * Get base axis if has coordinate system and has axis.
-	         * By default use coordSys.getBaseAxis();
-	         * Can be overrided for some chart.
-	         * @return {type} description
-	         */
-	        getBaseAxis: function () {
-	            var coordSys = this.coordinateSystem;
-	            return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
-	        },
-
-	        // FIXME
-	        /**
-	         * Default tooltip formatter
-	         *
-	         * @param {number} dataIndex
-	         * @param {boolean} [multipleSeries=false]
-	         * @param {number} [dataType]
-	         */
-	        formatTooltip: function (dataIndex, multipleSeries, dataType) {
-	            function formatArrayValue(value) {
-	                var result = [];
-
-	                zrUtil.each(value, function (val, idx) {
-	                    var dimInfo = data.getDimensionInfo(idx);
-	                    var dimType = dimInfo && dimInfo.type;
-	                    var valStr;
-
-	                    if (dimType === 'ordinal') {
-	                        valStr = val + '';
-	                    }
-	                    else if (dimType === 'time') {
-	                        valStr = multipleSeries ? '' : formatUtil.formatTime('yyyy/MM/dd hh:mm:ss', val);
-	                    }
-	                    else {
-	                        valStr = addCommas(val);
-	                    }
-
-	                    valStr && result.push(valStr);
-	                });
-
-	                return result.join(', ');
-	            }
-
-	            var data = get(this, 'data');
-
-	            var value = this.getRawValue(dataIndex);
-	            var formattedValue = encodeHTML(
-	                zrUtil.isArray(value) ? formatArrayValue(value) : addCommas(value)
-	            );
-	            var name = data.getName(dataIndex);
-
-	            var color = data.getItemVisual(dataIndex, 'color');
-	            if (zrUtil.isObject(color) && color.colorStops) {
-	                color = (color.colorStops[0] || {}).color;
-	            }
-	            color = color || 'transparent';
-
-	            var colorEl = '<span style="display:inline-block;margin-right:5px;'
-	                + 'border-radius:10px;width:9px;height:9px;background-color:' + encodeHTML(color) + '"></span>';
-
-	            var seriesName = this.name;
-	            // FIXME
-	            if (seriesName === '\0-') {
-	                // Not show '-'
-	                seriesName = '';
-	            }
-	            return !multipleSeries
-	                ? ((seriesName && encodeHTML(seriesName) + '<br />') + colorEl
-	                    + (name
-	                        ? encodeHTML(name) + ' : ' + formattedValue
-	                        : formattedValue
-	                    )
-	                  )
-	                : (colorEl + encodeHTML(this.name) + ' : ' + formattedValue);
-	        },
-
-	        /**
-	         * @return {boolean}
-	         */
-	        isAnimationEnabled: function () {
-	            if (env.node) {
-	                return false;
-	            }
-
-	            var animationEnabled = this.getShallow('animation');
-	            if (animationEnabled) {
-	                if (this.getData().count() > this.getShallow('animationThreshold')) {
-	                    animationEnabled = false;
-	                }
-	            }
-	            return animationEnabled;
-	        },
-
-	        restoreData: function () {
-	            set(this, 'data', get(this, 'dataBeforeProcessed').cloneShallow());
-	        },
-
-	        getColorFromPalette: function (name, scope) {
-	            var ecModel = this.ecModel;
-	            // PENDING
-	            var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope);
-	            if (!color) {
-	                color = ecModel.getColorFromPalette(name, scope);
-	            }
-	            return color;
-	        },
-
-	        /**
-	         * Get data indices for show tooltip content. See tooltip.
-	         * @abstract
-	         * @param {Array.<string>|string} dim
-	         * @param {Array.<number>} value
-	         * @param {module:echarts/coord/single/SingleAxis} baseAxis
-	         * @return {Object} {dataIndices, nestestValue}.
-	         */
-	        getAxisTooltipData: null,
-
-	        /**
-	         * See tooltip.
-	         * @abstract
-	         * @param {number} dataIndex
-	         * @return {Array.<number>} Point of tooltip. null/undefined can be returned.
-	         */
-	        getTooltipPosition: null
-	    });
-
-	    zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin);
-	    zrUtil.mixin(SeriesModel, colorPaletteMixin);
-
-	    module.exports = SeriesModel;
-
-
-/***/ },
-/* 29 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var Group = __webpack_require__(30);
-	    var componentUtil = __webpack_require__(20);
-	    var clazzUtil = __webpack_require__(13);
-
-	    var Component = function () {
-	        /**
-	         * @type {module:zrender/container/Group}
-	         * @readOnly
-	         */
-	        this.group = new Group();
-
-	        /**
-	         * @type {string}
-	         * @readOnly
-	         */
-	        this.uid = componentUtil.getUID('viewComponent');
-	    };
-
-	    Component.prototype = {
-
-	        constructor: Component,
-
-	        init: function (ecModel, api) {},
-
-	        render: function (componentModel, ecModel, api, payload) {},
-
-	        dispose: function () {}
-
-	    };
-
-	    var componentProto = Component.prototype;
-	    componentProto.updateView
-	        = componentProto.updateLayout
-	        = componentProto.updateVisual
-	        = function (seriesModel, ecModel, api, payload) {
-	            // Do nothing;
-	        };
-	    // Enable Component.extend.
-	    clazzUtil.enableClassExtend(Component);
-
-	    // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
-	    clazzUtil.enableClassManagement(Component, {registerWhenExtend: true});
-
-	    module.exports = Component;
-
-
-/***/ },
-/* 30 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Group是一个容器，可以插入子节点，Group的变换也会被应用到子节点上
-	 * @module zrender/graphic/Group
-	 * @example
-	 *     var Group = require('zrender/lib/container/Group');
-	 *     var Circle = require('zrender/lib/graphic/shape/Circle');
-	 *     var g = new Group();
-	 *     g.position[0] = 100;
-	 *     g.position[1] = 100;
-	 *     g.add(new Circle({
-	 *         style: {
-	 *             x: 100,
-	 *             y: 100,
-	 *             r: 20,
-	 *         }
-	 *     }));
-	 *     zr.add(g);
-	 */
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var Element = __webpack_require__(31);
-	    var BoundingRect = __webpack_require__(9);
-
-	    /**
-	     * @alias module:zrender/graphic/Group
-	     * @constructor
-	     * @extends module:zrender/mixin/Transformable
-	     * @extends module:zrender/mixin/Eventful
-	     */
-	    var Group = function (opts) {
+	    function Displayable(opts) {
 
 	        opts = opts || {};
 
 	        Element.call(this, opts);
 
-	        for (var key in opts) {
-	            if (opts.hasOwnProperty(key)) {
-	                this[key] = opts[key];
+	        // Extend properties
+	        for (var name in opts) {
+	            if (
+	                opts.hasOwnProperty(name) &&
+	                name !== 'style'
+	            ) {
+	                this[name] = opts[name];
 	            }
 	        }
 
-	        this._children = [];
-
-	        this.__storage = null;
-
-	        this.__dirty = true;
-	    };
-
-	    Group.prototype = {
-
-	        constructor: Group,
-
-	        isGroup: true,
-
 	        /**
-	         * @type {string}
+	         * @type {module:zrender/graphic/Style}
 	         */
-	        type: 'group',
+	        this.style = new Style(opts.style);
+
+	        this._rect = null;
+	        // Shapes for cascade clipping.
+	        this.__clipPaths = [];
+
+	        // FIXME Stateful must be mixined after style is setted
+	        // Stateful.call(this, opts);
+	    }
+
+	    Displayable.prototype = {
+
+	        constructor: Displayable,
+
+	        type: 'displayable',
 
 	        /**
-	         * 所有子孙元素是否响应鼠标事件
-	         * @name module:/zrender/container/Group#silent
+	         * Displayable 是否为脏，Painter 中会根据该标记判断是否需要是否需要重新绘制
+	         * Dirty flag. From which painter will determine if this displayable object needs brush
+	         * @name module:zrender/graphic/Displayable#__dirty
+	         * @type {boolean}
+	         */
+	        __dirty: true,
+
+	        /**
+	         * 图形是否可见，为true时不绘制图形，但是仍能触发鼠标事件
+	         * If ignore drawing of the displayable object. Mouse event will still be triggered
+	         * @name module:/zrender/graphic/Displayable#invisible
+	         * @type {boolean}
+	         * @default false
+	         */
+	        invisible: false,
+
+	        /**
+	         * @name module:/zrender/graphic/Displayable#z
+	         * @type {number}
+	         * @default 0
+	         */
+	        z: 0,
+
+	        /**
+	         * @name module:/zrender/graphic/Displayable#z
+	         * @type {number}
+	         * @default 0
+	         */
+	        z2: 0,
+
+	        /**
+	         * z层level，决定绘画在哪层canvas中
+	         * @name module:/zrender/graphic/Displayable#zlevel
+	         * @type {number}
+	         * @default 0
+	         */
+	        zlevel: 0,
+
+	        /**
+	         * 是否可拖拽
+	         * @name module:/zrender/graphic/Displayable#draggable
+	         * @type {boolean}
+	         * @default false
+	         */
+	        draggable: false,
+
+	        /**
+	         * 是否正在拖拽
+	         * @name module:/zrender/graphic/Displayable#draggable
+	         * @type {boolean}
+	         * @default false
+	         */
+	        dragging: false,
+
+	        /**
+	         * 是否相应鼠标事件
+	         * @name module:/zrender/graphic/Displayable#silent
 	         * @type {boolean}
 	         * @default false
 	         */
 	        silent: false,
 
 	        /**
-	         * @return {Array.<module:zrender/Element>}
+	         * If enable culling
+	         * @type {boolean}
+	         * @default false
 	         */
-	        children: function () {
-	            return this._children.slice();
+	        culling: false,
+
+	        /**
+	         * Mouse cursor when hovered
+	         * @name module:/zrender/graphic/Displayable#cursor
+	         * @type {string}
+	         */
+	        cursor: 'pointer',
+
+	        /**
+	         * If hover area is bounding rect
+	         * @name module:/zrender/graphic/Displayable#rectHover
+	         * @type {string}
+	         */
+	        rectHover: false,
+
+	        /**
+	         * Render the element progressively when the value >= 0,
+	         * usefull for large data.
+	         * @type {number}
+	         */
+	        progressive: -1,
+
+	        beforeBrush: function (ctx) {},
+
+	        afterBrush: function (ctx) {},
+
+	        /**
+	         * 图形绘制方法
+	         * @param {Canvas2DRenderingContext} ctx
+	         */
+	        // Interface
+	        brush: function (ctx, prevEl) {},
+
+	        /**
+	         * 获取最小包围盒
+	         * @return {module:zrender/core/BoundingRect}
+	         */
+	        // Interface
+	        getBoundingRect: function () {},
+
+	        /**
+	         * 判断坐标 x, y 是否在图形上
+	         * If displayable element contain coord x, y
+	         * @param  {number} x
+	         * @param  {number} y
+	         * @return {boolean}
+	         */
+	        contain: function (x, y) {
+	            return this.rectContain(x, y);
 	        },
 
 	        /**
-	         * 获取指定 index 的儿子节点
-	         * @param  {number} idx
-	         * @return {module:zrender/Element}
-	         */
-	        childAt: function (idx) {
-	            return this._children[idx];
-	        },
-
-	        /**
-	         * 获取指定名字的儿子节点
-	         * @param  {string} name
-	         * @return {module:zrender/Element}
-	         */
-	        childOfName: function (name) {
-	            var children = this._children;
-	            for (var i = 0; i < children.length; i++) {
-	                if (children[i].name === name) {
-	                    return children[i];
-	                }
-	             }
-	        },
-
-	        /**
-	         * @return {number}
-	         */
-	        childCount: function () {
-	            return this._children.length;
-	        },
-
-	        /**
-	         * 添加子节点到最后
-	         * @param {module:zrender/Element} child
-	         */
-	        add: function (child) {
-	            if (child && child !== this && child.parent !== this) {
-
-	                this._children.push(child);
-
-	                this._doAdd(child);
-	            }
-
-	            return this;
-	        },
-
-	        /**
-	         * 添加子节点在 nextSibling 之前
-	         * @param {module:zrender/Element} child
-	         * @param {module:zrender/Element} nextSibling
-	         */
-	        addBefore: function (child, nextSibling) {
-	            if (child && child !== this && child.parent !== this
-	                && nextSibling && nextSibling.parent === this) {
-
-	                var children = this._children;
-	                var idx = children.indexOf(nextSibling);
-
-	                if (idx >= 0) {
-	                    children.splice(idx, 0, child);
-	                    this._doAdd(child);
-	                }
-	            }
-
-	            return this;
-	        },
-
-	        _doAdd: function (child) {
-	            if (child.parent) {
-	                child.parent.remove(child);
-	            }
-
-	            child.parent = this;
-
-	            var storage = this.__storage;
-	            var zr = this.__zr;
-	            if (storage && storage !== child.__storage) {
-
-	                storage.addToStorage(child);
-
-	                if (child instanceof Group) {
-	                    child.addChildrenToStorage(storage);
-	                }
-	            }
-
-	            zr && zr.refresh();
-	        },
-
-	        /**
-	         * 移除子节点
-	         * @param {module:zrender/Element} child
-	         */
-	        remove: function (child) {
-	            var zr = this.__zr;
-	            var storage = this.__storage;
-	            var children = this._children;
-
-	            var idx = zrUtil.indexOf(children, child);
-	            if (idx < 0) {
-	                return this;
-	            }
-	            children.splice(idx, 1);
-
-	            child.parent = null;
-
-	            if (storage) {
-
-	                storage.delFromStorage(child);
-
-	                if (child instanceof Group) {
-	                    child.delChildrenFromStorage(storage);
-	                }
-	            }
-
-	            zr && zr.refresh();
-
-	            return this;
-	        },
-
-	        /**
-	         * 移除所有子节点
-	         */
-	        removeAll: function () {
-	            var children = this._children;
-	            var storage = this.__storage;
-	            var child;
-	            var i;
-	            for (i = 0; i < children.length; i++) {
-	                child = children[i];
-	                if (storage) {
-	                    storage.delFromStorage(child);
-	                    if (child instanceof Group) {
-	                        child.delChildrenFromStorage(storage);
-	                    }
-	                }
-	                child.parent = null;
-	            }
-	            children.length = 0;
-
-	            return this;
-	        },
-
-	        /**
-	         * 遍历所有子节点
-	         * @param  {Function} cb
-	         * @param  {}   context
-	         */
-	        eachChild: function (cb, context) {
-	            var children = this._children;
-	            for (var i = 0; i < children.length; i++) {
-	                var child = children[i];
-	                cb.call(context, child, i);
-	            }
-	            return this;
-	        },
-
-	        /**
-	         * 深度优先遍历所有子孙节点
 	         * @param  {Function} cb
 	         * @param  {}   context
 	         */
 	        traverse: function (cb, context) {
-	            for (var i = 0; i < this._children.length; i++) {
-	                var child = this._children[i];
-	                cb.call(context, child);
-
-	                if (child.type === 'group') {
-	                    child.traverse(cb, context);
-	                }
-	            }
-	            return this;
+	            cb.call(context, this);
 	        },
 
-	        addChildrenToStorage: function (storage) {
-	            for (var i = 0; i < this._children.length; i++) {
-	                var child = this._children[i];
-	                storage.addToStorage(child);
-	                if (child instanceof Group) {
-	                    child.addChildrenToStorage(storage);
-	                }
-	            }
+	        /**
+	         * 判断坐标 x, y 是否在图形的包围盒上
+	         * If bounding rect of element contain coord x, y
+	         * @param  {number} x
+	         * @param  {number} y
+	         * @return {boolean}
+	         */
+	        rectContain: function (x, y) {
+	            var coord = this.transformCoordToLocal(x, y);
+	            var rect = this.getBoundingRect();
+	            return rect.contain(coord[0], coord[1]);
 	        },
 
-	        delChildrenFromStorage: function (storage) {
-	            for (var i = 0; i < this._children.length; i++) {
-	                var child = this._children[i];
-	                storage.delFromStorage(child);
-	                if (child instanceof Group) {
-	                    child.delChildrenFromStorage(storage);
-	                }
-	            }
-	        },
-
+	        /**
+	         * 标记图形元素为脏，并且在下一帧重绘
+	         * Mark displayable element dirty and refresh next frame
+	         */
 	        dirty: function () {
 	            this.__dirty = true;
+
+	            this._rect = null;
+
 	            this.__zr && this.__zr.refresh();
+	        },
+
+	        /**
+	         * 图形是否会触发事件
+	         * If displayable object binded any event
+	         * @return {boolean}
+	         */
+	        // TODO, 通过 bind 绑定的事件
+	        // isSilent: function () {
+	        //     return !(
+	        //         this.hoverable || this.draggable
+	        //         || this.onmousemove || this.onmouseover || this.onmouseout
+	        //         || this.onmousedown || this.onmouseup || this.onclick
+	        //         || this.ondragenter || this.ondragover || this.ondragleave
+	        //         || this.ondrop
+	        //     );
+	        // },
+	        /**
+	         * Alias for animate('style')
+	         * @param {boolean} loop
+	         */
+	        animateStyle: function (loop) {
+	            return this.animate('style', loop);
+	        },
+
+	        attrKV: function (key, value) {
+	            if (key !== 'style') {
+	                Element.prototype.attrKV.call(this, key, value);
+	            }
+	            else {
+	                this.style.set(value);
+	            }
+	        },
+
+	        /**
+	         * @param {Object|string} key
+	         * @param {*} value
+	         */
+	        setStyle: function (key, value) {
+	            this.style.set(key, value);
+	            this.dirty(false);
 	            return this;
 	        },
 
 	        /**
-	         * @return {module:zrender/core/BoundingRect}
+	         * Use given style object
+	         * @param  {Object} obj
 	         */
-	        getBoundingRect: function (includeChildren) {
-	            // TODO Caching
-	            var rect = null;
-	            var tmpRect = new BoundingRect(0, 0, 0, 0);
-	            var children = includeChildren || this._children;
-	            var tmpMat = [];
-
-	            for (var i = 0; i < children.length; i++) {
-	                var child = children[i];
-	                if (child.ignore || child.invisible) {
-	                    continue;
-	                }
-
-	                var childRect = child.getBoundingRect();
-	                var transform = child.getLocalTransform(tmpMat);
-	                // TODO
-	                // The boundingRect cacluated by transforming original
-	                // rect may be bigger than the actual bundingRect when rotation
-	                // is used. (Consider a circle rotated aginst its center, where
-	                // the actual boundingRect should be the same as that not be
-	                // rotated.) But we can not find better approach to calculate
-	                // actual boundingRect yet, considering performance.
-	                if (transform) {
-	                    tmpRect.copy(childRect);
-	                    tmpRect.applyTransform(transform);
-	                    rect = rect || tmpRect.clone();
-	                    rect.union(tmpRect);
-	                }
-	                else {
-	                    rect = rect || childRect.clone();
-	                    rect.union(childRect);
-	                }
-	            }
-	            return rect || tmpRect;
+	        useStyle: function (obj) {
+	            this.style = new Style(obj);
+	            this.dirty(false);
+	            return this;
 	        }
 	    };
 
-	    zrUtil.inherits(Group, Element);
+	    zrUtil.inherits(Displayable, Element);
 
-	    module.exports = Group;
+	    zrUtil.mixin(Displayable, RectText);
+	    // zrUtil.mixin(Displayable, Stateful);
+
+	    module.exports = Displayable;
 
 
 /***/ },
-/* 31 */
+/* 22 */
+/***/ function(module, exports) {
+
+	/**
+	 * @module zrender/graphic/Style
+	 */
+
+
+	    var STYLE_COMMON_PROPS = [
+	        ['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'],
+	        ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]
+	    ];
+
+	    // var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);
+	    // var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);
+
+	    var Style = function (opts) {
+	        this.extendFrom(opts);
+	    };
+
+	    function createLinearGradient(ctx, obj, rect) {
+	        var x = obj.x == null ? 0 : obj.x;
+	        var x2 = obj.x2 == null ? 1 : obj.x2;
+	        var y = obj.y == null ? 0 : obj.y;
+	        var y2 = obj.y2 == null ? 0 : obj.y2;
+
+	        if (!obj.global) {
+	            x = x * rect.width + rect.x;
+	            x2 = x2 * rect.width + rect.x;
+	            y = y * rect.height + rect.y;
+	            y2 = y2 * rect.height + rect.y;
+	        }
+
+	        var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);
+
+	        return canvasGradient;
+	    }
+
+	    function createRadialGradient(ctx, obj, rect) {
+	        var width = rect.width;
+	        var height = rect.height;
+	        var min = Math.min(width, height);
+
+	        var x = obj.x == null ? 0.5 : obj.x;
+	        var y = obj.y == null ? 0.5 : obj.y;
+	        var r = obj.r == null ? 0.5 : obj.r;
+	        if (!obj.global) {
+	            x = x * width + rect.x;
+	            y = y * height + rect.y;
+	            r = r * min;
+	        }
+
+	        var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);
+
+	        return canvasGradient;
+	    }
+
+
+	    Style.prototype = {
+
+	        constructor: Style,
+
+	        /**
+	         * @type {string}
+	         */
+	        fill: '#000000',
+
+	        /**
+	         * @type {string}
+	         */
+	        stroke: null,
+
+	        /**
+	         * @type {number}
+	         */
+	        opacity: 1,
+
+	        /**
+	         * @type {Array.<number>}
+	         */
+	        lineDash: null,
+
+	        /**
+	         * @type {number}
+	         */
+	        lineDashOffset: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        shadowBlur: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        shadowOffsetX: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        shadowOffsetY: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        lineWidth: 1,
+
+	        /**
+	         * If stroke ignore scale
+	         * @type {Boolean}
+	         */
+	        strokeNoScale: false,
+
+	        // Bounding rect text configuration
+	        // Not affected by element transform
+	        /**
+	         * @type {string}
+	         */
+	        text: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textFill: '#000',
+
+	        /**
+	         * @type {string}
+	         */
+	        textStroke: null,
+
+	        /**
+	         * 'inside', 'left', 'right', 'top', 'bottom'
+	         * [x, y]
+	         * @type {string|Array.<number>}
+	         * @default 'inside'
+	         */
+	        textPosition: 'inside',
+
+	        /**
+	         * [x, y]
+	         * @type {Array.<number>}
+	         */
+	        textOffset: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textBaseline: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textAlign: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textVerticalAlign: null,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textDistance: 5,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textShadowBlur: 0,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textShadowOffsetX: 0,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textShadowOffsetY: 0,
+
+	        /**
+	         * If transform text
+	         * Only useful in Path and Image element
+	         * @type {boolean}
+	         */
+	        textTransform: false,
+
+	        /**
+	         * Text rotate around position of Path or Image
+	         * Only useful in Path and Image element and textTransform is false.
+	         */
+	        textRotation: 0,
+
+	        /**
+	         * @type {string}
+	         * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
+	         */
+	        blend: null,
+
+	        /**
+	         * @param {CanvasRenderingContext2D} ctx
+	         */
+	        bind: function (ctx, el, prevEl) {
+	            var style = this;
+	            var prevStyle = prevEl && prevEl.style;
+	            var firstDraw = !prevStyle;
+
+	            for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
+	                var prop = STYLE_COMMON_PROPS[i];
+	                var styleName = prop[0];
+
+	                if (firstDraw || style[styleName] !== prevStyle[styleName]) {
+	                    // FIXME Invalid property value will cause style leak from previous element.
+	                    ctx[styleName] = style[styleName] || prop[1];
+	                }
+	            }
+
+	            if ((firstDraw || style.fill !== prevStyle.fill)) {
+	                ctx.fillStyle = style.fill;
+	            }
+	            if ((firstDraw || style.stroke !== prevStyle.stroke)) {
+	                ctx.strokeStyle = style.stroke;
+	            }
+	            if ((firstDraw || style.opacity !== prevStyle.opacity)) {
+	                ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;
+	            }
+
+	            if ((firstDraw || style.blend !== prevStyle.blend)) {
+	                ctx.globalCompositeOperation = style.blend || 'source-over';
+	            }
+	            if (this.hasStroke()) {
+	                var lineWidth = style.lineWidth;
+	                ctx.lineWidth = lineWidth / (
+	                    (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1
+	                );
+	            }
+	        },
+
+	        hasFill: function () {
+	            var fill = this.fill;
+	            return fill != null && fill !== 'none';
+	        },
+
+	        hasStroke: function () {
+	            var stroke = this.stroke;
+	            return stroke != null && stroke !== 'none' && this.lineWidth > 0;
+	        },
+
+	        /**
+	         * Extend from other style
+	         * @param {zrender/graphic/Style} otherStyle
+	         * @param {boolean} overwrite
+	         */
+	        extendFrom: function (otherStyle, overwrite) {
+	            if (otherStyle) {
+	                var target = this;
+	                for (var name in otherStyle) {
+	                    if (otherStyle.hasOwnProperty(name)
+	                        && (overwrite || ! target.hasOwnProperty(name))
+	                    ) {
+	                        target[name] = otherStyle[name];
+	                    }
+	                }
+	            }
+	        },
+
+	        /**
+	         * Batch setting style with a given object
+	         * @param {Object|string} obj
+	         * @param {*} [obj]
+	         */
+	        set: function (obj, value) {
+	            if (typeof obj === 'string') {
+	                this[obj] = value;
+	            }
+	            else {
+	                this.extendFrom(obj, true);
+	            }
+	        },
+
+	        /**
+	         * Clone
+	         * @return {zrender/graphic/Style} [description]
+	         */
+	        clone: function () {
+	            var newStyle = new this.constructor();
+	            newStyle.extendFrom(this, true);
+	            return newStyle;
+	        },
+
+	        getGradient: function (ctx, obj, rect) {
+	            var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;
+	            var canvasGradient = method(ctx, obj, rect);
+	            var colorStops = obj.colorStops;
+	            for (var i = 0; i < colorStops.length; i++) {
+	                canvasGradient.addColorStop(
+	                    colorStops[i].offset, colorStops[i].color
+	                );
+	            }
+	            return canvasGradient;
+	        }
+	    };
+
+	    var styleProto = Style.prototype;
+	    for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
+	        var prop = STYLE_COMMON_PROPS[i];
+	        if (!(prop[0] in styleProto)) {
+	            styleProto[prop[0]] = prop[1];
+	        }
+	    }
+
+	    // Provide for others
+	    Style.getGradient = styleProto.getGradient;
+
+	    module.exports = Style;
+
+
+/***/ },
+/* 23 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -8585,10 +8445,10 @@
 	 */
 
 
-	    var guid = __webpack_require__(32);
-	    var Eventful = __webpack_require__(33);
-	    var Transformable = __webpack_require__(34);
-	    var Animatable = __webpack_require__(35);
+	    var guid = __webpack_require__(24);
+	    var Eventful = __webpack_require__(25);
+	    var Transformable = __webpack_require__(26);
+	    var Animatable = __webpack_require__(27);
 	    var zrUtil = __webpack_require__(4);
 
 	    /**
@@ -8844,7 +8704,7 @@
 
 
 /***/ },
-/* 32 */
+/* 24 */
 /***/ function(module, exports) {
 
 	/**
@@ -8863,7 +8723,7 @@
 
 
 /***/ },
-/* 33 */
+/* 25 */
 /***/ function(module, exports) {
 
 	/**
@@ -9171,7 +9031,7 @@
 
 
 /***/ },
-/* 34 */
+/* 26 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -9439,7 +9299,7 @@
 
 
 /***/ },
-/* 35 */
+/* 27 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -9448,12 +9308,12 @@
 	 */
 
 
-	    var Animator = __webpack_require__(36);
+	    var Animator = __webpack_require__(28);
 	    var util = __webpack_require__(4);
 	    var isString = util.isString;
 	    var isFunction = util.isFunction;
 	    var isObject = util.isObject;
-	    var log = __webpack_require__(41);
+	    var log = __webpack_require__(33);
 
 	    /**
 	     * @alias modue:zrender/mixin/Animatable
@@ -9713,7 +9573,7 @@
 
 
 /***/ },
-/* 36 */
+/* 28 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -9721,8 +9581,8 @@
 	 */
 
 
-	    var Clip = __webpack_require__(37);
-	    var color = __webpack_require__(39);
+	    var Clip = __webpack_require__(29);
+	    var color = __webpack_require__(31);
 	    var util = __webpack_require__(4);
 	    var isArrayLike = util.isArrayLike;
 
@@ -9771,7 +9631,7 @@
 	            }
 	        }
 	        else {
-	            var len2 = p0[0].length;
+	            var len2 = len && p0[0].length;
 	            for (var i = 0; i < len; i++) {
 	                for (var j = 0; j < len2; j++) {
 	                    out[i][j] = interpolateNumber(
@@ -9935,6 +9795,11 @@
 	        return 'rgba(' + rgba.join(',') + ')';
 	    }
 
+	    function getArrayDim(keyframes) {
+	        var lastValue = keyframes[keyframes.length - 1].value;
+	        return isArrayLike(lastValue && lastValue[0]) ? 2 : 1;
+	    }
+
 	    function createTrackClip (animator, easing, oneTrackDone, keyframes, propName) {
 	        var getter = animator._getter;
 	        var setter = animator._setter;
@@ -9951,11 +9816,8 @@
 	        var isValueString = false;
 
 	        // For vertices morphing
-	        var arrDim = (
-	                isValueArray
-	                && isArrayLike(firstVal[0])
-	            )
-	            ? 2 : 1;
+	        var arrDim = isValueArray ? getArrayDim(keyframes) : 0;
+
 	        var trackMaxTime;
 	        // Sort keyframe as ascending
 	        keyframes.sort(function(a, b) {
@@ -10367,7 +10229,7 @@
 
 
 /***/ },
-/* 37 */
+/* 29 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -10386,7 +10248,7 @@
 	 */
 
 
-	    var easingFuncs = __webpack_require__(38);
+	    var easingFuncs = __webpack_require__(30);
 
 	    function Clip(options) {
 
@@ -10496,7 +10358,7 @@
 
 
 /***/ },
-/* 38 */
+/* 30 */
 /***/ function(module, exports) {
 
 	/**
@@ -10847,7 +10709,7 @@
 
 
 /***/ },
-/* 39 */
+/* 31 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -10855,7 +10717,7 @@
 	 */
 
 
-	    var LRU = __webpack_require__(40);
+	    var LRU = __webpack_require__(32);
 
 	    var kCSSColorTable = {
 	        'transparent': [0,0,0,0], 'aliceblue': [240,248,255,1],
@@ -11385,7 +11247,7 @@
 
 
 /***/ },
-/* 40 */
+/* 32 */
 /***/ function(module, exports) {
 
 	// Simple LRU cache use doubly linked list
@@ -11587,11 +11449,11 @@
 
 
 /***/ },
-/* 41 */
+/* 33 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
-	        var config = __webpack_require__(42);
+	        var config = __webpack_require__(34);
 
 	        /**
 	         * @exports zrender/tool/log
@@ -11625,7 +11487,7 @@
 
 
 /***/ },
-/* 42 */
+/* 34 */
 /***/ function(module, exports) {
 
 	
@@ -11657,2139 +11519,7 @@
 
 
 /***/ },
-/* 43 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var Group = __webpack_require__(30);
-	    var componentUtil = __webpack_require__(20);
-	    var clazzUtil = __webpack_require__(13);
-	    var modelUtil = __webpack_require__(5);
-	    var zrUtil = __webpack_require__(4);
-
-	    function Chart() {
-
-	        /**
-	         * @type {module:zrender/container/Group}
-	         * @readOnly
-	         */
-	        this.group = new Group();
-
-	        /**
-	         * @type {string}
-	         * @readOnly
-	         */
-	        this.uid = componentUtil.getUID('viewChart');
-	    }
-
-	    Chart.prototype = {
-
-	        type: 'chart',
-
-	        /**
-	         * Init the chart
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         */
-	        init: function (ecModel, api) {},
-
-	        /**
-	         * Render the chart
-	         * @param  {module:echarts/model/Series} seriesModel
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         * @param  {Object} payload
-	         */
-	        render: function (seriesModel, ecModel, api, payload) {},
-
-	        /**
-	         * Highlight series or specified data item
-	         * @param  {module:echarts/model/Series} seriesModel
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         * @param  {Object} payload
-	         */
-	        highlight: function (seriesModel, ecModel, api, payload) {
-	            toggleHighlight(seriesModel.getData(), payload, 'emphasis');
-	        },
-
-	        /**
-	         * Downplay series or specified data item
-	         * @param  {module:echarts/model/Series} seriesModel
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         * @param  {Object} payload
-	         */
-	        downplay: function (seriesModel, ecModel, api, payload) {
-	            toggleHighlight(seriesModel.getData(), payload, 'normal');
-	        },
-
-	        /**
-	         * Remove self
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         */
-	        remove: function (ecModel, api) {
-	            this.group.removeAll();
-	        },
-
-	        /**
-	         * Dispose self
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         */
-	        dispose: function () {}
-
-	        /**
-	         * The view contains the given point.
-	         * @interface
-	         * @param {Array.<number>} point
-	         * @return {boolean}
-	         */
-	        // containPoint: function () {}
-
-	    };
-
-	    var chartProto = Chart.prototype;
-	    chartProto.updateView
-	        = chartProto.updateLayout
-	        = chartProto.updateVisual
-	        = function (seriesModel, ecModel, api, payload) {
-	            this.render(seriesModel, ecModel, api, payload);
-	        };
-
-	    /**
-	     * Set state of single element
-	     * @param  {module:zrender/Element} el
-	     * @param  {string} state
-	     */
-	    function elSetState(el, state) {
-	        if (el) {
-	            el.trigger(state);
-	            if (el.type === 'group') {
-	                for (var i = 0; i < el.childCount(); i++) {
-	                    elSetState(el.childAt(i), state);
-	                }
-	            }
-	        }
-	    }
-	    /**
-	     * @param  {module:echarts/data/List} data
-	     * @param  {Object} payload
-	     * @param  {string} state 'normal'|'emphasis'
-	     * @inner
-	     */
-	    function toggleHighlight(data, payload, state) {
-	        var dataIndex = modelUtil.queryDataIndex(data, payload);
-
-	        if (dataIndex != null) {
-	            zrUtil.each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {
-	                elSetState(data.getItemGraphicEl(dataIdx), state);
-	            });
-	        }
-	        else {
-	            data.eachItemGraphicEl(function (el) {
-	                elSetState(el, state);
-	            });
-	        }
-	    }
-
-	    // Enable Chart.extend.
-	    clazzUtil.enableClassExtend(Chart, ['dispose']);
-
-	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
-	    clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true});
-
-	    module.exports = Chart;
-
-
-/***/ },
-/* 44 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var pathTool = __webpack_require__(45);
-	    var round = Math.round;
-	    var Path = __webpack_require__(46);
-	    var colorTool = __webpack_require__(39);
-	    var matrix = __webpack_require__(11);
-	    var vector = __webpack_require__(10);
-	    var Transformable = __webpack_require__(34);
-	    var BoundingRect = __webpack_require__(9);
-
-	    var graphic = {};
-
-	    graphic.Group = __webpack_require__(30);
-
-	    graphic.Image = __webpack_require__(62);
-
-	    graphic.Text = __webpack_require__(63);
-
-	    graphic.Circle = __webpack_require__(64);
-
-	    graphic.Sector = __webpack_require__(65);
-
-	    graphic.Ring = __webpack_require__(66);
-
-	    graphic.Polygon = __webpack_require__(67);
-
-	    graphic.Polyline = __webpack_require__(71);
-
-	    graphic.Rect = __webpack_require__(72);
-
-	    graphic.Line = __webpack_require__(74);
-
-	    graphic.BezierCurve = __webpack_require__(75);
-
-	    graphic.Arc = __webpack_require__(76);
-
-	    graphic.CompoundPath = __webpack_require__(77);
-
-	    graphic.LinearGradient = __webpack_require__(78);
-
-	    graphic.RadialGradient = __webpack_require__(80);
-
-	    graphic.BoundingRect = BoundingRect;
-
-	    /**
-	     * Extend shape with parameters
-	     */
-	    graphic.extendShape = function (opts) {
-	        return Path.extend(opts);
-	    };
-
-	    /**
-	     * Extend path
-	     */
-	    graphic.extendPath = function (pathData, opts) {
-	        return pathTool.extendFromString(pathData, opts);
-	    };
-
-	    /**
-	     * Create a path element from path data string
-	     * @param {string} pathData
-	     * @param {Object} opts
-	     * @param {module:zrender/core/BoundingRect} rect
-	     * @param {string} [layout=cover] 'center' or 'cover'
-	     */
-	    graphic.makePath = function (pathData, opts, rect, layout) {
-	        var path = pathTool.createFromString(pathData, opts);
-	        var boundingRect = path.getBoundingRect();
-	        if (rect) {
-	            var aspect = boundingRect.width / boundingRect.height;
-
-	            if (layout === 'center') {
-	                // Set rect to center, keep width / height ratio.
-	                var width = rect.height * aspect;
-	                var height;
-	                if (width <= rect.width) {
-	                    height = rect.height;
-	                }
-	                else {
-	                    width = rect.width;
-	                    height = width / aspect;
-	                }
-	                var cx = rect.x + rect.width / 2;
-	                var cy = rect.y + rect.height / 2;
-
-	                rect.x = cx - width / 2;
-	                rect.y = cy - height / 2;
-	                rect.width = width;
-	                rect.height = height;
-	            }
-
-	            graphic.resizePath(path, rect);
-	        }
-	        return path;
-	    };
-
-	    graphic.mergePath = pathTool.mergePath,
-
-	    /**
-	     * Resize a path to fit the rect
-	     * @param {module:zrender/graphic/Path} path
-	     * @param {Object} rect
-	     */
-	    graphic.resizePath = function (path, rect) {
-	        if (!path.applyTransform) {
-	            return;
-	        }
-
-	        var pathRect = path.getBoundingRect();
-
-	        var m = pathRect.calculateTransform(rect);
-
-	        path.applyTransform(m);
-	    };
-
-	    /**
-	     * Sub pixel optimize line for canvas
-	     *
-	     * @param {Object} param
-	     * @param {Object} [param.shape]
-	     * @param {number} [param.shape.x1]
-	     * @param {number} [param.shape.y1]
-	     * @param {number} [param.shape.x2]
-	     * @param {number} [param.shape.y2]
-	     * @param {Object} [param.style]
-	     * @param {number} [param.style.lineWidth]
-	     * @return {Object} Modified param
-	     */
-	    graphic.subPixelOptimizeLine = function (param) {
-	        var subPixelOptimize = graphic.subPixelOptimize;
-	        var shape = param.shape;
-	        var lineWidth = param.style.lineWidth;
-
-	        if (round(shape.x1 * 2) === round(shape.x2 * 2)) {
-	            shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);
-	        }
-	        if (round(shape.y1 * 2) === round(shape.y2 * 2)) {
-	            shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);
-	        }
-	        return param;
-	    };
-
-	    /**
-	     * Sub pixel optimize rect for canvas
-	     *
-	     * @param {Object} param
-	     * @param {Object} [param.shape]
-	     * @param {number} [param.shape.x]
-	     * @param {number} [param.shape.y]
-	     * @param {number} [param.shape.width]
-	     * @param {number} [param.shape.height]
-	     * @param {Object} [param.style]
-	     * @param {number} [param.style.lineWidth]
-	     * @return {Object} Modified param
-	     */
-	    graphic.subPixelOptimizeRect = function (param) {
-	        var subPixelOptimize = graphic.subPixelOptimize;
-	        var shape = param.shape;
-	        var lineWidth = param.style.lineWidth;
-	        var originX = shape.x;
-	        var originY = shape.y;
-	        var originWidth = shape.width;
-	        var originHeight = shape.height;
-	        shape.x = subPixelOptimize(shape.x, lineWidth, true);
-	        shape.y = subPixelOptimize(shape.y, lineWidth, true);
-	        shape.width = Math.max(
-	            subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x,
-	            originWidth === 0 ? 0 : 1
-	        );
-	        shape.height = Math.max(
-	            subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y,
-	            originHeight === 0 ? 0 : 1
-	        );
-	        return param;
-	    };
-
-	    /**
-	     * Sub pixel optimize for canvas
-	     *
-	     * @param {number} position Coordinate, such as x, y
-	     * @param {number} lineWidth Should be nonnegative integer.
-	     * @param {boolean=} positiveOrNegative Default false (negative).
-	     * @return {number} Optimized position.
-	     */
-	    graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) {
-	        // Assure that (position + lineWidth / 2) is near integer edge,
-	        // otherwise line will be fuzzy in canvas.
-	        var doubledPosition = round(position * 2);
-	        return (doubledPosition + round(lineWidth)) % 2 === 0
-	            ? doubledPosition / 2
-	            : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;
-	    };
-
-	    function hasFillOrStroke(fillOrStroke) {
-	        return fillOrStroke != null && fillOrStroke != 'none';
-	    }
-
-	    function liftColor(color) {
-	        return typeof color === 'string' ? colorTool.lift(color, -0.1) : color;
-	    }
-
-	    /**
-	     * @private
-	     */
-	    function cacheElementStl(el) {
-	        if (el.__hoverStlDirty) {
-	            var stroke = el.style.stroke;
-	            var fill = el.style.fill;
-
-	            // Create hoverStyle on mouseover
-	            var hoverStyle = el.__hoverStl;
-	            hoverStyle.fill = hoverStyle.fill
-	                || (hasFillOrStroke(fill) ? liftColor(fill) : null);
-	            hoverStyle.stroke = hoverStyle.stroke
-	                || (hasFillOrStroke(stroke) ? liftColor(stroke) : null);
-
-	            var normalStyle = {};
-	            for (var name in hoverStyle) {
-	                if (hoverStyle.hasOwnProperty(name)) {
-	                    normalStyle[name] = el.style[name];
-	                }
-	            }
-
-	            el.__normalStl = normalStyle;
-
-	            el.__hoverStlDirty = false;
-	        }
-	    }
-
-	    /**
-	     * @private
-	     */
-	    function doSingleEnterHover(el) {
-	        if (el.__isHover) {
-	            return;
-	        }
-
-	        cacheElementStl(el);
-
-	        if (el.useHoverLayer) {
-	            el.__zr && el.__zr.addHover(el, el.__hoverStl);
-	        }
-	        else {
-	            el.setStyle(el.__hoverStl);
-	            el.z2 += 1;
-	        }
-
-	        el.__isHover = true;
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function doSingleLeaveHover(el) {
-	        if (!el.__isHover) {
-	            return;
-	        }
-
-	        var normalStl = el.__normalStl;
-	        if (el.useHoverLayer) {
-	            el.__zr && el.__zr.removeHover(el);
-	        }
-	        else {
-	            normalStl && el.setStyle(normalStl);
-	            el.z2 -= 1;
-	        }
-
-	        el.__isHover = false;
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function doEnterHover(el) {
-	        el.type === 'group'
-	            ? el.traverse(function (child) {
-	                if (child.type !== 'group') {
-	                    doSingleEnterHover(child);
-	                }
-	            })
-	            : doSingleEnterHover(el);
-	    }
-
-	    function doLeaveHover(el) {
-	        el.type === 'group'
-	            ? el.traverse(function (child) {
-	                if (child.type !== 'group') {
-	                    doSingleLeaveHover(child);
-	                }
-	            })
-	            : doSingleLeaveHover(el);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function setElementHoverStl(el, hoverStl) {
-	        // If element has sepcified hoverStyle, then use it instead of given hoverStyle
-	        // Often used when item group has a label element and it's hoverStyle is different
-	        el.__hoverStl = el.hoverStyle || hoverStl || {};
-	        el.__hoverStlDirty = true;
-
-	        if (el.__isHover) {
-	            cacheElementStl(el);
-	        }
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function onElementMouseOver(e) {
-	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
-	            return;
-	        }
-
-	        // Only if element is not in emphasis status
-	        !this.__isEmphasis && doEnterHover(this);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function onElementMouseOut(e) {
-	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
-	            return;
-	        }
-
-	        // Only if element is not in emphasis status
-	        !this.__isEmphasis && doLeaveHover(this);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function enterEmphasis() {
-	        this.__isEmphasis = true;
-	        doEnterHover(this);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function leaveEmphasis() {
-	        this.__isEmphasis = false;
-	        doLeaveHover(this);
-	    }
-
-	    /**
-	     * Set hover style of element.
-	     * This method can be called repeatly without side-effects.
-	     * @param {module:zrender/Element} el
-	     * @param {Object} [hoverStyle]
-	     * @param {Object} [opt]
-	     * @param {boolean} [opt.hoverSilentOnTouch=false]
-	     *        In touch device, mouseover event will be trigger on touchstart event
-	     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
-	     *        conviniently use hoverStyle when tap on touch screen without additional
-	     *        code for compatibility.
-	     *        But if the chart/component has select feature, which usually also use
-	     *        hoverStyle, there might be conflict between 'select-highlight' and
-	     *        'hover-highlight' especially when roam is enabled (see geo for example).
-	     *        In this case, hoverSilentOnTouch should be used to disable hover-highlight
-	     *        on touch device.
-	     */
-	    graphic.setHoverStyle = function (el, hoverStyle, opt) {
-	        el.__hoverSilentOnTouch = opt && opt.hoverSilentOnTouch;
-
-	        el.type === 'group'
-	            ? el.traverse(function (child) {
-	                if (child.type !== 'group') {
-	                    setElementHoverStl(child, hoverStyle);
-	                }
-	            })
-	            : setElementHoverStl(el, hoverStyle);
-
-	        // Duplicated function will be auto-ignored, see Eventful.js.
-	        el.on('mouseover', onElementMouseOver)
-	          .on('mouseout', onElementMouseOut);
-
-	        // Emphasis, normal can be triggered manually
-	        el.on('emphasis', enterEmphasis)
-	          .on('normal', leaveEmphasis);
-	    };
-
-	    /**
-	     * Set text option in the style
-	     * @param {Object} textStyle
-	     * @param {module:echarts/model/Model} labelModel
-	     * @param {string} color
-	     */
-	    graphic.setText = function (textStyle, labelModel, color) {
-	        var labelPosition = labelModel.getShallow('position') || 'inside';
-	        var labelOffset = labelModel.getShallow('offset');
-	        var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color;
-	        var textStyleModel = labelModel.getModel('textStyle');
-	        zrUtil.extend(textStyle, {
-	            textDistance: labelModel.getShallow('distance') || 5,
-	            textFont: textStyleModel.getFont(),
-	            textPosition: labelPosition,
-	            textOffset: labelOffset,
-	            textFill: textStyleModel.getTextColor() || labelColor
-	        });
-	    };
-
-	    function animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {
-	        if (typeof dataIndex === 'function') {
-	            cb = dataIndex;
-	            dataIndex = null;
-	        }
-	        // Do not check 'animation' property directly here. Consider this case:
-	        // animation model is an `itemModel`, whose does not have `isAnimationEnabled`
-	        // but its parent model (`seriesModel`) does.
-	        var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();
-
-	        if (animationEnabled) {
-	            var postfix = isUpdate ? 'Update' : '';
-	            var duration = animatableModel.getShallow('animationDuration' + postfix);
-	            var animationEasing = animatableModel.getShallow('animationEasing' + postfix);
-	            var animationDelay = animatableModel.getShallow('animationDelay' + postfix);
-	            if (typeof animationDelay === 'function') {
-	                animationDelay = animationDelay(
-	                    dataIndex,
-	                    animatableModel.getAnimationDelayParams
-	                        ? animatableModel.getAnimationDelayParams(el, dataIndex)
-	                        : null
-	                );
-	            }
-	            if (typeof duration === 'function') {
-	                duration = duration(dataIndex);
-	            }
-
-	            duration > 0
-	                ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb)
-	                : (el.stopAnimation(), el.attr(props), cb && cb());
-	        }
-	        else {
-	            el.stopAnimation();
-	            el.attr(props);
-	            cb && cb();
-	        }
-	    }
-
-	    /**
-	     * Update graphic element properties with or without animation according to the configuration in series
-	     * @param {module:zrender/Element} el
-	     * @param {Object} props
-	     * @param {module:echarts/model/Model} [animatableModel]
-	     * @param {number} [dataIndex]
-	     * @param {Function} [cb]
-	     * @example
-	     *     graphic.updateProps(el, {
-	     *         position: [100, 100]
-	     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
-	     *     // Or
-	     *     graphic.updateProps(el, {
-	     *         position: [100, 100]
-	     *     }, seriesModel, function () { console.log('Animation done!'); });
-	     */
-	    graphic.updateProps = function (el, props, animatableModel, dataIndex, cb) {
-	        animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);
-	    };
-
-	    /**
-	     * Init graphic element properties with or without animation according to the configuration in series
-	     * @param {module:zrender/Element} el
-	     * @param {Object} props
-	     * @param {module:echarts/model/Model} [animatableModel]
-	     * @param {number} [dataIndex]
-	     * @param {Function} cb
-	     */
-	    graphic.initProps = function (el, props, animatableModel, dataIndex, cb) {
-	        animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);
-	    };
-
-	    /**
-	     * Get transform matrix of target (param target),
-	     * in coordinate of its ancestor (param ancestor)
-	     *
-	     * @param {module:zrender/mixin/Transformable} target
-	     * @param {module:zrender/mixin/Transformable} [ancestor]
-	     */
-	    graphic.getTransform = function (target, ancestor) {
-	        var mat = matrix.identity([]);
-
-	        while (target && target !== ancestor) {
-	            matrix.mul(mat, target.getLocalTransform(), mat);
-	            target = target.parent;
-	        }
-
-	        return mat;
-	    };
-
-	    /**
-	     * Apply transform to an vertex.
-	     * @param {Array.<number>} target [x, y]
-	     * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:
-	     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
-	     *      + {position, rotation, scale}, the same as `zrender/Transformable`.
-	     * @param {boolean=} invert Whether use invert matrix.
-	     * @return {Array.<number>} [x, y]
-	     */
-	    graphic.applyTransform = function (target, transform, invert) {
-	        if (transform && !zrUtil.isArrayLike(transform)) {
-	            transform = Transformable.getLocalTransform(transform);
-	        }
-
-	        if (invert) {
-	            transform = matrix.invert([], transform);
-	        }
-	        return vector.applyTransform([], target, transform);
-	    };
-
-	    /**
-	     * @param {string} direction 'left' 'right' 'top' 'bottom'
-	     * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]
-	     * @param {boolean=} invert Whether use invert matrix.
-	     * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'
-	     */
-	    graphic.transformDirection = function (direction, transform, invert) {
-
-	        // Pick a base, ensure that transform result will not be (0, 0).
-	        var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0)
-	            ? 1 : Math.abs(2 * transform[4] / transform[0]);
-	        var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0)
-	            ? 1 : Math.abs(2 * transform[4] / transform[2]);
-
-	        var vertex = [
-	            direction === 'left' ? -hBase : direction === 'right' ? hBase : 0,
-	            direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0
-	        ];
-
-	        vertex = graphic.applyTransform(vertex, transform, invert);
-
-	        return Math.abs(vertex[0]) > Math.abs(vertex[1])
-	            ? (vertex[0] > 0 ? 'right' : 'left')
-	            : (vertex[1] > 0 ? 'bottom' : 'top');
-	    };
-
-	    /**
-	     * Apply group transition animation from g1 to g2.
-	     * If no animatableModel, no animation.
-	     */
-	    graphic.groupTransition = function (g1, g2, animatableModel, cb) {
-	        if (!g1 || !g2) {
-	            return;
-	        }
-
-	        function getElMap(g) {
-	            var elMap = {};
-	            g.traverse(function (el) {
-	                if (!el.isGroup && el.anid) {
-	                    elMap[el.anid] = el;
-	                }
-	            });
-	            return elMap;
-	        }
-	        function getAnimatableProps(el) {
-	            var obj = {
-	                position: vector.clone(el.position),
-	                rotation: el.rotation
-	            };
-	            if (el.shape) {
-	                obj.shape = zrUtil.extend({}, el.shape);
-	            }
-	            return obj;
-	        }
-	        var elMap1 = getElMap(g1);
-
-	        g2.traverse(function (el) {
-	            if (!el.isGroup && el.anid) {
-	                var oldEl = elMap1[el.anid];
-	                if (oldEl) {
-	                    var newProp = getAnimatableProps(el);
-	                    el.attr(getAnimatableProps(oldEl));
-	                    graphic.updateProps(el, newProp, animatableModel, el.dataIndex);
-	                }
-	                // else {
-	                //     if (el.previousProps) {
-	                //         graphic.updateProps
-	                //     }
-	                // }
-	            }
-	        });
-	    };
-
-	    module.exports = graphic;
-
-
-
-/***/ },
-/* 45 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var Path = __webpack_require__(46);
-	    var PathProxy = __webpack_require__(50);
-	    var transformPath = __webpack_require__(61);
-
-	    // command chars
-	    var cc = [
-	        'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z',
-	        'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'
-	    ];
-
-	    var mathSqrt = Math.sqrt;
-	    var mathSin = Math.sin;
-	    var mathCos = Math.cos;
-	    var PI = Math.PI;
-
-	    var vMag = function(v) {
-	        return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
-	    };
-	    var vRatio = function(u, v) {
-	        return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
-	    };
-	    var vAngle = function(u, v) {
-	        return (u[0] * v[1] < u[1] * v[0] ? -1 : 1)
-	                * Math.acos(vRatio(u, v));
-	    };
-
-	    function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {
-	        var psi = psiDeg * (PI / 180.0);
-	        var xp = mathCos(psi) * (x1 - x2) / 2.0
-	                 + mathSin(psi) * (y1 - y2) / 2.0;
-	        var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0
-	                 + mathCos(psi) * (y1 - y2) / 2.0;
-
-	        var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);
-
-	        if (lambda > 1) {
-	            rx *= mathSqrt(lambda);
-	            ry *= mathSqrt(lambda);
-	        }
-
-	        var f = (fa === fs ? -1 : 1)
-	            * mathSqrt((((rx * rx) * (ry * ry))
-	                    - ((rx * rx) * (yp * yp))
-	                    - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp)
-	                    + (ry * ry) * (xp * xp))
-	                ) || 0;
-
-	        var cxp = f * rx * yp / ry;
-	        var cyp = f * -ry * xp / rx;
-
-	        var cx = (x1 + x2) / 2.0
-	                 + mathCos(psi) * cxp
-	                 - mathSin(psi) * cyp;
-	        var cy = (y1 + y2) / 2.0
-	                + mathSin(psi) * cxp
-	                + mathCos(psi) * cyp;
-
-	        var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]);
-	        var u = [ (xp - cxp) / rx, (yp - cyp) / ry ];
-	        var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ];
-	        var dTheta = vAngle(u, v);
-
-	        if (vRatio(u, v) <= -1) {
-	            dTheta = PI;
-	        }
-	        if (vRatio(u, v) >= 1) {
-	            dTheta = 0;
-	        }
-	        if (fs === 0 && dTheta > 0) {
-	            dTheta = dTheta - 2 * PI;
-	        }
-	        if (fs === 1 && dTheta < 0) {
-	            dTheta = dTheta + 2 * PI;
-	        }
-
-	        path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);
-	    }
-
-	    function createPathProxyFromString(data) {
-	        if (!data) {
-	            return [];
-	        }
-
-	        // command string
-	        var cs = data.replace(/-/g, ' -')
-	            .replace(/  /g, ' ')
-	            .replace(/ /g, ',')
-	            .replace(/,,/g, ',');
-
-	        var n;
-	        // create pipes so that we can split the data
-	        for (n = 0; n < cc.length; n++) {
-	            cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
-	        }
-
-	        // create array
-	        var arr = cs.split('|');
-	        // init context point
-	        var cpx = 0;
-	        var cpy = 0;
-
-	        var path = new PathProxy();
-	        var CMD = PathProxy.CMD;
-
-	        var prevCmd;
-	        for (n = 1; n < arr.length; n++) {
-	            var str = arr[n];
-	            var c = str.charAt(0);
-	            var off = 0;
-	            var p = str.slice(1).replace(/e,-/g, 'e-').split(',');
-	            var cmd;
-
-	            if (p.length > 0 && p[0] === '') {
-	                p.shift();
-	            }
-
-	            for (var i = 0; i < p.length; i++) {
-	                p[i] = parseFloat(p[i]);
-	            }
-	            while (off < p.length && !isNaN(p[off])) {
-	                if (isNaN(p[0])) {
-	                    break;
-	                }
-	                var ctlPtx;
-	                var ctlPty;
-
-	                var rx;
-	                var ry;
-	                var psi;
-	                var fa;
-	                var fs;
-
-	                var x1 = cpx;
-	                var y1 = cpy;
-
-	                // convert l, H, h, V, and v to L
-	                switch (c) {
-	                    case 'l':
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'L':
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'm':
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.M;
-	                        path.addData(cmd, cpx, cpy);
-	                        c = 'l';
-	                        break;
-	                    case 'M':
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.M;
-	                        path.addData(cmd, cpx, cpy);
-	                        c = 'L';
-	                        break;
-	                    case 'h':
-	                        cpx += p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'H':
-	                        cpx = p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'v':
-	                        cpy += p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'V':
-	                        cpy = p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'C':
-	                        cmd = CMD.C;
-	                        path.addData(
-	                            cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]
-	                        );
-	                        cpx = p[off - 2];
-	                        cpy = p[off - 1];
-	                        break;
-	                    case 'c':
-	                        cmd = CMD.C;
-	                        path.addData(
-	                            cmd,
-	                            p[off++] + cpx, p[off++] + cpy,
-	                            p[off++] + cpx, p[off++] + cpy,
-	                            p[off++] + cpx, p[off++] + cpy
-	                        );
-	                        cpx += p[off - 2];
-	                        cpy += p[off - 1];
-	                        break;
-	                    case 'S':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.C) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cmd = CMD.C;
-	                        x1 = p[off++];
-	                        y1 = p[off++];
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
-	                        break;
-	                    case 's':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.C) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cmd = CMD.C;
-	                        x1 = cpx + p[off++];
-	                        y1 = cpy + p[off++];
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
-	                        break;
-	                    case 'Q':
-	                        x1 = p[off++];
-	                        y1 = p[off++];
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, x1, y1, cpx, cpy);
-	                        break;
-	                    case 'q':
-	                        x1 = p[off++] + cpx;
-	                        y1 = p[off++] + cpy;
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, x1, y1, cpx, cpy);
-	                        break;
-	                    case 'T':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.Q) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
-	                        break;
-	                    case 't':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.Q) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
-	                        break;
-	                    case 'A':
-	                        rx = p[off++];
-	                        ry = p[off++];
-	                        psi = p[off++];
-	                        fa = p[off++];
-	                        fs = p[off++];
-
-	                        x1 = cpx, y1 = cpy;
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.A;
-	                        processArc(
-	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
-	                        );
-	                        break;
-	                    case 'a':
-	                        rx = p[off++];
-	                        ry = p[off++];
-	                        psi = p[off++];
-	                        fa = p[off++];
-	                        fs = p[off++];
-
-	                        x1 = cpx, y1 = cpy;
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.A;
-	                        processArc(
-	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
-	                        );
-	                        break;
-	                }
-	            }
-
-	            if (c === 'z' || c === 'Z') {
-	                cmd = CMD.Z;
-	                path.addData(cmd);
-	            }
-
-	            prevCmd = cmd;
-	        }
-
-	        path.toStatic();
-
-	        return path;
-	    }
-
-	    // TODO Optimize double memory cost problem
-	    function createPathOptions(str, opts) {
-	        var pathProxy = createPathProxyFromString(str);
-	        opts = opts || {};
-	        opts.buildPath = function (path) {
-	            if (path.setData) {
-	                path.setData(pathProxy.data);
-	                // Svg and vml renderer don't have context
-	                var ctx = path.getContext();
-	                if (ctx) {
-	                    path.rebuildPath(ctx);
-	                }
-	            }
-	            else {
-	                var ctx = path;
-	                pathProxy.rebuildPath(ctx);
-	            }
-	        };
-
-	        opts.applyTransform = function (m) {
-	            transformPath(pathProxy, m);
-
-	            this.dirty(true);
-	        };
-
-	        return opts;
-	    }
-
-	    module.exports = {
-	        /**
-	         * Create a Path object from path string data
-	         * http://www.w3.org/TR/SVG/paths.html#PathData
-	         * @param  {Object} opts Other options
-	         */
-	        createFromString: function (str, opts) {
-	            return new Path(createPathOptions(str, opts));
-	        },
-
-	        /**
-	         * Create a Path class from path string data
-	         * @param  {string} str
-	         * @param  {Object} opts Other options
-	         */
-	        extendFromString: function (str, opts) {
-	            return Path.extend(createPathOptions(str, opts));
-	        },
-
-	        /**
-	         * Merge multiple paths
-	         */
-	        // TODO Apply transform
-	        // TODO stroke dash
-	        // TODO Optimize double memory cost problem
-	        mergePath: function (pathEls, opts) {
-	            var pathList = [];
-	            var len = pathEls.length;
-	            for (var i = 0; i < len; i++) {
-	                var pathEl = pathEls[i];
-	                if (!pathEl.path) {
-	                    pathEl.createPathProxy();
-	                }
-	                if (pathEl.__dirtyPath) {
-	                    pathEl.buildPath(pathEl.path, pathEl.shape, true);
-	                }
-	                pathList.push(pathEl.path);
-	            }
-
-	            var pathBundle = new Path(opts);
-	            // Need path proxy.
-	            pathBundle.createPathProxy();
-	            pathBundle.buildPath = function (path) {
-	                path.appendPath(pathList);
-	                // Svg and vml renderer don't have context
-	                var ctx = path.getContext();
-	                if (ctx) {
-	                    path.rebuildPath(ctx);
-	                }
-	            };
-
-	            return pathBundle;
-	        }
-	    };
-
-
-/***/ },
-/* 46 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Path element
-	 * @module zrender/graphic/Path
-	 */
-
-
-
-	    var Displayable = __webpack_require__(47);
-	    var zrUtil = __webpack_require__(4);
-	    var PathProxy = __webpack_require__(50);
-	    var pathContain = __webpack_require__(53);
-
-	    var Pattern = __webpack_require__(60);
-	    var getCanvasPattern = Pattern.prototype.getCanvasPattern;
-
-	    var abs = Math.abs;
-
-	    var pathProxyForDraw = new PathProxy(true);
-	    /**
-	     * @alias module:zrender/graphic/Path
-	     * @extends module:zrender/graphic/Displayable
-	     * @constructor
-	     * @param {Object} opts
-	     */
-	    function Path(opts) {
-	        Displayable.call(this, opts);
-
-	        /**
-	         * @type {module:zrender/core/PathProxy}
-	         * @readOnly
-	         */
-	        this.path = null;
-	    }
-
-	    Path.prototype = {
-
-	        constructor: Path,
-
-	        type: 'path',
-
-	        __dirtyPath: true,
-
-	        strokeContainThreshold: 5,
-
-	        brush: function (ctx, prevEl) {
-	            var style = this.style;
-	            var path = this.path || pathProxyForDraw;
-	            var hasStroke = style.hasStroke();
-	            var hasFill = style.hasFill();
-	            var fill = style.fill;
-	            var stroke = style.stroke;
-	            var hasFillGradient = hasFill && !!(fill.colorStops);
-	            var hasStrokeGradient = hasStroke && !!(stroke.colorStops);
-	            var hasFillPattern = hasFill && !!(fill.image);
-	            var hasStrokePattern = hasStroke && !!(stroke.image);
-
-	            style.bind(ctx, this, prevEl);
-	            this.setTransform(ctx);
-
-	            if (this.__dirty) {
-	                var rect;
-	                // Update gradient because bounding rect may changed
-	                if (hasFillGradient) {
-	                    rect = rect || this.getBoundingRect();
-	                    this._fillGradient = style.getGradient(ctx, fill, rect);
-	                }
-	                if (hasStrokeGradient) {
-	                    rect = rect || this.getBoundingRect();
-	                    this._strokeGradient = style.getGradient(ctx, stroke, rect);
-	                }
-	            }
-	            // Use the gradient or pattern
-	            if (hasFillGradient) {
-	                // PENDING If may have affect the state
-	                ctx.fillStyle = this._fillGradient;
-	            }
-	            else if (hasFillPattern) {
-	                ctx.fillStyle = getCanvasPattern.call(fill, ctx);
-	            }
-	            if (hasStrokeGradient) {
-	                ctx.strokeStyle = this._strokeGradient;
-	            }
-	            else if (hasStrokePattern) {
-	                ctx.strokeStyle = getCanvasPattern.call(stroke, ctx);
-	            }
-
-	            var lineDash = style.lineDash;
-	            var lineDashOffset = style.lineDashOffset;
-
-	            var ctxLineDash = !!ctx.setLineDash;
-
-	            // Update path sx, sy
-	            var scale = this.getGlobalScale();
-	            path.setScale(scale[0], scale[1]);
-
-	            // Proxy context
-	            // Rebuild path in following 2 cases
-	            // 1. Path is dirty
-	            // 2. Path needs javascript implemented lineDash stroking.
-	            //    In this case, lineDash information will not be saved in PathProxy
-	            if (this.__dirtyPath
-	                || (lineDash && !ctxLineDash && hasStroke)
-	            ) {
-	                path.beginPath(ctx);
-
-	                // Setting line dash before build path
-	                if (lineDash && !ctxLineDash) {
-	                    path.setLineDash(lineDash);
-	                    path.setLineDashOffset(lineDashOffset);
-	                }
-
-	                this.buildPath(path, this.shape, false);
-
-	                // Clear path dirty flag
-	                if (this.path) {
-	                    this.__dirtyPath = false;
-	                }
-	            }
-	            else {
-	                // Replay path building
-	                ctx.beginPath();
-	                this.path.rebuildPath(ctx);
-	            }
-
-	            hasFill && path.fill(ctx);
-
-	            if (lineDash && ctxLineDash) {
-	                ctx.setLineDash(lineDash);
-	                ctx.lineDashOffset = lineDashOffset;
-	            }
-
-	            hasStroke && path.stroke(ctx);
-
-	            if (lineDash && ctxLineDash) {
-	                // PENDING
-	                // Remove lineDash
-	                ctx.setLineDash([]);
-	            }
-
-
-	            this.restoreTransform(ctx);
-
-	            // Draw rect text
-	            if (style.text != null) {
-	                // var rect = this.getBoundingRect();
-	                this.drawRectText(ctx, this.getBoundingRect());
-	            }
-	        },
-
-	        // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath
-	        // Like in circle
-	        buildPath: function (ctx, shapeCfg, inBundle) {},
-
-	        createPathProxy: function () {
-	            this.path = new PathProxy();
-	        },
-
-	        getBoundingRect: function () {
-	            var rect = this._rect;
-	            var style = this.style;
-	            var needsUpdateRect = !rect;
-	            if (needsUpdateRect) {
-	                var path = this.path;
-	                if (!path) {
-	                    // Create path on demand.
-	                    path = this.path = new PathProxy();
-	                }
-	                if (this.__dirtyPath) {
-	                    path.beginPath();
-	                    this.buildPath(path, this.shape, false);
-	                }
-	                rect = path.getBoundingRect();
-	            }
-	            this._rect = rect;
-
-	            if (style.hasStroke()) {
-	                // Needs update rect with stroke lineWidth when
-	                // 1. Element changes scale or lineWidth
-	                // 2. Shape is changed
-	                var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone());
-	                if (this.__dirty || needsUpdateRect) {
-	                    rectWithStroke.copy(rect);
-	                    // FIXME Must after updateTransform
-	                    var w = style.lineWidth;
-	                    // PENDING, Min line width is needed when line is horizontal or vertical
-	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
-
-	                    // Only add extra hover lineWidth when there are no fill
-	                    if (!style.hasFill()) {
-	                        w = Math.max(w, this.strokeContainThreshold || 4);
-	                    }
-	                    // Consider line width
-	                    // Line scale can't be 0;
-	                    if (lineScale > 1e-10) {
-	                        rectWithStroke.width += w / lineScale;
-	                        rectWithStroke.height += w / lineScale;
-	                        rectWithStroke.x -= w / lineScale / 2;
-	                        rectWithStroke.y -= w / lineScale / 2;
-	                    }
-	                }
-
-	                // Return rect with stroke
-	                return rectWithStroke;
-	            }
-
-	            return rect;
-	        },
-
-	        contain: function (x, y) {
-	            var localPos = this.transformCoordToLocal(x, y);
-	            var rect = this.getBoundingRect();
-	            var style = this.style;
-	            x = localPos[0];
-	            y = localPos[1];
-
-	            if (rect.contain(x, y)) {
-	                var pathData = this.path.data;
-	                if (style.hasStroke()) {
-	                    var lineWidth = style.lineWidth;
-	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
-	                    // Line scale can't be 0;
-	                    if (lineScale > 1e-10) {
-	                        // Only add extra hover lineWidth when there are no fill
-	                        if (!style.hasFill()) {
-	                            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);
-	                        }
-	                        if (pathContain.containStroke(
-	                            pathData, lineWidth / lineScale, x, y
-	                        )) {
-	                            return true;
-	                        }
-	                    }
-	                }
-	                if (style.hasFill()) {
-	                    return pathContain.contain(pathData, x, y);
-	                }
-	            }
-	            return false;
-	        },
-
-	        /**
-	         * @param  {boolean} dirtyPath
-	         */
-	        dirty: function (dirtyPath) {
-	            if (dirtyPath == null) {
-	                dirtyPath = true;
-	            }
-	            // Only mark dirty, not mark clean
-	            if (dirtyPath) {
-	                this.__dirtyPath = dirtyPath;
-	                this._rect = null;
-	            }
-
-	            this.__dirty = true;
-
-	            this.__zr && this.__zr.refresh();
-
-	            // Used as a clipping path
-	            if (this.__clipTarget) {
-	                this.__clipTarget.dirty();
-	            }
-	        },
-
-	        /**
-	         * Alias for animate('shape')
-	         * @param {boolean} loop
-	         */
-	        animateShape: function (loop) {
-	            return this.animate('shape', loop);
-	        },
-
-	        // Overwrite attrKV
-	        attrKV: function (key, value) {
-	            // FIXME
-	            if (key === 'shape') {
-	                this.setShape(value);
-	                this.__dirtyPath = true;
-	                this._rect = null;
-	            }
-	            else {
-	                Displayable.prototype.attrKV.call(this, key, value);
-	            }
-	        },
-
-	        /**
-	         * @param {Object|string} key
-	         * @param {*} value
-	         */
-	        setShape: function (key, value) {
-	            var shape = this.shape;
-	            // Path from string may not have shape
-	            if (shape) {
-	                if (zrUtil.isObject(key)) {
-	                    for (var name in key) {
-	                        if (key.hasOwnProperty(name)) {
-	                            shape[name] = key[name];
-	                        }
-	                    }
-	                }
-	                else {
-	                    shape[key] = value;
-	                }
-	                this.dirty(true);
-	            }
-	            return this;
-	        },
-
-	        getLineScale: function () {
-	            var m = this.transform;
-	            // Get the line scale.
-	            // Determinant of `m` means how much the area is enlarged by the
-	            // transformation. So its square root can be used as a scale factor
-	            // for width.
-	            return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10
-	                ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1]))
-	                : 1;
-	        }
-	    };
-
-	    /**
-	     * 扩展一个 Path element, 比如星形，圆等。
-	     * Extend a path element
-	     * @param {Object} props
-	     * @param {string} props.type Path type
-	     * @param {Function} props.init Initialize
-	     * @param {Function} props.buildPath Overwrite buildPath method
-	     * @param {Object} [props.style] Extended default style config
-	     * @param {Object} [props.shape] Extended default shape config
-	     */
-	    Path.extend = function (defaults) {
-	        var Sub = function (opts) {
-	            Path.call(this, opts);
-
-	            if (defaults.style) {
-	                // Extend default style
-	                this.style.extendFrom(defaults.style, false);
-	            }
-
-	            // Extend default shape
-	            var defaultShape = defaults.shape;
-	            if (defaultShape) {
-	                this.shape = this.shape || {};
-	                var thisShape = this.shape;
-	                for (var name in defaultShape) {
-	                    if (
-	                        ! thisShape.hasOwnProperty(name)
-	                        && defaultShape.hasOwnProperty(name)
-	                    ) {
-	                        thisShape[name] = defaultShape[name];
-	                    }
-	                }
-	            }
-
-	            defaults.init && defaults.init.call(this, opts);
-	        };
-
-	        zrUtil.inherits(Sub, Path);
-
-	        // FIXME 不能 extend position, rotation 等引用对象
-	        for (var name in defaults) {
-	            // Extending prototype values and methods
-	            if (name !== 'style' && name !== 'shape') {
-	                Sub.prototype[name] = defaults[name];
-	            }
-	        }
-
-	        return Sub;
-	    };
-
-	    zrUtil.inherits(Path, Displayable);
-
-	    module.exports = Path;
-
-
-/***/ },
-/* 47 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * 可绘制的图形基类
-	 * Base class of all displayable graphic objects
-	 * @module zrender/graphic/Displayable
-	 */
-
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var Style = __webpack_require__(48);
-
-	    var Element = __webpack_require__(31);
-	    var RectText = __webpack_require__(49);
-	    // var Stateful = require('./mixin/Stateful');
-
-	    /**
-	     * @alias module:zrender/graphic/Displayable
-	     * @extends module:zrender/Element
-	     * @extends module:zrender/graphic/mixin/RectText
-	     */
-	    function Displayable(opts) {
-
-	        opts = opts || {};
-
-	        Element.call(this, opts);
-
-	        // Extend properties
-	        for (var name in opts) {
-	            if (
-	                opts.hasOwnProperty(name) &&
-	                name !== 'style'
-	            ) {
-	                this[name] = opts[name];
-	            }
-	        }
-
-	        /**
-	         * @type {module:zrender/graphic/Style}
-	         */
-	        this.style = new Style(opts.style);
-
-	        this._rect = null;
-	        // Shapes for cascade clipping.
-	        this.__clipPaths = [];
-
-	        // FIXME Stateful must be mixined after style is setted
-	        // Stateful.call(this, opts);
-	    }
-
-	    Displayable.prototype = {
-
-	        constructor: Displayable,
-
-	        type: 'displayable',
-
-	        /**
-	         * Displayable 是否为脏，Painter 中会根据该标记判断是否需要是否需要重新绘制
-	         * Dirty flag. From which painter will determine if this displayable object needs brush
-	         * @name module:zrender/graphic/Displayable#__dirty
-	         * @type {boolean}
-	         */
-	        __dirty: true,
-
-	        /**
-	         * 图形是否可见，为true时不绘制图形，但是仍能触发鼠标事件
-	         * If ignore drawing of the displayable object. Mouse event will still be triggered
-	         * @name module:/zrender/graphic/Displayable#invisible
-	         * @type {boolean}
-	         * @default false
-	         */
-	        invisible: false,
-
-	        /**
-	         * @name module:/zrender/graphic/Displayable#z
-	         * @type {number}
-	         * @default 0
-	         */
-	        z: 0,
-
-	        /**
-	         * @name module:/zrender/graphic/Displayable#z
-	         * @type {number}
-	         * @default 0
-	         */
-	        z2: 0,
-
-	        /**
-	         * z层level，决定绘画在哪层canvas中
-	         * @name module:/zrender/graphic/Displayable#zlevel
-	         * @type {number}
-	         * @default 0
-	         */
-	        zlevel: 0,
-
-	        /**
-	         * 是否可拖拽
-	         * @name module:/zrender/graphic/Displayable#draggable
-	         * @type {boolean}
-	         * @default false
-	         */
-	        draggable: false,
-
-	        /**
-	         * 是否正在拖拽
-	         * @name module:/zrender/graphic/Displayable#draggable
-	         * @type {boolean}
-	         * @default false
-	         */
-	        dragging: false,
-
-	        /**
-	         * 是否相应鼠标事件
-	         * @name module:/zrender/graphic/Displayable#silent
-	         * @type {boolean}
-	         * @default false
-	         */
-	        silent: false,
-
-	        /**
-	         * If enable culling
-	         * @type {boolean}
-	         * @default false
-	         */
-	        culling: false,
-
-	        /**
-	         * Mouse cursor when hovered
-	         * @name module:/zrender/graphic/Displayable#cursor
-	         * @type {string}
-	         */
-	        cursor: 'pointer',
-
-	        /**
-	         * If hover area is bounding rect
-	         * @name module:/zrender/graphic/Displayable#rectHover
-	         * @type {string}
-	         */
-	        rectHover: false,
-
-	        /**
-	         * Render the element progressively when the value >= 0,
-	         * usefull for large data.
-	         * @type {number}
-	         */
-	        progressive: -1,
-
-	        beforeBrush: function (ctx) {},
-
-	        afterBrush: function (ctx) {},
-
-	        /**
-	         * 图形绘制方法
-	         * @param {Canvas2DRenderingContext} ctx
-	         */
-	        // Interface
-	        brush: function (ctx, prevEl) {},
-
-	        /**
-	         * 获取最小包围盒
-	         * @return {module:zrender/core/BoundingRect}
-	         */
-	        // Interface
-	        getBoundingRect: function () {},
-
-	        /**
-	         * 判断坐标 x, y 是否在图形上
-	         * If displayable element contain coord x, y
-	         * @param  {number} x
-	         * @param  {number} y
-	         * @return {boolean}
-	         */
-	        contain: function (x, y) {
-	            return this.rectContain(x, y);
-	        },
-
-	        /**
-	         * @param  {Function} cb
-	         * @param  {}   context
-	         */
-	        traverse: function (cb, context) {
-	            cb.call(context, this);
-	        },
-
-	        /**
-	         * 判断坐标 x, y 是否在图形的包围盒上
-	         * If bounding rect of element contain coord x, y
-	         * @param  {number} x
-	         * @param  {number} y
-	         * @return {boolean}
-	         */
-	        rectContain: function (x, y) {
-	            var coord = this.transformCoordToLocal(x, y);
-	            var rect = this.getBoundingRect();
-	            return rect.contain(coord[0], coord[1]);
-	        },
-
-	        /**
-	         * 标记图形元素为脏，并且在下一帧重绘
-	         * Mark displayable element dirty and refresh next frame
-	         */
-	        dirty: function () {
-	            this.__dirty = true;
-
-	            this._rect = null;
-
-	            this.__zr && this.__zr.refresh();
-	        },
-
-	        /**
-	         * 图形是否会触发事件
-	         * If displayable object binded any event
-	         * @return {boolean}
-	         */
-	        // TODO, 通过 bind 绑定的事件
-	        // isSilent: function () {
-	        //     return !(
-	        //         this.hoverable || this.draggable
-	        //         || this.onmousemove || this.onmouseover || this.onmouseout
-	        //         || this.onmousedown || this.onmouseup || this.onclick
-	        //         || this.ondragenter || this.ondragover || this.ondragleave
-	        //         || this.ondrop
-	        //     );
-	        // },
-	        /**
-	         * Alias for animate('style')
-	         * @param {boolean} loop
-	         */
-	        animateStyle: function (loop) {
-	            return this.animate('style', loop);
-	        },
-
-	        attrKV: function (key, value) {
-	            if (key !== 'style') {
-	                Element.prototype.attrKV.call(this, key, value);
-	            }
-	            else {
-	                this.style.set(value);
-	            }
-	        },
-
-	        /**
-	         * @param {Object|string} key
-	         * @param {*} value
-	         */
-	        setStyle: function (key, value) {
-	            this.style.set(key, value);
-	            this.dirty(false);
-	            return this;
-	        },
-
-	        /**
-	         * Use given style object
-	         * @param  {Object} obj
-	         */
-	        useStyle: function (obj) {
-	            this.style = new Style(obj);
-	            this.dirty(false);
-	            return this;
-	        }
-	    };
-
-	    zrUtil.inherits(Displayable, Element);
-
-	    zrUtil.mixin(Displayable, RectText);
-	    // zrUtil.mixin(Displayable, Stateful);
-
-	    module.exports = Displayable;
-
-
-/***/ },
-/* 48 */
-/***/ function(module, exports) {
-
-	/**
-	 * @module zrender/graphic/Style
-	 */
-
-
-	    var STYLE_COMMON_PROPS = [
-	        ['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'],
-	        ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]
-	    ];
-
-	    // var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);
-	    // var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);
-
-	    var Style = function (opts) {
-	        this.extendFrom(opts);
-	    };
-
-	    function createLinearGradient(ctx, obj, rect) {
-	        var x = obj.x == null ? 0 : obj.x;
-	        var x2 = obj.x2 == null ? 1 : obj.x2;
-	        var y = obj.y == null ? 0 : obj.y;
-	        var y2 = obj.y2 == null ? 0 : obj.y2;
-
-	        if (!obj.global) {
-	            x = x * rect.width + rect.x;
-	            x2 = x2 * rect.width + rect.x;
-	            y = y * rect.height + rect.y;
-	            y2 = y2 * rect.height + rect.y;
-	        }
-
-	        var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);
-
-	        return canvasGradient;
-	    }
-
-	    function createRadialGradient(ctx, obj, rect) {
-	        var width = rect.width;
-	        var height = rect.height;
-	        var min = Math.min(width, height);
-
-	        var x = obj.x == null ? 0.5 : obj.x;
-	        var y = obj.y == null ? 0.5 : obj.y;
-	        var r = obj.r == null ? 0.5 : obj.r;
-	        if (!obj.global) {
-	            x = x * width + rect.x;
-	            y = y * height + rect.y;
-	            r = r * min;
-	        }
-
-	        var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);
-
-	        return canvasGradient;
-	    }
-
-
-	    Style.prototype = {
-
-	        constructor: Style,
-
-	        /**
-	         * @type {string}
-	         */
-	        fill: '#000000',
-
-	        /**
-	         * @type {string}
-	         */
-	        stroke: null,
-
-	        /**
-	         * @type {number}
-	         */
-	        opacity: 1,
-
-	        /**
-	         * @type {Array.<number>}
-	         */
-	        lineDash: null,
-
-	        /**
-	         * @type {number}
-	         */
-	        lineDashOffset: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        shadowBlur: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        shadowOffsetX: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        shadowOffsetY: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        lineWidth: 1,
-
-	        /**
-	         * If stroke ignore scale
-	         * @type {Boolean}
-	         */
-	        strokeNoScale: false,
-
-	        // Bounding rect text configuration
-	        // Not affected by element transform
-	        /**
-	         * @type {string}
-	         */
-	        text: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textFill: '#000',
-
-	        /**
-	         * @type {string}
-	         */
-	        textStroke: null,
-
-	        /**
-	         * 'inside', 'left', 'right', 'top', 'bottom'
-	         * [x, y]
-	         * @type {string|Array.<number>}
-	         * @default 'inside'
-	         */
-	        textPosition: 'inside',
-
-	        /**
-	         * [x, y]
-	         * @type {Array.<number>}
-	         */
-	        textOffset: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textBaseline: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textAlign: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textVerticalAlign: null,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textDistance: 5,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textShadowBlur: 0,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textShadowOffsetX: 0,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textShadowOffsetY: 0,
-
-	        /**
-	         * If transform text
-	         * Only useful in Path and Image element
-	         * @type {boolean}
-	         */
-	        textTransform: false,
-
-	        /**
-	         * Text rotate around position of Path or Image
-	         * Only useful in Path and Image element and textTransform is false.
-	         */
-	        textRotation: 0,
-
-	        /**
-	         * @type {string}
-	         * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
-	         */
-	        blend: null,
-
-	        /**
-	         * @param {CanvasRenderingContext2D} ctx
-	         */
-	        bind: function (ctx, el, prevEl) {
-	            var style = this;
-	            var prevStyle = prevEl && prevEl.style;
-	            var firstDraw = !prevStyle;
-
-	            for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
-	                var prop = STYLE_COMMON_PROPS[i];
-	                var styleName = prop[0];
-
-	                if (firstDraw || style[styleName] !== prevStyle[styleName]) {
-	                    // FIXME Invalid property value will cause style leak from previous element.
-	                    ctx[styleName] = style[styleName] || prop[1];
-	                }
-	            }
-
-	            if ((firstDraw || style.fill !== prevStyle.fill)) {
-	                ctx.fillStyle = style.fill;
-	            }
-	            if ((firstDraw || style.stroke !== prevStyle.stroke)) {
-	                ctx.strokeStyle = style.stroke;
-	            }
-	            if ((firstDraw || style.opacity !== prevStyle.opacity)) {
-	                ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;
-	            }
-
-	            if ((firstDraw || style.blend !== prevStyle.blend)) {
-	                ctx.globalCompositeOperation = style.blend || 'source-over';
-	            }
-	            if (this.hasStroke()) {
-	                var lineWidth = style.lineWidth;
-	                ctx.lineWidth = lineWidth / (
-	                    (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1
-	                );
-	            }
-	        },
-
-	        hasFill: function () {
-	            var fill = this.fill;
-	            return fill != null && fill !== 'none';
-	        },
-
-	        hasStroke: function () {
-	            var stroke = this.stroke;
-	            return stroke != null && stroke !== 'none' && this.lineWidth > 0;
-	        },
-
-	        /**
-	         * Extend from other style
-	         * @param {zrender/graphic/Style} otherStyle
-	         * @param {boolean} overwrite
-	         */
-	        extendFrom: function (otherStyle, overwrite) {
-	            if (otherStyle) {
-	                var target = this;
-	                for (var name in otherStyle) {
-	                    if (otherStyle.hasOwnProperty(name)
-	                        && (overwrite || ! target.hasOwnProperty(name))
-	                    ) {
-	                        target[name] = otherStyle[name];
-	                    }
-	                }
-	            }
-	        },
-
-	        /**
-	         * Batch setting style with a given object
-	         * @param {Object|string} obj
-	         * @param {*} [obj]
-	         */
-	        set: function (obj, value) {
-	            if (typeof obj === 'string') {
-	                this[obj] = value;
-	            }
-	            else {
-	                this.extendFrom(obj, true);
-	            }
-	        },
-
-	        /**
-	         * Clone
-	         * @return {zrender/graphic/Style} [description]
-	         */
-	        clone: function () {
-	            var newStyle = new this.constructor();
-	            newStyle.extendFrom(this, true);
-	            return newStyle;
-	        },
-
-	        getGradient: function (ctx, obj, rect) {
-	            var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;
-	            var canvasGradient = method(ctx, obj, rect);
-	            var colorStops = obj.colorStops;
-	            for (var i = 0; i < colorStops.length; i++) {
-	                canvasGradient.addColorStop(
-	                    colorStops[i].offset, colorStops[i].color
-	                );
-	            }
-	            return canvasGradient;
-	        }
-	    };
-
-	    var styleProto = Style.prototype;
-	    for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
-	        var prop = STYLE_COMMON_PROPS[i];
-	        if (!(prop[0] in styleProto)) {
-	            styleProto[prop[0]] = prop[1];
-	        }
-	    }
-
-	    // Provide for others
-	    Style.getGradient = styleProto.getGradient;
-
-	    module.exports = Style;
-
-
-/***/ },
-/* 49 */
+/* 35 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -13945,7 +11675,7 @@
 
 
 /***/ },
-/* 50 */
+/* 36 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -13960,11 +11690,11 @@
 	 // TODO getTotalLength, getPointAtLength
 
 
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 	    var vec2 = __webpack_require__(10);
-	    var bbox = __webpack_require__(52);
+	    var bbox = __webpack_require__(38);
 	    var BoundingRect = __webpack_require__(9);
-	    var dpr = __webpack_require__(42).devicePixelRatio;
+	    var dpr = __webpack_require__(34).devicePixelRatio;
 
 	    var CMD = {
 	        M: 1,
@@ -14739,7 +12469,7 @@
 
 
 /***/ },
-/* 51 */
+/* 37 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -15285,7 +13015,7 @@
 
 
 /***/ },
-/* 52 */
+/* 38 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -15294,7 +13024,7 @@
 
 
 	    var vec2 = __webpack_require__(10);
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 
 	    var bbox = {};
 	    var mathMin = Math.min;
@@ -15521,21 +13251,21 @@
 
 
 /***/ },
-/* 53 */
+/* 39 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var CMD = __webpack_require__(50).CMD;
-	    var line = __webpack_require__(54);
-	    var cubic = __webpack_require__(55);
-	    var quadratic = __webpack_require__(56);
-	    var arc = __webpack_require__(57);
-	    var normalizeRadian = __webpack_require__(58).normalizeRadian;
-	    var curve = __webpack_require__(51);
+	    var CMD = __webpack_require__(36).CMD;
+	    var line = __webpack_require__(40);
+	    var cubic = __webpack_require__(41);
+	    var quadratic = __webpack_require__(42);
+	    var arc = __webpack_require__(43);
+	    var normalizeRadian = __webpack_require__(44).normalizeRadian;
+	    var curve = __webpack_require__(37);
 
-	    var windingLine = __webpack_require__(59);
+	    var windingLine = __webpack_require__(45);
 
 	    var containStroke = line.containStroke;
 
@@ -15927,7 +13657,7 @@
 
 
 /***/ },
-/* 54 */
+/* 40 */
 /***/ function(module, exports) {
 
 	
@@ -15975,12 +13705,12 @@
 
 
 /***/ },
-/* 55 */
+/* 41 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 
 	    module.exports = {
 	        /**
@@ -16022,12 +13752,12 @@
 
 
 /***/ },
-/* 56 */
+/* 42 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 
 	    module.exports = {
 	        /**
@@ -16067,12 +13797,12 @@
 
 
 /***/ },
-/* 57 */
+/* 43 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var normalizeRadian = __webpack_require__(58).normalizeRadian;
+	    var normalizeRadian = __webpack_require__(44).normalizeRadian;
 	    var PI2 = Math.PI * 2;
 
 	    module.exports = {
@@ -16133,7 +13863,7 @@
 
 
 /***/ },
-/* 58 */
+/* 44 */
 /***/ function(module, exports) {
 
 	
@@ -16151,7 +13881,7 @@
 
 
 /***/ },
-/* 59 */
+/* 45 */
 /***/ function(module, exports) {
 
 	
@@ -16178,7 +13908,7 @@
 
 
 /***/ },
-/* 60 */
+/* 46 */
 /***/ function(module, exports) {
 
 	
@@ -16202,12 +13932,12 @@
 
 
 /***/ },
-/* 61 */
+/* 47 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var CMD = __webpack_require__(50).CMD;
+	    var CMD = __webpack_require__(36).CMD;
 	    var vec2 = __webpack_require__(10);
 	    var v2ApplyTransform = vec2.applyTransform;
 
@@ -16305,7 +14035,329 @@
 
 
 /***/ },
-/* 62 */
+/* 48 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Group是一个容器，可以插入子节点，Group的变换也会被应用到子节点上
+	 * @module zrender/graphic/Group
+	 * @example
+	 *     var Group = require('zrender/lib/container/Group');
+	 *     var Circle = require('zrender/lib/graphic/shape/Circle');
+	 *     var g = new Group();
+	 *     g.position[0] = 100;
+	 *     g.position[1] = 100;
+	 *     g.add(new Circle({
+	 *         style: {
+	 *             x: 100,
+	 *             y: 100,
+	 *             r: 20,
+	 *         }
+	 *     }));
+	 *     zr.add(g);
+	 */
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var Element = __webpack_require__(23);
+	    var BoundingRect = __webpack_require__(9);
+
+	    /**
+	     * @alias module:zrender/graphic/Group
+	     * @constructor
+	     * @extends module:zrender/mixin/Transformable
+	     * @extends module:zrender/mixin/Eventful
+	     */
+	    var Group = function (opts) {
+
+	        opts = opts || {};
+
+	        Element.call(this, opts);
+
+	        for (var key in opts) {
+	            if (opts.hasOwnProperty(key)) {
+	                this[key] = opts[key];
+	            }
+	        }
+
+	        this._children = [];
+
+	        this.__storage = null;
+
+	        this.__dirty = true;
+	    };
+
+	    Group.prototype = {
+
+	        constructor: Group,
+
+	        isGroup: true,
+
+	        /**
+	         * @type {string}
+	         */
+	        type: 'group',
+
+	        /**
+	         * 所有子孙元素是否响应鼠标事件
+	         * @name module:/zrender/container/Group#silent
+	         * @type {boolean}
+	         * @default false
+	         */
+	        silent: false,
+
+	        /**
+	         * @return {Array.<module:zrender/Element>}
+	         */
+	        children: function () {
+	            return this._children.slice();
+	        },
+
+	        /**
+	         * 获取指定 index 的儿子节点
+	         * @param  {number} idx
+	         * @return {module:zrender/Element}
+	         */
+	        childAt: function (idx) {
+	            return this._children[idx];
+	        },
+
+	        /**
+	         * 获取指定名字的儿子节点
+	         * @param  {string} name
+	         * @return {module:zrender/Element}
+	         */
+	        childOfName: function (name) {
+	            var children = this._children;
+	            for (var i = 0; i < children.length; i++) {
+	                if (children[i].name === name) {
+	                    return children[i];
+	                }
+	             }
+	        },
+
+	        /**
+	         * @return {number}
+	         */
+	        childCount: function () {
+	            return this._children.length;
+	        },
+
+	        /**
+	         * 添加子节点到最后
+	         * @param {module:zrender/Element} child
+	         */
+	        add: function (child) {
+	            if (child && child !== this && child.parent !== this) {
+
+	                this._children.push(child);
+
+	                this._doAdd(child);
+	            }
+
+	            return this;
+	        },
+
+	        /**
+	         * 添加子节点在 nextSibling 之前
+	         * @param {module:zrender/Element} child
+	         * @param {module:zrender/Element} nextSibling
+	         */
+	        addBefore: function (child, nextSibling) {
+	            if (child && child !== this && child.parent !== this
+	                && nextSibling && nextSibling.parent === this) {
+
+	                var children = this._children;
+	                var idx = children.indexOf(nextSibling);
+
+	                if (idx >= 0) {
+	                    children.splice(idx, 0, child);
+	                    this._doAdd(child);
+	                }
+	            }
+
+	            return this;
+	        },
+
+	        _doAdd: function (child) {
+	            if (child.parent) {
+	                child.parent.remove(child);
+	            }
+
+	            child.parent = this;
+
+	            var storage = this.__storage;
+	            var zr = this.__zr;
+	            if (storage && storage !== child.__storage) {
+
+	                storage.addToStorage(child);
+
+	                if (child instanceof Group) {
+	                    child.addChildrenToStorage(storage);
+	                }
+	            }
+
+	            zr && zr.refresh();
+	        },
+
+	        /**
+	         * 移除子节点
+	         * @param {module:zrender/Element} child
+	         */
+	        remove: function (child) {
+	            var zr = this.__zr;
+	            var storage = this.__storage;
+	            var children = this._children;
+
+	            var idx = zrUtil.indexOf(children, child);
+	            if (idx < 0) {
+	                return this;
+	            }
+	            children.splice(idx, 1);
+
+	            child.parent = null;
+
+	            if (storage) {
+
+	                storage.delFromStorage(child);
+
+	                if (child instanceof Group) {
+	                    child.delChildrenFromStorage(storage);
+	                }
+	            }
+
+	            zr && zr.refresh();
+
+	            return this;
+	        },
+
+	        /**
+	         * 移除所有子节点
+	         */
+	        removeAll: function () {
+	            var children = this._children;
+	            var storage = this.__storage;
+	            var child;
+	            var i;
+	            for (i = 0; i < children.length; i++) {
+	                child = children[i];
+	                if (storage) {
+	                    storage.delFromStorage(child);
+	                    if (child instanceof Group) {
+	                        child.delChildrenFromStorage(storage);
+	                    }
+	                }
+	                child.parent = null;
+	            }
+	            children.length = 0;
+
+	            return this;
+	        },
+
+	        /**
+	         * 遍历所有子节点
+	         * @param  {Function} cb
+	         * @param  {}   context
+	         */
+	        eachChild: function (cb, context) {
+	            var children = this._children;
+	            for (var i = 0; i < children.length; i++) {
+	                var child = children[i];
+	                cb.call(context, child, i);
+	            }
+	            return this;
+	        },
+
+	        /**
+	         * 深度优先遍历所有子孙节点
+	         * @param  {Function} cb
+	         * @param  {}   context
+	         */
+	        traverse: function (cb, context) {
+	            for (var i = 0; i < this._children.length; i++) {
+	                var child = this._children[i];
+	                cb.call(context, child);
+
+	                if (child.type === 'group') {
+	                    child.traverse(cb, context);
+	                }
+	            }
+	            return this;
+	        },
+
+	        addChildrenToStorage: function (storage) {
+	            for (var i = 0; i < this._children.length; i++) {
+	                var child = this._children[i];
+	                storage.addToStorage(child);
+	                if (child instanceof Group) {
+	                    child.addChildrenToStorage(storage);
+	                }
+	            }
+	        },
+
+	        delChildrenFromStorage: function (storage) {
+	            for (var i = 0; i < this._children.length; i++) {
+	                var child = this._children[i];
+	                storage.delFromStorage(child);
+	                if (child instanceof Group) {
+	                    child.delChildrenFromStorage(storage);
+	                }
+	            }
+	        },
+
+	        dirty: function () {
+	            this.__dirty = true;
+	            this.__zr && this.__zr.refresh();
+	            return this;
+	        },
+
+	        /**
+	         * @return {module:zrender/core/BoundingRect}
+	         */
+	        getBoundingRect: function (includeChildren) {
+	            // TODO Caching
+	            var rect = null;
+	            var tmpRect = new BoundingRect(0, 0, 0, 0);
+	            var children = includeChildren || this._children;
+	            var tmpMat = [];
+
+	            for (var i = 0; i < children.length; i++) {
+	                var child = children[i];
+	                if (child.ignore || child.invisible) {
+	                    continue;
+	                }
+
+	                var childRect = child.getBoundingRect();
+	                var transform = child.getLocalTransform(tmpMat);
+	                // TODO
+	                // The boundingRect cacluated by transforming original
+	                // rect may be bigger than the actual bundingRect when rotation
+	                // is used. (Consider a circle rotated aginst its center, where
+	                // the actual boundingRect should be the same as that not be
+	                // rotated.) But we can not find better approach to calculate
+	                // actual boundingRect yet, considering performance.
+	                if (transform) {
+	                    tmpRect.copy(childRect);
+	                    tmpRect.applyTransform(transform);
+	                    rect = rect || tmpRect.clone();
+	                    rect.union(tmpRect);
+	                }
+	                else {
+	                    rect = rect || childRect.clone();
+	                    rect.union(childRect);
+	                }
+	            }
+	            return rect || tmpRect;
+	        }
+	    };
+
+	    zrUtil.inherits(Group, Element);
+
+	    module.exports = Group;
+
+
+/***/ },
+/* 49 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16315,11 +14367,11 @@
 
 
 
-	    var Displayable = __webpack_require__(47);
+	    var Displayable = __webpack_require__(21);
 	    var BoundingRect = __webpack_require__(9);
 	    var zrUtil = __webpack_require__(4);
 
-	    var LRU = __webpack_require__(40);
+	    var LRU = __webpack_require__(32);
 	    var globalImageCache = new LRU(50);
 	    /**
 	     * @alias zrender/graphic/Image
@@ -16469,7 +14521,7 @@
 
 
 /***/ },
-/* 63 */
+/* 50 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16483,7 +14535,7 @@
 
 
 
-	    var Displayable = __webpack_require__(47);
+	    var Displayable = __webpack_require__(21);
 	    var zrUtil = __webpack_require__(4);
 	    var textContain = __webpack_require__(8);
 
@@ -16610,7 +14662,7 @@
 
 
 /***/ },
-/* 64 */
+/* 51 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -16621,7 +14673,7 @@
 
 
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'circle',
 
@@ -16652,7 +14704,7 @@
 
 
 /***/ },
-/* 65 */
+/* 52 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16663,7 +14715,7 @@
 
 
 	    var env = __webpack_require__(2);
-	    var Path = __webpack_require__(46);
+	    var Path = __webpack_require__(20);
 
 	    var shadowTemp = [
 	        ['shadowBlur', 0],
@@ -16771,7 +14823,7 @@
 
 
 /***/ },
-/* 66 */
+/* 53 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16780,7 +14832,7 @@
 	 */
 
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'ring',
 
@@ -16805,7 +14857,7 @@
 
 
 /***/ },
-/* 67 */
+/* 54 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16814,9 +14866,9 @@
 	 */
 
 
-	    var polyHelper = __webpack_require__(68);
+	    var polyHelper = __webpack_require__(55);
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 	        
 	        type: 'polygon',
 
@@ -16835,13 +14887,13 @@
 
 
 /***/ },
-/* 68 */
+/* 55 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var smoothSpline = __webpack_require__(69);
-	    var smoothBezier = __webpack_require__(70);
+	    var smoothSpline = __webpack_require__(56);
+	    var smoothBezier = __webpack_require__(57);
 
 	    module.exports = {
 	        buildPath: function (ctx, shape, closePath) {
@@ -16882,7 +14934,7 @@
 
 
 /***/ },
-/* 69 */
+/* 56 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16958,7 +15010,7 @@
 
 
 /***/ },
-/* 70 */
+/* 57 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17065,7 +15117,7 @@
 
 
 /***/ },
-/* 71 */
+/* 58 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17073,9 +15125,9 @@
 	 */
 
 
-	    var polyHelper = __webpack_require__(68);
+	    var polyHelper = __webpack_require__(55);
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 	        
 	        type: 'polyline',
 
@@ -17100,7 +15152,7 @@
 
 
 /***/ },
-/* 72 */
+/* 59 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17109,9 +15161,9 @@
 	 */
 
 
-	    var roundRectHelper = __webpack_require__(73);
+	    var roundRectHelper = __webpack_require__(60);
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'rect',
 
@@ -17148,7 +15200,7 @@
 
 
 /***/ },
-/* 73 */
+/* 60 */
 /***/ function(module, exports) {
 
 	
@@ -17243,7 +15295,7 @@
 
 
 /***/ },
-/* 74 */
+/* 61 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17251,7 +15303,7 @@
 	 * @module zrender/graphic/shape/Line
 	 */
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'line',
 
@@ -17308,7 +15360,7 @@
 
 
 /***/ },
-/* 75 */
+/* 62 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -17318,7 +15370,7 @@
 	 */
 
 
-	    var curveTool = __webpack_require__(51);
+	    var curveTool = __webpack_require__(37);
 	    var vec2 = __webpack_require__(10);
 	    var quadraticSubdivide = curveTool.quadraticSubdivide;
 	    var cubicSubdivide = curveTool.cubicSubdivide;
@@ -17345,7 +15397,7 @@
 	            ];
 	        }
 	    }
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'bezier-curve',
 
@@ -17449,7 +15501,7 @@
 
 
 /***/ },
-/* 76 */
+/* 63 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17458,7 +15510,7 @@
 	 */
 	 
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'arc',
 
@@ -17503,13 +15555,13 @@
 
 
 /***/ },
-/* 77 */
+/* 64 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// CompoundPath to improve performance
 
 
-	    var Path = __webpack_require__(46);
+	    var Path = __webpack_require__(20);
 
 	    module.exports = Path.extend({
 
@@ -17566,7 +15618,7 @@
 
 
 /***/ },
-/* 78 */
+/* 65 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -17574,7 +15626,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 
 	    /**
 	     * x, y, x2, y2 are all percent from 0 to 1
@@ -17618,7 +15670,7 @@
 
 
 /***/ },
-/* 79 */
+/* 66 */
 /***/ function(module, exports) {
 
 	
@@ -17649,7 +15701,7 @@
 
 
 /***/ },
-/* 80 */
+/* 67 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -17657,7 +15709,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 
 	    /**
 	     * x, y, r are all percent from 0 to 1
@@ -17698,6 +15750,2095 @@
 
 
 /***/ },
+/* 68 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+	    var getItemStyle = __webpack_require__(15)(
+	        [
+	            ['fill', 'color'],
+	            ['stroke', 'borderColor'],
+	            ['lineWidth', 'borderWidth'],
+	            ['opacity'],
+	            ['shadowBlur'],
+	            ['shadowOffsetX'],
+	            ['shadowOffsetY'],
+	            ['shadowColor'],
+	            ['textPosition'],
+	            ['textAlign']
+	        ]
+	    );
+	    module.exports = {
+	        getItemStyle: function (excludes, includes) {
+	            var style = getItemStyle.call(this, excludes, includes);
+	            var lineDash = this.getBorderLineDash();
+	            lineDash && (style.lineDash = lineDash);
+	            return style;
+	        },
+
+	        getBorderLineDash: function () {
+	            var lineType = this.get('borderType');
+	            return (lineType === 'solid' || lineType == null) ? null
+	                : (lineType === 'dashed' ? [5, 5] : [1, 1]);
+	        }
+	    };
+
+
+/***/ },
+/* 69 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Component model
+	 *
+	 * @module echarts/model/Component
+	 */
+
+
+	    var Model = __webpack_require__(12);
+	    var zrUtil = __webpack_require__(4);
+	    var arrayPush = Array.prototype.push;
+	    var componentUtil = __webpack_require__(70);
+	    var clazzUtil = __webpack_require__(13);
+	    var layout = __webpack_require__(71);
+
+	    /**
+	     * @alias module:echarts/model/Component
+	     * @constructor
+	     * @param {Object} option
+	     * @param {module:echarts/model/Model} parentModel
+	     * @param {module:echarts/model/Model} ecModel
+	     */
+	    var ComponentModel = Model.extend({
+
+	        type: 'component',
+
+	        /**
+	         * @readOnly
+	         * @type {string}
+	         */
+	        id: '',
+
+	        /**
+	         * @readOnly
+	         */
+	        name: '',
+
+	        /**
+	         * @readOnly
+	         * @type {string}
+	         */
+	        mainType: '',
+
+	        /**
+	         * @readOnly
+	         * @type {string}
+	         */
+	        subType: '',
+
+	        /**
+	         * @readOnly
+	         * @type {number}
+	         */
+	        componentIndex: 0,
+
+	        /**
+	         * @type {Object}
+	         * @protected
+	         */
+	        defaultOption: null,
+
+	        /**
+	         * @type {module:echarts/model/Global}
+	         * @readOnly
+	         */
+	        ecModel: null,
+
+	        /**
+	         * key: componentType
+	         * value:  Component model list, can not be null.
+	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
+	         * @readOnly
+	         */
+	        dependentModels: [],
+
+	        /**
+	         * @type {string}
+	         * @readOnly
+	         */
+	        uid: null,
+
+	        /**
+	         * Support merge layout params.
+	         * Only support 'box' now (left/right/top/bottom/width/height).
+	         * @type {string|Object} Object can be {ignoreSize: true}
+	         * @readOnly
+	         */
+	        layoutMode: null,
+
+	        $constructor: function (option, parentModel, ecModel, extraOpt) {
+	            Model.call(this, option, parentModel, ecModel, extraOpt);
+
+	            this.uid = componentUtil.getUID('componentModel');
+	        },
+
+
+	        init: function (option, parentModel, ecModel, extraOpt) {
+	            this.mergeDefaultAndTheme(option, ecModel);
+	        },
+
+	        mergeDefaultAndTheme: function (option, ecModel) {
+	            var layoutMode = this.layoutMode;
+	            var inputPositionParams = layoutMode
+	                ? layout.getLayoutParams(option) : {};
+
+	            var themeModel = ecModel.getTheme();
+	            zrUtil.merge(option, themeModel.get(this.mainType));
+	            zrUtil.merge(option, this.getDefaultOption());
+
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
+	            }
+	        },
+
+	        mergeOption: function (option, extraOpt) {
+	            zrUtil.merge(this.option, option, true);
+
+	            var layoutMode = this.layoutMode;
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(this.option, option, layoutMode);
+	            }
+	        },
+
+	        // Hooker after init or mergeOption
+	        optionUpdated: function (newCptOption, isInit) {},
+
+	        getDefaultOption: function () {
+	            if (!clazzUtil.hasOwn(this, '__defaultOption')) {
+	                var optList = [];
+	                var Class = this.constructor;
+	                while (Class) {
+	                    var opt = Class.prototype.defaultOption;
+	                    opt && optList.push(opt);
+	                    Class = Class.superClass;
+	                }
+
+	                var defaultOption = {};
+	                for (var i = optList.length - 1; i >= 0; i--) {
+	                    defaultOption = zrUtil.merge(defaultOption, optList[i], true);
+	                }
+	                clazzUtil.set(this, '__defaultOption', defaultOption);
+	            }
+	            return clazzUtil.get(this, '__defaultOption');
+	        },
+
+	        getReferringComponents: function (mainType) {
+	            return this.ecModel.queryComponents({
+	                mainType: mainType,
+	                index: this.get(mainType + 'Index', true),
+	                id: this.get(mainType + 'Id', true)
+	            });
+	        }
+
+	    });
+
+	    // Reset ComponentModel.extend, add preConstruct.
+	    // clazzUtil.enableClassExtend(
+	    //     ComponentModel,
+	    //     function (option, parentModel, ecModel, extraOpt) {
+	    //         // Set dependentModels, componentIndex, name, id, mainType, subType.
+	    //         zrUtil.extend(this, extraOpt);
+
+	    //         this.uid = componentUtil.getUID('componentModel');
+
+	    //         // this.setReadOnly([
+	    //         //     'type', 'id', 'uid', 'name', 'mainType', 'subType',
+	    //         //     'dependentModels', 'componentIndex'
+	    //         // ]);
+	    //     }
+	    // );
+
+	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+	    clazzUtil.enableClassManagement(
+	        ComponentModel, {registerWhenExtend: true}
+	    );
+	    componentUtil.enableSubTypeDefaulter(ComponentModel);
+
+	    // Add capability of ComponentModel.topologicalTravel.
+	    componentUtil.enableTopologicalTravel(ComponentModel, getDependencies);
+
+	    function getDependencies(componentType) {
+	        var deps = [];
+	        zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
+	            arrayPush.apply(deps, Clazz.prototype.dependencies || []);
+	        });
+	        // Ensure main type
+	        return zrUtil.map(deps, function (type) {
+	            return clazzUtil.parseClassType(type).main;
+	        });
+	    }
+
+	    zrUtil.mixin(ComponentModel, __webpack_require__(72));
+
+	    module.exports = ComponentModel;
+
+
+/***/ },
+/* 70 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var zrUtil = __webpack_require__(4);
+	    var clazz = __webpack_require__(13);
+
+	    var parseClassType = clazz.parseClassType;
+
+	    var base = 0;
+
+	    var componentUtil = {};
+
+	    var DELIMITER = '_';
+
+	    /**
+	     * @public
+	     * @param {string} type
+	     * @return {string}
+	     */
+	    componentUtil.getUID = function (type) {
+	        // Considering the case of crossing js context,
+	        // use Math.random to make id as unique as possible.
+	        return [(type || ''), base++, Math.random()].join(DELIMITER);
+	    };
+
+	    /**
+	     * @inner
+	     */
+	    componentUtil.enableSubTypeDefaulter = function (entity) {
+
+	        var subTypeDefaulters = {};
+
+	        entity.registerSubTypeDefaulter = function (componentType, defaulter) {
+	            componentType = parseClassType(componentType);
+	            subTypeDefaulters[componentType.main] = defaulter;
+	        };
+
+	        entity.determineSubType = function (componentType, option) {
+	            var type = option.type;
+	            if (!type) {
+	                var componentTypeMain = parseClassType(componentType).main;
+	                if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {
+	                    type = subTypeDefaulters[componentTypeMain](option);
+	                }
+	            }
+	            return type;
+	        };
+
+	        return entity;
+	    };
+
+	    /**
+	     * Topological travel on Activity Network (Activity On Vertices).
+	     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
+	     *
+	     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
+	     *
+	     * If there is circle dependencey, Error will be thrown.
+	     *
+	     */
+	    componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) {
+
+	        /**
+	         * @public
+	         * @param {Array.<string>} targetNameList Target Component type list.
+	         *                                           Can be ['aa', 'bb', 'aa.xx']
+	         * @param {Array.<string>} fullNameList By which we can build dependency graph.
+	         * @param {Function} callback Params: componentType, dependencies.
+	         * @param {Object} context Scope of callback.
+	         */
+	        entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {
+	            if (!targetNameList.length) {
+	                return;
+	            }
+
+	            var result = makeDepndencyGraph(fullNameList);
+	            var graph = result.graph;
+	            var stack = result.noEntryList;
+
+	            var targetNameSet = {};
+	            zrUtil.each(targetNameList, function (name) {
+	                targetNameSet[name] = true;
+	            });
+
+	            while (stack.length) {
+	                var currComponentType = stack.pop();
+	                var currVertex = graph[currComponentType];
+	                var isInTargetNameSet = !!targetNameSet[currComponentType];
+	                if (isInTargetNameSet) {
+	                    callback.call(context, currComponentType, currVertex.originalDeps.slice());
+	                    delete targetNameSet[currComponentType];
+	                }
+	                zrUtil.each(
+	                    currVertex.successor,
+	                    isInTargetNameSet ? removeEdgeAndAdd : removeEdge
+	                );
+	            }
+
+	            zrUtil.each(targetNameSet, function () {
+	                throw new Error('Circle dependency may exists');
+	            });
+
+	            function removeEdge(succComponentType) {
+	                graph[succComponentType].entryCount--;
+	                if (graph[succComponentType].entryCount === 0) {
+	                    stack.push(succComponentType);
+	                }
+	            }
+
+	            // Consider this case: legend depends on series, and we call
+	            // chart.setOption({series: [...]}), where only series is in option.
+	            // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will
+	            // not be called, but only sereis.mergeOption is called. Thus legend
+	            // have no chance to update its local record about series (like which
+	            // name of series is available in legend).
+	            function removeEdgeAndAdd(succComponentType) {
+	                targetNameSet[succComponentType] = true;
+	                removeEdge(succComponentType);
+	            }
+	        };
+
+	        /**
+	         * DepndencyGraph: {Object}
+	         * key: conponentType,
+	         * value: {
+	         *     successor: [conponentTypes...],
+	         *     originalDeps: [conponentTypes...],
+	         *     entryCount: {number}
+	         * }
+	         */
+	        function makeDepndencyGraph(fullNameList) {
+	            var graph = {};
+	            var noEntryList = [];
+
+	            zrUtil.each(fullNameList, function (name) {
+
+	                var thisItem = createDependencyGraphItem(graph, name);
+	                var originalDeps = thisItem.originalDeps = dependencyGetter(name);
+
+	                var availableDeps = getAvailableDependencies(originalDeps, fullNameList);
+	                thisItem.entryCount = availableDeps.length;
+	                if (thisItem.entryCount === 0) {
+	                    noEntryList.push(name);
+	                }
+
+	                zrUtil.each(availableDeps, function (dependentName) {
+	                    if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) {
+	                        thisItem.predecessor.push(dependentName);
+	                    }
+	                    var thatItem = createDependencyGraphItem(graph, dependentName);
+	                    if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) {
+	                        thatItem.successor.push(name);
+	                    }
+	                });
+	            });
+
+	            return {graph: graph, noEntryList: noEntryList};
+	        }
+
+	        function createDependencyGraphItem(graph, name) {
+	            if (!graph[name]) {
+	                graph[name] = {predecessor: [], successor: []};
+	            }
+	            return graph[name];
+	        }
+
+	        function getAvailableDependencies(originalDeps, fullNameList) {
+	            var availableDeps = [];
+	            zrUtil.each(originalDeps, function (dep) {
+	                zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);
+	            });
+	            return availableDeps;
+	        }
+	    };
+
+	    module.exports = componentUtil;
+
+
+/***/ },
+/* 71 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+	// Layout helpers for each component positioning
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var BoundingRect = __webpack_require__(9);
+	    var numberUtil = __webpack_require__(7);
+	    var formatUtil = __webpack_require__(6);
+	    var parsePercent = numberUtil.parsePercent;
+	    var each = zrUtil.each;
+
+	    var layout = {};
+
+	    /**
+	     * @public
+	     */
+	    var LOCATION_PARAMS = layout.LOCATION_PARAMS = [
+	        'left', 'right', 'top', 'bottom', 'width', 'height'
+	    ];
+
+	    /**
+	     * @public
+	     */
+	    var HV_NAMES = layout.HV_NAMES = [
+	        ['width', 'left', 'right'],
+	        ['height', 'top', 'bottom']
+	    ];
+
+	    function boxLayout(orient, group, gap, maxWidth, maxHeight) {
+	        var x = 0;
+	        var y = 0;
+	        if (maxWidth == null) {
+	            maxWidth = Infinity;
+	        }
+	        if (maxHeight == null) {
+	            maxHeight = Infinity;
+	        }
+	        var currentLineMaxSize = 0;
+	        group.eachChild(function (child, idx) {
+	            var position = child.position;
+	            var rect = child.getBoundingRect();
+	            var nextChild = group.childAt(idx + 1);
+	            var nextChildRect = nextChild && nextChild.getBoundingRect();
+	            var nextX;
+	            var nextY;
+	            if (orient === 'horizontal') {
+	                var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0);
+	                nextX = x + moveX;
+	                // Wrap when width exceeds maxWidth or meet a `newline` group
+	                if (nextX > maxWidth || child.newline) {
+	                    x = 0;
+	                    nextX = moveX;
+	                    y += currentLineMaxSize + gap;
+	                    currentLineMaxSize = rect.height;
+	                }
+	                else {
+	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);
+	                }
+	            }
+	            else {
+	                var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0);
+	                nextY = y + moveY;
+	                // Wrap when width exceeds maxHeight or meet a `newline` group
+	                if (nextY > maxHeight || child.newline) {
+	                    x += currentLineMaxSize + gap;
+	                    y = 0;
+	                    nextY = moveY;
+	                    currentLineMaxSize = rect.width;
+	                }
+	                else {
+	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);
+	                }
+	            }
+
+	            if (child.newline) {
+	                return;
+	            }
+
+	            position[0] = x;
+	            position[1] = y;
+
+	            orient === 'horizontal'
+	                ? (x = nextX + gap)
+	                : (y = nextY + gap);
+	        });
+	    }
+
+	    /**
+	     * VBox or HBox layouting
+	     * @param {string} orient
+	     * @param {module:zrender/container/Group} group
+	     * @param {number} gap
+	     * @param {number} [width=Infinity]
+	     * @param {number} [height=Infinity]
+	     */
+	    layout.box = boxLayout;
+
+	    /**
+	     * VBox layouting
+	     * @param {module:zrender/container/Group} group
+	     * @param {number} gap
+	     * @param {number} [width=Infinity]
+	     * @param {number} [height=Infinity]
+	     */
+	    layout.vbox = zrUtil.curry(boxLayout, 'vertical');
+
+	    /**
+	     * HBox layouting
+	     * @param {module:zrender/container/Group} group
+	     * @param {number} gap
+	     * @param {number} [width=Infinity]
+	     * @param {number} [height=Infinity]
+	     */
+	    layout.hbox = zrUtil.curry(boxLayout, 'horizontal');
+
+	    /**
+	     * If x or x2 is not specified or 'center' 'left' 'right',
+	     * the width would be as long as possible.
+	     * If y or y2 is not specified or 'middle' 'top' 'bottom',
+	     * the height would be as long as possible.
+	     *
+	     * @param {Object} positionInfo
+	     * @param {number|string} [positionInfo.x]
+	     * @param {number|string} [positionInfo.y]
+	     * @param {number|string} [positionInfo.x2]
+	     * @param {number|string} [positionInfo.y2]
+	     * @param {Object} containerRect
+	     * @param {string|number} margin
+	     * @return {Object} {width, height}
+	     */
+	    layout.getAvailableSize = function (positionInfo, containerRect, margin) {
+	        var containerWidth = containerRect.width;
+	        var containerHeight = containerRect.height;
+
+	        var x = parsePercent(positionInfo.x, containerWidth);
+	        var y = parsePercent(positionInfo.y, containerHeight);
+	        var x2 = parsePercent(positionInfo.x2, containerWidth);
+	        var y2 = parsePercent(positionInfo.y2, containerHeight);
+
+	        (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);
+	        (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);
+	        (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);
+	        (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);
+
+	        margin = formatUtil.normalizeCssArray(margin || 0);
+
+	        return {
+	            width: Math.max(x2 - x - margin[1] - margin[3], 0),
+	            height: Math.max(y2 - y - margin[0] - margin[2], 0)
+	        };
+	    };
+
+	    /**
+	     * Parse position info.
+	     *
+	     * @param {Object} positionInfo
+	     * @param {number|string} [positionInfo.left]
+	     * @param {number|string} [positionInfo.top]
+	     * @param {number|string} [positionInfo.right]
+	     * @param {number|string} [positionInfo.bottom]
+	     * @param {number|string} [positionInfo.width]
+	     * @param {number|string} [positionInfo.height]
+	     * @param {number|string} [positionInfo.aspect] Aspect is width / height
+	     * @param {Object} containerRect
+	     * @param {string|number} [margin]
+	     *
+	     * @return {module:zrender/core/BoundingRect}
+	     */
+	    layout.getLayoutRect = function (
+	        positionInfo, containerRect, margin
+	    ) {
+	        margin = formatUtil.normalizeCssArray(margin || 0);
+
+	        var containerWidth = containerRect.width;
+	        var containerHeight = containerRect.height;
+
+	        var left = parsePercent(positionInfo.left, containerWidth);
+	        var top = parsePercent(positionInfo.top, containerHeight);
+	        var right = parsePercent(positionInfo.right, containerWidth);
+	        var bottom = parsePercent(positionInfo.bottom, containerHeight);
+	        var width = parsePercent(positionInfo.width, containerWidth);
+	        var height = parsePercent(positionInfo.height, containerHeight);
+
+	        var verticalMargin = margin[2] + margin[0];
+	        var horizontalMargin = margin[1] + margin[3];
+	        var aspect = positionInfo.aspect;
+
+	        // If width is not specified, calculate width from left and right
+	        if (isNaN(width)) {
+	            width = containerWidth - right - horizontalMargin - left;
+	        }
+	        if (isNaN(height)) {
+	            height = containerHeight - bottom - verticalMargin - top;
+	        }
+
+	        // If width and height are not given
+	        // 1. Graph should not exceeds the container
+	        // 2. Aspect must be keeped
+	        // 3. Graph should take the space as more as possible
+	        if (isNaN(width) && isNaN(height)) {
+	            if (aspect > containerWidth / containerHeight) {
+	                width = containerWidth * 0.8;
+	            }
+	            else {
+	                height = containerHeight * 0.8;
+	            }
+	        }
+
+	        if (aspect != null) {
+	            // Calculate width or height with given aspect
+	            if (isNaN(width)) {
+	                width = aspect * height;
+	            }
+	            if (isNaN(height)) {
+	                height = width / aspect;
+	            }
+	        }
+
+	        // If left is not specified, calculate left from right and width
+	        if (isNaN(left)) {
+	            left = containerWidth - right - width - horizontalMargin;
+	        }
+	        if (isNaN(top)) {
+	            top = containerHeight - bottom - height - verticalMargin;
+	        }
+
+	        // Align left and top
+	        switch (positionInfo.left || positionInfo.right) {
+	            case 'center':
+	                left = containerWidth / 2 - width / 2 - margin[3];
+	                break;
+	            case 'right':
+	                left = containerWidth - width - horizontalMargin;
+	                break;
+	        }
+	        switch (positionInfo.top || positionInfo.bottom) {
+	            case 'middle':
+	            case 'center':
+	                top = containerHeight / 2 - height / 2 - margin[0];
+	                break;
+	            case 'bottom':
+	                top = containerHeight - height - verticalMargin;
+	                break;
+	        }
+	        // If something is wrong and left, top, width, height are calculated as NaN
+	        left = left || 0;
+	        top = top || 0;
+	        if (isNaN(width)) {
+	            // Width may be NaN if only one value is given except width
+	            width = containerWidth - left - (right || 0);
+	        }
+	        if (isNaN(height)) {
+	            // Height may be NaN if only one value is given except height
+	            height = containerHeight - top - (bottom || 0);
+	        }
+
+	        var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);
+	        rect.margin = margin;
+	        return rect;
+	    };
+
+
+	    /**
+	     * Position a zr element in viewport
+	     *  Group position is specified by either
+	     *  {left, top}, {right, bottom}
+	     *  If all properties exists, right and bottom will be igonred.
+	     *
+	     * Logic:
+	     *     1. Scale (against origin point in parent coord)
+	     *     2. Rotate (against origin point in parent coord)
+	     *     3. Traslate (with el.position by this method)
+	     * So this method only fixes the last step 'Traslate', which does not affect
+	     * scaling and rotating.
+	     *
+	     * If be called repeatly with the same input el, the same result will be gotten.
+	     *
+	     * @param {module:zrender/Element} el Should have `getBoundingRect` method.
+	     * @param {Object} positionInfo
+	     * @param {number|string} [positionInfo.left]
+	     * @param {number|string} [positionInfo.top]
+	     * @param {number|string} [positionInfo.right]
+	     * @param {number|string} [positionInfo.bottom]
+	     * @param {Object} containerRect
+	     * @param {string|number} margin
+	     * @param {Object} [opt]
+	     * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.
+	     * @param {Array.<number>} [opt.boundingMode='all']
+	     *        Specify how to calculate boundingRect when locating.
+	     *        'all': Position the boundingRect that is transformed and uioned
+	     *               both itself and its descendants.
+	     *               This mode simplies confine the elements in the bounding
+	     *               of their container (e.g., using 'right: 0').
+	     *        'raw': Position the boundingRect that is not transformed and only itself.
+	     *               This mode is useful when you want a element can overflow its
+	     *               container. (Consider a rotated circle needs to be located in a corner.)
+	     *               In this mode positionInfo.width/height can only be number.
+	     */
+	    layout.positionElement = function (el, positionInfo, containerRect, margin, opt) {
+	        var h = !opt || !opt.hv || opt.hv[0];
+	        var v = !opt || !opt.hv || opt.hv[1];
+	        var boundingMode = opt && opt.boundingMode || 'all';
+
+	        if (!h && !v) {
+	            return;
+	        }
+
+	        var rect;
+	        if (boundingMode === 'raw') {
+	            rect = el.type === 'group'
+	                ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0)
+	                : el.getBoundingRect();
+	        }
+	        else {
+	            rect = el.getBoundingRect();
+	            if (el.needLocalTransform()) {
+	                var transform = el.getLocalTransform();
+	                // Notice: raw rect may be inner object of el,
+	                // which should not be modified.
+	                rect = rect.clone();
+	                rect.applyTransform(transform);
+	            }
+	        }
+
+	        positionInfo = layout.getLayoutRect(
+	            zrUtil.defaults(
+	                {width: rect.width, height: rect.height},
+	                positionInfo
+	            ),
+	            containerRect,
+	            margin
+	        );
+
+	        // Because 'tranlate' is the last step in transform
+	        // (see zrender/core/Transformable#getLocalTransfrom),
+	        // we can just only modify el.position to get final result.
+	        var elPos = el.position;
+	        var dx = h ? positionInfo.x - rect.x : 0;
+	        var dy = v ? positionInfo.y - rect.y : 0;
+
+	        el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);
+	    };
+
+	    /**
+	     * @param {Object} option Contains some of the properties in HV_NAMES.
+	     * @param {number} hvIdx 0: horizontal; 1: vertical.
+	     */
+	    layout.sizeCalculable = function (option, hvIdx) {
+	        return option[HV_NAMES[hvIdx][0]] != null
+	            || (option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null);
+	    };
+
+	    /**
+	     * Consider Case:
+	     * When defulat option has {left: 0, width: 100}, and we set {right: 0}
+	     * through setOption or media query, using normal zrUtil.merge will cause
+	     * {right: 0} does not take effect.
+	     *
+	     * @example
+	     * ComponentModel.extend({
+	     *     init: function () {
+	     *         ...
+	     *         var inputPositionParams = layout.getLayoutParams(option);
+	     *         this.mergeOption(inputPositionParams);
+	     *     },
+	     *     mergeOption: function (newOption) {
+	     *         newOption && zrUtil.merge(thisOption, newOption, true);
+	     *         layout.mergeLayoutParam(thisOption, newOption);
+	     *     }
+	     * });
+	     *
+	     * @param {Object} targetOption
+	     * @param {Object} newOption
+	     * @param {Object|string} [opt]
+	     * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Some component must has width and height.
+	     */
+	    layout.mergeLayoutParam = function (targetOption, newOption, opt) {
+	        !zrUtil.isObject(opt) && (opt = {});
+
+	        var ignoreSize = opt.ignoreSize;
+	        !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);
+
+	        var hResult = merge(HV_NAMES[0], 0);
+	        var vResult = merge(HV_NAMES[1], 1);
+
+	        copy(HV_NAMES[0], targetOption, hResult);
+	        copy(HV_NAMES[1], targetOption, vResult);
+
+	        function merge(names, hvIdx) {
+	            var newParams = {};
+	            var newValueCount = 0;
+	            var merged = {};
+	            var mergedValueCount = 0;
+	            var enoughParamNumber = 2;
+
+	            each(names, function (name) {
+	                merged[name] = targetOption[name];
+	            });
+	            each(names, function (name) {
+	                // Consider case: newOption.width is null, which is
+	                // set by user for removing width setting.
+	                hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);
+	                hasValue(newParams, name) && newValueCount++;
+	                hasValue(merged, name) && mergedValueCount++;
+	            });
+
+	            if (ignoreSize[hvIdx]) {
+	                // Only one of left/right is premitted to exist.
+	                if (hasValue(newOption, names[1])) {
+	                    merged[names[2]] = null;
+	                }
+	                else if (hasValue(newOption, names[2])) {
+	                    merged[names[1]] = null;
+	                }
+	                return merged;
+	            }
+
+	            // Case: newOption: {width: ..., right: ...},
+	            // or targetOption: {right: ...} and newOption: {width: ...},
+	            // There is no conflict when merged only has params count
+	            // little than enoughParamNumber.
+	            if (mergedValueCount === enoughParamNumber || !newValueCount) {
+	                return merged;
+	            }
+	            // Case: newOption: {width: ..., right: ...},
+	            // Than we can make sure user only want those two, and ignore
+	            // all origin params in targetOption.
+	            else if (newValueCount >= enoughParamNumber) {
+	                return newParams;
+	            }
+	            else {
+	                // Chose another param from targetOption by priority.
+	                for (var i = 0; i < names.length; i++) {
+	                    var name = names[i];
+	                    if (!hasProp(newParams, name) && hasProp(targetOption, name)) {
+	                        newParams[name] = targetOption[name];
+	                        break;
+	                    }
+	                }
+	                return newParams;
+	            }
+	        }
+
+	        function hasProp(obj, name) {
+	            return obj.hasOwnProperty(name);
+	        }
+
+	        function hasValue(obj, name) {
+	            return obj[name] != null && obj[name] !== 'auto';
+	        }
+
+	        function copy(names, target, source) {
+	            each(names, function (name) {
+	                target[name] = source[name];
+	            });
+	        }
+	    };
+
+	    /**
+	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+	     * @param {Object} source
+	     * @return {Object} Result contains those props.
+	     */
+	    layout.getLayoutParams = function (source) {
+	        return layout.copyLayoutParams({}, source);
+	    };
+
+	    /**
+	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+	     * @param {Object} source
+	     * @return {Object} Result contains those props.
+	     */
+	    layout.copyLayoutParams = function (target, source) {
+	        source && target && each(LOCATION_PARAMS, function (name) {
+	            source.hasOwnProperty(name) && (target[name] = source[name]);
+	        });
+	        return target;
+	    };
+
+	    module.exports = layout;
+
+
+
+/***/ },
+/* 72 */
+/***/ function(module, exports) {
+
+	
+
+	    module.exports = {
+	        getBoxLayoutParams: function () {
+	            return {
+	                left: this.get('left'),
+	                top: this.get('top'),
+	                right: this.get('right'),
+	                bottom: this.get('bottom'),
+	                width: this.get('width'),
+	                height: this.get('height')
+	            };
+	        }
+	    };
+
+
+/***/ },
+/* 73 */
+/***/ function(module, exports) {
+
+	
+	    var platform = '';
+	    // Navigator not exists in node
+	    if (typeof navigator !== 'undefined') {
+	        platform = navigator.platform || '';
+	    }
+	    module.exports = {
+	        // 全图默认背景
+	        // backgroundColor: 'rgba(0,0,0,0)',
+
+	        // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization
+	        // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'],
+	        // 浅色
+	        // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'],
+	        // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'],
+	        // 深色
+	        color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83',  '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'],
+
+	        // 默认需要 Grid 配置项
+	        // grid: {},
+	        // 主题，主题
+	        textStyle: {
+	            // color: '#000',
+	            // decoration: 'none',
+	            // PENDING
+	            fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',
+	            // fontFamily: 'Arial, Verdana, sans-serif',
+	            fontSize: 12,
+	            fontStyle: 'normal',
+	            fontWeight: 'normal'
+	        },
+
+	        // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/
+	        // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
+	        // Default is source-over
+	        blendMode: null,
+
+	        animation: 'auto',
+	        animationDuration: 1000,
+	        animationDurationUpdate: 300,
+	        animationEasing: 'exponentialOut',
+	        animationEasingUpdate: 'cubicOut',
+
+	        animationThreshold: 2000,
+	        // Configuration for progressive/incremental rendering
+	        progressiveThreshold: 3000,
+	        progressive: 400,
+
+	        // Threshold of if use single hover layer to optimize.
+	        // It is recommended that `hoverLayerThreshold` is equivalent to or less than
+	        // `progressiveThreshold`, otherwise hover will cause restart of progressive,
+	        // which is unexpected.
+	        // see example <echarts/test/heatmap-large.html>.
+	        hoverLayerThreshold: 3000,
+
+	        // See: module:echarts/scale/Time
+	        useUTC: false
+	    };
+
+
+/***/ },
+/* 74 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var classUtil = __webpack_require__(13);
+	    var set = classUtil.set;
+	    var get = classUtil.get;
+
+	    module.exports = {
+	        clearColorPalette: function () {
+	            set(this, 'colorIdx', 0);
+	            set(this, 'colorNameMap', {});
+	        },
+
+	        getColorFromPalette: function (name, scope) {
+	            scope = scope || this;
+	            var colorIdx = get(scope, 'colorIdx') || 0;
+	            var colorNameMap = get(scope, 'colorNameMap') || set(scope, 'colorNameMap', {});
+	            // Use `hasOwnProperty` to avoid conflict with Object.prototype.
+	            if (colorNameMap.hasOwnProperty(name)) {
+	                return colorNameMap[name];
+	            }
+	            var colorPalette = this.get('color', true) || [];
+	            if (!colorPalette.length) {
+	                return;
+	            }
+
+	            var color = colorPalette[colorIdx];
+	            if (name) {
+	                colorNameMap[name] = color;
+	            }
+	            set(scope, 'colorIdx', (colorIdx + 1) % colorPalette.length);
+
+	            return color;
+	        }
+	    };
+
+
+/***/ },
+/* 75 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+
+	    var echartsAPIList = [
+	        'getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed',
+	        'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption',
+	        'getViewOfComponentModel', 'getViewOfSeriesModel'
+	    ];
+	    // And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js
+
+	    function ExtensionAPI(chartInstance) {
+	        zrUtil.each(echartsAPIList, function (name) {
+	            this[name] = zrUtil.bind(chartInstance[name], chartInstance);
+	        }, this);
+	    }
+
+	    module.exports = ExtensionAPI;
+
+
+/***/ },
+/* 76 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+
+	    var coordinateSystemCreators = {};
+
+	    function CoordinateSystemManager() {
+
+	        this._coordinateSystems = [];
+	    }
+
+	    CoordinateSystemManager.prototype = {
+
+	        constructor: CoordinateSystemManager,
+
+	        create: function (ecModel, api) {
+	            var coordinateSystems = [];
+	            zrUtil.each(coordinateSystemCreators, function (creater, type) {
+	                var list = creater.create(ecModel, api);
+	                coordinateSystems = coordinateSystems.concat(list || []);
+	            });
+
+	            this._coordinateSystems = coordinateSystems;
+	        },
+
+	        update: function (ecModel, api) {
+	            zrUtil.each(this._coordinateSystems, function (coordSys) {
+	                // FIXME MUST have
+	                coordSys.update && coordSys.update(ecModel, api);
+	            });
+	        },
+
+	        getCoordinateSystems: function () {
+	            return this._coordinateSystems.slice();
+	        }
+	    };
+
+	    CoordinateSystemManager.register = function (type, coordinateSystemCreator) {
+	        coordinateSystemCreators[type] = coordinateSystemCreator;
+	    };
+
+	    CoordinateSystemManager.get = function (type) {
+	        return coordinateSystemCreators[type];
+	    };
+
+	    module.exports = CoordinateSystemManager;
+
+
+/***/ },
+/* 77 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * ECharts option manager
+	 *
+	 * @module {echarts/model/OptionManager}
+	 */
+
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+	    var ComponentModel = __webpack_require__(69);
+	    var each = zrUtil.each;
+	    var clone = zrUtil.clone;
+	    var map = zrUtil.map;
+	    var merge = zrUtil.merge;
+
+	    var QUERY_REG = /^(min|max)?(.+)$/;
+
+	    /**
+	     * TERM EXPLANATIONS:
+	     *
+	     * [option]:
+	     *
+	     *     An object that contains definitions of components. For example:
+	     *     var option = {
+	     *         title: {...},
+	     *         legend: {...},
+	     *         visualMap: {...},
+	     *         series: [
+	     *             {data: [...]},
+	     *             {data: [...]},
+	     *             ...
+	     *         ]
+	     *     };
+	     *
+	     * [rawOption]:
+	     *
+	     *     An object input to echarts.setOption. 'rawOption' may be an
+	     *     'option', or may be an object contains multi-options. For example:
+	     *     var option = {
+	     *         baseOption: {
+	     *             title: {...},
+	     *             legend: {...},
+	     *             series: [
+	     *                 {data: [...]},
+	     *                 {data: [...]},
+	     *                 ...
+	     *             ]
+	     *         },
+	     *         timeline: {...},
+	     *         options: [
+	     *             {title: {...}, series: {data: [...]}},
+	     *             {title: {...}, series: {data: [...]}},
+	     *             ...
+	     *         ],
+	     *         media: [
+	     *             {
+	     *                 query: {maxWidth: 320},
+	     *                 option: {series: {x: 20}, visualMap: {show: false}}
+	     *             },
+	     *             {
+	     *                 query: {minWidth: 320, maxWidth: 720},
+	     *                 option: {series: {x: 500}, visualMap: {show: true}}
+	     *             },
+	     *             {
+	     *                 option: {series: {x: 1200}, visualMap: {show: true}}
+	     *             }
+	     *         ]
+	     *     };
+	     *
+	     * @alias module:echarts/model/OptionManager
+	     * @param {module:echarts/ExtensionAPI} api
+	     */
+	    function OptionManager(api) {
+
+	        /**
+	         * @private
+	         * @type {module:echarts/ExtensionAPI}
+	         */
+	        this._api = api;
+
+	        /**
+	         * @private
+	         * @type {Array.<number>}
+	         */
+	        this._timelineOptions = [];
+
+	        /**
+	         * @private
+	         * @type {Array.<Object>}
+	         */
+	        this._mediaList = [];
+
+	        /**
+	         * @private
+	         * @type {Object}
+	         */
+	        this._mediaDefault;
+
+	        /**
+	         * -1, means default.
+	         * empty means no media.
+	         * @private
+	         * @type {Array.<number>}
+	         */
+	        this._currentMediaIndices = [];
+
+	        /**
+	         * @private
+	         * @type {Object}
+	         */
+	        this._optionBackup;
+
+	        /**
+	         * @private
+	         * @type {Object}
+	         */
+	        this._newBaseOption;
+	    }
+
+	    // timeline.notMerge is not supported in ec3. Firstly there is rearly
+	    // case that notMerge is needed. Secondly supporting 'notMerge' requires
+	    // rawOption cloned and backuped when timeline changed, which does no
+	    // good to performance. What's more, that both timeline and setOption
+	    // method supply 'notMerge' brings complex and some problems.
+	    // Consider this case:
+	    // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);
+	    // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);
+
+	    OptionManager.prototype = {
+
+	        constructor: OptionManager,
+
+	        /**
+	         * @public
+	         * @param {Object} rawOption Raw option.
+	         * @param {module:echarts/model/Global} ecModel
+	         * @param {Array.<Function>} optionPreprocessorFuncs
+	         * @return {Object} Init option
+	         */
+	        setOption: function (rawOption, optionPreprocessorFuncs) {
+	            rawOption = clone(rawOption, true);
+
+	            // FIXME
+	            // 如果 timeline options 或者 media 中设置了某个属性，而baseOption中没有设置，则进行警告。
+
+	            var oldOptionBackup = this._optionBackup;
+	            var newParsedOption = parseRawOption.call(
+	                this, rawOption, optionPreprocessorFuncs, !oldOptionBackup
+	            );
+	            this._newBaseOption = newParsedOption.baseOption;
+
+	            // For setOption at second time (using merge mode);
+	            if (oldOptionBackup) {
+	                // Only baseOption can be merged.
+	                mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption);
+
+	                // For simplicity, timeline options and media options do not support merge,
+	                // that is, if you `setOption` twice and both has timeline options, the latter
+	                // timeline opitons will not be merged to the formers, but just substitude them.
+	                if (newParsedOption.timelineOptions.length) {
+	                    oldOptionBackup.timelineOptions = newParsedOption.timelineOptions;
+	                }
+	                if (newParsedOption.mediaList.length) {
+	                    oldOptionBackup.mediaList = newParsedOption.mediaList;
+	                }
+	                if (newParsedOption.mediaDefault) {
+	                    oldOptionBackup.mediaDefault = newParsedOption.mediaDefault;
+	                }
+	            }
+	            else {
+	                this._optionBackup = newParsedOption;
+	            }
+	        },
+
+	        /**
+	         * @param {boolean} isRecreate
+	         * @return {Object}
+	         */
+	        mountOption: function (isRecreate) {
+	            var optionBackup = this._optionBackup;
+
+	            // TODO
+	            // 如果没有reset功能则不clone。
+
+	            this._timelineOptions = map(optionBackup.timelineOptions, clone);
+	            this._mediaList = map(optionBackup.mediaList, clone);
+	            this._mediaDefault = clone(optionBackup.mediaDefault);
+	            this._currentMediaIndices = [];
+
+	            return clone(isRecreate
+	                // this._optionBackup.baseOption, which is created at the first `setOption`
+	                // called, and is merged into every new option by inner method `mergeOption`
+	                // each time `setOption` called, can be only used in `isRecreate`, because
+	                // its reliability is under suspicion. In other cases option merge is
+	                // performed by `model.mergeOption`.
+	                ? optionBackup.baseOption : this._newBaseOption
+	            );
+	        },
+
+	        /**
+	         * @param {module:echarts/model/Global} ecModel
+	         * @return {Object}
+	         */
+	        getTimelineOption: function (ecModel) {
+	            var option;
+	            var timelineOptions = this._timelineOptions;
+
+	            if (timelineOptions.length) {
+	                // getTimelineOption can only be called after ecModel inited,
+	                // so we can get currentIndex from timelineModel.
+	                var timelineModel = ecModel.getComponent('timeline');
+	                if (timelineModel) {
+	                    option = clone(
+	                        timelineOptions[timelineModel.getCurrentIndex()],
+	                        true
+	                    );
+	                }
+	            }
+
+	            return option;
+	        },
+
+	        /**
+	         * @param {module:echarts/model/Global} ecModel
+	         * @return {Array.<Object>}
+	         */
+	        getMediaOption: function (ecModel) {
+	            var ecWidth = this._api.getWidth();
+	            var ecHeight = this._api.getHeight();
+	            var mediaList = this._mediaList;
+	            var mediaDefault = this._mediaDefault;
+	            var indices = [];
+	            var result = [];
+
+	            // No media defined.
+	            if (!mediaList.length && !mediaDefault) {
+	                return result;
+	            }
+
+	            // Multi media may be applied, the latter defined media has higher priority.
+	            for (var i = 0, len = mediaList.length; i < len; i++) {
+	                if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {
+	                    indices.push(i);
+	                }
+	            }
+
+	            // FIXME
+	            // 是否mediaDefault应该强制用户设置，否则可能修改不能回归。
+	            if (!indices.length && mediaDefault) {
+	                indices = [-1];
+	            }
+
+	            if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {
+	                result = map(indices, function (index) {
+	                    return clone(
+	                        index === -1 ? mediaDefault.option : mediaList[index].option
+	                    );
+	                });
+	            }
+	            // Otherwise return nothing.
+
+	            this._currentMediaIndices = indices;
+
+	            return result;
+	        }
+	    };
+
+	    function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) {
+	        var timelineOptions = [];
+	        var mediaList = [];
+	        var mediaDefault;
+	        var baseOption;
+
+	        // Compatible with ec2.
+	        var timelineOpt = rawOption.timeline;
+
+	        if (rawOption.baseOption) {
+	            baseOption = rawOption.baseOption;
+	        }
+
+	        // For timeline
+	        if (timelineOpt || rawOption.options) {
+	            baseOption = baseOption || {};
+	            timelineOptions = (rawOption.options || []).slice();
+	        }
+
+	        // For media query
+	        if (rawOption.media) {
+	            baseOption = baseOption || {};
+	            var media = rawOption.media;
+	            each(media, function (singleMedia) {
+	                if (singleMedia && singleMedia.option) {
+	                    if (singleMedia.query) {
+	                        mediaList.push(singleMedia);
+	                    }
+	                    else if (!mediaDefault) {
+	                        // Use the first media default.
+	                        mediaDefault = singleMedia;
+	                    }
+	                }
+	            });
+	        }
+
+	        // For normal option
+	        if (!baseOption) {
+	            baseOption = rawOption;
+	        }
+
+	        // Set timelineOpt to baseOption in ec3,
+	        // which is convenient for merge option.
+	        if (!baseOption.timeline) {
+	            baseOption.timeline = timelineOpt;
+	        }
+
+	        // Preprocess.
+	        each([baseOption].concat(timelineOptions)
+	            .concat(zrUtil.map(mediaList, function (media) {
+	                return media.option;
+	            })),
+	            function (option) {
+	                each(optionPreprocessorFuncs, function (preProcess) {
+	                    preProcess(option, isNew);
+	                });
+	            }
+	        );
+
+	        return {
+	            baseOption: baseOption,
+	            timelineOptions: timelineOptions,
+	            mediaDefault: mediaDefault,
+	            mediaList: mediaList
+	        };
+	    }
+
+	    /**
+	     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
+	     * Support: width, height, aspectRatio
+	     * Can use max or min as prefix.
+	     */
+	    function applyMediaQuery(query, ecWidth, ecHeight) {
+	        var realMap = {
+	            width: ecWidth,
+	            height: ecHeight,
+	            aspectratio: ecWidth / ecHeight // lowser case for convenientce.
+	        };
+
+	        var applicatable = true;
+
+	        zrUtil.each(query, function (value, attr) {
+	            var matched = attr.match(QUERY_REG);
+
+	            if (!matched || !matched[1] || !matched[2]) {
+	                return;
+	            }
+
+	            var operator = matched[1];
+	            var realAttr = matched[2].toLowerCase();
+
+	            if (!compare(realMap[realAttr], value, operator)) {
+	                applicatable = false;
+	            }
+	        });
+
+	        return applicatable;
+	    }
+
+	    function compare(real, expect, operator) {
+	        if (operator === 'min') {
+	            return real >= expect;
+	        }
+	        else if (operator === 'max') {
+	            return real <= expect;
+	        }
+	        else { // Equals
+	            return real === expect;
+	        }
+	    }
+
+	    function indicesEquals(indices1, indices2) {
+	        // indices is always order by asc and has only finite number.
+	        return indices1.join(',') === indices2.join(',');
+	    }
+
+	    /**
+	     * Consider case:
+	     * `chart.setOption(opt1);`
+	     * Then user do some interaction like dataZoom, dataView changing.
+	     * `chart.setOption(opt2);`
+	     * Then user press 'reset button' in toolbox.
+	     *
+	     * After doing that all of the interaction effects should be reset, the
+	     * chart should be the same as the result of invoke
+	     * `chart.setOption(opt1); chart.setOption(opt2);`.
+	     *
+	     * Although it is not able ensure that
+	     * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to
+	     * `chart.setOption(merge(opt1, opt2));` exactly,
+	     * this might be the only simple way to implement that feature.
+	     *
+	     * MEMO: We've considered some other approaches:
+	     * 1. Each model handle its self restoration but not uniform treatment.
+	     *     (Too complex in logic and error-prone)
+	     * 2. Use a shadow ecModel. (Performace expensive)
+	     */
+	    function mergeOption(oldOption, newOption) {
+	        newOption = newOption || {};
+
+	        each(newOption, function (newCptOpt, mainType) {
+	            if (newCptOpt == null) {
+	                return;
+	            }
+
+	            var oldCptOpt = oldOption[mainType];
+
+	            if (!ComponentModel.hasClass(mainType)) {
+	                oldOption[mainType] = merge(oldCptOpt, newCptOpt, true);
+	            }
+	            else {
+	                newCptOpt = modelUtil.normalizeToArray(newCptOpt);
+	                oldCptOpt = modelUtil.normalizeToArray(oldCptOpt);
+
+	                var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt);
+
+	                oldOption[mainType] = map(mapResult, function (item) {
+	                    return (item.option && item.exist)
+	                        ? merge(item.exist, item.option, true)
+	                        : (item.exist || item.option);
+	                });
+	            }
+	        });
+	    }
+
+	    module.exports = OptionManager;
+
+
+/***/ },
+/* 78 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var formatUtil = __webpack_require__(6);
+	    var classUtil = __webpack_require__(13);
+	    var modelUtil = __webpack_require__(5);
+	    var ComponentModel = __webpack_require__(69);
+	    var colorPaletteMixin = __webpack_require__(74);
+	    var env = __webpack_require__(2);
+	    var layout = __webpack_require__(71);
+
+	    var set = classUtil.set;
+	    var get = classUtil.get;
+	    var encodeHTML = formatUtil.encodeHTML;
+	    var addCommas = formatUtil.addCommas;
+
+	    var SeriesModel = ComponentModel.extend({
+
+	        type: 'series.__base__',
+
+	        /**
+	         * @readOnly
+	         */
+	        seriesIndex: 0,
+
+	        // coodinateSystem will be injected in the echarts/CoordinateSystem
+	        coordinateSystem: null,
+
+	        /**
+	         * @type {Object}
+	         * @protected
+	         */
+	        defaultOption: null,
+
+	        /**
+	         * Data provided for legend
+	         * @type {Function}
+	         */
+	        // PENDING
+	        legendDataProvider: null,
+
+	        /**
+	         * Access path of color for visual
+	         */
+	        visualColorAccessPath: 'itemStyle.normal.color',
+
+	        /**
+	         * Support merge layout params.
+	         * Only support 'box' now (left/right/top/bottom/width/height).
+	         * @type {string|Object} Object can be {ignoreSize: true}
+	         * @readOnly
+	         */
+	        layoutMode: null,
+
+	        init: function (option, parentModel, ecModel, extraOpt) {
+
+	            /**
+	             * @type {number}
+	             * @readOnly
+	             */
+	            this.seriesIndex = this.componentIndex;
+
+	            this.mergeDefaultAndTheme(option, ecModel);
+
+	            var data = this.getInitialData(option, ecModel);
+	            if (true) {
+	                zrUtil.assert(data, 'getInitialData returned invalid data.');
+	            }
+	            /**
+	             * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph}
+	             * @private
+	             */
+	            set(this, 'dataBeforeProcessed', data);
+
+	            // If we reverse the order (make data firstly, and then make
+	            // dataBeforeProcessed by cloneShallow), cloneShallow will
+	            // cause data.graph.data !== data when using
+	            // module:echarts/data/Graph or module:echarts/data/Tree.
+	            // See module:echarts/data/helper/linkList
+	            this.restoreData();
+	        },
+
+	        /**
+	         * Util for merge default and theme to option
+	         * @param  {Object} option
+	         * @param  {module:echarts/model/Global} ecModel
+	         */
+	        mergeDefaultAndTheme: function (option, ecModel) {
+	            var layoutMode = this.layoutMode;
+	            var inputPositionParams = layoutMode
+	                ? layout.getLayoutParams(option) : {};
+
+	            zrUtil.merge(
+	                option,
+	                ecModel.getTheme().get(this.subType)
+	            );
+	            zrUtil.merge(option, this.getDefaultOption());
+
+	            // Default label emphasis `position` and `show`
+	            // FIXME Set label in mergeOption
+	            modelUtil.defaultEmphasis(option.label, modelUtil.LABEL_OPTIONS);
+
+	            this.fillDataTextStyle(option.data);
+
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
+	            }
+	        },
+
+	        mergeOption: function (newSeriesOption, ecModel) {
+	            newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);
+	            this.fillDataTextStyle(newSeriesOption.data);
+
+	            var layoutMode = this.layoutMode;
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(this.option, newSeriesOption, layoutMode);
+	            }
+
+	            var data = this.getInitialData(newSeriesOption, ecModel);
+	            // TODO Merge data?
+	            if (data) {
+	                set(this, 'data', data);
+	                set(this, 'dataBeforeProcessed', data.cloneShallow());
+	            }
+	        },
+
+	        fillDataTextStyle: function (data) {
+	            // Default data label emphasis `position` and `show`
+	            // FIXME Tree structure data ?
+	            // FIXME Performance ?
+	            if (data) {
+	                for (var i = 0; i < data.length; i++) {
+	                    if (data[i] && data[i].label) {
+	                        modelUtil.defaultEmphasis(data[i].label, modelUtil.LABEL_OPTIONS);
+	                    }
+	                }
+	            }
+	        },
+
+	        /**
+	         * Init a data structure from data related option in series
+	         * Must be overwritten
+	         */
+	        getInitialData: function () {},
+
+	        /**
+	         * @param {string} [dataType]
+	         * @return {module:echarts/data/List}
+	         */
+	        getData: function (dataType) {
+	            var data = get(this, 'data');
+	            return dataType == null ? data : data.getLinkedData(dataType);
+	        },
+
+	        /**
+	         * @param {module:echarts/data/List} data
+	         */
+	        setData: function (data) {
+	            set(this, 'data', data);
+	        },
+
+	        /**
+	         * Get data before processed
+	         * @return {module:echarts/data/List}
+	         */
+	        getRawData: function () {
+	            return get(this, 'dataBeforeProcessed');
+	        },
+
+	        /**
+	         * Coord dimension to data dimension.
+	         *
+	         * By default the result is the same as dimensions of series data.
+	         * But in some series data dimensions are different from coord dimensions (i.e.
+	         * candlestick and boxplot). Override this method to handle those cases.
+	         *
+	         * Coord dimension to data dimension can be one-to-many
+	         *
+	         * @param {string} coordDim
+	         * @return {Array.<string>} dimensions on the axis.
+	         */
+	        coordDimToDataDim: function (coordDim) {
+	            return modelUtil.coordDimToDataDim(this.getData(), coordDim);
+	        },
+
+	        /**
+	         * Convert data dimension to coord dimension.
+	         *
+	         * @param {string|number} dataDim
+	         * @return {string}
+	         */
+	        dataDimToCoordDim: function (dataDim) {
+	            return modelUtil.dataDimToCoordDim(this.getData(), dataDim);
+	        },
+
+	        /**
+	         * Get base axis if has coordinate system and has axis.
+	         * By default use coordSys.getBaseAxis();
+	         * Can be overrided for some chart.
+	         * @return {type} description
+	         */
+	        getBaseAxis: function () {
+	            var coordSys = this.coordinateSystem;
+	            return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
+	        },
+
+	        // FIXME
+	        /**
+	         * Default tooltip formatter
+	         *
+	         * @param {number} dataIndex
+	         * @param {boolean} [multipleSeries=false]
+	         * @param {number} [dataType]
+	         */
+	        formatTooltip: function (dataIndex, multipleSeries, dataType) {
+	            function formatArrayValue(value) {
+	                var vertially = zrUtil.reduce(value, function (vertially, val, idx) {
+	                    var dimItem = data.getDimensionInfo(idx);
+	                    return vertially |= dimItem.tooltip !== false && dimItem.tooltipName != null;
+	                }, 0);
+
+	                var result = [];
+	                var tooltipDims = modelUtil.otherDimToDataDim(data, 'tooltip');
+
+	                tooltipDims.length
+	                    ? zrUtil.each(tooltipDims, function (dimIdx) {
+	                        setEachItem(data.get(dimIdx, dataIndex), dimIdx);
+	                    })
+	                    // By default, all dims is used on tooltip.
+	                    : zrUtil.each(value, setEachItem);
+
+	                function setEachItem(val, dimIdx) {
+	                    var dimInfo = data.getDimensionInfo(dimIdx);
+	                    // If `dimInfo.tooltip` is not set, show tooltip.
+	                    if (!dimInfo || dimInfo.otherDims.tooltip === false) {
+	                        return;
+	                    }
+	                    var dimType = dimInfo.type;
+	                    var valStr = (vertially ? '- ' + (dimInfo.tooltipName || dimInfo.name) + ': ' : '')
+	                        + (dimType === 'ordinal'
+	                            ? val + ''
+	                            : dimType === 'time'
+	                            ? (multipleSeries ? '' : formatUtil.formatTime('yyyy/MM/dd hh:mm:ss', val))
+	                            : addCommas(val)
+	                        );
+	                    valStr && result.push(encodeHTML(valStr));
+	                }
+
+	                return (vertially ? '<br/>' : '') + result.join(vertially ? '<br/>' : ', ');
+	            }
+
+	            var data = get(this, 'data');
+
+	            var value = this.getRawValue(dataIndex);
+	            var formattedValue = zrUtil.isArray(value)
+	                ? formatArrayValue(value) : encodeHTML(addCommas(value));
+	            var name = data.getName(dataIndex);
+
+	            var color = data.getItemVisual(dataIndex, 'color');
+	            if (zrUtil.isObject(color) && color.colorStops) {
+	                color = (color.colorStops[0] || {}).color;
+	            }
+	            color = color || 'transparent';
+
+	            var colorEl = formatUtil.getTooltipMarker(color);
+
+	            var seriesName = this.name;
+	            // FIXME
+	            if (seriesName === '\0-') {
+	                // Not show '-'
+	                seriesName = '';
+	            }
+	            seriesName = seriesName
+	                ? encodeHTML(seriesName) + (!multipleSeries ? '<br/>' : ': ')
+	                : '';
+	            return !multipleSeries
+	                ? seriesName + colorEl
+	                    + (name
+	                        ? encodeHTML(name) + ': ' + formattedValue
+	                        : formattedValue
+	                    )
+	                : colorEl + seriesName + formattedValue;
+	        },
+
+	        /**
+	         * @return {boolean}
+	         */
+	        isAnimationEnabled: function () {
+	            if (env.node) {
+	                return false;
+	            }
+
+	            var animationEnabled = this.getShallow('animation');
+	            if (animationEnabled) {
+	                if (this.getData().count() > this.getShallow('animationThreshold')) {
+	                    animationEnabled = false;
+	                }
+	            }
+	            return animationEnabled;
+	        },
+
+	        restoreData: function () {
+	            set(this, 'data', get(this, 'dataBeforeProcessed').cloneShallow());
+	        },
+
+	        getColorFromPalette: function (name, scope) {
+	            var ecModel = this.ecModel;
+	            // PENDING
+	            var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope);
+	            if (!color) {
+	                color = ecModel.getColorFromPalette(name, scope);
+	            }
+	            return color;
+	        },
+
+	        /**
+	         * Get data indices for show tooltip content. See tooltip.
+	         * @abstract
+	         * @param {Array.<string>|string} dim
+	         * @param {Array.<number>} value
+	         * @param {module:echarts/coord/single/SingleAxis} baseAxis
+	         * @return {Object} {dataIndices, nestestValue}.
+	         */
+	        getAxisTooltipData: null,
+
+	        /**
+	         * See tooltip.
+	         * @abstract
+	         * @param {number} dataIndex
+	         * @return {Array.<number>} Point of tooltip. null/undefined can be returned.
+	         */
+	        getTooltipPosition: null
+	    });
+
+	    zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin);
+	    zrUtil.mixin(SeriesModel, colorPaletteMixin);
+
+	    module.exports = SeriesModel;
+
+
+/***/ },
+/* 79 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var Group = __webpack_require__(48);
+	    var componentUtil = __webpack_require__(70);
+	    var clazzUtil = __webpack_require__(13);
+
+	    var Component = function () {
+	        /**
+	         * @type {module:zrender/container/Group}
+	         * @readOnly
+	         */
+	        this.group = new Group();
+
+	        /**
+	         * @type {string}
+	         * @readOnly
+	         */
+	        this.uid = componentUtil.getUID('viewComponent');
+	    };
+
+	    Component.prototype = {
+
+	        constructor: Component,
+
+	        init: function (ecModel, api) {},
+
+	        render: function (componentModel, ecModel, api, payload) {},
+
+	        dispose: function () {}
+
+	    };
+
+	    var componentProto = Component.prototype;
+	    componentProto.updateView
+	        = componentProto.updateLayout
+	        = componentProto.updateVisual
+	        = function (seriesModel, ecModel, api, payload) {
+	            // Do nothing;
+	        };
+	    // Enable Component.extend.
+	    clazzUtil.enableClassExtend(Component);
+
+	    // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+	    clazzUtil.enableClassManagement(Component, {registerWhenExtend: true});
+
+	    module.exports = Component;
+
+
+/***/ },
+/* 80 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var Group = __webpack_require__(48);
+	    var componentUtil = __webpack_require__(70);
+	    var clazzUtil = __webpack_require__(13);
+	    var modelUtil = __webpack_require__(5);
+	    var zrUtil = __webpack_require__(4);
+
+	    function Chart() {
+
+	        /**
+	         * @type {module:zrender/container/Group}
+	         * @readOnly
+	         */
+	        this.group = new Group();
+
+	        /**
+	         * @type {string}
+	         * @readOnly
+	         */
+	        this.uid = componentUtil.getUID('viewChart');
+	    }
+
+	    Chart.prototype = {
+
+	        type: 'chart',
+
+	        /**
+	         * Init the chart
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         */
+	        init: function (ecModel, api) {},
+
+	        /**
+	         * Render the chart
+	         * @param  {module:echarts/model/Series} seriesModel
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         * @param  {Object} payload
+	         */
+	        render: function (seriesModel, ecModel, api, payload) {},
+
+	        /**
+	         * Highlight series or specified data item
+	         * @param  {module:echarts/model/Series} seriesModel
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         * @param  {Object} payload
+	         */
+	        highlight: function (seriesModel, ecModel, api, payload) {
+	            toggleHighlight(seriesModel.getData(), payload, 'emphasis');
+	        },
+
+	        /**
+	         * Downplay series or specified data item
+	         * @param  {module:echarts/model/Series} seriesModel
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         * @param  {Object} payload
+	         */
+	        downplay: function (seriesModel, ecModel, api, payload) {
+	            toggleHighlight(seriesModel.getData(), payload, 'normal');
+	        },
+
+	        /**
+	         * Remove self
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         */
+	        remove: function (ecModel, api) {
+	            this.group.removeAll();
+	        },
+
+	        /**
+	         * Dispose self
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         */
+	        dispose: function () {}
+
+	        /**
+	         * The view contains the given point.
+	         * @interface
+	         * @param {Array.<number>} point
+	         * @return {boolean}
+	         */
+	        // containPoint: function () {}
+
+	    };
+
+	    var chartProto = Chart.prototype;
+	    chartProto.updateView
+	        = chartProto.updateLayout
+	        = chartProto.updateVisual
+	        = function (seriesModel, ecModel, api, payload) {
+	            this.render(seriesModel, ecModel, api, payload);
+	        };
+
+	    /**
+	     * Set state of single element
+	     * @param  {module:zrender/Element} el
+	     * @param  {string} state
+	     */
+	    function elSetState(el, state) {
+	        if (el) {
+	            el.trigger(state);
+	            if (el.type === 'group') {
+	                for (var i = 0; i < el.childCount(); i++) {
+	                    elSetState(el.childAt(i), state);
+	                }
+	            }
+	        }
+	    }
+	    /**
+	     * @param  {module:echarts/data/List} data
+	     * @param  {Object} payload
+	     * @param  {string} state 'normal'|'emphasis'
+	     * @inner
+	     */
+	    function toggleHighlight(data, payload, state) {
+	        var dataIndex = modelUtil.queryDataIndex(data, payload);
+
+	        if (dataIndex != null) {
+	            zrUtil.each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {
+	                elSetState(data.getItemGraphicEl(dataIdx), state);
+	            });
+	        }
+	        else {
+	            data.eachItemGraphicEl(function (el) {
+	                elSetState(el, state);
+	            });
+	        }
+	    }
+
+	    // Enable Chart.extend.
+	    clazzUtil.enableClassExtend(Chart, ['dispose']);
+
+	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+	    clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true});
+
+	    module.exports = Chart;
+
+
+/***/ },
 /* 81 */
 /***/ function(module, exports) {
 
@@ -17871,7 +18012,7 @@
 	 */
 	// Global defines
 
-	    var guid = __webpack_require__(32);
+	    var guid = __webpack_require__(24);
 	    var env = __webpack_require__(2);
 	    var zrUtil = __webpack_require__(4);
 
@@ -17893,7 +18034,7 @@
 	    /**
 	     * @type {string}
 	     */
-	    zrender.version = '3.4.4';
+	    zrender.version = '3.5.0';
 
 	    /**
 	     * Initializing a zrender instance
@@ -18311,7 +18452,7 @@
 	    var util = __webpack_require__(4);
 	    var Draggable = __webpack_require__(84);
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 
 	    var SILENT = 'silent';
 
@@ -18596,6 +18737,8 @@
 	            var isSilent;
 	            while (el) {
 	                // If clipped by ancestor.
+	                // FIXME: If clipPath has neither stroke nor fill,
+	                // el.clipPath.contain(x, y) will always return false.
 	                if (el.clipPath && !el.clipPath.contain(x, y))  {
 	                    return false;
 	                }
@@ -18616,6 +18759,7 @@
 	    module.exports = Handler;
 
 
+
 /***/ },
 /* 84 */
 /***/ function(module, exports) {
@@ -18725,7 +18869,7 @@
 	    var util = __webpack_require__(4);
 	    var env = __webpack_require__(2);
 
-	    var Group = __webpack_require__(30);
+	    var Group = __webpack_require__(48);
 
 	    // Use timsort because in most case elements are partially sorted
 	    // https://jsfiddle.net/pissang/jr4x7mdm/8/
@@ -19668,7 +19812,7 @@
 
 	    var requestAnimationFrame = __webpack_require__(89);
 
-	    var Animator = __webpack_require__(36);
+	    var Animator = __webpack_require__(28);
 	    /**
 	     * @typedef {Object} IZRenderStage
 	     * @property {Function} update
@@ -19919,7 +20063,7 @@
 	 */
 
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var env = __webpack_require__(2);
 
 	    var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener;
@@ -20083,7 +20227,7 @@
 
 	    var eventTool = __webpack_require__(88);
 	    var zrUtil = __webpack_require__(4);
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var env = __webpack_require__(2);
 	    var GestureMgr = __webpack_require__(91);
 
@@ -20599,9 +20743,9 @@
 	 */
 	 
 
-	    var config = __webpack_require__(42);
+	    var config = __webpack_require__(34);
 	    var util = __webpack_require__(4);
-	    var log = __webpack_require__(41);
+	    var log = __webpack_require__(33);
 	    var BoundingRect = __webpack_require__(9);
 	    var timsort = __webpack_require__(86);
 
@@ -21562,11 +21706,41 @@
 	            var displayList = this.storage.getDisplayList(true);
 
 	            var scope = {};
+	            var zlevel;
+
+	            var self = this;
+	            function findAndDrawOtherLayer(smaller, larger) {
+	                var zlevelList = self._zlevelList;
+	                if (smaller == null) {
+	                    smaller = -Infinity;
+	                }
+	                var intermediateLayer;
+	                for (var i = 0; i < zlevelList.length; i++) {
+	                    var z = zlevelList[i];
+	                    var layer = self._layers[z];
+	                    if (!layer.__builtin__ && z > smaller && z < larger) {
+	                        intermediateLayer = layer;
+	                        break;
+	                    }
+	                }
+	                if (intermediateLayer && intermediateLayer.renderToCanvas) {
+	                    imageLayer.ctx.save();
+	                    intermediateLayer.renderToCanvas(imageLayer.ctx);
+	                    imageLayer.ctx.restore();
+	                }
+	            }
 	            for (var i = 0; i < displayList.length; i++) {
 	                var el = displayList[i];
+
+	                if (el.zlevel !== zlevel) {
+	                    findAndDrawOtherLayer(zlevel, el.zlevel);
+	                    zlevel = el.zlevel;
+	                }
 	                this._doPaintEl(el, imageLayer, true, scope);
 	            }
 
+	            findAndDrawOtherLayer(zlevel, Infinity);
+
 	            return imageLayer.dom;
 	        },
 	        /**
@@ -21643,7 +21817,7 @@
 	                path.brush(ctx);
 	            }
 
-	            var ImageShape = __webpack_require__(62);
+	            var ImageShape = __webpack_require__(49);
 	            var imgShape = new ImageShape({
 	                style: {
 	                    x: 0,
@@ -21683,9 +21857,9 @@
 
 
 	    var util = __webpack_require__(4);
-	    var config = __webpack_require__(42);
-	    var Style = __webpack_require__(48);
-	    var Pattern = __webpack_require__(60);
+	    var config = __webpack_require__(34);
+	    var Style = __webpack_require__(22);
+	    var Pattern = __webpack_require__(46);
 
 	    function returnFalse() {
 	        return false;
@@ -21912,7 +22086,7 @@
 /***/ function(module, exports, __webpack_require__) {
 
 	
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 	    module.exports = function (ecModel) {
 	        function encodeColor(seriesModel) {
 	            var colorAccessPath = (seriesModel.visualColorAccessPath || 'itemStyle.normal.color').split('.');
@@ -22144,7 +22318,7 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var PI = Math.PI;
 	    /**
@@ -22278,7 +22452,7 @@
 	        'stackedOn', 'hasItemOption', '_nameList', '_idList', '_rawData'
 	    ];
 
-	    var transferProperties = function (a, b) {
+	    function transferProperties(a, b) {
 	        zrUtil.each(TRANSFERABLE_PROPERTIES.concat(b.__wrappedMethods || []), function (propName) {
 	            if (b.hasOwnProperty(propName)) {
 	                a[propName] = b[propName];
@@ -22286,6 +22460,19 @@
 	        });
 
 	        a.__wrappedMethods = b.__wrappedMethods;
+	    }
+
+	    function DefaultDataProvider(dataArray) {
+	        this._array = dataArray || [];
+	    }
+
+	    DefaultDataProvider.prototype.pure = false;
+
+	    DefaultDataProvider.prototype.count = function () {
+	        return this._array.length;
+	    };
+	    DefaultDataProvider.prototype.getItem = function (idx) {
+	        return this._array[idx];
 	    };
 
 	    /**
@@ -22310,6 +22497,8 @@
 	                dimensionName = dimensions[i];
 	                dimensionInfo = {
 	                    name: dimensionName,
+	                    coordDim: dimensionName,
+	                    coordDimIndex: 0,
 	                    stackable: false,
 	                    // Type can be 'float', 'int', 'number'
 	                    // Default is number, Precision of float may not enough
@@ -22320,10 +22509,16 @@
 	                dimensionInfo = dimensions[i];
 	                dimensionName = dimensionInfo.name;
 	                dimensionInfo.type = dimensionInfo.type || 'number';
+	                if (!dimensionInfo.coordDim) {
+	                    dimensionInfo.coordDim = dimensionName;
+	                    dimensionInfo.coordDimIndex = 0;
+	                }
 	            }
+	            dimensionInfo.otherDims = dimensionInfo.otherDims || {};
 	            dimensionNames.push(dimensionName);
 	            dimensionInfos[dimensionName] = dimensionInfo;
 	        }
+
 	        /**
 	         * @readOnly
 	         * @type {Array.<string>}
@@ -22369,6 +22564,7 @@
 	         * @type {Array.<string>}
 	         */
 	        this._idList = [];
+
 	        /**
 	         * Models of data option is stored sparse for optimizing memory cost
 	         * @type {Array.<module:echarts/model/Model>}
@@ -22432,6 +22628,7 @@
 	    var listProto = List.prototype;
 
 	    listProto.type = 'list';
+
 	    /**
 	     * If each data item has it's own option
 	     * @type {boolean}
@@ -22451,6 +22648,7 @@
 	        }
 	        return dim;
 	    };
+
 	    /**
 	     * Get type and stackable info of particular dimension
 	     * @param {string|number} dim
@@ -22470,9 +22668,13 @@
 	    listProto.initData = function (data, nameList, dimValueGetter) {
 	        data = data || [];
 
+	        var isDataArray = zrUtil.isArray(data);
+	        if (isDataArray) {
+	            data = new DefaultDataProvider(data);
+	        }
 	        if (true) {
-	            if (!zrUtil.isArray(data)) {
-	                throw new Error('Invalid data.');
+	            if (!isDataArray && (typeof data.getItem != 'function' || typeof data.count != 'function')) {
+	                throw new Error('Inavlid data provider.');
 	            }
 	        }
 
@@ -22483,17 +22685,20 @@
 	        var indices = this.indices = [];
 
 	        var dimensions = this.dimensions;
-	        var size = data.length;
 	        var dimensionInfoMap = this._dimensionInfos;
 
+	        var size = data.count();
+
 	        var idList = [];
 	        var nameRepeatCount = {};
+	        var nameDimIdx;
 
 	        nameList = nameList || [];
 
 	        // Init storage
 	        for (var i = 0; i < dimensions.length; i++) {
 	            var dimInfo = dimensionInfoMap[dimensions[i]];
+	            dimInfo.otherDims.itemName === 0 && (nameDimIdx = i);
 	            var DataCtor = dataCtors[dimInfo.type];
 	            storage[dimensions[i]] = new DataCtor(size);
 	        }
@@ -22518,8 +22723,9 @@
 	            );
 	        };
 
-	        for (var idx = 0; idx < data.length; idx++) {
-	            var dataItem = data[idx];
+	        for (var i = 0; i < size; i++) {
+	            // NOTICE: Try not to write things into dataItem
+	            var dataItem = data.getItem(i);
 	            // Each data item is value
 	            // [1, 2]
 	            // 2
@@ -22532,22 +22738,26 @@
 	                var dim = dimensions[k];
 	                var dimStorage = storage[dim];
 	                // PENDING NULL is empty or zero
-	                dimStorage[idx] = dimValueGetter(dataItem, dim, idx, k);
+	                dimStorage[i] = dimValueGetter(dataItem, dim, i, k);
 	            }
 
-	            indices.push(idx);
+	            indices.push(i);
 	        }
 
 	        // Use the name in option and create id
-	        for (var i = 0; i < data.length; i++) {
-	            if (!nameList[i]) {
-	                if (data[i] && data[i].name != null) {
-	                    nameList[i] = data[i].name;
+	        for (var i = 0; i < size; i++) {
+	            var dataItem = data.getItem(i);
+	            if (!nameList[i] && dataItem) {
+	                if (dataItem.name != null) {
+	                    nameList[i] = dataItem.name;
+	                }
+	                else if (nameDimIdx != null) {
+	                    nameList[i] = storage[dimensions[nameDimIdx]][i];
 	                }
 	            }
 	            var name = nameList[i] || '';
 	            // Try using the id in option
-	            var id = data[i] && data[i].id;
+	            var id = dataItem && dataItem.id;
 
 	            if (!id && name) {
 	                // Use name as id and add counter to avoid same name
@@ -22584,11 +22794,11 @@
 	        var dataIndex = this.indices[idx];
 
 	        // If value not exists
-	        if (dataIndex == null) {
+	        if (dataIndex == null || !storage[dim]) {
 	            return NaN;
 	        }
 
-	        var value = storage[dim] && storage[dim][dataIndex];
+	        var value = storage[dim][dataIndex];
 	        // FIXME ordinal data type is not stackable
 	        if (stack) {
 	            var dimensionInfo = this._dimensionInfos[dim];
@@ -22845,7 +23055,7 @@
 	     * @return {number}
 	     */
 	    listProto.getRawDataItem = function (idx) {
-	        return this._rawData[this.getRawIndex(idx)];
+	        return this._rawData.getItem(this.getRawIndex(idx));
 	    };
 
 	    /**
@@ -22954,7 +23164,10 @@
 	        for (var i = 0; i < indices.length; i++) {
 	            var keep;
 	            // Simple optimization
-	            if (dimSize === 1) {
+	            if (!dimSize) {
+	                keep = cb.call(context, i);
+	            }
+	            else if (dimSize === 1) {
 	                keep = cb.call(
 	                    context, this.get(dimensions[0], i, stack), i
 	                );
@@ -23129,7 +23342,7 @@
 	    listProto.getItemModel = function (idx) {
 	        var hostModel = this.hostModel;
 	        idx = this.indices[idx];
-	        return new Model(this._rawData[idx], hostModel, hostModel && hostModel.ecModel);
+	        return new Model(this._rawData.getItem(idx), hostModel, hostModel && hostModel.ecModel);
 	    };
 
 	    /**
@@ -23246,7 +23459,7 @@
 	     * Get visual property of single data item
 	     * @param {number} idx
 	     * @param {string} key
-	     * @param {boolean} ignoreParent
+	     * @param {boolean} [ignoreParent=false]
 	     */
 	    listProto.getItemVisual = function (idx, key, ignoreParent) {
 	        var itemVisual = this._itemVisuals[idx];
@@ -23504,7 +23717,8 @@
 
 	    function initIndexMap(arr, map, keyArr, keyGetter) {
 	        for (var i = 0; i < arr.length; i++) {
-	            var key = keyGetter(arr[i], i);
+	            // Add prefix to avoid conflict with Object.prototype.
+	            var key = '_ec_' + keyGetter(arr[i], i);
 	            var existence = map[key];
 	            if (existence == null) {
 	                keyArr.push(key);
@@ -23531,6 +23745,7 @@
 	    var numberUtil = __webpack_require__(7);
 	    var linearMap = numberUtil.linearMap;
 	    var zrUtil = __webpack_require__(4);
+	    var axisHelper = __webpack_require__(101);
 
 	    function fixExtentWithBands(extent, nTick) {
 	        var size = extent[1] - extent[0];
@@ -23575,6 +23790,12 @@
 	         * @type {boolean}
 	         */
 	        this.onBand = false;
+
+	        /**
+	         * @private
+	         * @type {number}
+	         */
+	        this._labelInterval;
 	    };
 
 	    Axis.prototype = {
@@ -23607,8 +23828,7 @@
 	         * @return {Array.<number>}
 	         */
 	        getExtent: function () {
-	            var ret = this._extent.slice();
-	            return ret;
+	            return this._extent.slice();
 	        },
 
 	        /**
@@ -23752,6 +23972,32 @@
 	            var size = Math.abs(axisExtent[1] - axisExtent[0]);
 
 	            return Math.abs(size) / len;
+	        },
+
+	        /**
+	         * Get interval of the axis label.
+	         * @return {number}
+	         */
+	        getLabelInterval: function () {
+	            var labelInterval = this._labelInterval;
+	            if (!labelInterval) {
+	                var axisModel = this.model;
+	                var labelModel = axisModel.getModel('axisLabel');
+	                var interval = labelModel.get('interval');
+	                if (!(this.type === 'category' && interval === 'auto')) {
+	                    labelInterval = interval === 'auto' ? 0 : interval;
+	                }
+	                else if (this.isHorizontal){
+	                    labelInterval = axisHelper.getAxisLabelInterval(
+	                        zrUtil.map(this.scale.getTicks(), this.dataToCoord, this),
+	                        axisModel.getFormattedLabels(),
+	                        labelModel.getModel('textStyle').getFont(),
+	                        this.isHorizontal()
+	                    );
+	                }
+	                this._labelInterval = labelInterval;
+	            }
+	            return labelInterval;
 	        }
 
 	    };
@@ -23765,9 +24011,1238 @@
 
 	
 
-	    var createListFromArray = __webpack_require__(102);
-	    var symbolUtil = __webpack_require__(104);
-	    var axisHelper = __webpack_require__(105);
+	    var OrdinalScale = __webpack_require__(102);
+	    var IntervalScale = __webpack_require__(104);
+	    __webpack_require__(106);
+	    __webpack_require__(107);
+	    var Scale = __webpack_require__(103);
+
+	    var numberUtil = __webpack_require__(7);
+	    var zrUtil = __webpack_require__(4);
+	    var textContain = __webpack_require__(8);
+	    var axisHelper = {};
+
+	    /**
+	     * Get axis scale extent before niced.
+	     * Item of returned array can only be number (including Infinity and NaN).
+	     */
+	    axisHelper.getScaleExtent = function (scale, model) {
+	        var scaleType = scale.type;
+
+	        var min = model.getMin();
+	        var max = model.getMax();
+	        var fixMin = min != null;
+	        var fixMax = max != null;
+	        var originalExtent = scale.getExtent();
+
+	        var axisDataLen;
+	        var boundaryGap;
+	        var span;
+	        if (scaleType === 'ordinal') {
+	            axisDataLen = (model.get('data') || []).length;
+	        }
+	        else {
+	            boundaryGap = model.get('boundaryGap');
+	            if (!zrUtil.isArray(boundaryGap)) {
+	                boundaryGap = [boundaryGap || 0, boundaryGap || 0];
+	            }
+	            if (typeof boundaryGap[0] === 'boolean') {
+	                if (true) {
+	                    console.warn('Boolean type for boundaryGap is only '
+	                        + 'allowed for ordinal axis. Please use string in '
+	                        + 'percentage instead, e.g., "20%". Currently, '
+	                        + 'boundaryGap is set to be 0.');
+	                }
+	                boundaryGap = [0, 0];
+	            }
+	            boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1);
+	            boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1);
+	            span = (originalExtent[1] - originalExtent[0])
+	                || Math.abs(originalExtent[0]);
+	        }
+
+	        // Notice: When min/max is not set (that is, when there are null/undefined,
+	        // which is the most common case), these cases should be ensured:
+	        // (1) For 'ordinal', show all axis.data.
+	        // (2) For others:
+	        //      + `boundaryGap` is applied (if min/max set, boundaryGap is
+	        //      disabled).
+	        //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should
+	        //      be the result that originalExtent enlarged by boundaryGap.
+	        // (3) If no data, it should be ensured that `scale.setBlank` is set.
+
+	        // FIXME
+	        // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used?
+	        // (2) When `needCrossZero` and all data is positive/negative, should it be ensured
+	        // that the results processed by boundaryGap are positive/negative?
+
+	        if (min == null) {
+	            min = scaleType === 'ordinal'
+	                ? (axisDataLen ? 0 : NaN)
+	                : originalExtent[0] - boundaryGap[0] * span;
+	        }
+	        if (max == null) {
+	            max = scaleType === 'ordinal'
+	                ? (axisDataLen ? axisDataLen - 1 : NaN)
+	                : originalExtent[1] + boundaryGap[1] * span;
+	        }
+
+	        if (min === 'dataMin') {
+	            min = originalExtent[0];
+	        }
+	        if (max === 'dataMax') {
+	            max = originalExtent[1];
+	        }
+
+	        (min == null || !isFinite(min)) && (min = NaN);
+	        (max == null || !isFinite(max)) && (max = NaN);
+
+	        scale.setBlank(zrUtil.eqNaN(min) || zrUtil.eqNaN(max));
+
+	        // Evaluate if axis needs cross zero
+	        if (model.getNeedCrossZero()) {
+	            // Axis is over zero and min is not set
+	            if (min > 0 && max > 0 && !fixMin) {
+	                min = 0;
+	            }
+	            // Axis is under zero and max is not set
+	            if (min < 0 && max < 0 && !fixMax) {
+	                max = 0;
+	            }
+	        }
+
+	        return [min, max];
+	    };
+
+	    axisHelper.niceScaleExtent = function (scale, model) {
+	        var extent = axisHelper.getScaleExtent(scale, model);
+	        var fixMin = model.getMin() != null;
+	        var fixMax = model.getMax() != null;
+	        var splitNumber = model.get('splitNumber');
+
+	        if (scale.type === 'log') {
+	            scale.base = model.get('logBase');
+	        }
+
+	        scale.setExtent(extent[0], extent[1]);
+	        scale.niceExtent({
+	            splitNumber: splitNumber,
+	            fixMin: fixMin,
+	            fixMax: fixMax,
+	            minInterval: scale.type === 'interval' ? model.get('minInterval') : null
+	        });
+
+	        // If some one specified the min, max. And the default calculated interval
+	        // is not good enough. He can specify the interval. It is often appeared
+	        // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard
+	        // to be 60.
+	        // FIXME
+	        var interval = model.get('interval');
+	        if (interval != null) {
+	            scale.setInterval && scale.setInterval(interval);
+	        }
+	    };
+
+	    /**
+	     * @param {module:echarts/model/Model} model
+	     * @param {string} [axisType] Default retrieve from model.type
+	     * @return {module:echarts/scale/*}
+	     */
+	    axisHelper.createScaleByModel = function(model, axisType) {
+	        axisType = axisType || model.get('type');
+	        if (axisType) {
+	            switch (axisType) {
+	                // Buildin scale
+	                case 'category':
+	                    return new OrdinalScale(
+	                        model.getCategories(), [Infinity, -Infinity]
+	                    );
+	                case 'value':
+	                    return new IntervalScale();
+	                // Extended scale, like time and log
+	                default:
+	                    return (Scale.getClass(axisType) || IntervalScale).create(model);
+	            }
+	        }
+	    };
+
+	    /**
+	     * Check if the axis corss 0
+	     */
+	    axisHelper.ifAxisCrossZero = function (axis) {
+	        var dataExtent = axis.scale.getExtent();
+	        var min = dataExtent[0];
+	        var max = dataExtent[1];
+	        return !((min > 0 && max > 0) || (min < 0 && max < 0));
+	    };
+
+	    /**
+	     * @param {Array.<number>} tickCoords In axis self coordinate.
+	     * @param {Array.<string>} labels
+	     * @param {string} font
+	     * @param {boolean} isAxisHorizontal
+	     * @return {number}
+	     */
+	    axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) {
+	        // FIXME
+	        // 不同角的axis和label，不只是horizontal和vertical.
+
+	        var textSpaceTakenRect;
+	        var autoLabelInterval = 0;
+	        var accumulatedLabelInterval = 0;
+
+	        var step = 1;
+	        if (labels.length > 40) {
+	            // Simple optimization for large amount of labels
+	            step = Math.floor(labels.length / 40);
+	        }
+
+	        for (var i = 0; i < tickCoords.length; i += step) {
+	            var tickCoord = tickCoords[i];
+	            var rect = textContain.getBoundingRect(
+	                labels[i], font, 'center', 'top'
+	            );
+	            rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord;
+	            // FIXME Magic number 1.5
+	            rect[isAxisHorizontal ? 'width' : 'height'] *= 1.3;
+	            if (!textSpaceTakenRect) {
+	                textSpaceTakenRect = rect.clone();
+	            }
+	            // There is no space for current label;
+	            else if (textSpaceTakenRect.intersect(rect)) {
+	                accumulatedLabelInterval++;
+	                autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval);
+	            }
+	            else {
+	                textSpaceTakenRect.union(rect);
+	                // Reset
+	                accumulatedLabelInterval = 0;
+	            }
+	        }
+	        if (autoLabelInterval === 0 && step > 1) {
+	            return step;
+	        }
+	        return (autoLabelInterval + 1) * step - 1;
+	    };
+
+	    /**
+	     * @param {Object} axis
+	     * @param {Function} labelFormatter
+	     * @return {Array.<string>}
+	     */
+	    axisHelper.getFormattedLabels = function (axis, labelFormatter) {
+	        var scale = axis.scale;
+	        var labels = scale.getTicksLabels();
+	        var ticks = scale.getTicks();
+	        if (typeof labelFormatter === 'string') {
+	            labelFormatter = (function (tpl) {
+	                return function (val) {
+	                    return tpl.replace('{value}', val != null ? val : '');
+	                };
+	            })(labelFormatter);
+	            // Consider empty array
+	            return zrUtil.map(labels, labelFormatter);
+	        }
+	        else if (typeof labelFormatter === 'function') {
+	            return zrUtil.map(ticks, function (tick, idx) {
+	                return labelFormatter(
+	                    axisHelper.getAxisRawValue(axis, tick),
+	                    idx
+	                );
+	            }, this);
+	        }
+	        else {
+	            return labels;
+	        }
+	    };
+
+	    axisHelper.getAxisRawValue = function (axis, value) {
+	        // In category axis with data zoom, tick is not the original
+	        // index of axis.data. So tick should not be exposed to user
+	        // in category axis.
+	        return axis.type === 'category' ? axis.scale.getLabel(value) : value;
+	    };
+
+	    module.exports = axisHelper;
+
+
+/***/ },
+/* 102 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Linear continuous scale
+	 * @module echarts/coord/scale/Ordinal
+	 *
+	 * http://en.wikipedia.org/wiki/Level_of_measurement
+	 */
+
+	// FIXME only one data
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var Scale = __webpack_require__(103);
+
+	    var scaleProto = Scale.prototype;
+
+	    var OrdinalScale = Scale.extend({
+
+	        type: 'ordinal',
+
+	        init: function (data, extent) {
+	            this._data = data;
+	            this._extent = extent || [0, data.length - 1];
+	        },
+
+	        parse: function (val) {
+	            return typeof val === 'string'
+	                ? zrUtil.indexOf(this._data, val)
+	                // val might be float.
+	                : Math.round(val);
+	        },
+
+	        contain: function (rank) {
+	            rank = this.parse(rank);
+	            return scaleProto.contain.call(this, rank)
+	                && this._data[rank] != null;
+	        },
+
+	        /**
+	         * Normalize given rank or name to linear [0, 1]
+	         * @param {number|string} [val]
+	         * @return {number}
+	         */
+	        normalize: function (val) {
+	            return scaleProto.normalize.call(this, this.parse(val));
+	        },
+
+	        scale: function (val) {
+	            return Math.round(scaleProto.scale.call(this, val));
+	        },
+
+	        /**
+	         * @return {Array}
+	         */
+	        getTicks: function () {
+	            var ticks = [];
+	            var extent = this._extent;
+	            var rank = extent[0];
+
+	            while (rank <= extent[1]) {
+	                ticks.push(rank);
+	                rank++;
+	            }
+
+	            return ticks;
+	        },
+
+	        /**
+	         * Get item on rank n
+	         * @param {number} n
+	         * @return {string}
+	         */
+	        getLabel: function (n) {
+	            return this._data[n];
+	        },
+
+	        /**
+	         * @return {number}
+	         */
+	        count: function () {
+	            return this._extent[1] - this._extent[0] + 1;
+	        },
+
+	        /**
+	         * @override
+	         */
+	        unionExtentFromData: function (data, dim) {
+	            this.unionExtent(data.getDataExtent(dim, false));
+	        },
+
+	        niceTicks: zrUtil.noop,
+	        niceExtent: zrUtil.noop
+	    });
+
+	    /**
+	     * @return {module:echarts/scale/Time}
+	     */
+	    OrdinalScale.create = function () {
+	        return new OrdinalScale();
+	    };
+
+	    module.exports = OrdinalScale;
+
+
+/***/ },
+/* 103 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * // Scale class management
+	 * @module echarts/scale/Scale
+	 */
+
+
+	    var clazzUtil = __webpack_require__(13);
+
+	    /**
+	     * @param {Object} [setting]
+	     */
+	    function Scale(setting) {
+	        this._setting = setting || {};
+
+	        /**
+	         * Extent
+	         * @type {Array.<number>}
+	         * @protected
+	         */
+	        this._extent = [Infinity, -Infinity];
+
+	        /**
+	         * Step is calculated in adjustExtent
+	         * @type {Array.<number>}
+	         * @protected
+	         */
+	        this._interval = 0;
+
+	        this.init && this.init.apply(this, arguments);
+	    }
+
+	    var scaleProto = Scale.prototype;
+
+	    /**
+	     * Parse input val to valid inner number.
+	     * @param {*} val
+	     * @return {number}
+	     */
+	    scaleProto.parse = function (val) {
+	        // Notice: This would be a trap here, If the implementation
+	        // of this method depends on extent, and this method is used
+	        // before extent set (like in dataZoom), it would be wrong.
+	        // Nevertheless, parse does not depend on extent generally.
+	        return val;
+	    };
+
+	    scaleProto.getSetting = function (name) {
+	        return this._setting[name];
+	    };
+
+	    scaleProto.contain = function (val) {
+	        var extent = this._extent;
+	        return val >= extent[0] && val <= extent[1];
+	    };
+
+	    /**
+	     * Normalize value to linear [0, 1], return 0.5 if extent span is 0
+	     * @param {number} val
+	     * @return {number}
+	     */
+	    scaleProto.normalize = function (val) {
+	        var extent = this._extent;
+	        if (extent[1] === extent[0]) {
+	            return 0.5;
+	        }
+	        return (val - extent[0]) / (extent[1] - extent[0]);
+	    };
+
+	    /**
+	     * Scale normalized value
+	     * @param {number} val
+	     * @return {number}
+	     */
+	    scaleProto.scale = function (val) {
+	        var extent = this._extent;
+	        return val * (extent[1] - extent[0]) + extent[0];
+	    };
+
+	    /**
+	     * Set extent from data
+	     * @param {Array.<number>} other
+	     */
+	    scaleProto.unionExtent = function (other) {
+	        var extent = this._extent;
+	        other[0] < extent[0] && (extent[0] = other[0]);
+	        other[1] > extent[1] && (extent[1] = other[1]);
+	        // not setExtent because in log axis it may transformed to power
+	        // this.setExtent(extent[0], extent[1]);
+	    };
+
+	    /**
+	     * Set extent from data
+	     * @param {module:echarts/data/List} data
+	     * @param {string} dim
+	     */
+	    scaleProto.unionExtentFromData = function (data, dim) {
+	        this.unionExtent(data.getDataExtent(dim, true));
+	    };
+
+	    /**
+	     * Get extent
+	     * @return {Array.<number>}
+	     */
+	    scaleProto.getExtent = function () {
+	        return this._extent.slice();
+	    };
+
+	    /**
+	     * Set extent
+	     * @param {number} start
+	     * @param {number} end
+	     */
+	    scaleProto.setExtent = function (start, end) {
+	        var thisExtent = this._extent;
+	        if (!isNaN(start)) {
+	            thisExtent[0] = start;
+	        }
+	        if (!isNaN(end)) {
+	            thisExtent[1] = end;
+	        }
+	    };
+
+	    /**
+	     * @return {Array.<string>}
+	     */
+	    scaleProto.getTicksLabels = function () {
+	        var labels = [];
+	        var ticks = this.getTicks();
+	        for (var i = 0; i < ticks.length; i++) {
+	            labels.push(this.getLabel(ticks[i]));
+	        }
+	        return labels;
+	    };
+
+	    /**
+	     * When axis extent depends on data and no data exists,
+	     * axis ticks should not be drawn, which is named 'blank'.
+	     */
+	    scaleProto.isBlank = function () {
+	        return this._isBlank;
+	    },
+
+	    /**
+	     * When axis extent depends on data and no data exists,
+	     * axis ticks should not be drawn, which is named 'blank'.
+	     */
+	    scaleProto.setBlank = function (isBlank) {
+	        this._isBlank = isBlank;
+	    };
+
+
+	    clazzUtil.enableClassExtend(Scale);
+	    clazzUtil.enableClassManagement(Scale, {
+	        registerWhenExtend: true
+	    });
+
+	    module.exports = Scale;
+
+
+/***/ },
+/* 104 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Interval scale
+	 * @module echarts/scale/Interval
+	 */
+
+
+
+	    var numberUtil = __webpack_require__(7);
+	    var formatUtil = __webpack_require__(6);
+	    var Scale = __webpack_require__(103);
+	    var helper = __webpack_require__(105);
+
+	    var roundNumber = numberUtil.round;
+
+	    /**
+	     * @alias module:echarts/coord/scale/Interval
+	     * @constructor
+	     */
+	    var IntervalScale = Scale.extend({
+
+	        type: 'interval',
+
+	        _interval: 0,
+
+	        _intervalPrecision: 2,
+
+	        setExtent: function (start, end) {
+	            var thisExtent = this._extent;
+	            //start,end may be a Number like '25',so...
+	            if (!isNaN(start)) {
+	                thisExtent[0] = parseFloat(start);
+	            }
+	            if (!isNaN(end)) {
+	                thisExtent[1] = parseFloat(end);
+	            }
+	        },
+
+	        unionExtent: function (other) {
+	            var extent = this._extent;
+	            other[0] < extent[0] && (extent[0] = other[0]);
+	            other[1] > extent[1] && (extent[1] = other[1]);
+
+	            // unionExtent may called by it's sub classes
+	            IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]);
+	        },
+	        /**
+	         * Get interval
+	         */
+	        getInterval: function () {
+	            if (true) {
+	                if (this._interval == null) {
+	                    throw new Error('`nice` should be called firstly' );
+	                }
+	            }
+	            return this._interval;
+	        },
+
+	        /**
+	         * Set interval
+	         */
+	        setInterval: function (interval) {
+	            this._interval = interval;
+	            // Dropped auto calculated niceExtent and use user setted extent
+	            // We assume user wan't to set both interval, min, max to get a better result
+	            this._niceExtent = this._extent.slice();
+	        },
+
+	        /**
+	         * @return {Array.<number>}
+	         */
+	        getTicks: function () {
+	            if (true) {
+	                if (this._interval == null) {
+	                    throw new Error('`nice` should be called firstly' );
+	                }
+	            }
+	            return helper.intervalScaleGetTicks(
+	                this._interval, this._extent, this._niceExtent, this._intervalPrecision
+	            );
+	        },
+
+	        /**
+	         * @return {Array.<string>}
+	         */
+	        getTicksLabels: function () {
+	            var labels = [];
+	            var ticks = this.getTicks();
+	            for (var i = 0; i < ticks.length; i++) {
+	                labels.push(this.getLabel(ticks[i]));
+	            }
+	            return labels;
+	        },
+
+	        /**
+	         * @param {number} data
+	         * @param {Object} [opt]
+	         * @param {number|string} [opt.precision] If 'auto', use nice presision.
+	         * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2.
+	         * @return {string}
+	         */
+	        getLabel: function (data, opt) {
+	            if (data == null) {
+	                return '';
+	            }
+
+	            var precision = opt && opt.precision;
+
+	            if (precision == null) {
+	                precision = numberUtil.getPrecisionSafe(data) || 0;
+	            }
+	            else if (precision === 'auto') {
+	                // Should be more precise then tick.
+	                precision = this._intervalPrecision;
+	            }
+
+	            // (1) If `precision` is set, 12.005 should be display as '12.00500'.
+	            // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.
+	            data = roundNumber(data, precision, true);
+
+	            return formatUtil.addCommas(data);
+	        },
+
+	        /**
+	         * Update interval and extent of intervals for nice ticks
+	         *
+	         * @param {number} [splitNumber = 5] Desired number of ticks
+	         * @param {number} [minInterval]
+	         */
+	        niceTicks: function (splitNumber, minInterval) {
+	            splitNumber = splitNumber || 5;
+	            var extent = this._extent;
+	            var span = extent[1] - extent[0];
+	            if (!isFinite(span)) {
+	                return;
+	            }
+	            // User may set axis min 0 and data are all negative
+	            // FIXME If it needs to reverse ?
+	            if (span < 0) {
+	                span = -span;
+	                extent.reverse();
+	            }
+
+	            var result = helper.intervalScaleNiceTicks(extent, splitNumber, minInterval);
+
+	            this._intervalPrecision = result.intervalPrecision;
+	            this._interval = result.interval;
+	            this._niceExtent = result.niceTickExtent;
+	        },
+
+	        /**
+	         * Nice extent.
+	         * @param {Object} opt
+	         * @param {number} [opt.splitNumber = 5] Given approx tick number
+	         * @param {boolean} [opt.fixMin=false]
+	         * @param {boolean} [opt.fixMax=false]
+	         * @param {boolean} [opt.minInterval=false]
+	         */
+	        niceExtent: function (opt) {
+	            var extent = this._extent;
+	            // If extent start and end are same, expand them
+	            if (extent[0] === extent[1]) {
+	                if (extent[0] !== 0) {
+	                    // Expand extent
+	                    var expandSize = extent[0];
+	                    // In the fowllowing case
+	                    //      Axis has been fixed max 100
+	                    //      Plus data are all 100 and axis extent are [100, 100].
+	                    // Extend to the both side will cause expanded max is larger than fixed max.
+	                    // So only expand to the smaller side.
+	                    if (!opt.fixMax) {
+	                        extent[1] += expandSize / 2;
+	                        extent[0] -= expandSize / 2;
+	                    }
+	                    else {
+	                        extent[0] -= expandSize / 2;
+	                    }
+	                }
+	                else {
+	                    extent[1] = 1;
+	                }
+	            }
+	            var span = extent[1] - extent[0];
+	            // If there are no data and extent are [Infinity, -Infinity]
+	            if (!isFinite(span)) {
+	                extent[0] = 0;
+	                extent[1] = 1;
+	            }
+
+	            this.niceTicks(opt.splitNumber, opt.minInterval);
+
+	            // var extent = this._extent;
+	            var interval = this._interval;
+
+	            if (!opt.fixMin) {
+	                extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);
+	            }
+	            if (!opt.fixMax) {
+	                extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);
+	            }
+	        }
+	    });
+
+	    /**
+	     * @return {module:echarts/scale/Time}
+	     */
+	    IntervalScale.create = function () {
+	        return new IntervalScale();
+	    };
+
+	    module.exports = IntervalScale;
+
+
+
+/***/ },
+/* 105 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * For testable.
+	 */
+
+
+	    var numberUtil = __webpack_require__(7);
+
+	    var roundNumber = numberUtil.round;
+
+	    var helper = {};
+
+	    /**
+	     * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number.
+	     *                                Should be extent[0] < extent[1].
+	     * @param {number} splitNumber splitNumber should be >= 1.
+	     * @param {number} [minInterval]
+	     * @return {Object} {interval, intervalPrecision, niceTickExtent}
+	     */
+	    helper.intervalScaleNiceTicks = function (extent, splitNumber, minInterval) {
+	        var result = {};
+	        var span = extent[1] - extent[0];
+
+	        var interval = result.interval = numberUtil.nice(span / splitNumber, true);
+	        if (minInterval != null && interval < minInterval) {
+	            interval = result.interval = minInterval;
+	        }
+	        // Tow more digital for tick.
+	        var precision = result.intervalPrecision = numberUtil.getPrecisionSafe(interval) + 2;
+	        // Niced extent inside original extent
+	        var niceTickExtent = result.niceTickExtent = [
+	            roundNumber(Math.ceil(extent[0] / interval) * interval, precision),
+	            roundNumber(Math.floor(extent[1] / interval) * interval, precision)
+	        ];
+
+	        helper.fixExtent(niceTickExtent, extent);
+
+	        return result;
+	    };
+
+	    function clamp(niceTickExtent, idx, extent) {
+	        niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);
+	    }
+
+	    // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.
+	    helper.fixExtent = function (niceTickExtent, extent) {
+	        !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);
+	        !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);
+	        clamp(niceTickExtent, 0, extent);
+	        clamp(niceTickExtent, 1, extent);
+	        if (niceTickExtent[0] > niceTickExtent[1]) {
+	            niceTickExtent[0] = niceTickExtent[1];
+	        }
+	    };
+
+	    helper.intervalScaleGetTicks = function (interval, extent, niceTickExtent, intervalPrecision) {
+	        var ticks = [];
+
+	        // If interval is 0, return [];
+	        if (!interval) {
+	            return ticks;
+	        }
+
+	        // Consider this case: using dataZoom toolbox, zoom and zoom.
+	        var safeLimit = 10000;
+
+	        if (extent[0] < niceTickExtent[0]) {
+	            ticks.push(extent[0]);
+	        }
+	        var tick = niceTickExtent[0];
+
+	        while (tick <= niceTickExtent[1]) {
+	            ticks.push(tick);
+	            // Avoid rounding error
+	            tick = roundNumber(tick + interval, intervalPrecision);
+	            if (tick === ticks[ticks.length - 1]) {
+	                // Consider out of safe float point, e.g.,
+	                // -3711126.9907707 + 2e-10 === -3711126.9907707
+	                break;
+	            }
+	            if (ticks.length > safeLimit) {
+	                return [];
+	            }
+	        }
+	        // Consider this case: the last item of ticks is smaller
+	        // than niceTickExtent[1] and niceTickExtent[1] === extent[1].
+	        if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {
+	            ticks.push(extent[1]);
+	        }
+
+	        return ticks;
+	    };
+
+	    module.exports = helper;
+
+
+/***/ },
+/* 106 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Interval scale
+	 * @module echarts/coord/scale/Time
+	 */
+
+
+
+	    // [About UTC and local time zone]:
+	    // In most cases, `number.parseDate` will treat input data string as local time
+	    // (except time zone is specified in time string). And `format.formateTime` returns
+	    // local time by default. option.useUTC is false by default. This design have
+	    // concidered these common case:
+	    // (1) Time that is persistent in server is in UTC, but it is needed to be diplayed
+	    // in local time by default.
+	    // (2) By default, the input data string (e.g., '2011-01-02') should be displayed
+	    // as its original time, without any time difference.
+
+	    var zrUtil = __webpack_require__(4);
+	    var numberUtil = __webpack_require__(7);
+	    var formatUtil = __webpack_require__(6);
+	    var scaleHelper = __webpack_require__(105);
+
+	    var IntervalScale = __webpack_require__(104);
+
+	    var intervalScaleProto = IntervalScale.prototype;
+
+	    var mathCeil = Math.ceil;
+	    var mathFloor = Math.floor;
+	    var ONE_SECOND = 1000;
+	    var ONE_MINUTE = ONE_SECOND * 60;
+	    var ONE_HOUR = ONE_MINUTE * 60;
+	    var ONE_DAY = ONE_HOUR * 24;
+
+	    // FIXME 公用？
+	    var bisect = function (a, x, lo, hi) {
+	        while (lo < hi) {
+	            var mid = lo + hi >>> 1;
+	            if (a[mid][2] < x) {
+	                lo = mid + 1;
+	            }
+	            else {
+	                hi  = mid;
+	            }
+	        }
+	        return lo;
+	    };
+
+	    /**
+	     * @alias module:echarts/coord/scale/Time
+	     * @constructor
+	     */
+	    var TimeScale = IntervalScale.extend({
+	        type: 'time',
+
+	        /**
+	         * @override
+	         */
+	        getLabel: function (val) {
+	            var stepLvl = this._stepLvl;
+
+	            var date = new Date(val);
+
+	            return formatUtil.formatTime(stepLvl[0], date, this.getSetting('useUTC'));
+	        },
+
+	        /**
+	         * @override
+	         */
+	        niceExtent: function (opt) {
+	            var extent = this._extent;
+	            // If extent start and end are same, expand them
+	            if (extent[0] === extent[1]) {
+	                // Expand extent
+	                extent[0] -= ONE_DAY;
+	                extent[1] += ONE_DAY;
+	            }
+	            // If there are no data and extent are [Infinity, -Infinity]
+	            if (extent[1] === -Infinity && extent[0] === Infinity) {
+	                var d = new Date();
+	                extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate());
+	                extent[0] = extent[1] - ONE_DAY;
+	            }
+
+	            this.niceTicks(opt.splitNumber);
+
+	            // var extent = this._extent;
+	            var interval = this._interval;
+
+	            if (!opt.fixMin) {
+	                extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval);
+	            }
+	            if (!opt.fixMax) {
+	                extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval);
+	            }
+	        },
+
+	        /**
+	         * @override
+	         */
+	        niceTicks: function (approxTickNum) {
+	            var timezoneOffset = this.getSetting('useUTC')
+	                ? 0 : numberUtil.getTimezoneOffset() * 60 * 1000;
+	            approxTickNum = approxTickNum || 10;
+
+	            var extent = this._extent;
+	            var span = extent[1] - extent[0];
+	            var approxInterval = span / approxTickNum;
+	            var scaleLevelsLen = scaleLevels.length;
+	            var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen);
+
+	            var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)];
+	            var interval = level[2];
+	            // Same with interval scale if span is much larger than 1 year
+	            if (level[0] === 'year') {
+	                var yearSpan = span / interval;
+
+	                // From "Nice Numbers for Graph Labels" of Graphic Gems
+	                // var niceYearSpan = numberUtil.nice(yearSpan, false);
+	                var yearStep = numberUtil.nice(yearSpan / approxTickNum, true);
+
+	                interval *= yearStep;
+	            }
+
+	            var niceExtent = [
+	                Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset),
+	                Math.round(mathFloor((extent[1] - timezoneOffset)/ interval) * interval + timezoneOffset)
+	            ];
+
+	            scaleHelper.fixExtent(niceExtent, extent);
+
+	            this._stepLvl = level;
+	            // Interval will be used in getTicks
+	            this._interval = interval;
+	            this._niceExtent = niceExtent;
+	        },
+
+	        parse: function (val) {
+	            // val might be float.
+	            return +numberUtil.parseDate(val);
+	        }
+	    });
+
+	    zrUtil.each(['contain', 'normalize'], function (methodName) {
+	        TimeScale.prototype[methodName] = function (val) {
+	            return intervalScaleProto[methodName].call(this, this.parse(val));
+	        };
+	    });
+
+	    // Steps from d3
+	    var scaleLevels = [
+	        // Format       step    interval
+	        ['hh:mm:ss',    1,      ONE_SECOND],           // 1s
+	        ['hh:mm:ss',    5,      ONE_SECOND * 5],       // 5s
+	        ['hh:mm:ss',    10,     ONE_SECOND * 10],      // 10s
+	        ['hh:mm:ss',    15,     ONE_SECOND * 15],      // 15s
+	        ['hh:mm:ss',    30,     ONE_SECOND * 30],      // 30s
+	        ['hh:mm\nMM-dd',1,      ONE_MINUTE],          // 1m
+	        ['hh:mm\nMM-dd',5,      ONE_MINUTE * 5],      // 5m
+	        ['hh:mm\nMM-dd',10,     ONE_MINUTE * 10],     // 10m
+	        ['hh:mm\nMM-dd',15,     ONE_MINUTE * 15],     // 15m
+	        ['hh:mm\nMM-dd',30,     ONE_MINUTE * 30],     // 30m
+	        ['hh:mm\nMM-dd',1,      ONE_HOUR],        // 1h
+	        ['hh:mm\nMM-dd',2,      ONE_HOUR * 2],    // 2h
+	        ['hh:mm\nMM-dd',6,      ONE_HOUR * 6],    // 6h
+	        ['hh:mm\nMM-dd',12,     ONE_HOUR * 12],   // 12h
+	        ['MM-dd\nyyyy', 1,      ONE_DAY],   // 1d
+	        ['week',        7,      ONE_DAY * 7],        // 7d
+	        ['month',       1,      ONE_DAY * 31],       // 1M
+	        ['quarter',     3,      ONE_DAY * 380 / 4],  // 3M
+	        ['half-year',   6,      ONE_DAY * 380 / 2],  // 6M
+	        ['year',        1,      ONE_DAY * 380]       // 1Y
+	    ];
+
+	    /**
+	     * @param {module:echarts/model/Model}
+	     * @return {module:echarts/scale/Time}
+	     */
+	    TimeScale.create = function (model) {
+	        return new TimeScale({useUTC: model.ecModel.get('useUTC')});
+	    };
+
+	    module.exports = TimeScale;
+
+
+/***/ },
+/* 107 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Log scale
+	 * @module echarts/scale/Log
+	 */
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var Scale = __webpack_require__(103);
+	    var numberUtil = __webpack_require__(7);
+
+	    // Use some method of IntervalScale
+	    var IntervalScale = __webpack_require__(104);
+
+	    var scaleProto = Scale.prototype;
+	    var intervalScaleProto = IntervalScale.prototype;
+
+	    var getPrecisionSafe = numberUtil.getPrecisionSafe;
+	    var roundingErrorFix = numberUtil.round;
+
+	    var mathFloor = Math.floor;
+	    var mathCeil = Math.ceil;
+	    var mathPow = Math.pow;
+
+	    var mathLog = Math.log;
+
+	    var LogScale = Scale.extend({
+
+	        type: 'log',
+
+	        base: 10,
+
+	        $constructor: function () {
+	            Scale.apply(this, arguments);
+	            this._originalScale = new IntervalScale();
+	        },
+
+	        /**
+	         * @return {Array.<number>}
+	         */
+	        getTicks: function () {
+	            var originalScale = this._originalScale;
+	            var extent = this._extent;
+	            var originalExtent = originalScale.getExtent();
+
+	            return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) {
+	                var powVal = numberUtil.round(mathPow(this.base, val));
+
+	                // Fix #4158
+	                powVal = (val === extent[0] && originalScale.__fixMin)
+	                    ? fixRoundingError(powVal, originalExtent[0])
+	                    : powVal;
+	                powVal = (val === extent[1] && originalScale.__fixMax)
+	                    ? fixRoundingError(powVal, originalExtent[1])
+	                    : powVal;
+
+	                return powVal;
+	            }, this);
+	        },
+
+	        /**
+	         * @param {number} val
+	         * @return {string}
+	         */
+	        getLabel: intervalScaleProto.getLabel,
+
+	        /**
+	         * @param  {number} val
+	         * @return {number}
+	         */
+	        scale: function (val) {
+	            val = scaleProto.scale.call(this, val);
+	            return mathPow(this.base, val);
+	        },
+
+	        /**
+	         * @param {number} start
+	         * @param {number} end
+	         */
+	        setExtent: function (start, end) {
+	            var base = this.base;
+	            start = mathLog(start) / mathLog(base);
+	            end = mathLog(end) / mathLog(base);
+	            intervalScaleProto.setExtent.call(this, start, end);
+	        },
+
+	        /**
+	         * @return {number} end
+	         */
+	        getExtent: function () {
+	            var base = this.base;
+	            var extent = scaleProto.getExtent.call(this);
+	            extent[0] = mathPow(base, extent[0]);
+	            extent[1] = mathPow(base, extent[1]);
+
+	            // Fix #4158
+	            var originalScale = this._originalScale;
+	            var originalExtent = originalScale.getExtent();
+	            originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));
+	            originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));
+
+	            return extent;
+	        },
+
+	        /**
+	         * @param  {Array.<number>} extent
+	         */
+	        unionExtent: function (extent) {
+	            this._originalScale.unionExtent(extent);
+
+	            var base = this.base;
+	            extent[0] = mathLog(extent[0]) / mathLog(base);
+	            extent[1] = mathLog(extent[1]) / mathLog(base);
+	            scaleProto.unionExtent.call(this, extent);
+	        },
+
+	        /**
+	         * @override
+	         */
+	        unionExtentFromData: function (data, dim) {
+	            this.unionExtent(data.getDataExtent(dim, true, function (val) {
+	                return val > 0;
+	            }));
+	        },
+
+	        /**
+	         * Update interval and extent of intervals for nice ticks
+	         * @param  {number} [approxTickNum = 10] Given approx tick number
+	         */
+	        niceTicks: function (approxTickNum) {
+	            approxTickNum = approxTickNum || 10;
+	            var extent = this._extent;
+	            var span = extent[1] - extent[0];
+	            if (span === Infinity || span <= 0) {
+	                return;
+	            }
+
+	            var interval = numberUtil.quantity(span);
+	            var err = approxTickNum / span * interval;
+
+	            // Filter ticks to get closer to the desired count.
+	            if (err <= 0.5) {
+	                interval *= 10;
+	            }
+
+	            // Interval should be integer
+	            while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {
+	                interval *= 10;
+	            }
+
+	            var niceExtent = [
+	                numberUtil.round(mathCeil(extent[0] / interval) * interval),
+	                numberUtil.round(mathFloor(extent[1] / interval) * interval)
+	            ];
+
+	            this._interval = interval;
+	            this._niceExtent = niceExtent;
+	        },
+
+	        /**
+	         * Nice extent.
+	         * @override
+	         */
+	        niceExtent: function (opt) {
+	            intervalScaleProto.niceExtent.call(this, opt);
+
+	            var originalScale = this._originalScale;
+	            originalScale.__fixMin = opt.fixMin;
+	            originalScale.__fixMax = opt.fixMax;
+	        }
+
+	    });
+
+	    zrUtil.each(['contain', 'normalize'], function (methodName) {
+	        LogScale.prototype[methodName] = function (val) {
+	            val = mathLog(val) / mathLog(this.base);
+	            return scaleProto[methodName].call(this, val);
+	        };
+	    });
+
+	    LogScale.create = function () {
+	        return new LogScale();
+	    };
+
+	    function fixRoundingError(val, originalVal) {
+	        return roundingErrorFix(val, getPrecisionSafe(originalVal));
+	    }
+
+	    module.exports = LogScale;
+
+
+/***/ },
+/* 108 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var createListFromArray = __webpack_require__(109);
+	    var symbolUtil = __webpack_require__(111);
+	    var axisHelper = __webpack_require__(101);
 	    var axisModelCommonMixin = __webpack_require__(112);
 	    var Model = __webpack_require__(12);
 	    var util = __webpack_require__(4);
@@ -23784,16 +25259,9 @@
 	        },
 
 	        /**
-	         * Complete the dimensions array guessed from the data structure.
-	         * @param  {Array.<string>} dimensions Necessary dimensions, like ['x', 'y']
-	         * @param  {Array} data Data list. [[1, 2, 3], [2, 3, 4]]
-	         * @param  {Object} [opt]
-	         * @param  {Array.<string>} [opt.defaultNames] Default names to fill not necessary dimensions, like ['value']
-	         * @param  {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
-	         * @param  {number} [opt.dimCount] If not specified, guess by the first data item.
-	         * @return {Array.<string>}
+	         * @see {module:echarts/data/helper/completeDimensions}
 	         */
-	        completeDimensions: __webpack_require__(103),
+	        completeDimensions: __webpack_require__(110),
 
 	        /**
 	         * Create a symbol element with given symbol configuration: shape, x, y, width, height, color
@@ -23845,17 +25313,17 @@
 
 
 /***/ },
-/* 102 */
+/* 109 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var List = __webpack_require__(98);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
-	    var CoordinateSystem = __webpack_require__(26);
+	    var CoordinateSystem = __webpack_require__(76);
 	    var getDataItemValue = modelUtil.getDataItemValue;
 	    var converDataValue = modelUtil.converDataValue;
 
@@ -23888,8 +25356,13 @@
 	        var coordSysName = seriesModel.get('coordinateSystem');
 	        var creator = creators[coordSysName];
 	        var registeredCoordSys = CoordinateSystem.get(coordSysName);
+	        var completeDimOpt = {
+	            encodeDef: seriesModel.get('encode'),
+	            dimsDef: seriesModel.get('dimensions')
+	        };
+
 	        // FIXME
-	        var axesInfo = creator && creator(data, seriesModel, ecModel);
+	        var axesInfo = creator && creator(data, seriesModel, ecModel, completeDimOpt);
 	        var dimensions = axesInfo && axesInfo.dimensions;
 	        if (!dimensions) {
 	            // Get dimensions from registered coordinate system
@@ -23898,7 +25371,7 @@
 	                    ? registeredCoordSys.getDimensionsInfo()
 	                    : registeredCoordSys.dimensions.slice()
 	            )) || ['x', 'y'];
-	            dimensions = completeDimensions(dimensions, data, {defaultNames: dimensions.concat(['value'])});
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 	        }
 
 	        var categoryIndex = axesInfo ? axesInfo.categoryIndex : -1;
@@ -23968,7 +25441,7 @@
 	     */
 	    var creators = {
 
-	        cartesian2d: function (data, seriesModel, ecModel) {
+	        cartesian2d: function (data, seriesModel, ecModel, completeDimOpt) {
 
 	            var axesModels = zrUtil.map(['xAxis', 'yAxis'], function (name) {
 	                return ecModel.queryComponents({
@@ -24017,7 +25490,7 @@
 	            var isXAxisCateogry = xAxisType === 'category';
 	            var isYAxisCategory = yAxisType === 'category';
 
-	            completeDimensions(dimensions, data, {defaultNames: ['x', 'y', 'z']});
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 
 	            var categoryAxesModels = {};
 	            if (isXAxisCateogry) {
@@ -24033,7 +25506,7 @@
 	            };
 	        },
 
-	        singleAxis: function (data, seriesModel, ecModel) {
+	        singleAxis: function (data, seriesModel, ecModel, completeDimOpt) {
 
 	            var singleAxisModel = ecModel.queryComponents({
 	                mainType: 'singleAxis',
@@ -24056,7 +25529,7 @@
 	                stackable: isStackable(singleAxisType)
 	            }];
 
-	            completeDimensions(dimensions, data);
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 
 	            var categoryAxesModels = {};
 	            if (isCategory) {
@@ -24070,7 +25543,7 @@
 	            };
 	        },
 
-	        polar: function (data, seriesModel, ecModel) {
+	        polar: function (data, seriesModel, ecModel, completeDimOpt) {
 	            var polarModel = ecModel.queryComponents({
 	                mainType: 'polar',
 	                index: seriesModel.get('polarIndex'),
@@ -24107,7 +25580,7 @@
 	            var isAngleAxisCateogry = angleAxisType === 'category';
 	            var isRadiusAxisCateogry = radiusAxisType === 'category';
 
-	            completeDimensions(dimensions, data, {defaultNames: ['radius', 'angle', 'value']});
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 
 	            var categoryAxesModels = {};
 	            if (isRadiusAxisCateogry) {
@@ -24123,14 +25596,14 @@
 	            };
 	        },
 
-	        geo: function (data, seriesModel, ecModel) {
+	        geo: function (data, seriesModel, ecModel, completeDimOpt) {
 	            // TODO Region
 	            // 多个散点图系列在同一个地区的时候
 	            return {
 	                dimensions: completeDimensions([
 	                    {name: 'lng'},
 	                    {name: 'lat'}
-	                ], data, {defaultNames: ['lng', 'lat', 'value']})
+	                ], data, completeDimOpt)
 	            };
 	        }
 	    };
@@ -24173,7 +25646,7 @@
 
 
 /***/ },
-/* 103 */
+/* 110 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -24182,42 +25655,202 @@
 
 
 	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+	    var each = zrUtil.each;
+	    var isString = zrUtil.isString;
+	    var defaults = zrUtil.defaults;
+	    var normalizeToArray = modelUtil.normalizeToArray;
+
+	    var OTHER_DIMS = {tooltip: 1, label: 1, itemName: 1};
 
 	    /**
-	     * Complete the dimensions array guessed from the data structure.
-	     * @param  {Array.<string>} dimensions Necessary dimensions, like ['x', 'y']
-	     * @param  {Array} data Data list. [[1, 2, 3], [2, 3, 4]]
-	     * @param  {Object} [opt]
-	     * @param  {Array.<string>} [opt.defaultNames] Default names to fill not necessary dimensions, like ['value']
-	     * @param  {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
-	     * @param  {number} [opt.dimCount] If not specified, guess by the first data item.
-	     * @return {Array.<string>}
+	     * Complete the dimensions array, by user defined `dimension` and `encode`,
+	     * and guessing from the data structure.
+	     * If no 'value' dimension specified, the first no-named dimension will be
+	     * named as 'value'.
+	     *
+	     * @param {Array.<string>} sysDims Necessary dimensions, like ['x', 'y'], which
+	     *      provides not only dim template, but also default order.
+	     *      `name` of each item provides default coord name.
+	     *      [{dimsDef: []}, ...] can be specified to give names.
+	     * @param {Array} data Data list. [[1, 2, 3], [2, 3, 4]].
+	     * @param {Object} [opt]
+	     * @param {Array.<Object|string>} [opt.dimsDef] option.series.dimensions User defined dimensions
+	     *      For example: ['asdf', {name, type}, ...].
+	     * @param {Object} [opt.encodeDef] option.series.encode {x: 2, y: [3, 1], tooltip: [1, 2], label: 3}
+	     * @param {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
+	     * @param {string} [opt.extraFromZero] If specified, extra dim names will be:
+	     *                      extraPrefix + 0, extraPrefix + extraBaseIndex + 1 ...
+	     *                      If not specified, extra dim names will be:
+	     *                      extraPrefix, extraPrefix + 0, extraPrefix + 1 ...
+	     * @param {number} [opt.dimCount] If not specified, guess by the first data item.
+	     * @return {Array.<Object>} [{
+	     *      name: string mandatory,
+	     *      coordDim: string mandatory,
+	     *      coordDimIndex: number mandatory,
+	     *      type: string optional,
+	     *      tooltipName: string optional,
+	     *      otherDims: {
+	     *          tooltip: number optional,
+	     *          label: number optional
+	     *      },
+	     *      isExtraCoord: boolean true or undefined.
+	     *      other props ...
+	     * }]
 	     */
-	    function completeDimensions(dimensions, data, opt) {
-	        if (!data) {
-	            return dimensions;
-	        }
-
+	    function completeDimensions(sysDims, data, opt) {
+	        data = data || [];
 	        opt = opt || {};
+	        sysDims = (sysDims || []).slice();
+	        var dimsDef = (opt.dimsDef || []).slice();
+	        var encodeDef = zrUtil.createHashMap(opt.encodeDef);
+	        var dataDimNameMap = zrUtil.createHashMap();
+	        var coordDimNameMap = zrUtil.createHashMap();
+	        // var valueCandidate;
+	        var result = [];
 
 	        var dimCount = opt.dimCount;
 	        if (dimCount == null) {
 	            var value0 = retrieveValue(data[0]);
-	            dimCount = zrUtil.isArray(value0) && value0.length || 1;
+	            dimCount = Math.max(
+	                zrUtil.isArray(value0) && value0.length || 1,
+	                sysDims.length,
+	                dimsDef.length
+	            );
+	            each(sysDims, function (sysDimItem) {
+	                var sysDimItemDimsDef = sysDimItem.dimsDef;
+	                sysDimItemDimsDef && (dimCount = Math.max(dimCount, sysDimItemDimsDef.length));
+	            });
 	        }
 
-	        var defaultNames = opt.defaultNames || [];
-	        var extraPrefix = opt.extraPrefix || 'extra';
+	        // Apply user defined dims (`name` and `type`) and init result.
 	        for (var i = 0; i < dimCount; i++) {
-	            if (!dimensions[i]) {
-	                var name = defaultNames[i] || (extraPrefix + (i - defaultNames.length));
-	                dimensions[i] = guessOrdinal(data, i)
-	                    ? {type: 'ordinal', name: name}
-	                    : name;
+	            var dimDefItem = isString(dimsDef[i]) ? {name: dimsDef[i]} : (dimsDef[i] || {});
+	            var userDimName = dimDefItem.name;
+	            var resultItem = result[i] = {otherDims: {}};
+	            // Name will be applied later for avoiding duplication.
+	            if (userDimName != null && dataDimNameMap.get(userDimName) == null) {
+	                // Only if `series.dimensions` is defined in option, tooltipName
+	                // will be set, and dimension will be diplayed vertically in
+	                // tooltip by default.
+	                resultItem.name = resultItem.tooltipName = userDimName;
+	                dataDimNameMap.set(userDimName, i);
+	            }
+	            dimDefItem.type != null && (resultItem.type = dimDefItem.type);
+	        }
+
+	        // Set `coordDim` and `coordDimIndex` by `encodeDef` and normalize `encodeDef`.
+	        encodeDef.each(function (dataDims, coordDim) {
+	            dataDims = encodeDef.set(coordDim, normalizeToArray(dataDims).slice());
+	            each(dataDims, function (resultDimIdx, coordDimIndex) {
+	                // The input resultDimIdx can be dim name or index.
+	                isString(resultDimIdx) && (resultDimIdx = dataDimNameMap.get(resultDimIdx));
+	                if (resultDimIdx != null && resultDimIdx < dimCount) {
+	                    dataDims[coordDimIndex] = resultDimIdx;
+	                    applyDim(result[resultDimIdx], coordDim, coordDimIndex);
+	                    // coordDim === 'value' && valueCandidate == null && (valueCandidate = resultDimIdx);
+	                }
+	            });
+	        });
+
+	        // Apply templetes and default order from `sysDims`.
+	        var availDimIdx = 0;
+	        each(sysDims, function (sysDimItem, sysDimIndex) {
+	            var coordDim;
+	            var sysDimItem;
+	            var sysDimItemDimsDef;
+	            var sysDimItemOtherDims;
+	            if (isString(sysDimItem)) {
+	                coordDim = sysDimItem;
+	                sysDimItem = {};
+	            }
+	            else {
+	                coordDim = sysDimItem.name;
+	                sysDimItem = zrUtil.clone(sysDimItem);
+	                // `coordDimIndex` should not be set directly.
+	                sysDimItemDimsDef = sysDimItem.dimsDef;
+	                sysDimItemOtherDims = sysDimItem.otherDims;
+	                sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex
+	                    = sysDimItem.dimsDef = sysDimItem.otherDims = null;
+	            }
+
+	            var dataDims = normalizeToArray(encodeDef.get(coordDim));
+	            // dimensions provides default dim sequences.
+	            if (!dataDims.length) {
+	                for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) {
+	                    while (availDimIdx < result.length && result[availDimIdx].coordDim != null) {
+	                        availDimIdx++;
+	                    }
+	                    availDimIdx < result.length && dataDims.push(availDimIdx++);
+	                }
+	            }
+	            // Apply templates.
+	            each(dataDims, function (resultDimIdx, coordDimIndex) {
+	                var resultItem = result[resultDimIdx];
+	                applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex);
+	                // coordDim === 'value' && valueCandidate == null && (valueCandidate = resultDimIdx);
+	                if (resultItem.name == null && sysDimItemDimsDef) {
+	                    resultItem.name = resultItem.tooltipName = sysDimItemDimsDef[coordDimIndex];
+	                }
+	                sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims);
+	            });
+	        });
+
+	        // Make sure the first extra dim is 'value'.
+	        var extra = opt.extraPrefix || 'value';
+
+	        // Set dim `name` and other `coordDim` and other props.
+	        for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) {
+	            var resultItem = result[resultDimIdx] = result[resultDimIdx] || {};
+	            var coordDim = resultItem.coordDim;
+
+	            coordDim == null && (
+	                resultItem.coordDim = genName(extra, coordDimNameMap, opt.extraFromZero),
+	                resultItem.coordDimIndex = 0,
+	                resultItem.isExtraCoord = true
+	            );
+
+	            resultItem.name == null && (resultItem.name = genName(
+	                // Ensure At least one value dim.
+	                // (dataDimNameMap.get('value') == null
+	                //     && (valueCandidate == null || valueCandidate === resultDimIdx)
+	                //     // Try to set as 'value' only if coordDim is not set as 'extra'.
+	                //     && coordDim == null
+	                // )
+	                // ? 'value'
+	                // :
+	                resultItem.coordDim,
+	                dataDimNameMap
+	            ));
+
+	            resultItem.type == null && guessOrdinal(data, resultDimIdx)
+	                && (resultItem.type = 'ordinal');
+	        }
+
+	        return result;
+
+	        function applyDim(resultItem, coordDim, coordDimIndex) {
+	            if (OTHER_DIMS[coordDim]) {
+	                resultItem.otherDims[coordDim] = coordDimIndex;
+	            }
+	            else {
+	                resultItem.coordDim = coordDim;
+	                resultItem.coordDimIndex = coordDimIndex;
+	                coordDimNameMap.set(coordDim, true);
 	            }
 	        }
 
-	        return dimensions;
+	        function genName(name, map, fromZero) {
+	            if (fromZero || map.get(name) != null) {
+	                var i = 0;
+	                while (map.get(name + i) != null) {
+	                    i++;
+	                }
+	                name += i;
+	            }
+	            map.set(name, true);
+	            return name;
+	        }
 	    }
 
 	    // The rule should not be complex, otherwise user might not
@@ -24231,10 +25864,11 @@
 	            }
 
 	            var value = value[dimIndex];
+	            // Consider usage convenience, '1', '2' will be treated as "number".
 	            if (value != null && isFinite(value)) {
 	                return false;
 	            }
-	            else if (zrUtil.isString(value) && value !== '-') {
+	            else if (isString(value) && value !== '-') {
 	                return true;
 	            }
 	        }
@@ -24250,14 +25884,14 @@
 
 
 /***/ },
-/* 104 */
+/* 111 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	// Symbol factory
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var BoundingRect = __webpack_require__(9);
 
 	    /**
@@ -24612,1253 +26246,20 @@
 
 
 /***/ },
-/* 105 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var OrdinalScale = __webpack_require__(106);
-	    var IntervalScale = __webpack_require__(108);
-	    __webpack_require__(110);
-	    __webpack_require__(111);
-	    var Scale = __webpack_require__(107);
-
-	    var numberUtil = __webpack_require__(7);
-	    var zrUtil = __webpack_require__(4);
-	    var textContain = __webpack_require__(8);
-	    var axisHelper = {};
-
-	    /**
-	     * Get axis scale extent before niced.
-	     * Item of returned array can only be number (including Infinity and NaN).
-	     */
-	    axisHelper.getScaleExtent = function (scale, model) {
-	        var scaleType = scale.type;
-
-	        var min = model.getMin();
-	        var max = model.getMax();
-	        var fixMin = min != null;
-	        var fixMax = max != null;
-	        var originalExtent = scale.getExtent();
-
-	        var axisDataLen;
-	        var boundaryGap;
-	        var span;
-	        if (scaleType === 'ordinal') {
-	            axisDataLen = (model.get('data') || []).length;
-	        }
-	        else {
-	            boundaryGap = model.get('boundaryGap');
-	            if (!zrUtil.isArray(boundaryGap)) {
-	                boundaryGap = [boundaryGap || 0, boundaryGap || 0];
-	            }
-	            if (typeof boundaryGap[0] === 'boolean') {
-	                if (true) {
-	                    console.warn('Boolean type for boundaryGap is only '
-	                        + 'allowed for ordinal axis. Please use string in '
-	                        + 'percentage instead, e.g., "20%". Currently, '
-	                        + 'boundaryGap is set to be 0.');
-	                }
-	                boundaryGap = [0, 0];
-	            }
-	            boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1);
-	            boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1);
-	            span = (originalExtent[1] - originalExtent[0])
-	                || Math.abs(originalExtent[0]);
-	        }
-
-	        // Notice: When min/max is not set (that is, when there are null/undefined,
-	        // which is the most common case), these cases should be ensured:
-	        // (1) For 'ordinal', show all axis.data.
-	        // (2) For others:
-	        //      + `boundaryGap` is applied (if min/max set, boundaryGap is
-	        //      disabled).
-	        //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should
-	        //      be the result that originalExtent enlarged by boundaryGap.
-	        // (3) If no data, it should be ensured that `scale.setBlank` is set.
-
-	        // FIXME
-	        // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used?
-	        // (2) When `needCrossZero` and all data is positive/negative, should it be ensured
-	        // that the results processed by boundaryGap are positive/negative?
-
-	        if (min == null) {
-	            min = scaleType === 'ordinal'
-	                ? (axisDataLen ? 0 : NaN)
-	                : originalExtent[0] - boundaryGap[0] * span;
-	        }
-	        if (max == null) {
-	            max = scaleType === 'ordinal'
-	                ? (axisDataLen ? axisDataLen - 1 : NaN)
-	                : originalExtent[1] + boundaryGap[1] * span;
-	        }
-
-	        if (min === 'dataMin') {
-	            min = originalExtent[0];
-	        }
-	        if (max === 'dataMax') {
-	            max = originalExtent[1];
-	        }
-
-	        (min == null || !isFinite(min)) && (min = NaN);
-	        (max == null || !isFinite(max)) && (max = NaN);
-
-	        scale.setBlank(zrUtil.eqNaN(min) || zrUtil.eqNaN(max));
-
-	        // Evaluate if axis needs cross zero
-	        if (model.getNeedCrossZero()) {
-	            // Axis is over zero and min is not set
-	            if (min > 0 && max > 0 && !fixMin) {
-	                min = 0;
-	            }
-	            // Axis is under zero and max is not set
-	            if (min < 0 && max < 0 && !fixMax) {
-	                max = 0;
-	            }
-	        }
-
-	        return [min, max];
-	    };
-
-	    axisHelper.niceScaleExtent = function (scale, model) {
-	        var extent = axisHelper.getScaleExtent(scale, model);
-	        var fixMin = model.getMin() != null;
-	        var fixMax = model.getMax() != null;
-	        var splitNumber = model.get('splitNumber');
-
-	        if (scale.type === 'log') {
-	            scale.base = model.get('logBase');
-	        }
-
-	        scale.setExtent(extent[0], extent[1]);
-	        scale.niceExtent(splitNumber, fixMin, fixMax);
-
-	        // Use minInterval to constraint the calculated interval.
-	        // If calculated interval is less than minInterval. increase the interval quantity until
-	        // it is larger than minInterval.
-	        // For example:
-	        //  minInterval is 1, calculated interval is 0.2, so increase it to be 1. In this way we can get
-	        //  an integer axis.
-	        var minInterval = model.get('minInterval');
-	        if (isFinite(minInterval) && !fixMin && !fixMax && scale.type === 'interval') {
-	            var interval = scale.getInterval();
-	            var intervalScale = Math.max(Math.abs(interval), minInterval) / interval;
-	            // while (interval < minInterval) {
-	            //     var quantity = numberUtil.quantity(interval);
-	            //     interval = quantity * 10;
-	            //     scaleQuantity *= 10;
-	            // }
-	            extent = scale.getExtent();
-	            var origin = (extent[1] + extent[0]) / 2;
-	            scale.setExtent(
-	                intervalScale * (extent[0] - origin) + origin,
-	                intervalScale * (extent[1] - origin) + origin
-	            );
-	            scale.niceExtent(splitNumber);
-	        }
-
-	        // If some one specified the min, max. And the default calculated interval
-	        // is not good enough. He can specify the interval. It is often appeared
-	        // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard
-	        // to be 60.
-	        // FIXME
-	        var interval = model.get('interval');
-	        if (interval != null) {
-	            scale.setInterval && scale.setInterval(interval);
-	        }
-	    };
-
-	    /**
-	     * @param {module:echarts/model/Model} model
-	     * @param {string} [axisType] Default retrieve from model.type
-	     * @return {module:echarts/scale/*}
-	     */
-	    axisHelper.createScaleByModel = function(model, axisType) {
-	        axisType = axisType || model.get('type');
-	        if (axisType) {
-	            switch (axisType) {
-	                // Buildin scale
-	                case 'category':
-	                    return new OrdinalScale(
-	                        model.getCategories(), [Infinity, -Infinity]
-	                    );
-	                case 'value':
-	                    return new IntervalScale();
-	                // Extended scale, like time and log
-	                default:
-	                    return (Scale.getClass(axisType) || IntervalScale).create(model);
-	            }
-	        }
-	    };
-
-	    /**
-	     * Check if the axis corss 0
-	     */
-	    axisHelper.ifAxisCrossZero = function (axis) {
-	        var dataExtent = axis.scale.getExtent();
-	        var min = dataExtent[0];
-	        var max = dataExtent[1];
-	        return !((min > 0 && max > 0) || (min < 0 && max < 0));
-	    };
-
-	    /**
-	     * @param {Array.<number>} tickCoords In axis self coordinate.
-	     * @param {Array.<string>} labels
-	     * @param {string} font
-	     * @param {boolean} isAxisHorizontal
-	     * @return {number}
-	     */
-	    axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) {
-	        // FIXME
-	        // 不同角的axis和label，不只是horizontal和vertical.
-
-	        var textSpaceTakenRect;
-	        var autoLabelInterval = 0;
-	        var accumulatedLabelInterval = 0;
-
-	        var step = 1;
-	        if (labels.length > 40) {
-	            // Simple optimization for large amount of labels
-	            step = Math.floor(labels.length / 40);
-	        }
-
-	        for (var i = 0; i < tickCoords.length; i += step) {
-	            var tickCoord = tickCoords[i];
-	            var rect = textContain.getBoundingRect(
-	                labels[i], font, 'center', 'top'
-	            );
-	            rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord;
-	            // FIXME Magic number 1.5
-	            rect[isAxisHorizontal ? 'width' : 'height'] *= 1.3;
-	            if (!textSpaceTakenRect) {
-	                textSpaceTakenRect = rect.clone();
-	            }
-	            // There is no space for current label;
-	            else if (textSpaceTakenRect.intersect(rect)) {
-	                accumulatedLabelInterval++;
-	                autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval);
-	            }
-	            else {
-	                textSpaceTakenRect.union(rect);
-	                // Reset
-	                accumulatedLabelInterval = 0;
-	            }
-	        }
-	        if (autoLabelInterval === 0 && step > 1) {
-	            return step;
-	        }
-	        return (autoLabelInterval + 1) * step - 1;
-	    };
-
-	    /**
-	     * @param {Object} axis
-	     * @param {Function} labelFormatter
-	     * @return {Array.<string>}
-	     */
-	    axisHelper.getFormattedLabels = function (axis, labelFormatter) {
-	        var scale = axis.scale;
-	        var labels = scale.getTicksLabels();
-	        var ticks = scale.getTicks();
-	        if (typeof labelFormatter === 'string') {
-	            labelFormatter = (function (tpl) {
-	                return function (val) {
-	                    return tpl.replace('{value}', val != null ? val : '');
-	                };
-	            })(labelFormatter);
-	            // Consider empty array
-	            return zrUtil.map(labels, labelFormatter);
-	        }
-	        else if (typeof labelFormatter === 'function') {
-	            return zrUtil.map(ticks, function (tick, idx) {
-	                return labelFormatter(
-	                    axisHelper.getAxisRawValue(axis, tick),
-	                    idx
-	                );
-	            }, this);
-	        }
-	        else {
-	            return labels;
-	        }
-	    };
-
-	    axisHelper.getAxisRawValue = function (axis, value) {
-	        // In category axis with data zoom, tick is not the original
-	        // index of axis.data. So tick should not be exposed to user
-	        // in category axis.
-	        return axis.type === 'category' ? axis.scale.getLabel(value) : value;
-	    };
-
-	    module.exports = axisHelper;
-
-
-/***/ },
-/* 106 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Linear continuous scale
-	 * @module echarts/coord/scale/Ordinal
-	 *
-	 * http://en.wikipedia.org/wiki/Level_of_measurement
-	 */
-
-	// FIXME only one data
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var Scale = __webpack_require__(107);
-
-	    var scaleProto = Scale.prototype;
-
-	    var OrdinalScale = Scale.extend({
-
-	        type: 'ordinal',
-
-	        init: function (data, extent) {
-	            this._data = data;
-	            this._extent = extent || [0, data.length - 1];
-	        },
-
-	        parse: function (val) {
-	            return typeof val === 'string'
-	                ? zrUtil.indexOf(this._data, val)
-	                // val might be float.
-	                : Math.round(val);
-	        },
-
-	        contain: function (rank) {
-	            rank = this.parse(rank);
-	            return scaleProto.contain.call(this, rank)
-	                && this._data[rank] != null;
-	        },
-
-	        /**
-	         * Normalize given rank or name to linear [0, 1]
-	         * @param {number|string} [val]
-	         * @return {number}
-	         */
-	        normalize: function (val) {
-	            return scaleProto.normalize.call(this, this.parse(val));
-	        },
-
-	        scale: function (val) {
-	            return Math.round(scaleProto.scale.call(this, val));
-	        },
-
-	        /**
-	         * @return {Array}
-	         */
-	        getTicks: function () {
-	            var ticks = [];
-	            var extent = this._extent;
-	            var rank = extent[0];
-
-	            while (rank <= extent[1]) {
-	                ticks.push(rank);
-	                rank++;
-	            }
-
-	            return ticks;
-	        },
-
-	        /**
-	         * Get item on rank n
-	         * @param {number} n
-	         * @return {string}
-	         */
-	        getLabel: function (n) {
-	            return this._data[n];
-	        },
-
-	        /**
-	         * @return {number}
-	         */
-	        count: function () {
-	            return this._extent[1] - this._extent[0] + 1;
-	        },
-
-	        /**
-	         * @override
-	         */
-	        unionExtentFromData: function (data, dim) {
-	            this.unionExtent(data.getDataExtent(dim, false));
-	        },
-
-	        niceTicks: zrUtil.noop,
-	        niceExtent: zrUtil.noop
-	    });
-
-	    /**
-	     * @return {module:echarts/scale/Time}
-	     */
-	    OrdinalScale.create = function () {
-	        return new OrdinalScale();
-	    };
-
-	    module.exports = OrdinalScale;
-
-
-/***/ },
-/* 107 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * // Scale class management
-	 * @module echarts/scale/Scale
-	 */
-
-
-	    var clazzUtil = __webpack_require__(13);
-
-	    /**
-	     * @param {Object} [setting]
-	     */
-	    function Scale(setting) {
-	        this._setting = setting || {};
-
-	        /**
-	         * Extent
-	         * @type {Array.<number>}
-	         * @protected
-	         */
-	        this._extent = [Infinity, -Infinity];
-
-	        /**
-	         * Step is calculated in adjustExtent
-	         * @type {Array.<number>}
-	         * @protected
-	         */
-	        this._interval = 0;
-
-	        this.init && this.init.apply(this, arguments);
-	    }
-
-	    var scaleProto = Scale.prototype;
-
-	    /**
-	     * Parse input val to valid inner number.
-	     * @param {*} val
-	     * @return {number}
-	     */
-	    scaleProto.parse = function (val) {
-	        // Notice: This would be a trap here, If the implementation
-	        // of this method depends on extent, and this method is used
-	        // before extent set (like in dataZoom), it would be wrong.
-	        // Nevertheless, parse does not depend on extent generally.
-	        return val;
-	    };
-
-	    scaleProto.getSetting = function (name) {
-	        return this._setting[name];
-	    };
-
-	    scaleProto.contain = function (val) {
-	        var extent = this._extent;
-	        return val >= extent[0] && val <= extent[1];
-	    };
-
-	    /**
-	     * Normalize value to linear [0, 1], return 0.5 if extent span is 0
-	     * @param {number} val
-	     * @return {number}
-	     */
-	    scaleProto.normalize = function (val) {
-	        var extent = this._extent;
-	        if (extent[1] === extent[0]) {
-	            return 0.5;
-	        }
-	        return (val - extent[0]) / (extent[1] - extent[0]);
-	    };
-
-	    /**
-	     * Scale normalized value
-	     * @param {number} val
-	     * @return {number}
-	     */
-	    scaleProto.scale = function (val) {
-	        var extent = this._extent;
-	        return val * (extent[1] - extent[0]) + extent[0];
-	    };
-
-	    /**
-	     * Set extent from data
-	     * @param {Array.<number>} other
-	     */
-	    scaleProto.unionExtent = function (other) {
-	        var extent = this._extent;
-	        other[0] < extent[0] && (extent[0] = other[0]);
-	        other[1] > extent[1] && (extent[1] = other[1]);
-	        // not setExtent because in log axis it may transformed to power
-	        // this.setExtent(extent[0], extent[1]);
-	    };
-
-	    /**
-	     * Set extent from data
-	     * @param {module:echarts/data/List} data
-	     * @param {string} dim
-	     */
-	    scaleProto.unionExtentFromData = function (data, dim) {
-	        this.unionExtent(data.getDataExtent(dim, true));
-	    };
-
-	    /**
-	     * Get extent
-	     * @return {Array.<number>}
-	     */
-	    scaleProto.getExtent = function () {
-	        return this._extent.slice();
-	    };
-
-	    /**
-	     * Set extent
-	     * @param {number} start
-	     * @param {number} end
-	     */
-	    scaleProto.setExtent = function (start, end) {
-	        var thisExtent = this._extent;
-	        if (!isNaN(start)) {
-	            thisExtent[0] = start;
-	        }
-	        if (!isNaN(end)) {
-	            thisExtent[1] = end;
-	        }
-	    };
-
-	    /**
-	     * @return {Array.<string>}
-	     */
-	    scaleProto.getTicksLabels = function () {
-	        var labels = [];
-	        var ticks = this.getTicks();
-	        for (var i = 0; i < ticks.length; i++) {
-	            labels.push(this.getLabel(ticks[i]));
-	        }
-	        return labels;
-	    };
-
-	    /**
-	     * When axis extent depends on data and no data exists,
-	     * axis ticks should not be drawn, which is named 'blank'.
-	     */
-	    scaleProto.isBlank = function () {
-	        return this._isBlank;
-	    },
-
-	    /**
-	     * When axis extent depends on data and no data exists,
-	     * axis ticks should not be drawn, which is named 'blank'.
-	     */
-	    scaleProto.setBlank = function (isBlank) {
-	        this._isBlank = isBlank;
-	    };
-
-
-	    clazzUtil.enableClassExtend(Scale);
-	    clazzUtil.enableClassManagement(Scale, {
-	        registerWhenExtend: true
-	    });
-
-	    module.exports = Scale;
-
-
-/***/ },
-/* 108 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Interval scale
-	 * @module echarts/scale/Interval
-	 */
-
-
-
-	    var numberUtil = __webpack_require__(7);
-	    var formatUtil = __webpack_require__(6);
-	    var Scale = __webpack_require__(107);
-	    var helper = __webpack_require__(109);
-
-	    var roundNumber = numberUtil.round;
-
-	    /**
-	     * @alias module:echarts/coord/scale/Interval
-	     * @constructor
-	     */
-	    var IntervalScale = Scale.extend({
-
-	        type: 'interval',
-
-	        _interval: 0,
-
-	        _intervalPrecision: 2,
-
-	        setExtent: function (start, end) {
-	            var thisExtent = this._extent;
-	            //start,end may be a Number like '25',so...
-	            if (!isNaN(start)) {
-	                thisExtent[0] = parseFloat(start);
-	            }
-	            if (!isNaN(end)) {
-	                thisExtent[1] = parseFloat(end);
-	            }
-	        },
-
-	        unionExtent: function (other) {
-	            var extent = this._extent;
-	            other[0] < extent[0] && (extent[0] = other[0]);
-	            other[1] > extent[1] && (extent[1] = other[1]);
-
-	            // unionExtent may called by it's sub classes
-	            IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]);
-	        },
-	        /**
-	         * Get interval
-	         */
-	        getInterval: function () {
-	            if (!this._interval) {
-	                this.niceTicks();
-	            }
-	            return this._interval;
-	        },
-
-	        /**
-	         * Set interval
-	         */
-	        setInterval: function (interval) {
-	            this._interval = interval;
-	            // Dropped auto calculated niceExtent and use user setted extent
-	            // We assume user wan't to set both interval, min, max to get a better result
-	            this._niceExtent = this._extent.slice();
-	        },
-
-	        /**
-	         * @return {Array.<number>}
-	         */
-	        getTicks: function () {
-	            if (!this._interval) {
-	                this.niceTicks();
-	            }
-	            return helper.intervalScaleGetTicks(
-	                this._interval, this._extent, this._niceExtent, this._intervalPrecision
-	            );
-	        },
-
-	        /**
-	         * @return {Array.<string>}
-	         */
-	        getTicksLabels: function () {
-	            var labels = [];
-	            var ticks = this.getTicks();
-	            for (var i = 0; i < ticks.length; i++) {
-	                labels.push(this.getLabel(ticks[i]));
-	            }
-	            return labels;
-	        },
-
-	        /**
-	         * @param {number} data
-	         * @param {Object} [opt]
-	         * @param {number|string} [opt.precision] If 'auto', use nice presision.
-	         * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2.
-	         * @return {string}
-	         */
-	        getLabel: function (data, opt) {
-	            if (data == null) {
-	                return '';
-	            }
-
-	            var precision = opt && opt.precision;
-
-	            if (precision == null) {
-	                precision = numberUtil.getPrecisionSafe(data) || 0;
-	            }
-	            else if (precision === 'auto') {
-	                // Should be more precise then tick.
-	                precision = this._intervalPrecision;
-	            }
-
-	            // (1) If `precision` is set, 12.005 should be display as '12.00500'.
-	            // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.
-	            data = roundNumber(data, precision, true);
-
-	            return formatUtil.addCommas(data);
-	        },
-
-	        /**
-	         * Update interval and extent of intervals for nice ticks
-	         *
-	         * @param {number} [splitNumber = 5] Desired number of ticks
-	         */
-	        niceTicks: function (splitNumber) {
-	            splitNumber = splitNumber || 5;
-	            var extent = this._extent;
-	            var span = extent[1] - extent[0];
-	            if (!isFinite(span)) {
-	                return;
-	            }
-	            // User may set axis min 0 and data are all negative
-	            // FIXME If it needs to reverse ?
-	            if (span < 0) {
-	                span = -span;
-	                extent.reverse();
-	            }
-
-	            var result = helper.intervalScaleNiceTicks(extent, splitNumber);
-
-	            this._intervalPrecision = result.intervalPrecision;
-	            this._interval = result.interval;
-	            this._niceExtent = result.niceTickExtent;
-	        },
-
-	        /**
-	         * Nice extent.
-	         * @param {number} [splitNumber = 5] Given approx tick number
-	         * @param {boolean} [fixMin=false]
-	         * @param {boolean} [fixMax=false]
-	         */
-	        niceExtent: function (splitNumber, fixMin, fixMax) {
-	            var extent = this._extent;
-	            // If extent start and end are same, expand them
-	            if (extent[0] === extent[1]) {
-	                if (extent[0] !== 0) {
-	                    // Expand extent
-	                    var expandSize = extent[0];
-	                    // In the fowllowing case
-	                    //      Axis has been fixed max 100
-	                    //      Plus data are all 100 and axis extent are [100, 100].
-	                    // Extend to the both side will cause expanded max is larger than fixed max.
-	                    // So only expand to the smaller side.
-	                    if (!fixMax) {
-	                        extent[1] += expandSize / 2;
-	                        extent[0] -= expandSize / 2;
-	                    }
-	                    else {
-	                        extent[0] -= expandSize / 2;
-	                    }
-	                }
-	                else {
-	                    extent[1] = 1;
-	                }
-	            }
-	            var span = extent[1] - extent[0];
-	            // If there are no data and extent are [Infinity, -Infinity]
-	            if (!isFinite(span)) {
-	                extent[0] = 0;
-	                extent[1] = 1;
-	            }
-
-	            this.niceTicks(splitNumber);
-
-	            // var extent = this._extent;
-	            var interval = this._interval;
-
-	            if (!fixMin) {
-	                extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);
-	            }
-	            if (!fixMax) {
-	                extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);
-	            }
-	        }
-	    });
-
-	    /**
-	     * @return {module:echarts/scale/Time}
-	     */
-	    IntervalScale.create = function () {
-	        return new IntervalScale();
-	    };
-
-	    module.exports = IntervalScale;
-
-
-
-/***/ },
-/* 109 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * For testable.
-	 */
-
-
-	    var numberUtil = __webpack_require__(7);
-
-	    var roundNumber = numberUtil.round;
-
-	    var helper = {};
-
-	    /**
-	     * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number.
-	     *                                Should be extent[0] < extent[1].
-	     * @param {number} splitNumber splitNumber should be >= 1.
-	     * @return {Object} {interval, intervalPrecision, niceTickExtent}
-	     */
-	    helper.intervalScaleNiceTicks = function (extent, splitNumber) {
-	        var result = {};
-	        var span = extent[1] - extent[0];
-
-	        var interval = result.interval = numberUtil.nice(span / splitNumber, true);
-	        // Tow more digital for tick.
-	        var precision = result.intervalPrecision = numberUtil.getPrecisionSafe(interval) + 2;
-	        // Niced extent inside original extent
-	        var niceTickExtent = result.niceTickExtent = [
-	            roundNumber(Math.ceil(extent[0] / interval) * interval, precision),
-	            roundNumber(Math.floor(extent[1] / interval) * interval, precision)
-	        ];
-
-	        helper.fixExtent(niceTickExtent, extent);
-
-	        return result;
-	    };
-
-	    function clamp(niceTickExtent, idx, extent) {
-	        niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);
-	    }
-
-	    // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.
-	    helper.fixExtent = function (niceTickExtent, extent) {
-	        !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);
-	        !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);
-	        clamp(niceTickExtent, 0, extent);
-	        clamp(niceTickExtent, 1, extent);
-	        if (niceTickExtent[0] > niceTickExtent[1]) {
-	            niceTickExtent[0] = niceTickExtent[1];
-	        }
-	    };
-
-	    helper.intervalScaleGetTicks = function (interval, extent, niceTickExtent, intervalPrecision) {
-	        var ticks = [];
-
-	        // If interval is 0, return [];
-	        if (!interval) {
-	            return ticks;
-	        }
-
-	        // Consider this case: using dataZoom toolbox, zoom and zoom.
-	        var safeLimit = 10000;
-
-	        if (extent[0] < niceTickExtent[0]) {
-	            ticks.push(extent[0]);
-	        }
-	        var tick = niceTickExtent[0];
-
-	        while (tick <= niceTickExtent[1]) {
-	            ticks.push(tick);
-	            // Avoid rounding error
-	            tick = roundNumber(tick + interval, intervalPrecision);
-	            if (tick === ticks[ticks.length - 1]) {
-	                // Consider out of safe float point, e.g.,
-	                // -3711126.9907707 + 2e-10 === -3711126.9907707
-	                break;
-	            }
-	            if (ticks.length > safeLimit) {
-	                return [];
-	            }
-	        }
-	        // Consider this case: the last item of ticks is smaller
-	        // than niceTickExtent[1] and niceTickExtent[1] === extent[1].
-	        if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {
-	            ticks.push(extent[1]);
-	        }
-
-	        return ticks;
-	    };
-
-	    module.exports = helper;
-
-
-/***/ },
-/* 110 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Interval scale
-	 * @module echarts/coord/scale/Time
-	 */
-
-
-
-	    // [About UTC and local time zone]:
-	    // In most cases, `number.parseDate` will treat input data string as local time
-	    // (except time zone is specified in time string). And `format.formateTime` returns
-	    // local time by default. option.useUTC is false by default. This design have
-	    // concidered these common case:
-	    // (1) Time that is persistent in server is in UTC, but it is needed to be diplayed
-	    // in local time by default.
-	    // (2) By default, the input data string (e.g., '2011-01-02') should be displayed
-	    // as its original time, without any time difference.
-
-	    var zrUtil = __webpack_require__(4);
-	    var numberUtil = __webpack_require__(7);
-	    var formatUtil = __webpack_require__(6);
-	    var scaleHelper = __webpack_require__(109);
-
-	    var IntervalScale = __webpack_require__(108);
-
-	    var intervalScaleProto = IntervalScale.prototype;
-
-	    var mathCeil = Math.ceil;
-	    var mathFloor = Math.floor;
-	    var ONE_SECOND = 1000;
-	    var ONE_MINUTE = ONE_SECOND * 60;
-	    var ONE_HOUR = ONE_MINUTE * 60;
-	    var ONE_DAY = ONE_HOUR * 24;
-
-	    // FIXME 公用？
-	    var bisect = function (a, x, lo, hi) {
-	        while (lo < hi) {
-	            var mid = lo + hi >>> 1;
-	            if (a[mid][2] < x) {
-	                lo = mid + 1;
-	            }
-	            else {
-	                hi  = mid;
-	            }
-	        }
-	        return lo;
-	    };
-
-	    /**
-	     * @alias module:echarts/coord/scale/Time
-	     * @constructor
-	     */
-	    var TimeScale = IntervalScale.extend({
-	        type: 'time',
-
-	        // Overwrite
-	        getLabel: function (val) {
-	            var stepLvl = this._stepLvl;
-
-	            var date = new Date(val);
-
-	            return formatUtil.formatTime(stepLvl[0], date, this.getSetting('useUTC'));
-	        },
-
-	        // Overwrite
-	        niceExtent: function (approxTickNum, fixMin, fixMax) {
-	            var extent = this._extent;
-	            // If extent start and end are same, expand them
-	            if (extent[0] === extent[1]) {
-	                // Expand extent
-	                extent[0] -= ONE_DAY;
-	                extent[1] += ONE_DAY;
-	            }
-	            // If there are no data and extent are [Infinity, -Infinity]
-	            if (extent[1] === -Infinity && extent[0] === Infinity) {
-	                var d = new Date();
-	                extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate());
-	                extent[0] = extent[1] - ONE_DAY;
-	            }
-
-	            this.niceTicks(approxTickNum);
-
-	            // var extent = this._extent;
-	            var interval = this._interval;
-
-	            if (!fixMin) {
-	                extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval);
-	            }
-	            if (!fixMax) {
-	                extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval);
-	            }
-	        },
-
-	        // Overwrite
-	        niceTicks: function (approxTickNum) {
-	            var timezoneOffset = this.getSetting('useUTC')
-	                ? 0 : numberUtil.getTimezoneOffset() * 60 * 1000;
-	            approxTickNum = approxTickNum || 10;
-
-	            var extent = this._extent;
-	            var span = extent[1] - extent[0];
-	            var approxInterval = span / approxTickNum;
-	            var scaleLevelsLen = scaleLevels.length;
-	            var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen);
-
-	            var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)];
-	            var interval = level[2];
-	            // Same with interval scale if span is much larger than 1 year
-	            if (level[0] === 'year') {
-	                var yearSpan = span / interval;
-
-	                // From "Nice Numbers for Graph Labels" of Graphic Gems
-	                // var niceYearSpan = numberUtil.nice(yearSpan, false);
-	                var yearStep = numberUtil.nice(yearSpan / approxTickNum, true);
-
-	                interval *= yearStep;
-	            }
-
-	            var niceExtent = [
-	                Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset),
-	                Math.round(mathFloor((extent[1] - timezoneOffset)/ interval) * interval + timezoneOffset)
-	            ];
-
-	            scaleHelper.fixExtent(niceExtent, extent);
-
-	            this._stepLvl = level;
-	            // Interval will be used in getTicks
-	            this._interval = interval;
-	            this._niceExtent = niceExtent;
-	        },
-
-	        parse: function (val) {
-	            // val might be float.
-	            return +numberUtil.parseDate(val);
-	        }
-	    });
-
-	    zrUtil.each(['contain', 'normalize'], function (methodName) {
-	        TimeScale.prototype[methodName] = function (val) {
-	            return intervalScaleProto[methodName].call(this, this.parse(val));
-	        };
-	    });
-
-	    // Steps from d3
-	    var scaleLevels = [
-	        // Format       step    interval
-	        ['hh:mm:ss',    1,      ONE_SECOND],           // 1s
-	        ['hh:mm:ss',    5,      ONE_SECOND * 5],       // 5s
-	        ['hh:mm:ss',    10,     ONE_SECOND * 10],      // 10s
-	        ['hh:mm:ss',    15,     ONE_SECOND * 15],      // 15s
-	        ['hh:mm:ss',    30,     ONE_SECOND * 30],      // 30s
-	        ['hh:mm\nMM-dd',1,      ONE_MINUTE],          // 1m
-	        ['hh:mm\nMM-dd',5,      ONE_MINUTE * 5],      // 5m
-	        ['hh:mm\nMM-dd',10,     ONE_MINUTE * 10],     // 10m
-	        ['hh:mm\nMM-dd',15,     ONE_MINUTE * 15],     // 15m
-	        ['hh:mm\nMM-dd',30,     ONE_MINUTE * 30],     // 30m
-	        ['hh:mm\nMM-dd',1,      ONE_HOUR],        // 1h
-	        ['hh:mm\nMM-dd',2,      ONE_HOUR * 2],    // 2h
-	        ['hh:mm\nMM-dd',6,      ONE_HOUR * 6],    // 6h
-	        ['hh:mm\nMM-dd',12,     ONE_HOUR * 12],   // 12h
-	        ['MM-dd\nyyyy', 1,      ONE_DAY],   // 1d
-	        ['week',        7,      ONE_DAY * 7],        // 7d
-	        ['month',       1,      ONE_DAY * 31],       // 1M
-	        ['quarter',     3,      ONE_DAY * 380 / 4],  // 3M
-	        ['half-year',   6,      ONE_DAY * 380 / 2],  // 6M
-	        ['year',        1,      ONE_DAY * 380]       // 1Y
-	    ];
-
-	    /**
-	     * @param {module:echarts/model/Model}
-	     * @return {module:echarts/scale/Time}
-	     */
-	    TimeScale.create = function (model) {
-	        return new TimeScale({useUTC: model.ecModel.get('useUTC')});
-	    };
-
-	    module.exports = TimeScale;
-
-
-/***/ },
-/* 111 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Log scale
-	 * @module echarts/scale/Log
-	 */
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var Scale = __webpack_require__(107);
-	    var numberUtil = __webpack_require__(7);
-
-	    // Use some method of IntervalScale
-	    var IntervalScale = __webpack_require__(108);
-
-	    var scaleProto = Scale.prototype;
-	    var intervalScaleProto = IntervalScale.prototype;
-
-	    var getPrecisionSafe = numberUtil.getPrecisionSafe;
-	    var roundingErrorFix = numberUtil.round;
-
-	    var mathFloor = Math.floor;
-	    var mathCeil = Math.ceil;
-	    var mathPow = Math.pow;
-
-	    var mathLog = Math.log;
-
-	    var LogScale = Scale.extend({
-
-	        type: 'log',
-
-	        base: 10,
-
-	        $constructor: function () {
-	            Scale.apply(this, arguments);
-	            this._originalScale = new IntervalScale();
-	        },
-
-	        /**
-	         * @return {Array.<number>}
-	         */
-	        getTicks: function () {
-	            var originalScale = this._originalScale;
-	            var extent = this._extent;
-	            var originalExtent = originalScale.getExtent();
-
-	            return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) {
-	                var powVal = numberUtil.round(mathPow(this.base, val));
-
-	                // Fix #4158
-	                powVal = (val === extent[0] && originalScale.__fixMin)
-	                    ? fixRoundingError(powVal, originalExtent[0])
-	                    : powVal;
-	                powVal = (val === extent[1] && originalScale.__fixMax)
-	                    ? fixRoundingError(powVal, originalExtent[1])
-	                    : powVal;
-
-	                return powVal;
-	            }, this);
-	        },
-
-	        /**
-	         * @param {number} val
-	         * @return {string}
-	         */
-	        getLabel: intervalScaleProto.getLabel,
-
-	        /**
-	         * @param  {number} val
-	         * @return {number}
-	         */
-	        scale: function (val) {
-	            val = scaleProto.scale.call(this, val);
-	            return mathPow(this.base, val);
-	        },
-
-	        /**
-	         * @param {number} start
-	         * @param {number} end
-	         */
-	        setExtent: function (start, end) {
-	            var base = this.base;
-	            start = mathLog(start) / mathLog(base);
-	            end = mathLog(end) / mathLog(base);
-	            intervalScaleProto.setExtent.call(this, start, end);
-	        },
-
-	        /**
-	         * @return {number} end
-	         */
-	        getExtent: function () {
-	            var base = this.base;
-	            var extent = scaleProto.getExtent.call(this);
-	            extent[0] = mathPow(base, extent[0]);
-	            extent[1] = mathPow(base, extent[1]);
-
-	            // Fix #4158
-	            var originalScale = this._originalScale;
-	            var originalExtent = originalScale.getExtent();
-	            originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));
-	            originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));
-
-	            return extent;
-	        },
-
-	        /**
-	         * @param  {Array.<number>} extent
-	         */
-	        unionExtent: function (extent) {
-	            this._originalScale.unionExtent(extent);
-
-	            var base = this.base;
-	            extent[0] = mathLog(extent[0]) / mathLog(base);
-	            extent[1] = mathLog(extent[1]) / mathLog(base);
-	            scaleProto.unionExtent.call(this, extent);
-	        },
-
-	        /**
-	         * @override
-	         */
-	        unionExtentFromData: function (data, dim) {
-	            this.unionExtent(data.getDataExtent(dim, true, function (val) {
-	                return val > 0;
-	            }));
-	        },
-
-	        /**
-	         * Update interval and extent of intervals for nice ticks
-	         * @param  {number} [approxTickNum = 10] Given approx tick number
-	         */
-	        niceTicks: function (approxTickNum) {
-	            approxTickNum = approxTickNum || 10;
-	            var extent = this._extent;
-	            var span = extent[1] - extent[0];
-	            if (span === Infinity || span <= 0) {
-	                return;
-	            }
-
-	            var interval = numberUtil.quantity(span);
-	            var err = approxTickNum / span * interval;
-
-	            // Filter ticks to get closer to the desired count.
-	            if (err <= 0.5) {
-	                interval *= 10;
-	            }
-
-	            // Interval should be integer
-	            while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {
-	                interval *= 10;
-	            }
-
-	            var niceExtent = [
-	                numberUtil.round(mathCeil(extent[0] / interval) * interval),
-	                numberUtil.round(mathFloor(extent[1] / interval) * interval)
-	            ];
-
-	            this._interval = interval;
-	            this._niceExtent = niceExtent;
-	        },
-
-	        /**
-	         * Nice extent.
-	         * @param {number} [approxTickNum = 10] Given approx tick number
-	         * @param {boolean} [fixMin=false]
-	         * @param {boolean} [fixMax=false]
-	         */
-	        niceExtent: function (splitNumber, fixMin, fixMax) {
-	            intervalScaleProto.niceExtent.call(this, splitNumber, fixMin, fixMax);
-
-	            var originalScale = this._originalScale;
-	            originalScale.__fixMin = fixMin;
-	            originalScale.__fixMax = fixMax;
-	        }
-
-	    });
-
-	    zrUtil.each(['contain', 'normalize'], function (methodName) {
-	        LogScale.prototype[methodName] = function (val) {
-	            val = mathLog(val) / mathLog(this.base);
-	            return scaleProto[methodName].call(this, val);
-	        };
-	    });
-
-	    LogScale.create = function () {
-	        return new LogScale();
-	    };
-
-	    function fixRoundingError(val, originalVal) {
-	        return roundingErrorFix(val, getPrecisionSafe(originalVal));
-	    }
-
-	    module.exports = LogScale;
-
-
-/***/ },
 /* 112 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 
 	    function getName(obj) {
 	        if (zrUtil.isObject(obj) && obj.value != null) {
 	            return obj.value;
 	        }
 	        else {
-	            return obj;
+	            return obj + '';
 	        }
 	    }
 
@@ -25961,19 +26362,19 @@
 	    __webpack_require__(115);
 
 	    echarts.registerVisual(zrUtil.curry(
-	        __webpack_require__(120), 'line', 'circle', 'line'
+	        __webpack_require__(121), 'line', 'circle', 'line'
 	    ));
 	    echarts.registerLayout(zrUtil.curry(
-	        __webpack_require__(121), 'line'
+	        __webpack_require__(122), 'line'
 	    ));
 
 	    // Down sample after filter
 	    echarts.registerProcessor(PRIORITY.PROCESSOR.STATISTIC, zrUtil.curry(
-	        __webpack_require__(122), 'line'
+	        __webpack_require__(123), 'line'
 	    ));
 
 	    // In case developer forget to include grid component
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 
 /***/ },
@@ -25983,8 +26384,8 @@
 	'use strict';
 
 
-	    var createListFromArray = __webpack_require__(102);
-	    var SeriesModel = __webpack_require__(28);
+	    var createListFromArray = __webpack_require__(109);
+	    var SeriesModel = __webpack_require__(78);
 
 	    module.exports = SeriesModel.extend({
 
@@ -26078,11 +26479,11 @@
 	    var zrUtil = __webpack_require__(4);
 	    var SymbolDraw = __webpack_require__(116);
 	    var Symbol = __webpack_require__(117);
-	    var lineAnimationDiff = __webpack_require__(118);
-	    var graphic = __webpack_require__(44);
+	    var lineAnimationDiff = __webpack_require__(119);
+	    var graphic = __webpack_require__(18);
 	    var modelUtil = __webpack_require__(5);
-	    var polyHelper = __webpack_require__(119);
-	    var ChartView = __webpack_require__(43);
+	    var polyHelper = __webpack_require__(120);
+	    var ChartView = __webpack_require__(80);
 
 	    function isPointsSame(points1, points2) {
 	        if (points1.length !== points2.length) {
@@ -26784,7 +27185,7 @@
 	 */
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Symbol = __webpack_require__(117);
 
 	    /**
@@ -26917,9 +27318,10 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var symbolUtil = __webpack_require__(104);
-	    var graphic = __webpack_require__(44);
+	    var symbolUtil = __webpack_require__(111);
+	    var graphic = __webpack_require__(18);
 	    var numberUtil = __webpack_require__(7);
+	    var labelHelper = __webpack_require__(118);
 
 	    function getSymbolSize(data, idx) {
 	        var symbolSize = data.getItemVisual(idx, 'symbolSize');
@@ -27131,37 +27533,13 @@
 	            elStyle.opacity = opacity;
 	        }
 
-	        // Get last value dim
-	        var dimensions = data.dimensions.slice();
-	        var valueDim;
-	        var dataType;
-	        while (dimensions.length && (
-	            valueDim = dimensions.pop(),
-	            dataType = data.getDimensionInfo(valueDim).type,
-	            dataType === 'ordinal' || dataType === 'time'
-	        )) {} // jshint ignore:line
-
-	        if (valueDim != null && labelModel.getShallow('show')) {
-	            graphic.setText(elStyle, labelModel, color);
-	            elStyle.text = zrUtil.retrieve(
-	                seriesModel.getFormattedLabel(idx, 'normal'),
-	                data.get(valueDim, idx)
-	            );
-	        }
-	        else {
-	            elStyle.text = '';
-	        }
-
-	        if (valueDim != null && hoverLabelModel.getShallow('show')) {
-	            graphic.setText(hoverItemStyle, hoverLabelModel, color);
-	            hoverItemStyle.text = zrUtil.retrieve(
-	                seriesModel.getFormattedLabel(idx, 'emphasis'),
-	                data.get(valueDim, idx)
-	            );
-	        }
-	        else {
-	            hoverItemStyle.text = '';
-	        }
+	        var valueDim = labelHelper.findLabelValueDim(data);
+	        labelHelper.setTextToStyle(
+	            data, idx, valueDim, elStyle, seriesModel, labelModel, color
+	        );
+	        labelHelper.setTextToStyle(
+	            data, idx, valueDim, hoverItemStyle, seriesModel, hoverLabelModel, color
+	        );
 
 	        symbolPath.off('mouseover')
 	            .off('mouseout')
@@ -27214,6 +27592,60 @@
 
 /***/ },
 /* 118 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * @module echarts/chart/helper/Symbol
+	 */
+
+
+	    var graphic = __webpack_require__(18);
+	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+
+	    var helper = {};
+
+	    helper.findLabelValueDim = function (data) {
+	        var valueDim;
+	        var labelDims = modelUtil.otherDimToDataDim(data, 'label');
+
+	        if (labelDims.length) {
+	            valueDim = labelDims[0];
+	        }
+	        else {
+	            // Get last value dim
+	            var dimensions = data.dimensions.slice();
+	            var dataType;
+	            while (dimensions.length && (
+	                valueDim = dimensions.pop(),
+	                dataType = data.getDimensionInfo(valueDim).type,
+	                dataType === 'ordinal' || dataType === 'time'
+	            )) {} // jshint ignore:line
+	        }
+
+	        return valueDim;
+	    };
+
+	    helper.setTextToStyle = function (
+	        data, dataIndex, valueDim, elStyle, seriesModel, labelModel, color
+	    ) {
+	        if (valueDim != null && labelModel.getShallow('show')) {
+	            graphic.setText(elStyle, labelModel, color);
+	            elStyle.text = zrUtil.retrieve(
+	                seriesModel.getFormattedLabel(dataIndex, 'normal'),
+	                data.get(valueDim, dataIndex)
+	            );
+	        }
+	        else {
+	            elStyle.text = '';
+	        }
+	    };
+
+	    module.exports = helper;
+
+
+/***/ },
+/* 119 */
 /***/ function(module, exports) {
 
 	
@@ -27427,13 +27859,13 @@
 
 
 /***/ },
-/* 119 */
+/* 120 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// Poly path support NaN point
 
 
-	    var Path = __webpack_require__(46);
+	    var Path = __webpack_require__(20);
 	    var vec2 = __webpack_require__(10);
 
 	    var vec2Min = vec2.min;
@@ -27682,7 +28114,7 @@
 
 
 /***/ },
-/* 120 */
+/* 121 */
 /***/ function(module, exports) {
 
 	
@@ -27731,7 +28163,7 @@
 
 
 /***/ },
-/* 121 */
+/* 122 */
 /***/ function(module, exports) {
 
 	
@@ -27741,23 +28173,29 @@
 	            var data = seriesModel.getData();
 	            var coordSys = seriesModel.coordinateSystem;
 
-	            if (coordSys) {
-	                var dims = coordSys.dimensions;
+	            if (!coordSys) {
+	                return;
+	            }
 
-	                if (dims.length === 1) {
-	                    data.each(dims[0], function (x, idx) {
-	                        // Also {Array.<number>}, not undefined to avoid if...else... statement
-	                        data.setItemLayout(idx, isNaN(x) ? [NaN, NaN] : coordSys.dataToPoint(x));
-	                    });
-	                }
-	                else if (dims.length === 2) {
-	                    data.each(dims, function (x, y, idx) {
-	                        // Also {Array.<number>}, not undefined to avoid if...else... statement
-	                        data.setItemLayout(
-	                            idx, (isNaN(x) || isNaN(y)) ? [NaN, NaN] : coordSys.dataToPoint([x, y])
-	                        );
-	                    }, true);
-	                }
+	            var dims = [];
+	            var coordDims = coordSys.dimensions;
+	            for (var i = 0; i < coordDims.length; i++) {
+	                dims.push(seriesModel.coordDimToDataDim(coordSys.dimensions[i])[0]);
+	            }
+
+	            if (dims.length === 1) {
+	                data.each(dims[0], function (x, idx) {
+	                    // Also {Array.<number>}, not undefined to avoid if...else... statement
+	                    data.setItemLayout(idx, isNaN(x) ? [NaN, NaN] : coordSys.dataToPoint(x));
+	                });
+	            }
+	            else if (dims.length === 2) {
+	                data.each(dims, function (x, y, idx) {
+	                    // Also {Array.<number>}, not undefined to avoid if...else... statement
+	                    data.setItemLayout(
+	                        idx, (isNaN(x) || isNaN(y)) ? [NaN, NaN] : coordSys.dataToPoint([x, y])
+	                    );
+	                }, true);
 	            }
 	        });
 	    };
@@ -27765,7 +28203,7 @@
 
 
 /***/ },
-/* 122 */
+/* 123 */
 /***/ function(module, exports) {
 
 	
@@ -27848,17 +28286,17 @@
 
 
 /***/ },
-/* 123 */
+/* 124 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var echarts = __webpack_require__(1);
 
-	    __webpack_require__(124);
+	    __webpack_require__(125);
 
 	    __webpack_require__(133);
 
@@ -27892,7 +28330,7 @@
 
 
 /***/ },
-/* 124 */
+/* 125 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -27902,12 +28340,12 @@
 	 */
 	var factory = exports;
 
-	    var layout = __webpack_require__(21);
-	    var axisHelper = __webpack_require__(105);
+	    var layout = __webpack_require__(71);
+	    var axisHelper = __webpack_require__(101);
 
 	    var zrUtil = __webpack_require__(4);
-	    var Cartesian2D = __webpack_require__(125);
-	    var Axis2D = __webpack_require__(127);
+	    var Cartesian2D = __webpack_require__(126);
+	    var Axis2D = __webpack_require__(128);
 
 	    var each = zrUtil.each;
 
@@ -27997,7 +28435,9 @@
 	            for (var idx in axes) {
 	                if (axes.hasOwnProperty(idx)) {
 	                    var axis = axes[idx];
-	                    if (axis && (axis.type === 'category' || !ifAxisCrossZero(axis))) {
+	                    if (axis && (
+	                        axis.type === 'category' || axis.type === 'time' || !ifAxisCrossZero(axis)
+	                    )) {
 	                        return true;
 	                    }
 	                }
@@ -28452,7 +28892,8 @@
 	        ecModel.eachComponent('grid', function (gridModel, idx) {
 	            var grid = new Grid(gridModel, ecModel, api);
 	            grid.name = 'grid_' + idx;
-	            grid.resize(gridModel, api);
+	            // Postpone `resize` to `update`.
+	            // grid.resize(gridModel, api);
 
 	            gridModel.coordinateSystem = grid;
 
@@ -28499,20 +28940,20 @@
 	    // For deciding which dimensions to use when creating list data
 	    Grid.dimensions = Grid.prototype.dimensions = Cartesian2D.prototype.dimensions;
 
-	    __webpack_require__(26).register('cartesian2d', Grid);
+	    __webpack_require__(76).register('cartesian2d', Grid);
 
 	    module.exports = Grid;
 
 
 /***/ },
-/* 125 */
+/* 126 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var Cartesian = __webpack_require__(126);
+	    var Cartesian = __webpack_require__(127);
 
 	    function Cartesian2D(name) {
 
@@ -28613,6 +29054,7 @@
 	        getOtherAxis: function (axis) {
 	            return this.getAxis(axis.dim === 'x' ? 'y' : 'x');
 	        }
+
 	    };
 
 	    zrUtil.inherits(Cartesian2D, Cartesian);
@@ -28621,7 +29063,7 @@
 
 
 /***/ },
-/* 126 */
+/* 127 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -28739,14 +29181,13 @@
 
 
 /***/ },
-/* 127 */
+/* 128 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
 	    var Axis = __webpack_require__(100);
-	    var axisLabelInterval = __webpack_require__(128);
 
 	    /**
 	     * Extend axis 2d
@@ -28826,17 +29267,6 @@
 	        },
 
 	        /**
-	         * @return {number}
-	         */
-	        getLabelInterval: function () {
-	            var labelInterval = this._labelInterval;
-	            if (!labelInterval) {
-	                labelInterval = this._labelInterval = axisLabelInterval(this);
-	            }
-	            return labelInterval;
-	        },
-
-	        /**
 	         * If label is ignored.
 	         * Automatically used when axis is category and label can not be all shown
 	         * @param  {number}  idx
@@ -28881,37 +29311,6 @@
 
 
 /***/ },
-/* 128 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-	/**
-	 * Helper function for axisLabelInterval calculation
-	 */
-
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var axisHelper = __webpack_require__(105);
-
-	    module.exports = function (axis) {
-	        var axisModel = axis.model;
-	        var labelModel = axisModel.getModel('axisLabel');
-	        var labelInterval = labelModel.get('interval');
-	        if (!(axis.type === 'category' && labelInterval === 'auto')) {
-	            return labelInterval === 'auto' ? 0 : labelInterval;
-	        }
-
-	        return axisHelper.getAxisLabelInterval(
-	            zrUtil.map(axis.scale.getTicks(), axis.dataToCoord, axis),
-	            axisModel.getFormattedLabels(),
-	            labelModel.getModel('textStyle').getFont(),
-	            axis.isHorizontal()
-	        );
-	    };
-
-
-/***/ },
 /* 129 */
 /***/ function(module, exports, __webpack_require__) {
 
@@ -28922,7 +29321,7 @@
 
 	    __webpack_require__(130);
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 
 	    module.exports = ComponentModel.extend({
 
@@ -28963,7 +29362,7 @@
 	'use strict';
 
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 	    var zrUtil = __webpack_require__(4);
 	    var axisModelCreator = __webpack_require__(131);
 
@@ -29043,8 +29442,8 @@
 
 	    var axisDefault = __webpack_require__(132);
 	    var zrUtil = __webpack_require__(4);
-	    var ComponentModel = __webpack_require__(19);
-	    var layout = __webpack_require__(21);
+	    var ComponentModel = __webpack_require__(69);
+	    var layout = __webpack_require__(71);
 
 	    // FIXME axisType is fixed ?
 	    var AXIS_TYPES = ['value', 'category', 'time', 'log'];
@@ -29246,10 +29645,11 @@
 	        min: 'dataMin',
 	        max: 'dataMax'
 	    }, valueAxis);
+
 	    var logAxis = zrUtil.defaults({
+	        scale: true,
 	        logBase: 10
 	    }, valueAxis);
-	    logAxis.scale = true;
 
 	    module.exports = {
 	        categoryAxis: categoryAxis,
@@ -29279,7 +29679,7 @@
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var AxisBuilder = __webpack_require__(135);
 	    var AxisView = __webpack_require__(136);
 	    var cartesianAxisHelper = __webpack_require__(138);
@@ -29515,7 +29915,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var formatUtil = __webpack_require__(6);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Model = __webpack_require__(12);
 	    var numberUtil = __webpack_require__(7);
 	    var remRadian = numberUtil.remRadian;
@@ -30686,7 +31086,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    __webpack_require__(124);
+	    __webpack_require__(125);
 
 	    __webpack_require__(140);
 	    __webpack_require__(142);
@@ -30695,6 +31095,7 @@
 	    var echarts = __webpack_require__(1);
 
 	    echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'bar'));
+
 	    // Visual coding for legend
 	    echarts.registerVisual(function (ecModel) {
 	        ecModel.eachSeriesByType('bar', function (seriesModel) {
@@ -30704,7 +31105,7 @@
 	    });
 
 	    // In case developer forget to include grid component
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 
 /***/ },
@@ -30730,20 +31131,14 @@
 	'use strict';
 
 
-	    var SeriesModel = __webpack_require__(28);
-	    var createListFromArray = __webpack_require__(102);
+	    var SeriesModel = __webpack_require__(78);
+	    var createListFromArray = __webpack_require__(109);
 
 	    module.exports = SeriesModel.extend({
 
 	        type: 'series.__base_bar__',
 
 	        getInitialData: function (option, ecModel) {
-	            if (true) {
-	                var coordSys = option.coordinateSystem;
-	                if (coordSys !== 'cartesian2d') {
-	                    throw new Error('Bar only support cartesian2d coordinateSystem');
-	                }
-	            }
 	            return createListFromArray(option.data, this, ecModel);
 	        },
 
@@ -30775,6 +31170,8 @@
 
 	            // 最小高度改为0
 	            barMinHeight: 0,
+	            // 最小角度为0，仅对极坐标系下的柱状图有效
+	            barMinAngle: 0,
 
 	            // barMaxWidth: null,
 	            // 默认自适应
@@ -30806,7 +31203,7 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var helper = __webpack_require__(143);
 
 	    var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'normal', 'barBorderWidth'];
@@ -30822,8 +31219,13 @@
 	        render: function (seriesModel, ecModel, api) {
 	            var coordinateSystemType = seriesModel.get('coordinateSystem');
 
-	            if (coordinateSystemType === 'cartesian2d') {
-	                this._renderOnCartesian(seriesModel, ecModel, api);
+	            if (coordinateSystemType === 'cartesian2d'
+	                || coordinateSystemType === 'polar'
+	            ) {
+	                this._render(seriesModel, ecModel, api);
+	            }
+	            else if (true) {
+	                console.warn('Only cartesian2d and polar supported for bar.');
 	            }
 
 	            return this.group;
@@ -30831,14 +31233,22 @@
 
 	        dispose: zrUtil.noop,
 
-	        _renderOnCartesian: function (seriesModel, ecModel, api) {
+	        _render: function (seriesModel, ecModel, api) {
 	            var group = this.group;
 	            var data = seriesModel.getData();
 	            var oldData = this._data;
 
-	            var cartesian = seriesModel.coordinateSystem;
-	            var baseAxis = cartesian.getBaseAxis();
-	            var isHorizontal = baseAxis.isHorizontal();
+	            var coord = seriesModel.coordinateSystem;
+	            var baseAxis = coord.getBaseAxis();
+	            var isHorizontalOrRadial;
+
+	            if (coord.type === 'cartesian2d') {
+	                isHorizontalOrRadial = baseAxis.isHorizontal();
+	            }
+	            else if (coord.type === 'polar') {
+	                isHorizontalOrRadial = baseAxis.dim === 'angle';
+	            }
+
 	            var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;
 
 	            data.diff(oldData)
@@ -30848,12 +31258,17 @@
 	                    }
 
 	                    var itemModel = data.getItemModel(dataIndex);
-	                    var layout = getRectItemLayout(data, dataIndex, itemModel);
-	                    var el = createRect(data, dataIndex, itemModel, layout, isHorizontal, animationModel);
+	                    var layout = getLayout[coord.type](data, dataIndex, itemModel);
+	                    var el = elementCreator[coord.type](
+	                        data, dataIndex, itemModel, layout, isHorizontalOrRadial, animationModel
+	                    );
 	                    data.setItemGraphicEl(dataIndex, el);
 	                    group.add(el);
 
-	                    updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal);
+	                    updateStyle(
+	                        el, data, dataIndex, itemModel, layout,
+	                        seriesModel, isHorizontalOrRadial, coord.type === 'polar'
+	                    );
 	                })
 	                .update(function (newIndex, oldIndex) {
 	                    var el = oldData.getItemGraphicEl(oldIndex);
@@ -30864,24 +31279,34 @@
 	                    }
 
 	                    var itemModel = data.getItemModel(newIndex);
-	                    var layout = getRectItemLayout(data, newIndex, itemModel);
+	                    var layout = getLayout[coord.type](data, newIndex, itemModel);
 
 	                    if (el) {
 	                        graphic.updateProps(el, {shape: layout}, animationModel, newIndex);
 	                    }
 	                    else {
-	                        el = createRect(data, newIndex, itemModel, layout, isHorizontal, animationModel, true);
+	                        el = elementCreator[coord.type](
+	                            data, newIndex, itemModel, layout, isHorizontalOrRadial, animationModel, true
+	                        );
 	                    }
 
 	                    data.setItemGraphicEl(newIndex, el);
 	                    // Add back
 	                    group.add(el);
 
-	                    updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontal);
+	                    updateStyle(
+	                        el, data, newIndex, itemModel, layout,
+	                        seriesModel, isHorizontalOrRadial, coord.type === 'polar'
+	                    );
 	                })
 	                .remove(function (dataIndex) {
 	                    var el = oldData.getItemGraphicEl(dataIndex);
-	                    el && removeRect(dataIndex, animationModel, el);
+	                    if (coord.type === 'cartesian2d') {
+	                        el && removeRect(dataIndex, animationModel, el);
+	                    }
+	                    else {
+	                        el && removeSector(dataIndex, animationModel, el);
+	                    }
 	                })
 	                .execute();
 
@@ -30894,7 +31319,12 @@
 	            if (ecModel.get('animation')) {
 	                if (data) {
 	                    data.eachItemGraphicEl(function (el) {
-	                        removeRect(el.dataIndex, ecModel, el);
+	                        if (el.type === 'sector') {
+	                            removeSector(el.dataIndex, ecModel, el);
+	                        }
+	                        else {
+	                            removeRect(el.dataIndex, ecModel, el);
+	                        }
 	                    });
 	                }
 	            }
@@ -30904,23 +31334,50 @@
 	        }
 	    });
 
-	    function createRect(data, dataIndex, itemModel, layout, isHorizontal, animationModel, isUpdate) {
-	        var rect = new graphic.Rect({shape: zrUtil.extend({}, layout)});
+	    var elementCreator = {
 
-	        // Animation
-	        if (animationModel) {
-	            var rectShape = rect.shape;
-	            var animateProperty = isHorizontal ? 'height' : 'width';
-	            var animateTarget = {};
-	            rectShape[animateProperty] = 0;
-	            animateTarget[animateProperty] = layout[animateProperty];
-	            graphic[isUpdate ? 'updateProps' : 'initProps'](rect, {
-	                shape: animateTarget
-	            }, animationModel, dataIndex);
+	        cartesian2d: function (
+	            data, dataIndex, itemModel, layout, isHorizontal,
+	            animationModel, isUpdate
+	        ) {
+	            var rect = new graphic.Rect({shape: zrUtil.extend({}, layout)});
+
+	            // Animation
+	            if (animationModel) {
+	                var rectShape = rect.shape;
+	                var animateProperty = isHorizontal ? 'height' : 'width';
+	                var animateTarget = {};
+	                rectShape[animateProperty] = 0;
+	                animateTarget[animateProperty] = layout[animateProperty];
+	                graphic[isUpdate ? 'updateProps' : 'initProps'](rect, {
+	                    shape: animateTarget
+	                }, animationModel, dataIndex);
+	            }
+
+	            return rect;
+	        },
+
+	        polar: function (
+	            data, dataIndex, itemModel, layout, isRadial,
+	            animationModel, isUpdate
+	        ) {
+	            var sector = new graphic.Sector({shape: zrUtil.extend({}, layout)});
+
+	            // Animation
+	            if (animationModel) {
+	                var sectorShape = sector.shape;
+	                var animateProperty = isRadial ? 'r' : 'endAngle';
+	                var animateTarget = {};
+	                sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle;
+	                animateTarget[animateProperty] = layout[animateProperty];
+	                graphic[isUpdate ? 'updateProps' : 'initProps'](sector, {
+	                    shape: animateTarget
+	                }, animationModel, dataIndex);
+	            }
+
+	            return sector;
 	        }
-
-	        return rect;
-	    }
+	    };
 
 	    function removeRect(dataIndex, animationModel, el) {
 	        // Not show text when animating
@@ -30934,28 +31391,58 @@
 	        });
 	    }
 
-	    function getRectItemLayout(data, dataIndex, itemModel) {
-	        var layout = data.getItemLayout(dataIndex);
-	        var fixedLineWidth = getLineWidth(itemModel, layout);
-
-	        // fix layout with lineWidth
-	        var signX = layout.width > 0 ? 1 : -1;
-	        var signY = layout.height > 0 ? 1 : -1;
-	        return {
-	            x: layout.x + signX * fixedLineWidth / 2,
-	            y: layout.y + signY * fixedLineWidth / 2,
-	            width: layout.width - signX * fixedLineWidth,
-	            height: layout.height - signY * fixedLineWidth
-	        };
+	    function removeSector(dataIndex, animationModel, el) {
+	        // Not show text when animating
+	        el.style.text = '';
+	        graphic.updateProps(el, {
+	            shape: {
+	                r: el.shape.r0
+	            }
+	        }, animationModel, dataIndex, function () {
+	            el.parent && el.parent.remove(el);
+	        });
 	    }
 
-	    function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal) {
+	    var getLayout = {
+	        cartesian2d: function (data, dataIndex, itemModel) {
+	            var layout = data.getItemLayout(dataIndex);
+	            var fixedLineWidth = getLineWidth(itemModel, layout);
+
+	            // fix layout with lineWidth
+	            var signX = layout.width > 0 ? 1 : -1;
+	            var signY = layout.height > 0 ? 1 : -1;
+	            return {
+	                x: layout.x + signX * fixedLineWidth / 2,
+	                y: layout.y + signY * fixedLineWidth / 2,
+	                width: layout.width - signX * fixedLineWidth,
+	                height: layout.height - signY * fixedLineWidth
+	            };
+	        },
+
+	        polar: function (data, dataIndex, itemModel) {
+	            var layout = data.getItemLayout(dataIndex);
+	            return {
+	                cx: layout.cx,
+	                cy: layout.cy,
+	                r0: layout.r0,
+	                r: layout.r,
+	                startAngle: layout.startAngle,
+	                endAngle: layout.endAngle
+	            };
+	        }
+	    };
+
+	    function updateStyle(
+	        el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal, isPolar
+	    ) {
 	        var color = data.getItemVisual(dataIndex, 'color');
 	        var opacity = data.getItemVisual(dataIndex, 'opacity');
 	        var itemStyleModel = itemModel.getModel('itemStyle.normal');
 	        var hoverStyle = itemModel.getModel('itemStyle.emphasis').getBarItemStyle();
 
-	        el.setShape('r', itemStyleModel.get('barBorderRadius') || 0);
+	        if (!isPolar && isHorizontal) {
+	            el.setShape('r', itemStyleModel.get('barBorderRadius') || 0);
+	        }
 
 	        el.useStyle(zrUtil.defaults(
 	            {
@@ -30969,10 +31456,12 @@
 	            ? (layout.height > 0 ? 'bottom' : 'top')
 	            : (layout.width > 0 ? 'left' : 'right');
 
-	        helper.setLabel(
-	            el.style, hoverStyle, itemModel, color,
-	            seriesModel, dataIndex, labelPositionOutside
-	        );
+	        if (!isPolar) {
+	            helper.setLabel(
+	                el.style, hoverStyle, itemModel, color,
+	                seriesModel, dataIndex, labelPositionOutside
+	            );
+	        }
 
 	        graphic.setHoverStyle(el, hoverStyle);
 	    }
@@ -30993,7 +31482,7 @@
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 
 	    var helper = {};
 
@@ -31088,49 +31577,65 @@
 	    var numberUtil = __webpack_require__(7);
 	    var parsePercent = numberUtil.parsePercent;
 
+	    var STACK_PREFIX = '__ec_stack_';
+
 	    function getSeriesStackId(seriesModel) {
-	        return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex;
+	        return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex;
 	    }
 
 	    function getAxisKey(axis) {
 	        return axis.dim + axis.index;
 	    }
 
-	    function calBarWidthAndOffset(barSeries, api) {
-	        // Columns info on each category axis. Key is cartesian name
-	        var columnsMap = {};
+	    /**
+	     * @param {Object} opt
+	     * @param {module:echarts/coord/Axis} opt.axis Only support category axis currently.
+	     * @param {number} opt.count Positive interger.
+	     * @param {number} [opt.barWidth]
+	     * @param {number} [opt.barMaxWidth]
+	     * @param {number} [opt.barGap]
+	     * @param {number} [opt.barCategoryGap]
+	     * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined.
+	     */
+	    function getLayoutOnAxis(opt, api) {
+	        var params = [];
+	        var baseAxis = opt.axis;
+	        var axisKey = 'axis0';
 
-	        zrUtil.each(barSeries, function (seriesModel, idx) {
+	        if (baseAxis.type !== 'category') {
+	            return;
+	        }
+	        var bandWidth = baseAxis.getBandWidth();
+
+	        for (var i = 0; i < opt.count || 0; i++) {
+	            params.push(zrUtil.defaults({
+	                bandWidth: bandWidth,
+	                axisKey: axisKey,
+	                stackId: STACK_PREFIX + i
+	            }, opt));
+	        }
+	        var widthAndOffsets = doCalBarWidthAndOffset(params, api);
+
+	        var result = [];
+	        for (var i = 0; i < opt.count; i++) {
+	            var item = widthAndOffsets[axisKey][STACK_PREFIX + i];
+	            item.offsetCenter = item.offset + item.width / 2;
+	            result.push(item);
+	        }
+
+	        return result;
+	    }
+
+	    function calBarWidthAndOffset(barSeries, api) {
+	        var seriesInfoList = zrUtil.map(barSeries, function (seriesModel) {
 	            var data = seriesModel.getData();
 	            var cartesian = seriesModel.coordinateSystem;
-
 	            var baseAxis = cartesian.getBaseAxis();
 	            var axisExtent = baseAxis.getExtent();
 	            var bandWidth = baseAxis.type === 'category'
 	                ? baseAxis.getBandWidth()
 	                : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count());
 
-	            var columnsOnAxis = columnsMap[getAxisKey(baseAxis)] || {
-	                bandWidth: bandWidth,
-	                remainedWidth: bandWidth,
-	                autoWidthCount: 0,
-	                categoryGap: '20%',
-	                gap: '30%',
-	                stacks: {}
-	            };
-	            var stacks = columnsOnAxis.stacks;
-	            columnsMap[getAxisKey(baseAxis)] = columnsOnAxis;
-
-	            var stackId = getSeriesStackId(seriesModel);
-
-	            if (!stacks[stackId]) {
-	                columnsOnAxis.autoWidthCount++;
-	            }
-	            stacks[stackId] = stacks[stackId] || {
-	                width: 0,
-	                maxWidth: 0
-	            };
-
 	            var barWidth = parsePercent(
 	                seriesModel.get('barWidth'), bandWidth
 	            );
@@ -31140,20 +31645,66 @@
 	            var barGap = seriesModel.get('barGap');
 	            var barCategoryGap = seriesModel.get('barCategoryGap');
 
+	            return {
+	                bandWidth: bandWidth,
+	                barWidth: barWidth,
+	                barMaxWidth: barMaxWidth,
+	                barGap: barGap,
+	                barCategoryGap: barCategoryGap,
+	                axisKey: getAxisKey(baseAxis),
+	                stackId: getSeriesStackId(seriesModel)
+	            };
+	        });
+
+	        return doCalBarWidthAndOffset(seriesInfoList, api);
+	    }
+
+	    function doCalBarWidthAndOffset(seriesInfoList, api) {
+	        // Columns info on each category axis. Key is cartesian name
+	        var columnsMap = {};
+
+	        zrUtil.each(seriesInfoList, function (seriesInfo, idx) {
+	            var axisKey = seriesInfo.axisKey;
+	            var bandWidth = seriesInfo.bandWidth;
+	            var columnsOnAxis = columnsMap[axisKey] || {
+	                bandWidth: bandWidth,
+	                remainedWidth: bandWidth,
+	                autoWidthCount: 0,
+	                categoryGap: '20%',
+	                gap: '30%',
+	                stacks: {}
+	            };
+	            var stacks = columnsOnAxis.stacks;
+	            columnsMap[axisKey] = columnsOnAxis;
+
+	            var stackId = seriesInfo.stackId;
+
+	            if (!stacks[stackId]) {
+	                columnsOnAxis.autoWidthCount++;
+	            }
+	            stacks[stackId] = stacks[stackId] || {
+	                width: 0,
+	                maxWidth: 0
+	            };
+
 	            // Caution: In a single coordinate system, these barGrid attributes
 	            // will be shared by series. Consider that they have default values,
 	            // only the attributes set on the last series will work.
 	            // Do not change this fact unless there will be a break change.
 
 	            // TODO
+	            var barWidth = seriesInfo.barWidth;
 	            if (barWidth && !stacks[stackId].width) {
 	                barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);
 	                stacks[stackId].width = barWidth;
 	                columnsOnAxis.remainedWidth -= barWidth;
 	            }
 
+	            var barMaxWidth = seriesInfo.barMaxWidth;
 	            barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);
+	            var barGap = seriesInfo.barGap;
 	            (barGap != null) && (columnsOnAxis.gap = barGap);
+	            var barCategoryGap = seriesInfo.barCategoryGap;
 	            (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap);
 	        });
 
@@ -31243,6 +31794,11 @@
 
 	        ecModel.eachSeriesByType(seriesType, function (seriesModel) {
 
+	            // Check series coordinate, do layout for cartesian2d only
+	            if (seriesModel.coordinateSystem.type !== 'cartesian2d') {
+	                return;
+	            }
+
 	            var data = seriesModel.getData();
 	            var cartesian = seriesModel.coordinateSystem;
 	            var baseAxis = cartesian.getBaseAxis();
@@ -31329,6 +31885,8 @@
 	        }, this);
 	    }
 
+	    barLayoutGrid.getLayoutOnAxis = getLayoutOnAxis;
+
 	    module.exports = barLayoutGrid;
 
 
@@ -31377,7 +31935,7 @@
 	    var List = __webpack_require__(98);
 	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 
 	    var dataSelectableMixin = __webpack_require__(148);
 
@@ -31536,9 +32094,9 @@
 
 	        updateSelectedMap: function (targetList) {
 	            this._selectTargetMap = zrUtil.reduce(targetList || [], function (targetMap, target) {
-	                targetMap[target.name] = target;
+	                targetMap.set(target.name, target);
 	                return targetMap;
-	            }, {});
+	            }, zrUtil.createHashMap());
 	        },
 	        /**
 	         * @param {string} name
@@ -31546,10 +32104,10 @@
 	        // PENGING If selectedMode is null ?
 	        select: function (name) {
 	            var targetMap = this._selectTargetMap;
-	            var target = targetMap[name];
+	            var target = targetMap.get(name);
 	            var selectedMode = this.get('selectedMode');
 	            if (selectedMode === 'single') {
-	                zrUtil.each(targetMap, function (target) {
+	                targetMap.each(function (target) {
 	                    target.selected = false;
 	                });
 	            }
@@ -31560,7 +32118,7 @@
 	         * @param {string} name
 	         */
 	        unSelect: function (name) {
-	            var target = this._selectTargetMap[name];
+	            var target = this._selectTargetMap.get(name);
 	            // var selectedMode = this.get('selectedMode');
 	            // selectedMode !== 'single' && target && (target.selected = false);
 	            target && (target.selected = false);
@@ -31570,7 +32128,7 @@
 	         * @param {string} name
 	         */
 	        toggleSelected: function (name) {
-	            var target = this._selectTargetMap[name];
+	            var target = this._selectTargetMap.get(name);
 	            if (target != null) {
 	                this[target.selected ? 'unSelect' : 'select'](name);
 	                return target.selected;
@@ -31581,7 +32139,7 @@
 	         * @param {string} name
 	         */
 	        isSelected: function (name) {
-	            var target = this._selectTargetMap[name];
+	            var target = this._selectTargetMap.get(name);
 	            return target && target.selected;
 	        }
 	    };
@@ -31593,7 +32151,7 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 
 	    /**
@@ -31871,7 +32429,7 @@
 
 
 	    // Pie view
-	    var Pie = __webpack_require__(43).extend({
+	    var Pie = __webpack_require__(80).extend({
 
 	        type: 'pie',
 
@@ -32088,9 +32646,7 @@
 /* 152 */
 /***/ function(module, exports, __webpack_require__) {
 
-	// TODO minAngle
-
-
+	
 
 	    var numberUtil = __webpack_require__(7);
 	    var parsePercent = numberUtil.parsePercent;
@@ -32126,9 +32682,14 @@
 
 	            var minAngle = seriesModel.get('minAngle') * RADIAN;
 
+	            var validDataCount = 0;
+	            data.each('value', function (value) {
+	                !isNaN(value) && validDataCount++;
+	            });
+
 	            var sum = data.getSum('value');
 	            // Sum may be 0
-	            var unitRadian = Math.PI / (sum || data.count()) * 2;
+	            var unitRadian = Math.PI / (sum || validDataCount) * 2;
 
 	            var clockwise = seriesModel.get('clockwise');
 
@@ -32144,8 +32705,8 @@
 	            var valueSumLargerThanMinAngle = 0;
 
 	            var currentAngle = startAngle;
-
 	            var dir = clockwise ? 1 : -1;
+
 	            data.each('value', function (value, idx) {
 	                var angle;
 	                if (isNaN(value)) {
@@ -32170,7 +32731,7 @@
 	                        ? unitRadian : (value * unitRadian);
 	                }
 	                else {
-	                    angle = PI2 / (data.count() || 1);
+	                    angle = PI2 / validDataCount;
 	                }
 
 	                if (angle < minAngle) {
@@ -32200,27 +32761,32 @@
 
 	            // Some sector is constrained by minAngle
 	            // Rest sectors needs recalculate angle
-	            if (restAngle < PI2) {
+	            if (restAngle < PI2 && validDataCount) {
 	                // Average the angle if rest angle is not enough after all angles is
 	                // Constrained by minAngle
 	                if (restAngle <= 1e-3) {
-	                    var angle = PI2 / data.count();
-	                    data.each(function (idx) {
-	                        var layout = data.getItemLayout(idx);
-	                        layout.startAngle = startAngle + dir * idx * angle;
-	                        layout.endAngle = startAngle + dir * (idx + 1) * angle;
+	                    var angle = PI2 / validDataCount;
+	                    data.each('value', function (value, idx) {
+	                        if (!isNaN(value)) {
+	                            var layout = data.getItemLayout(idx);
+	                            layout.angle = angle;
+	                            layout.startAngle = startAngle + dir * idx * angle;
+	                            layout.endAngle = startAngle + dir * (idx + 1) * angle;
+	                        }
 	                    });
 	                }
 	                else {
 	                    unitRadian = restAngle / valueSumLargerThanMinAngle;
 	                    currentAngle = startAngle;
 	                    data.each('value', function (value, idx) {
-	                        var layout = data.getItemLayout(idx);
-	                        var angle = layout.angle === minAngle
-	                            ? minAngle : value * unitRadian;
-	                        layout.startAngle = currentAngle;
-	                        layout.endAngle = currentAngle + dir * angle;
-	                        currentAngle += dir * angle;
+	                        if (!isNaN(value)) {
+	                            var layout = data.getItemLayout(idx);
+	                            var angle = layout.angle === minAngle
+	                                ? minAngle : value * unitRadian;
+	                            layout.startAngle = currentAngle;
+	                            layout.endAngle = currentAngle + dir * angle;
+	                            currentAngle += dir * angle;
+	                        }
 	                    });
 	                }
 	            }
@@ -32502,14 +33068,14 @@
 	    __webpack_require__(157);
 
 	    echarts.registerVisual(zrUtil.curry(
-	        __webpack_require__(120), 'scatter', 'circle', null
+	        __webpack_require__(121), 'scatter', 'circle', null
 	    ));
 	    echarts.registerLayout(zrUtil.curry(
-	        __webpack_require__(121), 'scatter'
+	        __webpack_require__(122), 'scatter'
 	    ));
 
 	    // In case developer forget to include grid component
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 
 /***/ },
@@ -32519,18 +33085,17 @@
 	'use strict';
 
 
-	    var createListFromArray = __webpack_require__(102);
-	    var SeriesModel = __webpack_require__(28);
+	    var createListFromArray = __webpack_require__(109);
+	    var SeriesModel = __webpack_require__(78);
 
 	    module.exports = SeriesModel.extend({
 
 	        type: 'series.scatter',
 
-	        dependencies: ['grid', 'polar', 'geo', 'singleAxis'],
+	        dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'],
 
 	        getInitialData: function (option, ecModel) {
-	            var list = createListFromArray(option.data, this, ecModel);
-	            return list;
+	            return createListFromArray(option.data, this, ecModel);
 	        },
 
 	        brushSelector: 'point',
@@ -32638,8 +33203,8 @@
 
 
 
-	    var graphic = __webpack_require__(44);
-	    var symbolUtil = __webpack_require__(104);
+	    var graphic = __webpack_require__(18);
+	    var symbolUtil = __webpack_require__(111);
 
 	    var LargeSymbolPath = graphic.extendShape({
 
@@ -32798,7 +33363,7 @@
 
 	    echarts.registerVisual(zrUtil.curry(__webpack_require__(151), 'radar'));
 	    echarts.registerVisual(zrUtil.curry(
-	        __webpack_require__(120), 'radar', 'circle', null
+	        __webpack_require__(121), 'radar', 'circle', null
 	    ));
 	    echarts.registerLayout(__webpack_require__(167));
 
@@ -32830,9 +33395,9 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var IndicatorAxis = __webpack_require__(162);
-	    var IntervalScale = __webpack_require__(108);
+	    var IntervalScale = __webpack_require__(104);
 	    var numberUtil = __webpack_require__(7);
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 
 	    function Radar(radarModel, ecModel, api) {
 
@@ -33056,7 +33621,7 @@
 	        return radarList;
 	    };
 
-	    __webpack_require__(26).register('radar', Radar);
+	    __webpack_require__(76).register('radar', Radar);
 	    module.exports = Radar;
 
 
@@ -33248,7 +33813,7 @@
 
 	    var AxisBuilder = __webpack_require__(135);
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 
 	    var axisBuilderAttrs = [
 	        'axisLine', 'axisLabel', 'axisTick', 'axisName'
@@ -33427,9 +33992,9 @@
 	'use strict';
 
 
-	    var SeriesModel = __webpack_require__(28);
+	    var SeriesModel = __webpack_require__(78);
 	    var List = __webpack_require__(98);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 	    var zrUtil = __webpack_require__(4);
 	    var encodeHTML = __webpack_require__(6).encodeHTML;
 
@@ -33454,7 +34019,7 @@
 	        getInitialData: function (option, ecModel) {
 	            var data = option.data || [];
 	            var dimensions = completeDimensions(
-	                [], data, {extraPrefix: 'indicator_'}
+	                [], data, {extraPrefix: 'indicator_', extraFromZero: true}
 	            );
 	            var list = new List(dimensions, this);
 	            list.initData(data);
@@ -33507,9 +34072,9 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
-	    var symbolUtil = __webpack_require__(104);
+	    var symbolUtil = __webpack_require__(111);
 
 	    function normalizeSymbolSize(symbolSize) {
 	        if (!zrUtil.isArray(symbolSize)) {
@@ -33848,9 +34413,9 @@
 	
 
 	    var List = __webpack_require__(98);
-	    var SeriesModel = __webpack_require__(28);
+	    var SeriesModel = __webpack_require__(78);
 	    var zrUtil = __webpack_require__(4);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 
 	    var formatUtil = __webpack_require__(6);
 	    var encodeHTML = formatUtil.encodeHTML;
@@ -34104,7 +34669,7 @@
 
 	    var Geo = __webpack_require__(172);
 
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var zrUtil = __webpack_require__(4);
 	    var numberUtil = __webpack_require__(7);
 
@@ -34362,15 +34927,15 @@
 	                return originRegionArr;
 	            }
 
-	            var dataNameMap = {};
+	            var dataNameMap = zrUtil.createHashMap();
 	            var features = geoJson.features;
 	            for (var i = 0; i < regionsArr.length; i++) {
-	                dataNameMap[regionsArr[i].name] = regionsArr[i];
+	                dataNameMap.set(regionsArr[i].name, regionsArr[i]);
 	            }
 
 	            for (var i = 0; i < features.length; i++) {
 	                var name = features[i].properties.name;
-	                if (!dataNameMap[name]) {
+	                if (!dataNameMap.get(name)) {
 	                    regionsArr.push({
 	                        name: name
 	                    });
@@ -34439,7 +35004,7 @@
 	         */
 	        this.map = map;
 
-	        this._nameCoordMap = {};
+	        this._nameCoordMap = zrUtil.createHashMap();
 
 	        this.loadGeoJson(geoJson, specialAreas, nameMap);
 	    }
@@ -34488,14 +35053,14 @@
 	            specialAreas = specialAreas || {};
 	            nameMap = nameMap || {};
 	            var regions = this.regions;
-	            var regionsMap = {};
+	            var regionsMap = zrUtil.createHashMap();
 	            for (var i = 0; i < regions.length; i++) {
 	                var regionName = regions[i].name;
 	                // Try use the alias in nameMap
-	                regionName = nameMap[regionName] || regionName;
+	                regionName = nameMap.hasOwnProperty(regionName) ? nameMap[regionName] : regionName;
 	                regions[i].name = regionName;
 
-	                regionsMap[regionName] = regions[i];
+	                regionsMap.set(regionName, regions[i]);
 	                // Add geoJson
 	                this.addGeoCoord(regionName, regions[i].center);
 
@@ -34547,7 +35112,7 @@
 	         * @return {module:echarts/coord/geo/Region}
 	         */
 	        getRegion: function (name) {
-	            return this._regionsMap[name];
+	            return this._regionsMap.get(name);
 	        },
 
 	        getRegionByCoord: function (coord) {
@@ -34565,7 +35130,7 @@
 	         * @param {Array.<number>} geoCoord
 	         */
 	        addGeoCoord: function (name, geoCoord) {
-	            this._nameCoordMap[name] = geoCoord;
+	            this._nameCoordMap.set(name, geoCoord);
 	        },
 
 	        /**
@@ -34574,7 +35139,7 @@
 	         * @return {Array.<number>}
 	         */
 	        getGeoCoord: function (name) {
-	            return this._nameCoordMap[name];
+	            return this._nameCoordMap.get(name);
 	        },
 
 	        // Overwrite
@@ -34611,7 +35176,6 @@
 	            }, this);
 	        },
 
-	        // Overwrite
 	        /**
 	         * @param {string|Array.<number>} data
 	         * @return {Array.<number>}
@@ -34627,16 +35191,12 @@
 	        },
 
 	        /**
-	         * @override
-	         * @implements
-	         * see {module:echarts/CoodinateSystem}
+	         * @inheritDoc
 	         */
 	        convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),
 
 	        /**
-	         * @override
-	         * @implements
-	         * see {module:echarts/CoodinateSystem}
+	         * @inheritDoc
 	         */
 	        convertFromPixel: zrUtil.curry(doConvert, 'pointToData')
 
@@ -34811,7 +35371,7 @@
 
 	    var BoundingRect = __webpack_require__(9);
 
-	    var bbox = __webpack_require__(52);
+	    var bbox = __webpack_require__(38);
 	    var vec2 = __webpack_require__(10);
 
 	    /**
@@ -34968,7 +35528,7 @@
 
 	
 
-	    var windingLine = __webpack_require__(59);
+	    var windingLine = __webpack_require__(45);
 
 	    var EPSILON = 1e-8;
 
@@ -35018,7 +35578,7 @@
 	    var vector = __webpack_require__(10);
 	    var matrix = __webpack_require__(11);
 
-	    var Transformable = __webpack_require__(34);
+	    var Transformable = __webpack_require__(26);
 	    var zrUtil = __webpack_require__(4);
 
 	    var BoundingRect = __webpack_require__(9);
@@ -35421,7 +35981,7 @@
 	
 
 	    // var zrUtil = require('zrender/lib/core/util');
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 
 	    var MapDraw = __webpack_require__(181);
 
@@ -35582,7 +36142,7 @@
 	    var RoamController = __webpack_require__(182);
 	    var roamHelper = __webpack_require__(184);
 	    var cursorHelper = __webpack_require__(185);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 
 	    function getFixedItemStyle(model, scale) {
@@ -35732,7 +36292,7 @@
 	            var hoverItemStyleAccessPath = ['itemStyle', 'emphasis'];
 	            var labelAccessPath = ['label', 'normal'];
 	            var hoverLabelAccessPath = ['label', 'emphasis'];
-	            var nameMap = {};
+	            var nameMap = zrUtil.createHashMap();
 
 	            zrUtil.each(geo.regions, function (region) {
 
@@ -35741,8 +36301,8 @@
 	                // colonies). And it is not appropriate to merge them in geo, which
 	                // will make them share the same label and bring trouble in label
 	                // location calculation.
-	                var regionGroup = nameMap[region.name]
-	                    || (nameMap[region.name] = new graphic.Group());
+	                var regionGroup = nameMap.get(region.name)
+	                    || nameMap.set(region.name, new graphic.Group());
 
 	                var compoundPath = new graphic.CompoundPath({
 	                    shape: {
@@ -35953,7 +36513,7 @@
 	 */
 
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var zrUtil = __webpack_require__(4);
 	    var eventTool = __webpack_require__(88);
 	    var interactionMutex = __webpack_require__(183);
@@ -35977,6 +36537,11 @@
 	         */
 	        this._zr = zr;
 
+	        /**
+	         * @type {Object}
+	         */
+	        this._opt = {};
+
 	        // Avoid two roamController bind the same handler
 	        var bind = zrUtil.bind;
 	        var mousedownHandler = bind(mousedown, this);
@@ -36004,11 +36569,22 @@
 	         * @param  {boolean|string} [controlType=true] Specify the control type,
 	         *                          which can be null/undefined or true/false
 	         *                          or 'pan/move' or 'zoom'/'scale'
+	         * @param {Object} [opt]
+	         * @param {Object} [opt.zoomOnMouseWheel=true]
+	         * @param {Object} [opt.moveOnMouseMove=true]
+	         * @param {Object} [opt.preventDefaultMouseMove=true] When pan.
 	         */
-	        this.enable = function (controlType) {
+	        this.enable = function (controlType, opt) {
+
 	            // Disable previous first
 	            this.disable();
 
+	            this._opt = zrUtil.defaults(zrUtil.clone(opt) || {}, {
+	                zoomOnMouseWheel: true,
+	                moveOnMouseMove: true,
+	                preventDefaultMouseMove: true
+	            });
+
 	            if (controlType == null) {
 	                controlType = true;
 	            }
@@ -36064,33 +36640,33 @@
 	    }
 
 	    function mousemove(e) {
-	        if (!this._dragging) {
+	        if (!checkKeyBinding(this, 'moveOnMouseMove', e) || !this._dragging) {
 	            return;
 	        }
 
-	        eventTool.stop(e.event);
-
-	        if (e.gestureEvent !== 'pinch') {
-
-	            if (interactionMutex.isTaken(this._zr, 'globalPan')) {
-	                return;
-	            }
-
-	            var x = e.offsetX;
-	            var y = e.offsetY;
-
-	            var oldX = this._x;
-	            var oldY = this._y;
-
-	            var dx = x - oldX;
-	            var dy = y - oldY;
-
-	            this._x = x;
-	            this._y = y;
-
-	            eventTool.stop(e.event);
-	            this.trigger('pan', dx, dy, oldX, oldY, x, y);
+	        if (e.gestureEvent === 'pinch') {
+	            return;
 	        }
+
+	        if (interactionMutex.isTaken(this._zr, 'globalPan')) {
+	            return;
+	        }
+
+	        var x = e.offsetX;
+	        var y = e.offsetY;
+
+	        var oldX = this._x;
+	        var oldY = this._y;
+
+	        var dx = x - oldX;
+	        var dy = y - oldY;
+
+	        this._x = x;
+	        this._y = y;
+
+	        this._opt.preventDefaultMouseMove && eventTool.stop(e.event);
+
+	        this.trigger('pan', dx, dy, oldX, oldY, x, y);
 	    }
 
 	    function mouseup(e) {
@@ -36099,9 +36675,10 @@
 
 	    function mousewheel(e) {
 	        // wheelDelta maybe -0 in chrome mac.
-	        if (e.wheelDelta === 0) {
+	        if (!checkKeyBinding(this, 'zoomOnMouseWheel', e) || e.wheelDelta === 0) {
 	            return;
 	        }
+
 	        // Convenience:
 	        // Mac and VM Windows on Mac: scroll up: zoom out.
 	        // Windows: scroll up: zoom in.
@@ -36120,7 +36697,7 @@
 	    function zoom(e, zoomDelta, zoomX, zoomY) {
 	        if (this.pointerChecker && this.pointerChecker(e, zoomX, zoomY)) {
 	            // When mouse is out of roamController rect,
-	            // default befavoius should be be disabled, otherwise
+	            // default befavoius should not be be disabled, otherwise
 	            // page sliding is disabled, contrary to expectation.
 	            eventTool.stop(e.event);
 
@@ -36128,6 +36705,12 @@
 	        }
 	    }
 
+	    function checkKeyBinding(roamController, prop, e) {
+	        var setting = roamController._opt[prop];
+	        return setting
+	            && (!zrUtil.isString(setting) || e.event[setting + 'Key']);
+	    }
+
 	    module.exports = RoamController;
 
 
@@ -36494,24 +37077,25 @@
 
 	        zrUtil.each(datas, function (data) {
 	            data.each(dims, function (value, idx) {
-	                var name = data.getName(idx);
-	                dataNameMap[name] = dataNameMap[name] || [];
+	                // Add prefix to avoid conflict with Object.prototype.
+	                var mapKey = 'ec-' + data.getName(idx);
+	                dataNameMap[mapKey] = dataNameMap[mapKey] || [];
 	                if (!isNaN(value)) {
-	                    dataNameMap[name].push(value);
+	                    dataNameMap[mapKey].push(value);
 	                }
 	            });
 	        });
 
 	        return datas[0].map(dims, function (value, idx) {
-	            var name = datas[0].getName(idx);
+	            var mapKey = 'ec-' + datas[0].getName(idx);
 	            var sum = 0;
 	            var min = Infinity;
 	            var max = -Infinity;
-	            var len = dataNameMap[name].length;
+	            var len = dataNameMap[mapKey].length;
 	            for (var i = 0; i < len; i++) {
-	                min = Math.min(min, dataNameMap[name][i]);
-	                max = Math.max(max, dataNameMap[name][i]);
-	                sum += dataNameMap[name][i];
+	                min = Math.min(min, dataNameMap[mapKey][i]);
+	                max = Math.max(max, dataNameMap[mapKey][i]);
+	                sum += dataNameMap[mapKey][i];
 	            }
 	            var result;
 	            if (statisticType === 'min') {
@@ -36610,7 +37194,7 @@
 
 	
 
-	    var SeriesModel = __webpack_require__(28);
+	    var SeriesModel = __webpack_require__(78);
 	    var Tree = __webpack_require__(194);
 	    var zrUtil = __webpack_require__(4);
 	    var Model = __webpack_require__(12);
@@ -36847,7 +37431,7 @@
 	            var idIndexMap = this._idIndexMap;
 
 	            if (!idIndexMap) {
-	                idIndexMap = this._idIndexMap = {};
+	                idIndexMap = this._idIndexMap = zrUtil.createHashMap();
 	                /**
 	                 * @private
 	                 * @type {number}
@@ -36855,9 +37439,9 @@
 	                this._idIndexMapCount = 0;
 	            }
 
-	            var index = idIndexMap[id];
+	            var index = idIndexMap.get(id);
 	            if (index == null) {
-	                idIndexMap[id] = index = this._idIndexMapCount++;
+	                idIndexMap.set(id, index = this._idIndexMapCount++);
 	            }
 
 	            return index;
@@ -36970,7 +37554,7 @@
 	    var Model = __webpack_require__(12);
 	    var List = __webpack_require__(98);
 	    var linkList = __webpack_require__(195);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 
 	    /**
 	     * @constructor module:echarts/data/Tree~TreeNode
@@ -37649,7 +38233,7 @@
 	 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var DataDiffer = __webpack_require__(99);
 	    var helper = __webpack_require__(196);
 	    var Breadcrumb = __webpack_require__(198);
@@ -38532,8 +39116,8 @@
 
 	 
 
-	    var graphic = __webpack_require__(44);
-	    var layout = __webpack_require__(21);
+	    var graphic = __webpack_require__(18);
+	    var layout = __webpack_require__(71);
 	    var zrUtil = __webpack_require__(4);
 	    var helper = __webpack_require__(196);
 
@@ -38865,7 +39449,7 @@
 	
 
 	    var VisualMapping = __webpack_require__(202);
-	    var zrColor = __webpack_require__(39);
+	    var zrColor = __webpack_require__(31);
 	    var zrUtil = __webpack_require__(4);
 	    var isArray = zrUtil.isArray;
 
@@ -39100,7 +39684,7 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var zrColor = __webpack_require__(39);
+	    var zrColor = __webpack_require__(31);
 	    var linearMap = __webpack_require__(7).linearMap;
 	    var each = zrUtil.each;
 	    var isObject = zrUtil.isObject;
@@ -39722,7 +40306,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var numberUtil = __webpack_require__(7);
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var helper = __webpack_require__(196);
 	    var BoundingRect = __webpack_require__(9);
 	    var helper = __webpack_require__(196);
@@ -40291,7 +40875,7 @@
 	    echarts.registerProcessor(__webpack_require__(214));
 
 	    echarts.registerVisual(zrUtil.curry(
-	        __webpack_require__(120), 'graph', 'circle', null
+	        __webpack_require__(121), 'graph', 'circle', null
 	    ));
 	    echarts.registerVisual(__webpack_require__(215));
 	    echarts.registerVisual(__webpack_require__(216));
@@ -40589,10 +41173,10 @@
 	    var List = __webpack_require__(98);
 	    var Graph = __webpack_require__(207);
 	    var linkList = __webpack_require__(195);
-	    var completeDimensions = __webpack_require__(103);
-	    var CoordinateSystem = __webpack_require__(26);
+	    var completeDimensions = __webpack_require__(110);
+	    var CoordinateSystem = __webpack_require__(76);
 	    var zrUtil = __webpack_require__(4);
-	    var createListFromArray = __webpack_require__(102);
+	    var createListFromArray = __webpack_require__(109);
 
 	    module.exports = function (nodes, edges, hostModel, directed, beforeLink) {
 	        var graph = new Graph(directed);
@@ -40670,6 +41254,10 @@
 
 	    var zrUtil = __webpack_require__(4);
 
+	    // id may be function name of Object, add a prefix to avoid this problem.
+	    function generateNodeKey (id) {
+	        return '_EC_' + id;
+	    }
 	    /**
 	     * @alias module:echarts/data/Graph
 	     * @constructor
@@ -40743,7 +41331,7 @@
 
 	        var nodesMap = this._nodesMap;
 
-	        if (nodesMap[id]) {
+	        if (nodesMap[generateNodeKey(id)]) {
 	            return;
 	        }
 
@@ -40752,7 +41340,7 @@
 
 	        this.nodes.push(node);
 
-	        nodesMap[id] = node;
+	        nodesMap[generateNodeKey(id)] = node;
 	        return node;
 	    };
 
@@ -40771,7 +41359,7 @@
 	     * @return {module:echarts/data/Graph.Node}
 	     */
 	    graphProto.getNodeById = function (id) {
-	        return this._nodesMap[id];
+	        return this._nodesMap[generateNodeKey(id)];
 	    };
 
 	    /**
@@ -40794,10 +41382,10 @@
 	        }
 
 	        if (!(n1 instanceof Node)) {
-	            n1 = nodesMap[n1];
+	            n1 = nodesMap[generateNodeKey(n1)];
 	        }
 	        if (!(n2 instanceof Node)) {
-	            n2 = nodesMap[n2];
+	            n2 = nodesMap[generateNodeKey(n2)];
 	        }
 	        if (!n1 || !n2) {
 	            return;
@@ -40904,7 +41492,7 @@
 	        cb, startNode, direction, context
 	    ) {
 	        if (!(startNode instanceof Node)) {
-	            startNode = this._nodesMap[startNode];
+	            startNode = this._nodesMap[generateNodeKey(startNode)];
 	        }
 	        if (!startNode) {
 	            return;
@@ -40931,7 +41519,7 @@
 	                var otherNode = e.node1 === currentNode
 	                    ? e.node2 : e.node1;
 	                if (!otherNode.__visited) {
-	                    if (cb.call(otherNode, otherNode, currentNode)) {
+	                    if (cb.call(context, otherNode, currentNode)) {
 	                        // Stop traversing
 	                        return;
 	                    }
@@ -41187,7 +41775,7 @@
 	    var roamHelper = __webpack_require__(184);
 	    var cursorHelper = __webpack_require__(185);
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var adjustEdge = __webpack_require__(212);
 	    var zrUtil = __webpack_require__(4);
 
@@ -41536,7 +42124,7 @@
 	 */
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var LineGroup = __webpack_require__(210);
 
 
@@ -41635,11 +42223,11 @@
 	 */
 
 
-	    var symbolUtil = __webpack_require__(104);
+	    var symbolUtil = __webpack_require__(111);
 	    var vector = __webpack_require__(10);
 	    // var matrix = require('zrender/lib/core/matrix');
 	    var LinePath = __webpack_require__(211);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var numberUtil = __webpack_require__(7);
 
@@ -42006,7 +42594,7 @@
 	 * Line path for bezier and straight line draw
 	 */
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var vec2 = __webpack_require__(10);
 
 	    var straightLineProto = graphic.Line.prototype;
@@ -42061,7 +42649,7 @@
 
 	
 
-	    var curveTool = __webpack_require__(51);
+	    var curveTool = __webpack_require__(37);
 	    var vec2 = __webpack_require__(10);
 
 	    var v1 = [];
@@ -42344,7 +42932,8 @@
 
 	            categoriesData.each(function (idx) {
 	                var name = categoriesData.getName(idx);
-	                categoryNameIdxMap[name] = idx;
+	                // Add prefix to avoid conflict with Object.prototype.
+	                categoryNameIdxMap['ec-' + name] = idx;
 
 	                var itemModel = categoriesData.getItemModel(idx);
 	                var color = itemModel.get('itemStyle.normal.color')
@@ -42359,7 +42948,7 @@
 	                    var category = model.getShallow('category');
 	                    if (category != null) {
 	                        if (typeof category === 'string') {
-	                            category = categoryNameIdxMap[category];
+	                            category = categoryNameIdxMap['ec-' + category];
 	                        }
 	                        if (!data.getItemVisual(idx, 'color', true)) {
 	                            data.setItemVisual(
@@ -42893,8 +43482,8 @@
 	
 	    // FIXME Where to create the simple view coordinate system
 	    var View = __webpack_require__(176);
-	    var layout = __webpack_require__(21);
-	    var bbox = __webpack_require__(52);
+	    var layout = __webpack_require__(71);
+	    var bbox = __webpack_require__(38);
 
 	    function getViewRect(seriesModel, api, aspect) {
 	        var option = seriesModel.getBoxLayoutParams();
@@ -42983,7 +43572,7 @@
 	
 
 	    var List = __webpack_require__(98);
-	    var SeriesModel = __webpack_require__(28);
+	    var SeriesModel = __webpack_require__(78);
 	    var zrUtil = __webpack_require__(4);
 
 	    var GaugeSeries = SeriesModel.extend({
@@ -43112,7 +43701,7 @@
 
 	    var PointerPath = __webpack_require__(228);
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var numberUtil = __webpack_require__(7);
 	    var parsePercent = numberUtil.parsePercent;
 
@@ -43147,7 +43736,7 @@
 
 	    var PI2 = Math.PI * 2;
 
-	    var GaugeView = __webpack_require__(43).extend({
+	    var GaugeView = __webpack_require__(80).extend({
 
 	        type: 'gauge',
 
@@ -43544,7 +44133,7 @@
 
 	
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'echartsGaugePointer',
 
@@ -43617,7 +44206,7 @@
 
 	    var List = __webpack_require__(98);
 	    var modelUtil = __webpack_require__(5);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 
 	    var FunnelSeries = __webpack_require__(1).extendSeriesModel({
 
@@ -43732,7 +44321,7 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 
 	    /**
@@ -43901,7 +44490,7 @@
 	    zrUtil.inherits(FunnelPiece, graphic.Group);
 
 
-	    var Funnel = __webpack_require__(43).extend({
+	    var Funnel = __webpack_require__(80).extend({
 
 	        type: 'funnel',
 
@@ -43953,7 +44542,7 @@
 
 	
 
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var number = __webpack_require__(7);
 
 	    var parsePercent = number.parsePercent;
@@ -44315,7 +44904,7 @@
 	        return coordSysList;
 	    }
 
-	    __webpack_require__(26).register('parallel', {create: create});
+	    __webpack_require__(76).register('parallel', {create: create});
 
 
 
@@ -44329,11 +44918,11 @@
 	 */
 
 
-	    var layoutUtil = __webpack_require__(21);
-	    var axisHelper = __webpack_require__(105);
+	    var layoutUtil = __webpack_require__(71);
+	    var axisHelper = __webpack_require__(101);
 	    var zrUtil = __webpack_require__(4);
 	    var ParallelAxis = __webpack_require__(237);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var matrix = __webpack_require__(11);
 	    var numberUtil = __webpack_require__(7);
 	    var sliderMove = __webpack_require__(238);
@@ -44354,7 +44943,7 @@
 	         * @type {Object.<string, module:echarts/coord/parallel/Axis>}
 	         * @private
 	         */
-	        this._axesMap = {};
+	        this._axesMap = zrUtil.createHashMap();
 
 	        /**
 	         * key: dimension
@@ -44404,13 +44993,13 @@
 	                var axisIndex = parallelAxisIndex[idx];
 	                var axisModel = ecModel.getComponent('parallelAxis', axisIndex);
 
-	                var axis = this._axesMap[dim] = new ParallelAxis(
+	                var axis = this._axesMap.set(dim, new ParallelAxis(
 	                    dim,
 	                    axisHelper.createScaleByModel(axisModel),
 	                    [0, 0],
 	                    axisModel.get('type'),
 	                    axisIndex
-	                );
+	                ));
 
 	                var isCategory = axis.type === 'category';
 	                axis.onBand = isCategory && axisModel.get('boundaryGap');
@@ -44464,7 +45053,7 @@
 	                var data = seriesModel.getData();
 
 	                each(this.dimensions, function (dim) {
-	                    var axis = this._axesMap[dim];
+	                    var axis = this._axesMap.get(dim);
 	                    axis.scale.unionExtentFromData(data, dim);
 	                    axisHelper.niceScaleExtent(axis.scale, axis.model);
 	                }, this);
@@ -44574,7 +45163,7 @@
 	            var layoutInfo = this._makeLayoutInfo();
 	            var layout = layoutInfo.layout;
 
-	            each(axes, function (axis) {
+	            axes.each(function (axis) {
 	                var axisExtent = [0, layoutInfo.axisLength];
 	                var idx = axis.inverse ? 1 : 0;
 	                axis.setExtent(axisExtent[idx], axisExtent[1 - idx]);
@@ -44624,7 +45213,8 @@
 	                    axisLabelShow: posInfo.axisLabelShow,
 	                    nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth,
 	                    tickDirection: 1,
-	                    labelDirection: 1
+	                    labelDirection: 1,
+	                    labelInterval: axes.get(dim).getLabelInterval()
 	                };
 	            }, this);
 	        },
@@ -44635,7 +45225,7 @@
 	         * @return {module:echarts/coord/parallel/ParallelAxis} [description]
 	         */
 	        getAxis: function (dim) {
-	            return this._axesMap[dim];
+	            return this._axesMap.get(dim);
 	        },
 
 	        /**
@@ -44646,7 +45236,7 @@
 	         */
 	        dataToPoint: function (value, dim) {
 	            return this.axisCoordToPoint(
-	                this._axesMap[dim].dataToCoord(value),
+	                this._axesMap.get(dim).dataToCoord(value),
 	                dim
 	            );
 	        },
@@ -44674,7 +45264,7 @@
 	                    activeState = 'active';
 	                    for (var j = 0, lenj = dimensions.length; j < lenj; j++) {
 	                        var dimName = dimensions[j];
-	                        var state = axesMap[dimName].model.getActiveState(values[j], j);
+	                        var state = axesMap.get(dimName).model.getActiveState(values[j], j);
 
 	                        if (state === 'inactive') {
 	                            activeState = 'inactive';
@@ -44697,7 +45287,7 @@
 	            var hasActiveSet = false;
 
 	            for (var j = 0, lenj = dimensions.length; j < lenj; j++) {
-	                if (axesMap[dimensions[j]].model.getActiveState() !== 'normal') {
+	                if (axesMap.get(dimensions[j]).model.getActiveState() !== 'normal') {
 	                    hasActiveSet = true;
 	                }
 	            }
@@ -44768,7 +45358,7 @@
 	                }
 	                delta *= layoutInfo.axisExpandWidth / axisCollapseWidth;
 	                delta
-	                    ? sliderMove(delta, axisExpandWindow, extent, 'rigid')
+	                    ? sliderMove(delta, axisExpandWindow, extent, 'all')
 	                    // Avoid nonsense triger on mousemove.
 	                    : (behavior = 'none');
 	            }
@@ -44902,56 +45492,85 @@
 
 	    /**
 	     * Calculate slider move result.
+	     * Usage:
+	     * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as
+	     * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`.
+	     * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`.
 	     *
 	     * @param {number} delta Move length.
-	     * @param {Array.<number>} handleEnds handleEnds[0] and be bigger then handleEnds[1].
-	     *                                    handleEnds will be modified in this method.
+	     * @param {Array.<number>} handleEnds handleEnds[0] can be bigger then handleEnds[1].
+	     *              handleEnds will be modified in this method.
 	     * @param {Array.<number>} extent handleEnds is restricted by extent.
-	     *                                extent[0] should less or equals than extent[1].
-	     * @param {string} mode 'rigid': Math.abs(handleEnds[0] - handleEnds[1]) remain unchanged,
-	     *                      'cross' handleEnds[0] can be bigger then handleEnds[1],
-	     *                      'push' handleEnds[0] can not be bigger then handleEnds[1],
-	     *                              when they touch, one push other.
-	     * @param {number} handleIndex If mode is 'rigid', handleIndex is not required.
+	     *              extent[0] should less or equals than extent[1].
+	     * @param {number|string} handleIndex Can be 'all', means that both move the two handleEnds,
+	     *              where the input minSpan and maxSpan will not work.
+	     * @param {number} [minSpan] The range of dataZoom can not be smaller than that.
+	     *              If not set, handle0 and cross handle1. If set as a non-negative
+	     *              number (including `0`), handles will push each other when reaching
+	     *              the minSpan.
+	     * @param {number} [maxSpan] The range of dataZoom can not be larger than that.
 	     * @return {Array.<number>} The input handleEnds.
 	     */
-	    module.exports = function (delta, handleEnds, extent, mode, handleIndex) {
-	        if (!delta) {
-	            return handleEnds;
+	    module.exports = function (delta, handleEnds, extent, handleIndex, minSpan, maxSpan) {
+	        // Normalize firstly.
+	        handleEnds[0] = restrict(handleEnds[0], extent);
+	        handleEnds[1] = restrict(handleEnds[1], extent);
+
+	        delta = delta || 0;
+
+	        var extentSpan = extent[1] - extent[0];
+
+	        // Notice maxSpan and minSpan can be null/undefined.
+	        if (minSpan != null) {
+	            minSpan = restrict(minSpan, [0, extentSpan]);
+	        }
+	        if (maxSpan != null) {
+	            maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0);
+	        }
+	        if (handleIndex === 'all') {
+	            minSpan = maxSpan = Math.abs(handleEnds[1] - handleEnds[0]);
+	            handleIndex = 0;
 	        }
 
-	        if (mode === 'rigid') {
-	            delta = getRealDelta(delta, handleEnds, extent);
-	            handleEnds[0] += delta;
-	            handleEnds[1] += delta;
-	        }
-	        else {
-	            delta = getRealDelta(delta, handleEnds[handleIndex], extent);
-	            handleEnds[handleIndex] += delta;
+	        var originalDistSign = getSpanSign(handleEnds, handleIndex);
 
-	            if (mode === 'push' && handleEnds[0] > handleEnds[1]) {
-	                handleEnds[1 - handleIndex] = handleEnds[handleIndex];
-	            }
+	        handleEnds[handleIndex] += delta;
+
+	        // Restrict in extent.
+	        var extentMinSpan = minSpan || 0;
+	        var realExtent = extent.slice();
+	        originalDistSign.sign < 0 ? (realExtent[0] += extentMinSpan) : (realExtent[1] -= extentMinSpan);
+	        handleEnds[handleIndex] = restrict(handleEnds[handleIndex], realExtent);
+
+	        // Expand span.
+	        var currDistSign = getSpanSign(handleEnds, handleIndex);
+	        if (minSpan != null && (
+	            currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan
+	        )) {
+	            // If minSpan exists, 'cross' is forbinden.
+	            handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan;
+	        }
+
+	        // Shrink span.
+	        var currDistSign = getSpanSign(handleEnds, handleIndex);
+	        if (maxSpan != null && currDistSign.span > maxSpan) {
+	            handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan;
 	        }
 
 	        return handleEnds;
-
-	        function getRealDelta(delta, handleEnds, extent) {
-	            var handleMinMax = !handleEnds.length
-	                ? [handleEnds, handleEnds]
-	                : handleEnds.slice();
-	            handleEnds[0] > handleEnds[1] && handleMinMax.reverse();
-
-	            if (delta < 0 && handleMinMax[0] + delta < extent[0]) {
-	                delta = extent[0] - handleMinMax[0];
-	            }
-	            if (delta > 0 && handleMinMax[1] + delta > extent[1]) {
-	                delta = extent[1] - handleMinMax[1];
-	            }
-	            return delta;
-	        }
 	    };
 
+	    function getSpanSign(handleEnds, handleIndex) {
+	        var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex];
+	        // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0]
+	        // is at left of handleEnds[1] for non-cross case.
+	        return {span: Math.abs(dist), sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1};
+	    }
+
+	    function restrict(value, extend) {
+	        return Math.min(extend[1], Math.max(extend[0], value));
+	    }
+
 
 /***/ },
 /* 239 */
@@ -44960,7 +45579,7 @@
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var Component = __webpack_require__(19);
+	    var Component = __webpack_require__(69);
 
 	    __webpack_require__(240);
 
@@ -45091,7 +45710,7 @@
 
 	
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 	    var zrUtil = __webpack_require__(4);
 	    var makeStyleMapper = __webpack_require__(15);
 	    var axisModelCreator = __webpack_require__(131);
@@ -45275,7 +45894,7 @@
 	    var AxisBuilder = __webpack_require__(135);
 	    var BrushController = __webpack_require__(244);
 	    var brushHelper = __webpack_require__(245);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 
 	    var elementList = ['axisLine', 'axisLabel', 'axisTick', 'axisName'];
 
@@ -45466,9 +46085,9 @@
 
 
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var interactionMutex = __webpack_require__(183);
 	    var DataDiffer = __webpack_require__(99);
 
@@ -46459,27 +47078,16 @@
 
 	
 
-	    var zrUtil = __webpack_require__(4);
 	    var cursorHelper = __webpack_require__(185);
 	    var BoundingRect = __webpack_require__(9);
-
-	    var mathMax = Math.max;
-	    var mathMin = Math.min;
+	    var graphicUtil = __webpack_require__(18);
 
 	    var helper = {};
 
 	    helper.makeRectPanelClipPath = function (rect) {
 	        rect = normalizeRect(rect);
 	        return function (localPoints, transform) {
-	            return zrUtil.map(localPoints, function (localPoint) {
-	                var x = localPoint[0];
-	                x = mathMax(x, rect.x);
-	                x = mathMin(x, rect.x + rect.width);
-	                var y = localPoint[1];
-	                y = mathMax(y, rect.y);
-	                y = mathMin(y, rect.y + rect.height);
-	                return [x, y];
-	            });
+	            return graphicUtil.clipPointsByRect(localPoints, rect);
 	        };
 	    };
 
@@ -46577,8 +47185,8 @@
 
 	    var List = __webpack_require__(98);
 	    var zrUtil = __webpack_require__(4);
-	    var SeriesModel = __webpack_require__(28);
-	    var completeDimensions = __webpack_require__(103);
+	    var SeriesModel = __webpack_require__(78);
+	    var completeDimensions = __webpack_require__(110);
 
 	    module.exports = SeriesModel.extend({
 
@@ -46740,12 +47348,12 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 
 	    var SMOOTH = 0.3;
 
-	    var ParallelView = __webpack_require__(43).extend({
+	    var ParallelView = __webpack_require__(80).extend({
 
 	        type: 'parallel',
 
@@ -47049,7 +47657,7 @@
 	 */
 
 
-	    var SeriesModel = __webpack_require__(28);
+	    var SeriesModel = __webpack_require__(78);
 	    var createGraphFromNodeEdge = __webpack_require__(206);
 	    var encodeHTML = __webpack_require__(6).encodeHTML;
 
@@ -47186,7 +47794,7 @@
 	 */
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 
 	    var SankeyShape = graphic.extendShape({
@@ -47393,7 +48001,7 @@
 	 */
 
 
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var nest = __webpack_require__(254);
 	    var zrUtil = __webpack_require__(4);
 
@@ -47942,7 +48550,7 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var SeriesModel = __webpack_require__(28);
+	    var SeriesModel = __webpack_require__(78);
 	    var whiskerBoxCommon = __webpack_require__(258);
 
 	    var BoxplotSeries = SeriesModel.extend({
@@ -47960,7 +48568,7 @@
 	         * and echarts do not need to know it.
 	         * @readOnly
 	         */
-	        valueDimensions: ['min', 'Q1', 'median', 'Q3', 'max'],
+	        defaultValueDimensions: ['min', 'Q1', 'median', 'Q3', 'max'],
 
 	        /**
 	         * @type {Array.<string>}
@@ -48018,14 +48626,10 @@
 
 
 	    var List = __webpack_require__(98);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 	    var WhiskerBoxDraw = __webpack_require__(259);
 	    var zrUtil = __webpack_require__(4);
 
-	    function getItemValue(item) {
-	        return item.value == null ? item : item.value;
-	    }
-
 	    var seriesModelMixin = {
 
 	        /**
@@ -48067,55 +48671,39 @@
 	                option.layout = option.layout || 'horizontal';
 	            }
 
-	            this._baseAxisDim = option.layout === 'horizontal' ? 'x' : 'y';
-
+	            var coordDims = ['x', 'y'];
+	            var baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1;
+	            var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex];
+	            var otherAxisDim = coordDims[1 - baseAxisDimIndex];
 	            var data = option.data;
-	            var dimensions = this.dimensions = ['base'].concat(this.valueDimensions);
-	            completeDimensions(dimensions, data);
 
-	            var list = new List(dimensions, this);
-	            list.initData(data, categories ? categories.slice() : null, function (dataItem, dimName, idx, dimIdx) {
-	                var value = getItemValue(dataItem);
-	                return addOrdinal ? (dimName === 'base' ? idx : value[dimIdx - 1]) : value[dimIdx];
+	            addOrdinal && zrUtil.each(data, function (item, index) {
+	                zrUtil.isArray(item) && item.unshift(index);
 	            });
 
+	            var dimensions = [{
+	                name: baseAxisDim,
+	                otherDims: {
+	                    tooltip: false
+	                },
+	                dimsDef: ['base']
+	            }, {
+	                name: otherAxisDim,
+	                dimsDef: this.defaultValueDimensions.slice()
+	            }];
+
+	            dimensions = completeDimensions(dimensions, data, {
+	                encodeDef: this.get('encode'),
+	                dimsDef: this.get('dimensions')
+	            });
+
+	            var list = new List(dimensions, this);
+	            list.initData(data, categories ? categories.slice() : null);
+
 	            return list;
 	        },
 
 	        /**
-	         * Used by Gird.
-	         * @param {string} axisDim 'x' or 'y'
-	         * @return {Array.<string>} dimensions on the axis.
-	         */
-	        coordDimToDataDim: function (axisDim) {
-	            var dims = this.valueDimensions.slice();
-	            var baseDim = ['base'];
-	            var map = {
-	                horizontal: {x: baseDim, y: dims},
-	                vertical: {x: dims, y: baseDim}
-	            };
-	            return map[this.get('layout')][axisDim];
-	        },
-
-	        /**
-	         * @override
-	         * @param {string|number} dataDim
-	         * @return {string} coord dimension
-	         */
-	        dataDimToCoordDim: function (dataDim) {
-	            var dim;
-
-	            zrUtil.each(['x', 'y'], function (coordDim, index) {
-	                var dataDims = this.coordDimToDataDim(coordDim);
-	                if (zrUtil.indexOf(dataDims, dataDim) >= 0) {
-	                    dim = coordDim;
-	                }
-	            }, this);
-
-	            return dim;
-	        },
-
-	        /**
 	         * If horizontal, base axis is x, otherwise y.
 	         * @override
 	         */
@@ -48123,6 +48711,7 @@
 	            var dim = this._baseAxisDim;
 	            return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis;
 	        }
+
 	    };
 
 	    var viewMixin = {
@@ -48164,8 +48753,8 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
-	    var Path = __webpack_require__(46);
+	    var graphic = __webpack_require__(18);
+	    var Path = __webpack_require__(20);
 
 	    var WhiskerPath = Path.extend({
 
@@ -48382,8 +48971,8 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var ChartView = __webpack_require__(43);
-	    var graphic = __webpack_require__(44);
+	    var ChartView = __webpack_require__(80);
+	    var graphic = __webpack_require__(18);
 	    var whiskerBoxCommon = __webpack_require__(258);
 
 	    var BoxplotView = ChartView.extend({
@@ -48583,17 +49172,33 @@
 	    function layoutSingleSeries(seriesModel, offset, boxWidth) {
 	        var coordSys = seriesModel.coordinateSystem;
 	        var data = seriesModel.getData();
-	        var dimensions = seriesModel.dimensions;
-	        var chartLayout = seriesModel.get('layout');
 	        var halfWidth = boxWidth / 2;
+	        var chartLayout = seriesModel.get('layout');
+	        var variableDim = chartLayout === 'horizontal' ? 0 : 1;
+	        var constDim = 1 - variableDim;
+	        var coordDims = ['x', 'y'];
+	        var vDims = [];
+	        var cDim;
 
-	        data.each(dimensions, function () {
+	        zrUtil.each(data.dimensions, function (dimName) {
+	            var dimInfo = data.getDimensionInfo(dimName);
+	            var coordDim = dimInfo.coordDim;
+	            if (coordDim === coordDims[constDim]) {
+	                vDims.push(dimName);
+	            }
+	            else if (coordDim === coordDims[variableDim]) {
+	                cDim = dimName;
+	            }
+	        });
+
+	        if (cDim == null || vDims.length < 5) {
+	            return;
+	        }
+
+	        data.each([cDim].concat(vDims), function () {
 	            var args = arguments;
-	            var dimLen = dimensions.length;
 	            var axisDimVal = args[0];
-	            var idx = args[dimLen];
-	            var variableDim = chartLayout === 'horizontal' ? 0 : 1;
-	            var constDim = 1 - variableDim;
+	            var idx = args[vDims.length + 1];
 
 	            var median = getPoint(args[3]);
 	            var end1 = getPoint(args[1]);
@@ -48682,11 +49287,8 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var SeriesModel = __webpack_require__(28);
+	    var SeriesModel = __webpack_require__(78);
 	    var whiskerBoxCommon = __webpack_require__(258);
-	    var formatUtil = __webpack_require__(6);
-	    var encodeHTML = formatUtil.encodeHTML;
-	    var addCommas = formatUtil.addCommas;
 
 	    var CandlestickSeries = SeriesModel.extend({
 
@@ -48697,7 +49299,7 @@
 	        /**
 	         * @readOnly
 	         */
-	        valueDimensions: ['open', 'close', 'lowest', 'highest'],
+	        defaultValueDimensions: ['open', 'close', 'lowest', 'highest'],
 
 	        /**
 	         * @type {Array.<string>}
@@ -48753,23 +49355,6 @@
 	            return 'open';
 	        },
 
-	        /**
-	         * @override
-	         */
-	        formatTooltip: function (dataIndex, mutipleSeries) {
-	            // It rearly use mutiple candlestick series in one cartesian,
-	            // so only consider one series in this default tooltip.
-	            var valueHTML = zrUtil.map(this.valueDimensions, function (dim) {
-	                return encodeHTML(dim + ': ' + addCommas(this.getData().get(dim, dataIndex)));
-	            }, this).join('<br />');
-
-	            var html = [];
-	            this.name != null && html.push(encodeHTML(this.name));
-	            valueHTML != null && html.push(valueHTML);
-
-	            return html.join('<br />');
-	        },
-
 	        brushSelector: function (dataIndex, data, selectors) {
 	            var itemLayout = data.getItemLayout(dataIndex);
 	            return selectors.rect(itemLayout.brushRect);
@@ -48791,8 +49376,8 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var ChartView = __webpack_require__(43);
-	    var graphic = __webpack_require__(44);
+	    var ChartView = __webpack_require__(80);
+	    var graphic = __webpack_require__(18);
 	    var whiskerBoxCommon = __webpack_require__(258);
 
 	    var CandlestickView = ChartView.extend({
@@ -48916,6 +49501,7 @@
 
 	
 
+	    var zrUtil = __webpack_require__(4);
 	    var retrieve = __webpack_require__(4).retrieve;
 	    var parsePercent = __webpack_require__(7).parsePercent;
 
@@ -48925,18 +49511,33 @@
 
 	            var coordSys = seriesModel.coordinateSystem;
 	            var data = seriesModel.getData();
-	            var dimensions = seriesModel.dimensions;
-	            var chartLayout = seriesModel.get('layout');
-
 	            var candleWidth = calculateCandleWidth(seriesModel, data);
+	            var chartLayout = seriesModel.get('layout');
+	            var variableDim = chartLayout === 'horizontal' ? 0 : 1;
+	            var constDim = 1 - variableDim;
+	            var coordDims = ['x', 'y'];
+	            var vDims = [];
+	            var cDim;
 
-	            data.each(dimensions, function () {
+	            zrUtil.each(data.dimensions, function (dimName) {
+	                var dimInfo = data.getDimensionInfo(dimName);
+	                var coordDim = dimInfo.coordDim;
+	                if (coordDim === coordDims[constDim]) {
+	                    vDims.push(dimName);
+	                }
+	                else if (coordDim === coordDims[variableDim]) {
+	                    cDim = dimName;
+	                }
+	            });
+
+	            if (cDim == null || vDims.length < 4) {
+	                return;
+	            }
+
+	            data.each([cDim].concat(vDims), function () {
 	                var args = arguments;
-	                var dimLen = dimensions.length;
 	                var axisDimVal = args[0];
-	                var idx = args[dimLen];
-	                var variableDim = chartLayout === 'horizontal' ? 0 : 1;
-	                var constDim = 1 - variableDim;
+	                var idx = args[vDims.length + 1];
 
 	                var openVal = args[1];
 	                var closeVal = args[2];
@@ -49049,10 +49650,10 @@
 	    __webpack_require__(271);
 
 	    echarts.registerVisual(zrUtil.curry(
-	        __webpack_require__(120), 'effectScatter', 'circle', null
+	        __webpack_require__(121), 'effectScatter', 'circle', null
 	    ));
 	    echarts.registerLayout(zrUtil.curry(
-	        __webpack_require__(121), 'effectScatter'
+	        __webpack_require__(122), 'effectScatter'
 	    ));
 
 
@@ -49063,8 +49664,8 @@
 	'use strict';
 
 
-	    var createListFromArray = __webpack_require__(102);
-	    var SeriesModel = __webpack_require__(28);
+	    var createListFromArray = __webpack_require__(109);
+	    var SeriesModel = __webpack_require__(78);
 
 	    module.exports = SeriesModel.extend({
 
@@ -49176,8 +49777,8 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var symbolUtil = __webpack_require__(104);
-	    var graphic = __webpack_require__(44);
+	    var symbolUtil = __webpack_require__(111);
+	    var graphic = __webpack_require__(18);
 	    var numberUtil = __webpack_require__(7);
 	    var Symbol = __webpack_require__(117);
 	    var Group = graphic.Group;
@@ -49424,11 +50025,11 @@
 	'use strict';
 
 
-	    var SeriesModel = __webpack_require__(28);
+	    var SeriesModel = __webpack_require__(78);
 	    var List = __webpack_require__(98);
 	    var zrUtil = __webpack_require__(4);
 	    var formatUtil = __webpack_require__(6);
-	    var CoordinateSystem = __webpack_require__(26);
+	    var CoordinateSystem = __webpack_require__(76);
 
 	    // Convert [ [{coord: []}, {coord: []}] ]
 	    // to [ { coords: [[]] } ]
@@ -49690,13 +50291,13 @@
 	 */
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Line = __webpack_require__(210);
 	    var zrUtil = __webpack_require__(4);
-	    var symbolUtil = __webpack_require__(104);
+	    var symbolUtil = __webpack_require__(111);
 	    var vec2 = __webpack_require__(10);
 
-	    var curveUtil = __webpack_require__(51);
+	    var curveUtil = __webpack_require__(37);
 
 	    /**
 	     * @constructor
@@ -49882,7 +50483,7 @@
 	 */
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 
 	    /**
@@ -50087,10 +50688,10 @@
 
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 
-	    var quadraticContain = __webpack_require__(56);
-	    var lineContain = __webpack_require__(54);
+	    var quadraticContain = __webpack_require__(42);
+	    var lineContain = __webpack_require__(40);
 
 	    var LargeLineShape = graphic.extendShape({
 	        shape: {
@@ -50334,8 +50935,8 @@
 
 	
 
-	    var SeriesModel = __webpack_require__(28);
-	    var createListFromArray = __webpack_require__(102);
+	    var SeriesModel = __webpack_require__(78);
+	    var createListFromArray = __webpack_require__(109);
 
 	    module.exports = SeriesModel.extend({
 	        type: 'series.heatmap',
@@ -50377,7 +50978,7 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var HeatmapLayer = __webpack_require__(285);
 	    var zrUtil = __webpack_require__(4);
 
@@ -50486,7 +51087,6 @@
 
 	            }
 
-
 	            var group = this.group;
 	            var data = seriesModel.getData();
 
@@ -50498,90 +51098,93 @@
 	            var hoverStl = seriesModel.getModel(hoverItemStyleQuery).getItemStyle();
 	            var labelModel = seriesModel.getModel('label.normal');
 	            var hoverLabelModel = seriesModel.getModel('label.emphasis');
+	            var coordSysType = coordSys.type;
 
+	            var dataDims = coordSysType === 'cartesian2d'
+	                ? [
+	                    seriesModel.coordDimToDataDim('x')[0],
+	                    seriesModel.coordDimToDataDim('y')[0],
+	                    seriesModel.coordDimToDataDim('value')[0]
+	                ]
+	                : [
+	                    seriesModel.coordDimToDataDim('time')[0],
+	                    seriesModel.coordDimToDataDim('value')[0]
+	                ];
 
+	            data.each(function (idx) {
+	                var rect;
 
-	            data.each(
-	                coordSys.type === 'cartesian2d' ? ['x', 'y', 'z'] : ['time', 'value'],
+	                if (coordSysType === 'cartesian2d') {
+	                    // Ignore empty data
+	                    if (isNaN(data.get(dataDims[2], idx))) {
+	                        return;
+	                    }
 
-	                function (x, y, z, idx) {
-	                    var rect;
+	                    var point = coordSys.dataToPoint([
+	                        data.get(dataDims[0], idx),
+	                        data.get(dataDims[1], idx)
+	                    ]);
 
-	                    if (coordSys.type === 'cartesian2d') {
-
-	                        // Ignore empty data
-	                        if (isNaN(z)) {
-	                            return;
+	                    rect = new graphic.Rect({
+	                        shape: {
+	                            x: point[0] - width / 2,
+	                            y: point[1] - height / 2,
+	                            width: width,
+	                            height: height
+	                        },
+	                        style: {
+	                            fill: data.getItemVisual(idx, 'color'),
+	                            opacity: data.getItemVisual(idx, 'opacity')
 	                        }
-
-	                        var point = coordSys.dataToPoint([x, y]);
-
-	                        rect = new graphic.Rect({
-	                            shape: {
-	                                x: point[0] - width / 2,
-	                                y: point[1] - height / 2,
-	                                width: width,
-	                                height: height
-	                            },
-	                            style: {
-	                                fill: data.getItemVisual(idx, 'color'),
-	                                opacity: data.getItemVisual(idx, 'opacity')
-	                            }
-	                        });
-	                    }
-	                    else {
-	                        // x => time y => value z => idx
-
-	                        // Ignore empty data
-	                        if (isNaN(y)) {
-	                            return;
-	                        }
-
-	                        idx = z;
-
-	                        rect = new graphic.Rect({
-	                            z2: 1,
-	                            shape: coordSys.dataToRect([x, y]).contentShape,
-	                            style: {
-	                                fill: data.getItemVisual(idx, 'color'),
-	                                opacity: data.getItemVisual(idx, 'opacity')
-	                            }
-	                        });
-	                    }
-
-
-	                    var itemModel = data.getItemModel(idx);
-
-	                    // Optimization for large datset
-	                    if (data.hasItemOption) {
-	                        style = itemModel.getModel(itemStyleQuery).getItemStyle(['color']);
-	                        hoverStl = itemModel.getModel(hoverItemStyleQuery).getItemStyle();
-	                        labelModel = itemModel.getModel(labelQuery);
-	                        hoverLabelModel = itemModel.getModel(hoverLabelQuery);
-	                    }
-
-	                    var rawValue = seriesModel.getRawValue(idx);
-	                    var defaultText = '-';
-	                    if (rawValue && rawValue[2] != null) {
-	                        defaultText = rawValue[2];
-	                    }
-	                    if (labelModel.getShallow('show')) {
-	                        graphic.setText(style, labelModel);
-	                        style.text = seriesModel.getFormattedLabel(idx, 'normal') || defaultText;
-	                    }
-	                    if (hoverLabelModel.getShallow('show')) {
-	                        graphic.setText(hoverStl, hoverLabelModel);
-	                        hoverStl.text = seriesModel.getFormattedLabel(idx, 'emphasis') || defaultText;
-	                    }
-
-	                    rect.setStyle(style);
-
-	                    graphic.setHoverStyle(rect, data.hasItemOption ? hoverStl : zrUtil.extend({}, hoverStl));
-
-	                    group.add(rect);
-	                    data.setItemGraphicEl(idx, rect);
+	                    });
 	                }
-	            );
+	                else {
+	                    // Ignore empty data
+	                    if (isNaN(data.get(dataDims[1], idx))) {
+	                        return;
+	                    }
+
+	                    rect = new graphic.Rect({
+	                        z2: 1,
+	                        shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape,
+	                        style: {
+	                            fill: data.getItemVisual(idx, 'color'),
+	                            opacity: data.getItemVisual(idx, 'opacity')
+	                        }
+	                    });
+	                }
+
+	                var itemModel = data.getItemModel(idx);
+
+	                // Optimization for large datset
+	                if (data.hasItemOption) {
+	                    style = itemModel.getModel(itemStyleQuery).getItemStyle(['color']);
+	                    hoverStl = itemModel.getModel(hoverItemStyleQuery).getItemStyle();
+	                    labelModel = itemModel.getModel(labelQuery);
+	                    hoverLabelModel = itemModel.getModel(hoverLabelQuery);
+	                }
+
+	                var rawValue = seriesModel.getRawValue(idx);
+	                var defaultText = '-';
+	                if (rawValue && rawValue[2] != null) {
+	                    defaultText = rawValue[2];
+	                }
+	                if (labelModel.getShallow('show')) {
+	                    graphic.setText(style, labelModel);
+	                    style.text = seriesModel.getFormattedLabel(idx, 'normal') || defaultText;
+	                }
+	                if (hoverLabelModel.getShallow('show')) {
+	                    graphic.setText(hoverStl, hoverLabelModel);
+	                    hoverStl.text = seriesModel.getFormattedLabel(idx, 'emphasis') || defaultText;
+	                }
+
+	                rect.setStyle(style);
+
+	                graphic.setHoverStyle(rect, data.hasItemOption ? hoverStl : zrUtil.extend({}, hoverStl));
+
+	                group.add(rect);
+	                data.setItemGraphicEl(idx, rect);
+	            });
 	        },
 
 	        _renderOnGeo: function (geo, seriesModel, visualMapModel, api) {
@@ -50812,7 +51415,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    __webpack_require__(124);
+	    __webpack_require__(125);
 
 	    __webpack_require__(287);
 	    __webpack_require__(288);
@@ -50823,11 +51426,11 @@
 	    echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'pictorialBar'));
 
 	    echarts.registerVisual(zrUtil.curry(
-	        __webpack_require__(120), 'pictorialBar', 'roundRect', null
+	        __webpack_require__(121), 'pictorialBar', 'roundRect', null
 	    ));
 
 	    // In case developer forget to include grid component
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 
 /***/ },
@@ -50887,8 +51490,8 @@
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
-	    var symbolUtil = __webpack_require__(104);
+	    var graphic = __webpack_require__(18);
+	    var symbolUtil = __webpack_require__(111);
 	    var numberUtil = __webpack_require__(7);
 	    var helper = __webpack_require__(143);
 
@@ -51728,7 +52331,7 @@
 	        return singles;
 	    }
 
-	    __webpack_require__(26).register('single', {
+	    __webpack_require__(76).register('single', {
 	        create: create,
 	        dimensions: Single.prototype.dimensions
 	    });
@@ -51744,8 +52347,8 @@
 
 
 	    var SingleAxis = __webpack_require__(293);
-	    var axisHelper = __webpack_require__(105);
-	    var layout = __webpack_require__(21);
+	    var axisHelper = __webpack_require__(101);
+	    var layout = __webpack_require__(71);
 
 	    /**
 	     * Create a single coordinates system.
@@ -51907,19 +52510,19 @@
 	            var extentSum = axisExtent[0] + axisExtent[1];
 	            var isHorizontal = axis.isHorizontal();
 
-	            axis.toGlobalCoord = isHorizontal ?
-	                function (coord) {
+	            axis.toGlobalCoord = isHorizontal
+	                ? function (coord) {
 	                    return coord + coordBase;
-	                } :
-	                function (coord) {
+	                }
+	                : function (coord) {
 	                    return extentSum - coord + coordBase;
 	                };
 
-	            axis.toLocalCoord = isHorizontal ?
-	                function (coord) {
+	            axis.toLocalCoord = isHorizontal
+	                ? function (coord) {
 	                    return coord - coordBase;
-	                } :
-	                function (coord) {
+	                }
+	                : function (coord) {
 	                    return extentSum - coord + coordBase;
 	                };
 	        },
@@ -52007,6 +52610,7 @@
 	            pt[1 - idx] = idx === 0 ? (rect.y + rect.height / 2) : (rect.x + rect.width / 2);
 	            return pt;
 	        }
+
 	    };
 
 	    module.exports = Single;
@@ -52021,7 +52625,6 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var Axis = __webpack_require__(100);
-	    var axisHelper = __webpack_require__(105);
 
 	    /**
 	     * @constructor  module:echarts/coord/single/SingleAxis
@@ -52092,32 +52695,6 @@
 	        },
 
 	        /**
-	         * Get interval of the axis label.
-	         * @return {number}
-	         */
-	        getLabelInterval: function () {
-	            var labelInterval = this._labelInterval;
-	            if (!labelInterval) {
-	                var axisModel = this.model;
-	                var labelModel = axisModel.getModel('axisLabel');
-	                var interval = labelModel.get('interval');
-	                if (!(this.type === 'category' && interval === 'auto')) {
-
-	                    labelInterval = this._labelInterval = interval === 'auto' ? 0 : interval;
-	                    return labelInterval;
-	                }
-	                labelInterval = this._labelInterval =
-	                    axisHelper.getAxisLabelInterval(
-	                        zrUtil.map(this.scale.getTicks(), this.dataToCoord, this),
-	                        axisModel.getFormattedLabels(),
-	                        labelModel.getModel('textStyle').getFont(),
-	                        this.isHorizontal()
-	                    );
-	            }
-	            return labelInterval;
-	        },
-
-	        /**
 	         * @override
 	         */
 	        pointToData: function (point, clamp) {
@@ -52154,7 +52731,7 @@
 
 	    var AxisBuilder = __webpack_require__(135);
 	    var zrUtil =  __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var singleAxisHelper = __webpack_require__(295);
 	    var getInterval = AxisBuilder.getInterval;
 	    var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick;
@@ -52350,7 +52927,7 @@
 
 	
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 	    var axisModelCreator = __webpack_require__(131);
 	    var zrUtil =  __webpack_require__(4);
 
@@ -52498,8 +53075,7 @@
 	            payload.dispatchAction || zrUtil.bind(api.dispatchAction, api),
 	            ecModel,
 	            api,
-	            payload.tooltipOption,
-	            payload.highDownKey
+	            payload.tooltipOption
 	        );
 
 	        return outputFinder;
@@ -52530,20 +53106,26 @@
 	     * @param {string} [currTrigger] 'click' | 'mousemove' | 'leave'
 	     * @param {Array.<number>} [point] x and y, which are mandatory, specify a point to
 	     *              tigger axisPointer and tooltip.
-	     * @param {Object} [finder] {xAxisId: ...[], yAxisName: ...[], angleAxisIndex: ...[]}
+	     * @param {Object} [finder] {
+	     *                  seriesIndex, dataIndex,
+	     *                  axesInfo: [{
+	     *                      axisDim: 'x'|'y'|'angle'|..., axisIndex: ..., value: ...
+	     *                  }, ...]
+	     *              }
 	     *              These properties, which are optional, restrict target axes.
 	     * @param {Function} dispatchAction
 	     * @param {module:echarts/ExtensionAPI} api
 	     * @param {Object} [tooltipOption]
-	     * @param {string} [highDownKey]
 	     * @return {Object} content of event obj for echarts.connect.
 	     */
 	    function axisTrigger(
 	        coordSysAxesInfo, currTrigger, point, finder, dispatchAction,
-	        ecModel, api, tooltipOption, highDownKey
+	        ecModel, api, tooltipOption
 	    ) {
 	        finder = finder || {};
-	        if (!point || point[0] == null || point[1] == null) {
+	        if (illegalPoint(point)) {
+	            // Used in the default behavior of `connection`: use the sample seriesIndex
+	            // and dataIndex. And also used in the tooltipView trigger.
 	            point = findPointFromSeries({
 	                seriesIndex: finder.seriesIndex,
 	                // Do not use dataIndexInside from other ec instance.
@@ -52551,6 +53133,13 @@
 	                dataIndex: finder.dataIndex
 	            }, ecModel).point;
 	        }
+	        var isIllegalPoint = illegalPoint(point);
+
+	        // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}).
+	        // Notice: In this case, it is difficult to get the `point` (which is necessary to show
+	        // tooltip, so if point is not given, we just use the point found by sample seriesIndex
+	        // and dataIndex.
+	        var inputAxesInfo = finder.axesInfo;
 
 	        var axesInfo = coordSysAxesInfo.axesInfo;
 	        var shouldHide = currTrigger === 'leave' || illegalPoint(point);
@@ -52558,21 +53147,26 @@
 
 	        var showValueMap = {};
 	        var dataByCoordSys = {list: [], map: {}};
-	        var highlightBatch = [];
 	        var updaters = {
 	            showPointer: curry(showPointer, showValueMap),
-	            showTooltip: curry(showTooltip, dataByCoordSys),
-	            highlight: curry(highlight, highlightBatch)
+	            showTooltip: curry(showTooltip, dataByCoordSys)
 	        };
 
 	        // Process for triggered axes.
 	        each(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) {
-	            var coordSysContainsPoint = coordSys.containPoint(point);
+	            // If a point given, it must be contained by the coordinate system.
+	            var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point);
 
 	            each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) {
 	                var axis = axisInfo.axis;
-	                if (!shouldHide && coordSysContainsPoint && !notTargetAxis(finder, axis)) {
-	                    processOnAxis(axisInfo, axis.pointToData(point), updaters, false, outputFinder);
+	                var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo);
+	                // If no inputAxesInfo, no axis is restricted.
+	                if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) {
+	                    var val = inputAxisInfo && inputAxisInfo.value;
+	                    if (val == null && !isIllegalPoint) {
+	                        val = axis.pointToData(point);
+	                    }
+	                    val != null && processOnAxis(axisInfo, val, updaters, false, outputFinder);
 	                }
 	            });
 	        });
@@ -52601,9 +53195,9 @@
 	            processOnAxis(axesInfo[tarKey], val, updaters, true, outputFinder);
 	        });
 
-	        updateModelActually(showValueMap, axesInfo);
+	        updateModelActually(showValueMap, axesInfo, outputFinder);
 	        dispatchTooltipActually(dataByCoordSys, point, tooltipOption, dispatchAction);
-	        dispatchHighDownActually(highlightBatch, dispatchAction, api, highDownKey);
+	        dispatchHighDownActually(axesInfo, dispatchAction, api);
 
 	        return outputFinder;
 	    }
@@ -52639,8 +53233,7 @@
 	            }
 	        }
 
-	        updaters.highlight('highlight', payloadBatch);
-	        updaters.showPointer(axisInfo, newValue, payloadBatch);
+	        updaters.showPointer(axisInfo, newValue, payloadBatch, outputFinder);
 	        // Tooltip should always be snapToValue, otherwise there will be
 	        // incorrect "axis value ~ series value" mapping displayed in tooltip.
 	        updaters.showTooltip(axisInfo, payloadInfo, snapToValue);
@@ -52756,11 +53349,8 @@
 	        });
 	    }
 
-	    function highlight(highlightBatch, actionType, batch) {
-	        highlightBatch.push.apply(highlightBatch, batch);
-	    }
-
-	    function updateModelActually(showValueMap, axesInfo) {
+	    function updateModelActually(showValueMap, axesInfo, outputFinder) {
+	        var outputAxesInfo = outputFinder.axesInfo = [];
 	        // Basic logic: If no 'show' required, 'hide' this axisPointer.
 	        each(axesInfo, function (axisInfo, key) {
 	            var option = axisInfo.axisPointerModel.option;
@@ -52769,7 +53359,7 @@
 	            if (valItem) {
 	                !axisInfo.useHandle && (option.status = 'show');
 	                option.value = valItem.value;
-	                // For label formatter param.
+	                // For label formatter param and highlight.
 	                option.seriesDataIndices = (valItem.payloadBatch || []).slice();
 	            }
 	            // When always show (e.g., handle used), remain
@@ -52779,6 +53369,13 @@
 	                // click legend to toggle axis blank.
 	                !axisInfo.useHandle && (option.status = 'hide');
 	            }
+
+	            // If status is 'hide', should be no info in payload.
+	            option.status === 'show' && outputAxesInfo.push({
+	                axisDim: axisInfo.axis.dim,
+	                axisIndex: axisInfo.axis.model.componentIndex,
+	                value: option.value
+	            });
 	        });
 	    }
 
@@ -52808,28 +53405,24 @@
 	        });
 	    }
 
-	    function dispatchHighDownActually(highlightBatch, dispatchAction, api, highDownKey) {
-	        // Basic logic: If nothing highlighted, should downplay all highlighted items.
-	        // This case will occur when mouse leave coordSys.
-
+	    function dispatchHighDownActually(axesInfo, dispatchAction, api) {
 	        // FIXME
-	        // (1) highlight status shoule be managemented in series.getData()?
-	        // (2) If axisPointer A triggerOn 'handle' and axisPointer B triggerOn
-	        // 'mousemove', items highlighted by A will be downplayed by B.
-	        // It will not be fixed until someone requires this scenario.
+	        // highlight status modification shoule be a stage of main process?
+	        // (Consider confilct (e.g., legend and axisPointer) and setOption)
 
-	        // Consider items area hightlighted by 'handle', and globalListener may
-	        // downplay all items (including just highlighted ones) when mousemove.
-	        // So we use a highDownKey to separate them as a temporary solution.
 	        var zr = api.getZr();
-	        highDownKey = 'lastHighlights' + (highDownKey || '');
+	        var highDownKey = 'axisPointerLastHighlights';
 	        var lastHighlights = get(zr)[highDownKey] || {};
 	        var newHighlights = get(zr)[highDownKey] = {};
 
+	        // Update highlight/downplay status according to axisPointer model.
 	        // Build hash map and remove duplicate incidentally.
-	        zrUtil.each(highlightBatch, function (batchItem) {
-	            var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex;
-	            newHighlights[key] = batchItem;
+	        each(axesInfo, function (axisInfo, key) {
+	            var option = axisInfo.axisPointerModel.option;
+	            option.status === 'show' && each(option.seriesDataIndices, function (batchItem) {
+	                var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex;
+	                newHighlights[key] = batchItem;
+	            });
 	        });
 
 	        // Diff.
@@ -52850,21 +53443,15 @@
 	        });
 	    }
 
-	    function notTargetAxis(finder, axis) {
-	        var isTarget = 1;
-	        // If none of xxxAxisId and xxxAxisName and xxxAxisIndex exists in finder,
-	        // no axis is not target axis.
-	        each(finder, function (value, propName) {
-	            isTarget &= !(/^.+(AxisId|AxisName|AxisIndex)$/.test(propName));
-	        });
-	        !isTarget && each(
-	            [['AxisId', 'id'], ['AxisIndex', 'componentIndex'], ['AxisName', 'name']],
-	            function (prop) {
-	                var vals = modelUtil.normalizeToArray(finder[axis.dim + prop[0]]);
-	                isTarget |= zrUtil.indexOf(vals, axis.model[prop[1]]) >= 0;
+	    function findInputAxisInfo(inputAxesInfo, axisInfo) {
+	        for (var i = 0; i < (inputAxesInfo || []).length; i++) {
+	            var inputAxisInfo = inputAxesInfo[i];
+	            if (axisInfo.axis.dim === inputAxisInfo.axisDim
+	                && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex
+	            ) {
+	                return inputAxisInfo;
 	            }
-	        );
-	        return !isTarget;
+	        }
 	    }
 
 	    function makeMapperParam(axisInfo) {
@@ -52878,7 +53465,7 @@
 	    }
 
 	    function illegalPoint(point) {
-	        return point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]);
+	        return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]);
 	    }
 
 	    module.exports = axisTrigger;
@@ -53245,7 +53832,7 @@
 	'use strict';
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var BaseAxisPointer = __webpack_require__(304);
 	    var viewHelper = __webpack_require__(305);
 	    var cartesianAxisHelper = __webpack_require__(138);
@@ -53381,7 +53968,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var clazzUtil = __webpack_require__(13);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var get = __webpack_require__(5).makeGetter();
 	    var axisPointerModelHelper = __webpack_require__(137);
 	    var eventTool = __webpack_require__(88);
@@ -53736,16 +54323,17 @@
 	            }
 
 	            var payloadInfo = this._payloadInfo;
-	            var payload = {
+	            var axisModel = this._axisModel;
+	            this._api.dispatchAction({
 	                type: 'updateAxisPointer',
 	                x: payloadInfo.cursorPoint[0],
 	                y: payloadInfo.cursorPoint[1],
 	                tooltipOption: payloadInfo.tooltipOption,
-	                highDownKey: 'axisPointerHandle'
-	            };
-	            var axis = this._axisModel.axis;
-	            payload[axis.dim + 'AxisId'] = this._axisModel.id;
-	            this._api.dispatchAction(payload);
+	                axesInfo: [{
+	                    axisDim: axisModel.axis.dim,
+	                    axisIndex: axisModel.componentIndex
+	                }]
+	            });
 	        },
 
 	        /**
@@ -53927,11 +54515,11 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var textContain = __webpack_require__(8);
 	    var formatUtil = __webpack_require__(6);
 	    var matrix = __webpack_require__(11);
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 	    var AxisBuilder = __webpack_require__(135);
 
 	    var helper = {};
@@ -54154,7 +54742,7 @@
 	'use strict';
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var BaseAxisPointer = __webpack_require__(304);
 	    var viewHelper = __webpack_require__(305);
 	    var singleAxisHelper = __webpack_require__(295);
@@ -54289,8 +54877,8 @@
 	 */
 
 
-	    var completeDimensions = __webpack_require__(103);
-	    var SeriesModel = __webpack_require__(28);
+	    var completeDimensions = __webpack_require__(110);
+	    var SeriesModel = __webpack_require__(78);
 	    var List = __webpack_require__(98);
 	    var zrUtil = __webpack_require__(4);
 	    var formatUtil = __webpack_require__(6);
@@ -54307,7 +54895,7 @@
 
 	        /**
 	         * @readOnly
-	         * @type {Object}
+	         * @type {module:zrender/core/util#HashMap}
 	         */
 	        nameMap: null,
 
@@ -54434,17 +55022,18 @@
 
 	            var data = this.fixData(filterData || []);
 	            var nameList = [];
-	            var nameMap = this.nameMap = {};
+	            var nameMap = this.nameMap = zrUtil.createHashMap();
 	            var count = 0;
 
 	            for (var i = 0; i < data.length; ++i) {
 	                nameList.push(data[i][DATA_NAME_INDEX]);
-	                if (!nameMap[data[i][DATA_NAME_INDEX]]) {
-	                    nameMap[data[i][DATA_NAME_INDEX]] = count++;
+	                if (!nameMap.get(data[i][DATA_NAME_INDEX])) {
+	                    nameMap.set(data[i][DATA_NAME_INDEX], count);
+	                    count++;
 	                }
 	            }
 
-	            completeDimensions(dimensions, data);
+	            dimensions = completeDimensions(dimensions, data);
 
 	            var list = new List(dimensions, this);
 
@@ -54602,8 +55191,8 @@
 	 */
 
 
-	    var poly = __webpack_require__(119);
-	    var graphic = __webpack_require__(44);
+	    var poly = __webpack_require__(120);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var DataDiffer = __webpack_require__(99);
 
@@ -55130,7 +55719,7 @@
 
 	            data.each(function (index) {
 	                var name = data.getName(index);
-	                var color = colorList[(seriesModel.nameMap[name] - 1) % colorList.length];
+	                var color = colorList[(seriesModel.nameMap.get(name) - 1) % colorList.length];
 	                rawData.setItemVisual(index, 'color', color);
 	            });
 	        });
@@ -55146,9 +55735,676 @@
 
 	    var echarts = __webpack_require__(1);
 	    var zrUtil = __webpack_require__(4);
+	    var graphicUtil = __webpack_require__(18);
+	    var labelHelper = __webpack_require__(118);
+	    var createListFromArray = __webpack_require__(109);
+	    var barGrid = __webpack_require__(145);
+
+	    var ITEM_STYLE_NORMAL_PATH = ['itemStyle', 'normal'];
+	    var ITEM_STYLE_EMPHASIS_PATH = ['itemStyle', 'emphasis'];
+	    var LABEL_NORMAL = ['label', 'normal'];
+	    var LABEL_EMPHASIS = ['label', 'emphasis'];
+
+	    /**
+	     * To reduce total package size of each coordinate systems, the modules `prepareCustom`
+	     * of each coordinate systems are not required by each coordinate systems directly, but
+	     * required by the module `custom`.
+	     *
+	     * prepareInfoForCustomSeries {Function}: optional
+	     *     @return {Object} {coordSys: {...}, api: {
+	     *         coord: function (data, clamp) {}, // return point in global.
+	     *         size: function (dataSize, dataItem) {} // return size of each axis in coordSys.
+	     *     }}
+	     */
+	    var prepareCustoms = {
+	        cartesian2d: __webpack_require__(313),
+	        geo: __webpack_require__(314),
+	        singleAxis: __webpack_require__(315),
+	        polar: __webpack_require__(316),
+	        calendar: __webpack_require__(317)
+	    };
+
+	    // ------
+	    // Model
+	    // ------
+
+	    echarts.extendSeriesModel({
+
+	        type: 'series.custom',
+
+	        dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'],
+
+	        defaultOption: {
+	            coordinateSystem: 'cartesian2d',
+	            zlevel: 0,
+	            z: 2,
+	            legendHoverLink: true
+
+	            // Cartesian coordinate system
+	            // xAxisIndex: 0,
+	            // yAxisIndex: 0,
+
+	            // Polar coordinate system
+	            // polarIndex: 0,
+
+	            // Geo coordinate system
+	            // geoIndex: 0,
+
+	            // label: {}
+	            // itemStyle: {}
+	        },
+
+	        getInitialData: function (option, ecModel) {
+	            return createListFromArray(option.data, this, ecModel);
+	        }
+	    });
+
+	    // -----
+	    // View
+	    // -----
+
+	    echarts.extendChartView({
+
+	        type: 'custom',
+
+	        /**
+	         * @private
+	         * @type {module:echarts/data/List}
+	         */
+	        _data: null,
+
+	        /**
+	         * @override
+	         */
+	        render: function (customSeries, ecModel, api) {
+	            var oldData = this._data;
+	            var data = customSeries.getData();
+	            var group = this.group;
+	            var renderItem = makeRenderItem(customSeries, data, ecModel, api);
+
+	            data.diff(oldData)
+	                .add(function (newIdx) {
+	                    data.hasValue(newIdx) && createOrUpdate(
+	                        null, newIdx, renderItem(newIdx), customSeries, group, data
+	                    );
+	                })
+	                .update(function (newIdx, oldIdx) {
+	                    var el = oldData.getItemGraphicEl(oldIdx);
+	                    data.hasValue(newIdx)
+	                        ? createOrUpdate(
+	                            el, newIdx, renderItem(newIdx), customSeries, group, data
+	                        )
+	                        : (el && group.remove(el));
+	                })
+	                .remove(function (oldIdx) {
+	                    var el = oldData.getItemGraphicEl(oldIdx);
+	                    el && group.remove(el);
+	                })
+	                .execute();
+
+	            this._data = data;
+	        }
+	    });
+
+
+	    function createEl(elOption) {
+	        var graphicType = elOption.type;
+	        var el;
+
+	        if (graphicType === 'path') {
+	            var shape = elOption.shape;
+	            el = graphicUtil.makePath(
+	                shape.pathData,
+	                null,
+	                {
+	                    x: shape.x || 0,
+	                    y: shape.y || 0,
+	                    width: shape.width || 0,
+	                    height: shape.height || 0
+	                },
+	                'center'
+	            );
+	            el.__customPathData = elOption.pathData;
+	        }
+	        else if (graphicType === 'image') {
+	            el = new graphicUtil.Image({
+	            });
+	            el.__customImagePath = elOption.style.image;
+	        }
+	        else if (graphicType === 'text') {
+	            el = new graphicUtil.Text({
+	            });
+	            el.__customText = elOption.style.text;
+	        }
+	        else {
+	            var Clz = graphicUtil[graphicType.charAt(0).toUpperCase() + graphicType.slice(1)];
+
+	            if (true) {
+	                zrUtil.assert(Clz, 'graphic type "' + graphicType + '" can not be found.');
+	            }
+
+	            el = new Clz();
+	        }
+
+	        el.__customGraphicType = graphicType;
+
+	        return el;
+	    }
+
+	    function updateEl(el, dataIndex, elOption, animatableModel, data, isInit) {
+	        var targetProps = {};
+	        var elOptionStyle = elOption.style || {};
+
+	        elOption.shape && (targetProps.shape = zrUtil.clone(elOption.shape));
+	        elOption.position && (targetProps.position = elOption.position.slice());
+	        elOption.scale && (targetProps.scale = elOption.scale.slice());
+	        elOption.origin && (targetProps.origin = elOption.origin.slice());
+	        elOption.rotation && (targetProps.rotation = elOption.rotation);
+
+	        if (el.type === 'image' && elOption.style) {
+	            var targetStyle = targetProps.style = {};
+	            zrUtil.each(['x', 'y', 'width', 'height'], function (prop) {
+	                prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit);
+	            });
+	        }
+
+	        if (el.type === 'text' && elOption.style) {
+	            var targetStyle = targetProps.style = {};
+	            zrUtil.each(['x', 'y'], function (prop) {
+	                prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit);
+	            });
+	        }
+
+	        if (el.type !== 'group') {
+	            el.useStyle(elOptionStyle);
+
+	            // Init animation.
+	            if (isInit) {
+	                el.style.opacity = 0;
+	                var targetOpacity = elOptionStyle.opacity;
+	                targetOpacity == null && (targetOpacity = 1);
+	                graphicUtil.initProps(el, {style: {opacity: targetOpacity}}, animatableModel, dataIndex);
+	            }
+	        }
+
+	        if (isInit) {
+	            el.attr(targetProps);
+	        }
+	        else {
+	            graphicUtil.updateProps(el, targetProps, animatableModel, dataIndex);
+	        }
+
+	        // z2 must not be null/undefined, otherwise sort error may occur.
+	        el.attr({z2: elOption.z2 || 0, silent: elOption.silent});
+
+	        el.styleEmphasis !== false && graphicUtil.setHoverStyle(el, el.styleEmphasis);
+	    }
+
+	    function prepareStyleTransition(prop, targetStyle, elOptionStyle, oldElStyle, isInit) {
+	        if (elOptionStyle[prop] != null && !isInit) {
+	            targetStyle[prop] = elOptionStyle[prop];
+	            elOptionStyle[prop] = oldElStyle[prop];
+	        }
+	    }
+
+	    function makeRenderItem(customSeries, data, ecModel, api) {
+	        var renderItem = customSeries.get('renderItem');
+	        var coordSys = customSeries.coordinateSystem;
+
+	        if (true) {
+	            zrUtil.assert(renderItem, 'series.render is required.');
+	            zrUtil.assert(prepareCustoms[coordSys.type], 'This coordSys does not support custom series.');
+	        }
+
+	        var prepareResult = prepareCustoms[coordSys.type](coordSys);
+
+	        var userAPI = zrUtil.defaults({
+	            getWidth: api.getWidth,
+	            getHeight: api.getHeight,
+	            getZr: api.getZr,
+	            getDevicePixelRatio: api.getDevicePixelRatio,
+	            value: value,
+	            style: style,
+	            styleEmphasis: styleEmphasis,
+	            visual: visual,
+	            barLayout: barLayout,
+	            currentSeriesIndices: currentSeriesIndices,
+	            font: font
+	        }, prepareResult.api);
+
+	        var userParams = {
+	            context: {},
+	            seriesId: customSeries.id,
+	            seriesName: customSeries.name,
+	            seriesIndex: customSeries.seriesIndex,
+	            coordSys: prepareResult.coordSys,
+	            dataInsideLength: data.count(),
+	            encode: wrapEncodeDef(customSeries.getData())
+	        };
+
+	        // Do not support call `api` asynchronously without dataIndexInside input.
+	        var currDataIndexInside;
+	        var currDirty = true;
+	        var currItemModel;
+	        var currLabelNormalModel;
+	        var currLabelEmphasisModel;
+	        var currLabelValueDim;
+	        var currVisualColor;
+
+	        return function (dataIndexInside) {
+	            currDataIndexInside = dataIndexInside;
+	            currDirty = true;
+	            return renderItem && renderItem(
+	                zrUtil.defaults({
+	                    dataIndexInside: dataIndexInside,
+	                    dataIndex: data.getRawIndex(dataIndexInside)
+	                }, userParams),
+	                userAPI
+	            ) || {};
+	        };
+
+	        // Do not update cache until api called.
+	        function updateCache(dataIndexInside) {
+	            dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+	            if (currDirty) {
+	                currItemModel = data.getItemModel(dataIndexInside);
+	                currLabelNormalModel = currItemModel.getModel(LABEL_NORMAL);
+	                currLabelEmphasisModel = currItemModel.getModel(LABEL_EMPHASIS);
+	                currLabelValueDim = labelHelper.findLabelValueDim(data);
+	                currVisualColor = data.getItemVisual(dataIndexInside, 'color');
+
+	                currDirty = false;
+	            }
+	        }
+
+	        /**
+	         * @public
+	         * @param {nubmer|string} dim
+	         * @param {number} [dataIndexInside=currDataIndexInside]
+	         * @return {number|string} value
+	         */
+	        function value(dim, dataIndexInside) {
+	            dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+	            return data.get(data.getDimension(dim || 0), dataIndexInside);
+	        }
+
+	        /**
+	         * By default, `visual` is applied to style (to support visualMap).
+	         * `visual.color` is applied at `fill`. If user want apply visual.color on `stroke`,
+	         * it can be implemented as:
+	         * `api.style({stroke: api.visual('color'), fill: null})`;
+	         * @public
+	         * @param {Object} [extra]
+	         * @param {number} [dataIndexInside=currDataIndexInside]
+	         */
+	        function style(extra, dataIndexInside) {
+	            dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+	            updateCache(dataIndexInside);
+
+	            var itemStyle = currItemModel.getModel(ITEM_STYLE_NORMAL_PATH).getItemStyle();
+
+	            currVisualColor != null && (itemStyle.fill = currVisualColor);
+	            var opacity = data.getItemVisual(dataIndexInside, 'opacity');
+	            opacity != null && (itemStyle.opacity = opacity);
+
+	            labelHelper.setTextToStyle(
+	                data, dataIndexInside, currLabelValueDim, itemStyle,
+	                customSeries, currLabelNormalModel, currVisualColor
+	            );
+
+	            extra && zrUtil.extend(itemStyle, extra);
+	            return itemStyle;
+	        }
+
+	        /**
+	         * @public
+	         * @param {Object} [extra]
+	         * @param {number} [dataIndexInside=currDataIndexInside]
+	         */
+	        function styleEmphasis(extra, dataIndexInside) {
+	            dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+	            updateCache(dataIndexInside);
+
+	            var itemStyle = currItemModel.getModel(ITEM_STYLE_EMPHASIS_PATH).getItemStyle();
+
+	            labelHelper.setTextToStyle(
+	                data, dataIndexInside, currLabelValueDim, itemStyle,
+	                customSeries, currLabelEmphasisModel, currVisualColor
+	            );
+
+	            extra && zrUtil.extend(itemStyle, extra);
+	            return itemStyle;
+	        }
+
+	        /**
+	         * @public
+	         * @param {string} visualType
+	         * @param {number} [dataIndexInside=currDataIndexInside]
+	         */
+	        function visual(visualType, dataIndexInside) {
+	            dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+	            return data.getItemVisual(dataIndexInside, visualType);
+	        }
+
+	        /**
+	         * @public
+	         * @param {number} opt.count Positive interger.
+	         * @param {number} [opt.barWidth]
+	         * @param {number} [opt.barMaxWidth]
+	         * @param {number} [opt.barGap]
+	         * @param {number} [opt.barCategoryGap]
+	         * @return {Object} {width, offset, offsetCenter} is not support, return undefined.
+	         */
+	        function barLayout(opt) {
+	            if (coordSys.getBaseAxis) {
+	                var baseAxis = coordSys.getBaseAxis();
+	                return barGrid.getLayoutOnAxis(zrUtil.defaults({axis: baseAxis}, opt), api);
+	            }
+	        }
+
+	        /**
+	         * @public
+	         * @return {Array.<number>}
+	         */
+	        function currentSeriesIndices() {
+	            return ecModel.getCurrentSeriesIndices();
+	        }
+
+	        /**
+	         * @public
+	         * @param {Object} opt
+	         * @param {string} [opt.fontStyle]
+	         * @param {number} [opt.fontWeight]
+	         * @param {number} [opt.fontSize]
+	         * @param {string} [opt.fontFamily]
+	         * @return {string} font string
+	         */
+	        function font(opt) {
+	            return graphicUtil.getFont(opt, ecModel);
+	        }
+	    }
+
+	    function wrapEncodeDef(data) {
+	        var encodeDef = {};
+	        zrUtil.each(data.dimensions, function (dimName, dataDimIndex) {
+	            var dimInfo = data.getDimensionInfo(dimName);
+	            if (!dimInfo.isExtraCoord) {
+	                var coordDim = dimInfo.coordDim;
+	                var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || [];
+	                dataDims[dimInfo.coordDimIndex] = dataDimIndex;
+	            }
+	        });
+	        return encodeDef;
+	    }
+
+	    function createOrUpdate(el, dataIndex, elOption, animatableModel, group, data) {
+	        el = doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data);
+	        el && data.setItemGraphicEl(dataIndex, el);
+	    }
+
+	    function doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data) {
+	        var elOptionType = elOption.type;
+	        if (el
+	            && elOptionType !== el.__customGraphicType
+	            && (elOptionType !== 'path' || elOption.pathData !== el.__customPathData)
+	            && (elOptionType !== 'image' || elOption.style.image !== el.__customImagePath)
+	            && (elOptionType !== 'text' || elOption.style.text !== el.__customText)
+	        ) {
+	            group.remove(el);
+	            el = null;
+	        }
+
+	        // `elOption.type` is undefined when `renderItem` returns nothing.
+	        if (elOptionType == null) {
+	            return;
+	        }
+
+	        var isInit = !el;
+	        !el && (el = createEl(elOption));
+	        updateEl(el, dataIndex, elOption, animatableModel, data, isInit);
+
+	        elOptionType === 'group' && zrUtil.each(elOption.children, function (childOption, index) {
+	            doCreateOrUpdate(el.childAt(index), dataIndex, childOption, animatableModel, el, data);
+	        });
+
+	        group.add(el);
+
+	        return el;
+	    }
+
+
+
+
+/***/ },
+/* 313 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var zrUtil = __webpack_require__(4);
+
+	    function dataToCoordSize(dataSize, dataItem) {
+	        // dataItem is necessary in log axis.
+	        dataItem = dataItem || [0, 0];
+	        return zrUtil.map(['x', 'y'], function (dim, dimIdx) {
+	            var axis = this.getAxis(dim);
+	            var val = dataItem[dimIdx];
+	            var halfSize = dataSize[dimIdx] / 2;
+	            return axis.type === 'category'
+	                ? axis.getBandWidth()
+	                : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));
+	        }, this);
+	    }
+
+	    function prepareCustom(coordSys) {
+	        var rect = coordSys.grid.getRect();
+	        return {
+	            coordSys: {
+	                // The name exposed to user is always 'cartesian2d' but not 'grid'.
+	                type: 'cartesian2d',
+	                x: rect.x,
+	                y: rect.y,
+	                width: rect.width,
+	                height: rect.height
+	            },
+	            api: {
+	                coord: zrUtil.bind(coordSys.dataToPoint, coordSys),
+	                size: zrUtil.bind(dataToCoordSize, coordSys)
+	            }
+	        };
+	    }
+
+	    module.exports = prepareCustom;
+
+
+/***/ },
+/* 314 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var zrUtil = __webpack_require__(4);
+
+	    function dataToCoordSize(dataSize, dataItem) {
+	        dataItem = dataItem || [0, 0];
+	        return zrUtil.map([0, 1], function (dimIdx) {
+	            var val = dataItem[dimIdx];
+	            var halfSize = dataSize[dimIdx] / 2;
+	            var p1 = [];
+	            var p2 = [];
+	            p1[dimIdx] = val - halfSize;
+	            p2[dimIdx] = val + halfSize;
+	            p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx];
+	            return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]);
+	        }, this);
+	    }
+
+	    function prepareCustom(coordSys) {
+	        var rect = coordSys.getBoundingRect();
+	        return {
+	            coordSys: {
+	                type: 'geo',
+	                x: rect.x,
+	                y: rect.y,
+	                width: rect.width,
+	                height: rect.height
+	            },
+	            api: {
+	                coord: zrUtil.bind(coordSys.dataToPoint, coordSys),
+	                size: zrUtil.bind(dataToCoordSize, coordSys)
+	            }
+	        };
+	    }
+
+	    module.exports = prepareCustom;
+
+
+/***/ },
+/* 315 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var zrUtil = __webpack_require__(4);
+
+	    function dataToCoordSize(dataSize, dataItem) {
+	        // dataItem is necessary in log axis.
+	        var axis = this.getAxis();
+	        var val = dataItem instanceof Array ? dataItem[0] : dataItem;
+	        var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2;
+	        return axis.type === 'category'
+	            ? axis.getBandWidth()
+	            : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));
+	    }
+
+	    function prepareCustom(coordSys) {
+	        var rect = coordSys.getRect();
+
+	        return {
+	            coordSys: {
+	                type: 'singleAxis',
+	                x: rect.x,
+	                y: rect.y,
+	                width: rect.width,
+	                height: rect.height
+	            },
+	            api: {
+	                coord: zrUtil.bind(coordSys.dataToPoint, coordSys),
+	                size: zrUtil.bind(dataToCoordSize, coordSys)
+	            }
+	        };
+	    }
+
+	    module.exports = prepareCustom;
+
+
+/***/ },
+/* 316 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var zrUtil = __webpack_require__(4);
+
+	    function dataToCoordSize(dataSize, dataItem) {
+	        // dataItem is necessary in log axis.
+	        return zrUtil.map(['Radius', 'Angle'], function (dim, dimIdx) {
+	            var axis = this['get' + dim + 'Axis']();
+	            var val = dataItem[dimIdx];
+	            var halfSize = dataSize[dimIdx] / 2;
+	            var method = 'dataTo' + dim;
+
+	            var result = axis.type === 'category'
+	                ? axis.getBandWidth()
+	                : Math.abs(axis[method](val - halfSize) - axis[method](val + halfSize));
+
+	            if (dim === 'Angle') {
+	                result = result * Math.PI / 180;
+	            }
+
+	            return result;
+
+	        }, this);
+	    }
+
+	    function prepareCustom(coordSys) {
+	        var radiusAxis = coordSys.getRadiusAxis();
+	        var angleAxis = coordSys.getAngleAxis();
+	        var radius = radiusAxis.getExtent();
+	        radius[0] > radius[1] && radius.reverse();
+
+	        return {
+	            coordSys: {
+	                type: 'polar',
+	                cx: coordSys.cx,
+	                cy: coordSys.cy,
+	                r: radius[1],
+	                r0: radius[0]
+	            },
+	            api: {
+	                coord: zrUtil.bind(function (data) {
+	                    var radius = radiusAxis.dataToRadius(data[0]);
+	                    var angle = angleAxis.dataToAngle(data[1]);
+	                    var coord = coordSys.coordToPoint([radius, angle]);
+	                    coord.push(radius, angle * Math.PI / 180);
+	                    return coord;
+	                }),
+	                size: zrUtil.bind(dataToCoordSize, coordSys)
+	            }
+	        };
+	    }
+
+	    module.exports = prepareCustom;
+
+
+/***/ },
+/* 317 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var zrUtil = __webpack_require__(4);
+
+	    function prepareCustom(coordSys) {
+	        var rect = coordSys.getRect();
+	        var rangeInfo = coordSys.getRangeInfo();
+
+	        return {
+	            coordSys: {
+	                type: 'calendar',
+	                x: rect.x,
+	                y: rect.y,
+	                width: rect.width,
+	                height: rect.height,
+	                cellWidth: coordSys.getCellWidth(),
+	                cellHeight: coordSys.getCellHeight(),
+	                rangeInfo: {
+	                    start: rangeInfo.start,
+	                    end: rangeInfo.end,
+	                    weeks: rangeInfo.weeks,
+	                    dayCount: rangeInfo.allDay
+	                }
+	            },
+	            api: {
+	                coord: zrUtil.bind(coordSys.dataToPoint, coordSys)
+	            }
+	        };
+	    }
+
+	    module.exports = prepareCustom;
+
+
+/***/ },
+/* 318 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var echarts = __webpack_require__(1);
+	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
-	    var graphicUtil = __webpack_require__(44);
-	    var layoutUtil = __webpack_require__(21);
+	    var graphicUtil = __webpack_require__(18);
+	    var layoutUtil = __webpack_require__(71);
 
 	    // -------------
 	    // Preprocessor
@@ -55358,9 +56614,9 @@
 
 	            /**
 	             * @private
-	             * @type {Object}
+	             * @type {module:zrender/core/util.HashMap}
 	             */
-	            this._elMap = {};
+	            this._elMap = zrUtil.createHashMap();
 
 	            /**
 	             * @private
@@ -55414,9 +56670,9 @@
 	            zrUtil.each(elOptionsToUpdate, function (elOption) {
 	                var $action = elOption.$action;
 	                var id = elOption.id;
-	                var existEl = elMap[id];
+	                var existEl = elMap.get(id);
 	                var parentId = elOption.parentId;
-	                var targetElParent = parentId != null ? elMap[parentId] : rootGroup;
+	                var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup;
 
 	                // In top/bottom mode, textVertical should not be used. And textBaseline
 	                // should not be 'alphabetic', which cause inaccurately locating.
@@ -55449,9 +56705,10 @@
 	                    removeEl(existEl, elMap);
 	                }
 
-	                if (elMap[id]) {
-	                    elMap[id].__ecGraphicWidth = elOption.width;
-	                    elMap[id].__ecGraphicHeight = elOption.height;
+	                var el = elMap.get(id);
+	                if (el) {
+	                    el.__ecGraphicWidth = elOption.width;
+	                    el.__ecGraphicHeight = elOption.height;
 	                }
 	            });
 	        },
@@ -55471,7 +56728,7 @@
 	            // Bottom-up tranvese all elements (consider ec resize) to locate elements.
 	            for (var i = elOptions.length - 1; i >= 0; i--) {
 	                var elOption = elOptions[i];
-	                var el = elMap[elOption.id];
+	                var el = elMap.get(elOption.id);
 
 	                if (!el) {
 	                    continue;
@@ -55502,10 +56759,10 @@
 	         */
 	        _clear: function () {
 	            var elMap = this._elMap;
-	            zrUtil.each(elMap, function (el) {
+	            elMap.each(function (el) {
 	                removeEl(el, elMap);
 	            });
-	            this._elMap = {};
+	            this._elMap = zrUtil.createHashMap();
 	        },
 
 	        /**
@@ -55531,7 +56788,7 @@
 
 	        var el = new Clz(elOption);
 	        targetElParent.add(el);
-	        elMap[id] = el;
+	        elMap.set(id, el);
 	        el.__ecGraphicId = id;
 	    }
 
@@ -55541,7 +56798,7 @@
 	            existEl.type === 'group' && existEl.traverse(function (el) {
 	                removeEl(el, elMap);
 	            });
-	            delete elMap[existEl.__ecGraphicId];
+	            elMap.removeKey(existEl.__ecGraphicId);
 	            existElParent.remove(existEl);
 	        }
 	    }
@@ -55646,12 +56903,12 @@
 
 
 /***/ },
-/* 313 */
+/* 319 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 	    __webpack_require__(303);
 
@@ -55660,7 +56917,7 @@
 
 
 /***/ },
-/* 314 */
+/* 320 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -55668,17 +56925,17 @@
 	 */
 
 
-	    __webpack_require__(315);
-	    __webpack_require__(316);
-	    __webpack_require__(317);
+	    __webpack_require__(321);
+	    __webpack_require__(322);
+	    __webpack_require__(323);
 
 	    var echarts = __webpack_require__(1);
 	    // Series Filter
-	    echarts.registerProcessor(__webpack_require__(319));
+	    echarts.registerProcessor(__webpack_require__(325));
 
 
 /***/ },
-/* 315 */
+/* 321 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -55875,7 +57132,7 @@
 
 
 /***/ },
-/* 316 */
+/* 322 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -55911,7 +57168,7 @@
 	                    return;
 	                }
 	                var isItemSelected = legendModel.isSelected(name);
-	                if (name in selectedMap) {
+	                if (selectedMap.hasOwnProperty(name)) {
 	                    // Unselected if any legend is unselected
 	                    selectedMap[name] = selectedMap[name] && isItemSelected;
 	                }
@@ -55962,15 +57219,15 @@
 
 
 /***/ },
-/* 317 */
+/* 323 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var symbolCreator = __webpack_require__(104);
-	    var graphic = __webpack_require__(44);
-	    var listComponentHelper = __webpack_require__(318);
+	    var symbolCreator = __webpack_require__(111);
+	    var graphic = __webpack_require__(18);
+	    var listComponentHelper = __webpack_require__(324);
 
 	    var curry = zrUtil.curry;
 
@@ -56030,7 +57287,7 @@
 	                    ? 'right' : 'left';
 	            }
 
-	            var legendDrawedMap = {};
+	            var legendDrawedMap = zrUtil.createHashMap();
 
 	            zrUtil.each(legendModel.getData(), function (itemModel) {
 	                var name = itemModel.get('name');
@@ -56045,7 +57302,7 @@
 
 	                var seriesModel = ecModel.getSeriesByName(name)[0];
 
-	                if (legendDrawedMap[name]) {
+	                if (legendDrawedMap.get(name)) {
 	                    // Have been drawed
 	                    return;
 	                }
@@ -56076,13 +57333,13 @@
 	                        .on('mouseover', curry(dispatchHighlightAction, seriesModel, null, api))
 	                        .on('mouseout', curry(dispatchDownplayAction, seriesModel, null, api));
 
-	                    legendDrawedMap[name] = true;
+	                    legendDrawedMap.set(name, true);
 	                }
 	                else {
 	                    // Data legend of pie, funnel
 	                    ecModel.eachRawSeries(function (seriesModel) {
 	                        // In case multiple series has same data name
-	                        if (legendDrawedMap[name]) {
+	                        if (legendDrawedMap.get(name)) {
 	                            return;
 	                        }
 	                        if (seriesModel.legendDataProvider) {
@@ -56108,13 +57365,13 @@
 	                                .on('mouseover', curry(dispatchHighlightAction, seriesModel, name, api))
 	                                .on('mouseout', curry(dispatchDownplayAction, seriesModel, name, api));
 
-	                            legendDrawedMap[name] = true;
+	                            legendDrawedMap.set(name, true);
 	                        }
 	                    }, this);
 	                }
 
 	                if (true) {
-	                    if (!legendDrawedMap[name]) {
+	                    if (!legendDrawedMap.get(name)) {
 	                        console.warn(name + ' series not exists. Legend data should be same with series name or data name.');
 	                    }
 	                }
@@ -56232,14 +57489,14 @@
 
 
 /***/ },
-/* 318 */
+/* 324 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 	    // List layout
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var formatUtil = __webpack_require__(6);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 
 	    function positionGroup(group, model, api) {
 	        layout.positionElement(
@@ -56302,7 +57559,7 @@
 
 
 /***/ },
-/* 319 */
+/* 325 */
 /***/ function(module, exports) {
 
 	
@@ -56326,7 +57583,7 @@
 
 
 /***/ },
-/* 320 */
+/* 326 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// FIXME Better way to pack data in graphic element
@@ -56334,9 +57591,9 @@
 
 	    __webpack_require__(297);
 
-	    __webpack_require__(321);
+	    __webpack_require__(327);
 
-	    __webpack_require__(322);
+	    __webpack_require__(328);
 
 
 	    // Show tip action
@@ -56370,7 +57627,7 @@
 
 
 /***/ },
-/* 321 */
+/* 327 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -56480,22 +57737,22 @@
 
 
 /***/ },
-/* 322 */
+/* 328 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var TooltipContent = __webpack_require__(323);
+	    var TooltipContent = __webpack_require__(329);
 	    var zrUtil = __webpack_require__(4);
 	    var formatUtil = __webpack_require__(6);
 	    var numberUtil = __webpack_require__(7);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var findPointFromSeries = __webpack_require__(299);
-	    var layoutUtil = __webpack_require__(21);
+	    var layoutUtil = __webpack_require__(71);
 	    var env = __webpack_require__(2);
 	    var Model = __webpack_require__(12);
 	    var globalListener = __webpack_require__(302);
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 	    var axisPointerViewHelper = __webpack_require__(305);
 
 	    var bind = zrUtil.bind;
@@ -57098,13 +58355,13 @@
 	            var contentNotChanged = !!lastCoordSys
 	                && lastCoordSys.length === dataByCoordSys.length;
 
-	            each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) {
+	            contentNotChanged && each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) {
 	                var lastDataByAxis = lastItemCoordSys.dataByAxis || {};
 	                var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {};
 	                var thisDataByAxis = thisItemCoordSys.dataByAxis || [];
 	                contentNotChanged &= lastDataByAxis.length === thisDataByAxis.length;
 
-	                each(lastDataByAxis, function (lastItem, indexAxis) {
+	                contentNotChanged && each(lastDataByAxis, function (lastItem, indexAxis) {
 	                    var thisItem = thisDataByAxis[indexAxis] || {};
 	                    var lastIndices = lastItem.seriesDataIndices || [];
 	                    var newIndices = thisItem.seriesDataIndices || [];
@@ -57115,7 +58372,7 @@
 	                        && lastItem.axisId === thisItem.axisId
 	                        && lastIndices.length === newIndices.length;
 
-	                    each(lastIndices, function (lastIdxItem, j) {
+	                    contentNotChanged && each(lastIndices, function (lastIdxItem, j) {
 	                        var newIdxItem = newIndices[j];
 	                        contentNotChanged &=
 	                            lastIdxItem.seriesIndex === newIdxItem.seriesIndex
@@ -57256,7 +58513,7 @@
 
 
 /***/ },
-/* 323 */
+/* 329 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -57265,7 +58522,7 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var zrColor = __webpack_require__(39);
+	    var zrColor = __webpack_require__(31);
 	    var eventUtil = __webpack_require__(88);
 	    var formatUtil = __webpack_require__(6);
 	    var each = zrUtil.each;
@@ -57522,18 +58779,23 @@
 
 
 /***/ },
-/* 324 */
+/* 330 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    __webpack_require__(325);
+	    var zrUtil = __webpack_require__(4);
+
 	    __webpack_require__(331);
-	    __webpack_require__(333);
+	    __webpack_require__(337);
+	    __webpack_require__(339);
 	    __webpack_require__(297);
 
-	    __webpack_require__(335);
+	    __webpack_require__(341);
+
+	    // For reducing size of echarts.min, barLayoutPolar is required by polar.
+	    __webpack_require__(1).registerLayout(zrUtil.curry(__webpack_require__(342), 'bar'));
 
 	    // Polar view
 	    __webpack_require__(1).extendComponentView({
@@ -57542,21 +58804,21 @@
 
 
 /***/ },
-/* 325 */
+/* 331 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// TODO Axis scale
 
 
-	    var Polar = __webpack_require__(326);
+	    var Polar = __webpack_require__(332);
 	    var numberUtil = __webpack_require__(7);
 	    var zrUtil = __webpack_require__(4);
 
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 	    var niceScaleExtent = axisHelper.niceScaleExtent;
 
 	    // 依赖 PolarModel 做预处理
-	    __webpack_require__(329);
+	    __webpack_require__(335);
 
 	    /**
 	     * Resize method bound to the polar
@@ -57689,11 +58951,11 @@
 	        }
 	    };
 
-	    __webpack_require__(26).register('polar', polarCreator);
+	    __webpack_require__(76).register('polar', polarCreator);
 
 
 /***/ },
-/* 326 */
+/* 332 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -57702,8 +58964,8 @@
 	 */
 
 
-	    var RadiusAxis = __webpack_require__(327);
-	    var AngleAxis = __webpack_require__(328);
+	    var RadiusAxis = __webpack_require__(333);
+	    var AngleAxis = __webpack_require__(334);
 
 	    /**
 	     * @alias {module:echarts/coord/polar/Polar}
@@ -57871,7 +59133,7 @@
 	        dataToPoints: function (data) {
 	            return data.mapArray(this.dimensions, function (radius, angle) {
 	                return this.dataToPoint([radius, angle]);
-	            }, this);
+	            }, true, this);
 	        },
 
 	        /**
@@ -57949,13 +59211,14 @@
 
 	            return [x, y];
 	        }
+
 	    };
 
 	    module.exports = Polar;
 
 
 /***/ },
-/* 327 */
+/* 333 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -58001,7 +59264,7 @@
 
 
 /***/ },
-/* 328 */
+/* 334 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -58049,13 +59312,13 @@
 
 
 /***/ },
-/* 329 */
+/* 335 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    __webpack_require__(330);
+	    __webpack_require__(336);
 
 	    __webpack_require__(1).extendComponentModel({
 
@@ -58098,14 +59361,14 @@
 
 
 /***/ },
-/* 330 */
+/* 336 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 	    var axisModelCreator = __webpack_require__(131);
 
 	    var PolarAxisModel = ComponentModel.extend({
@@ -58166,26 +59429,26 @@
 
 
 /***/ },
-/* 331 */
+/* 337 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    __webpack_require__(325);
+	    __webpack_require__(331);
 
-	    __webpack_require__(332);
+	    __webpack_require__(338);
 
 
 /***/ },
-/* 332 */
+/* 338 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Model = __webpack_require__(12);
 
 	    var elementList = ['axisLine', 'axisLabel', 'axisTick', 'splitLine', 'splitArea'];
@@ -58416,25 +59679,25 @@
 
 
 /***/ },
-/* 333 */
+/* 339 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(325);
+	    __webpack_require__(331);
 
-	    __webpack_require__(334);
+	    __webpack_require__(340);
 
 
 /***/ },
-/* 334 */
+/* 340 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var AxisBuilder = __webpack_require__(135);
 
 	    var axisBuilderAttrs = [
@@ -58576,7 +59839,7 @@
 
 
 /***/ },
-/* 335 */
+/* 341 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -58584,7 +59847,7 @@
 
 	    var formatUtil = __webpack_require__(6);
 	    var BaseAxisPointer = __webpack_require__(304);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var viewHelper = __webpack_require__(305);
 	    var matrix = __webpack_require__(11);
 	    var AxisBuilder = __webpack_require__(135);
@@ -58725,16 +59988,308 @@
 
 
 /***/ },
-/* 336 */
+/* 342 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var parsePercent = __webpack_require__(7).parsePercent;
+
+	    function getSeriesStackId(seriesModel) {
+	        return seriesModel.get('stack')
+	            || '__ec_stack_' + seriesModel.seriesIndex;
+	    }
+
+	    function getAxisKey(axis) {
+	        return axis.dim;
+	    }
+
+	    /**
+	     * @param {string} seriesType
+	     * @param {module:echarts/model/Global} ecModel
+	     * @param {module:echarts/ExtensionAPI} api
+	     */
+	    function barLayoutPolar(seriesType, ecModel, api) {
+
+	        var width = api.getWidth();
+	        var height = api.getHeight();
+
+	        var lastStackCoords = {};
+	        var lastStackCoordsOrigin = {};
+
+	        var barWidthAndOffset = calRadialBar(
+	            zrUtil.filter(
+	                ecModel.getSeriesByType(seriesType),
+	                function (seriesModel) {
+	                    return !ecModel.isSeriesFiltered(seriesModel)
+	                        && seriesModel.coordinateSystem
+	                        && seriesModel.coordinateSystem.type === 'polar';
+	                }
+	            )
+	        );
+
+	        ecModel.eachSeriesByType(seriesType, function (seriesModel) {
+	            // Check series coordinate, do layout for polar only
+	            if (seriesModel.coordinateSystem.type !== 'polar') {
+	                return;
+	            }
+
+	            var data = seriesModel.getData();
+	            var polar = seriesModel.coordinateSystem;
+	            var angleAxis = polar.getAngleAxis();
+	            var baseAxis = polar.getBaseAxis();
+
+	            var stackId = getSeriesStackId(seriesModel);
+	            var columnLayoutInfo
+	                = barWidthAndOffset[getAxisKey(baseAxis)][stackId];
+	            var columnOffset = columnLayoutInfo.offset;
+	            var columnWidth = columnLayoutInfo.width;
+	            var valueAxis = polar.getOtherAxis(baseAxis);
+
+	            var center = seriesModel.get('center') || ['50%', '50%'];
+	            var cx = parsePercent(center[0], width);
+	            var cy = parsePercent(center[1], height);
+
+	            var barMinHeight = seriesModel.get('barMinHeight') || 0;
+	            var barMinAngle = seriesModel.get('barMinAngle') || 0;
+
+	            var valueAxisStart = valueAxis.getExtent()[0];
+	            var valueMax = valueAxis.model.get('max');
+	            var valueMin = valueAxis.model.get('min');
+
+	            var coords = polar.dataToPoints(data);
+	            lastStackCoords[stackId] = lastStackCoords[stackId] || [];
+	            lastStackCoordsOrigin[stackId] = lastStackCoordsOrigin[stackId] || []; // Fix #4243
+
+	            data.each(valueAxis.dim, function (value, idx) {
+	                if (isNaN(value)) {
+	                    return;
+	                }
+
+	                if (!lastStackCoords[stackId][idx]) {
+	                    lastStackCoords[stackId][idx] = {
+	                        p: valueAxisStart, // Positive stack
+	                        n: valueAxisStart  // Negative stack
+	                    };
+	                    lastStackCoordsOrigin[stackId][idx] = {
+	                        p: valueAxisStart, // Positive stack
+	                        n: valueAxisStart  // Negative stack
+	                    };
+	                }
+	                var sign = value >= 0 ? 'p' : 'n';
+	                var coord = polar.pointToCoord(coords[idx]);
+
+	                var lastCoordOrigin = lastStackCoordsOrigin[stackId][idx][sign];
+	                var r0;
+	                var r;
+	                var startAngle;
+	                var endAngle;
+
+	                if (valueAxis.dim === 'radius') {
+	                    // radial sector
+	                    r0 = lastCoordOrigin;
+	                    r = coord[0];
+	                    startAngle = (-coord[1] + columnOffset) * Math.PI / 180;
+	                    endAngle = startAngle + columnWidth * Math.PI / 180;
+
+	                    if (Math.abs(r) < barMinHeight) {
+	                        r = r0 + (r < 0 ? -1 : 1) * barMinHeight;
+	                    }
+
+	                    lastStackCoordsOrigin[stackId][idx][sign] = r;
+	                }
+	                else {
+	                    // tangential sector
+	                    r0 = coord[0] + columnOffset;
+	                    r = r0 + columnWidth;
+
+	                    // clamp data if min or max is defined for valueAxis
+	                    if (valueMax != null) {
+	                        value = Math.min(value, valueMax);
+	                    }
+	                    if (valueMin != null) {
+	                        value = Math.max(value, valueMin);
+	                    }
+
+	                    var angle = angleAxis.dataToAngle(value);
+	                    if (Math.abs(angle - lastCoordOrigin) < barMinAngle) {
+	                        angle = lastCoordOrigin - (value < 0 ? -1 : 1)
+	                            * barMinAngle;
+	                    }
+
+	                    startAngle = -lastCoordOrigin * Math.PI / 180;
+	                    endAngle = -angle * Math.PI / 180;
+
+	                    // if the previous stack is at the end of the ring,
+	                    // add a round to differentiate it from origin
+	                    var extent = angleAxis.getExtent();
+	                    var stackCoord = angle;
+	                    if (stackCoord === extent[0] && value > 0) {
+	                        stackCoord = extent[1];
+	                    }
+	                    else if (stackCoord === extent[1] && value < 0) {
+	                        stackCoord = extent[0];
+	                    }
+	                    lastStackCoordsOrigin[stackId][idx][sign] = stackCoord;
+	                }
+
+	                data.setItemLayout(idx, {
+	                    cx: cx,
+	                    cy: cy,
+	                    r0: r0,
+	                    r: r,
+	                    startAngle: startAngle,
+	                    endAngle: endAngle
+	                });
+
+	            }, true);
+
+	        }, this);
+
+	    }
+
+	    /**
+	     * Calculate bar width and offset for radial bar charts
+	     */
+	    function calRadialBar(barSeries, api) {
+	        // Columns info on each category axis. Key is polar name
+	        var columnsMap = {};
+
+	        zrUtil.each(barSeries, function (seriesModel, idx) {
+	            var data = seriesModel.getData();
+	            var polar = seriesModel.coordinateSystem;
+
+	            var baseAxis = polar.getBaseAxis();
+
+	            var axisExtent = baseAxis.getExtent();
+	            var bandWidth = baseAxis.type === 'category'
+	                ? baseAxis.getBandWidth()
+	                : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count());
+
+	            var columnsOnAxis = columnsMap[getAxisKey(baseAxis)] || {
+	                bandWidth: bandWidth,
+	                remainedWidth: bandWidth,
+	                autoWidthCount: 0,
+	                categoryGap: '20%',
+	                gap: '30%',
+	                stacks: {}
+	            };
+	            var stacks = columnsOnAxis.stacks;
+	            columnsMap[getAxisKey(baseAxis)] = columnsOnAxis;
+
+	            var stackId = getSeriesStackId(seriesModel);
+
+	            if (!stacks[stackId]) {
+	                columnsOnAxis.autoWidthCount++;
+	            }
+	            stacks[stackId] = stacks[stackId] || {
+	                width: 0,
+	                maxWidth: 0
+	            };
+
+	            var barWidth = parsePercent(
+	                seriesModel.get('barWidth'),
+	                bandWidth
+	            );
+	            var barMaxWidth = parsePercent(
+	                seriesModel.get('barMaxWidth'),
+	                bandWidth
+	            );
+	            var barGap = seriesModel.get('barGap');
+	            var barCategoryGap = seriesModel.get('barCategoryGap');
+
+	            if (barWidth && !stacks[stackId].width) {
+	                barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);
+	                stacks[stackId].width = barWidth;
+	                columnsOnAxis.remainedWidth -= barWidth;
+	            }
+
+	            barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);
+	            (barGap != null) && (columnsOnAxis.gap = barGap);
+	            (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap);
+	        });
+
+
+	        var result = {};
+
+	        zrUtil.each(columnsMap, function (columnsOnAxis, coordSysName) {
+
+	            result[coordSysName] = {};
+
+	            var stacks = columnsOnAxis.stacks;
+	            var bandWidth = columnsOnAxis.bandWidth;
+	            var categoryGap = parsePercent(columnsOnAxis.categoryGap, bandWidth);
+	            var barGapPercent = parsePercent(columnsOnAxis.gap, 1);
+
+	            var remainedWidth = columnsOnAxis.remainedWidth;
+	            var autoWidthCount = columnsOnAxis.autoWidthCount;
+	            var autoWidth = (remainedWidth - categoryGap)
+	                / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);
+	            autoWidth = Math.max(autoWidth, 0);
+
+	            // Find if any auto calculated bar exceeded maxBarWidth
+	            zrUtil.each(stacks, function (column, stack) {
+	                var maxWidth = column.maxWidth;
+	                if (maxWidth && maxWidth < autoWidth) {
+	                    maxWidth = Math.min(maxWidth, remainedWidth);
+	                    if (column.width) {
+	                        maxWidth = Math.min(maxWidth, column.width);
+	                    }
+	                    remainedWidth -= maxWidth;
+	                    column.width = maxWidth;
+	                    autoWidthCount--;
+	                }
+	            });
+
+	            // Recalculate width again
+	            autoWidth = (remainedWidth - categoryGap)
+	                / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);
+	            autoWidth = Math.max(autoWidth, 0);
+
+	            var widthSum = 0;
+	            var lastColumn;
+	            zrUtil.each(stacks, function (column, idx) {
+	                if (!column.width) {
+	                    column.width = autoWidth;
+	                }
+	                lastColumn = column;
+	                widthSum += column.width * (1 + barGapPercent);
+	            });
+	            if (lastColumn) {
+	                widthSum -= lastColumn.width * barGapPercent;
+	            }
+
+	            var offset = -widthSum / 2;
+	            zrUtil.each(stacks, function (column, stackId) {
+	                result[coordSysName][stackId] = result[coordSysName][stackId] || {
+	                    offset: offset,
+	                    width: column.width
+	                };
+
+	                offset += column.width * (1 + barGapPercent);
+	            });
+	        });
+
+	        return result;
+	    }
+
+	    module.exports = barLayoutPolar;
+
+
+
+/***/ },
+/* 343 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(337);
+	    __webpack_require__(344);
 
 	    __webpack_require__(171);
 
-	    __webpack_require__(338);
+	    __webpack_require__(345);
 
 	    __webpack_require__(186);
 
@@ -58779,13 +60334,13 @@
 
 
 /***/ },
-/* 337 */
+/* 344 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 	    var modelUtil = __webpack_require__(5);
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 	    var Model = __webpack_require__(12);
 	    var zrUtil = __webpack_require__(4);
 
@@ -58819,12 +60374,12 @@
 
 	            option.regions = geoCreator.getFilledRegions(option.regions, option.map);
 
-	            this._optionModelMap = zrUtil.reduce(option.regions || [], function (obj, regionOpt) {
+	            this._optionModelMap = zrUtil.reduce(option.regions || [], function (optionModelMap, regionOpt) {
 	                if (regionOpt.name) {
-	                    obj[regionOpt.name] = new Model(regionOpt, self);
+	                    optionModelMap.set(regionOpt.name, new Model(regionOpt, self));
 	                }
-	                return obj;
-	            }, {});
+	                return optionModelMap;
+	            }, zrUtil.createHashMap());
 
 	            this.updateSelectedMap(option.regions);
 	        },
@@ -58912,7 +60467,7 @@
 	         * @return {module:echarts/model/Model}
 	         */
 	        getRegionModel: function (name) {
-	            return this._optionModelMap[name] || new Model(null, this, this.ecModel);
+	            return this._optionModelMap.get(name) || new Model(null, this, this.ecModel);
 	        },
 
 	        /**
@@ -58952,7 +60507,7 @@
 
 
 /***/ },
-/* 338 */
+/* 345 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -58998,7 +60553,7 @@
 
 
 /***/ },
-/* 339 */
+/* 346 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -59007,20 +60562,20 @@
 
 
 	    __webpack_require__(1).registerPreprocessor(
-	        __webpack_require__(340)
+	        __webpack_require__(347)
 	    );
 
-	    __webpack_require__(341);
-	    __webpack_require__(345);
-	    __webpack_require__(346);
-	    __webpack_require__(347);
-
 	    __webpack_require__(348);
+	    __webpack_require__(352);
+	    __webpack_require__(353);
+	    __webpack_require__(354);
+
+	    __webpack_require__(355);
 
 
 
 /***/ },
-/* 340 */
+/* 347 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -59090,7 +60645,7 @@
 
 
 /***/ },
-/* 341 */
+/* 348 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -59099,12 +60654,12 @@
 
 
 	    var echarts = __webpack_require__(1);
-	    var visualSolution = __webpack_require__(342);
+	    var visualSolution = __webpack_require__(349);
 	    var zrUtil = __webpack_require__(4);
 	    var BoundingRect = __webpack_require__(9);
-	    var selector = __webpack_require__(343);
+	    var selector = __webpack_require__(350);
 	    var throttle = __webpack_require__(81);
-	    var BrushTargetManager = __webpack_require__(344);
+	    var BrushTargetManager = __webpack_require__(351);
 
 	    var STATE_LIST = ['inBrush', 'outOfBrush'];
 	    var DISPATCH_METHOD = '__ecBrushSelect';
@@ -59421,7 +60976,7 @@
 
 
 /***/ },
-/* 342 */
+/* 349 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -59576,7 +61131,7 @@
 
 
 /***/ },
-/* 343 */
+/* 350 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -59708,13 +61263,13 @@
 
 
 /***/ },
-/* 344 */
+/* 351 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var modelUtil = __webpack_require__(5);
 	    var brushHelper = __webpack_require__(245);
 
@@ -59957,7 +61512,7 @@
 	            var yAxisModels = foundCpts.yAxisModels;
 	            var gridModels = foundCpts.gridModels;
 	            // Remove duplicated.
-	            var gridModelMap = {};
+	            var gridModelMap = zrUtil.createHashMap();
 	            var xAxesHas = {};
 	            var yAxesHas = {};
 
@@ -59967,21 +61522,21 @@
 
 	            each(xAxisModels, function (axisModel) {
 	                var gridModel = axisModel.axis.grid.model;
-	                gridModelMap[gridModel.id] = gridModel;
+	                gridModelMap.set(gridModel.id, gridModel);
 	                xAxesHas[gridModel.id] = true;
 	            });
 	            each(yAxisModels, function (axisModel) {
 	                var gridModel = axisModel.axis.grid.model;
-	                gridModelMap[gridModel.id] = gridModel;
+	                gridModelMap.set(gridModel.id, gridModel);
 	                yAxesHas[gridModel.id] = true;
 	            });
 	            each(gridModels, function (gridModel) {
-	                gridModelMap[gridModel.id] = gridModel;
+	                gridModelMap.set(gridModel.id, gridModel);
 	                xAxesHas[gridModel.id] = true;
 	                yAxesHas[gridModel.id] = true;
 	            });
 
-	            each(gridModelMap, function (gridModel) {
+	            gridModelMap.each(function (gridModel) {
 	                var grid = gridModel.coordinateSystem;
 	                var cartesians = [];
 
@@ -60156,7 +61711,7 @@
 
 
 /***/ },
-/* 345 */
+/* 352 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -60166,7 +61721,7 @@
 
 	    var echarts = __webpack_require__(1);
 	    var zrUtil = __webpack_require__(4);
-	    var visualSolution = __webpack_require__(342);
+	    var visualSolution = __webpack_require__(349);
 	    var Model = __webpack_require__(12);
 
 	    var DEFAULT_OUT_OF_BRUSH_COLOR = ['#ddd'];
@@ -60308,7 +61863,7 @@
 
 
 /***/ },
-/* 346 */
+/* 353 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -60413,7 +61968,7 @@
 
 
 /***/ },
-/* 347 */
+/* 354 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -60468,13 +62023,13 @@
 
 
 /***/ },
-/* 348 */
+/* 355 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var featureManager = __webpack_require__(349);
+	    var featureManager = __webpack_require__(356);
 	    var zrUtil = __webpack_require__(4);
 
 	    function Brush(model, ecModel, api) {
@@ -60600,7 +62155,7 @@
 
 
 /***/ },
-/* 349 */
+/* 356 */
 /***/ function(module, exports) {
 
 	'use strict';
@@ -60620,7 +62175,7 @@
 
 
 /***/ },
-/* 350 */
+/* 357 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -60631,21 +62186,21 @@
 
 
 
-	    __webpack_require__(351);
-	    __webpack_require__(352);
-	    __webpack_require__(353);
+	    __webpack_require__(358);
+	    __webpack_require__(359);
+	    __webpack_require__(360);
 
 
 
 
 /***/ },
-/* 351 */
+/* 358 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var numberUtil = __webpack_require__(7);
 	    var zrUtil = __webpack_require__(4);
 
@@ -60678,7 +62233,7 @@
 	            return [{name: 'time', type: 'time'}];
 	        },
 
-	        getHandledRangeInfo: function () {
+	        getRangeInfo: function () {
 	            return this._rangeInfo;
 	        },
 
@@ -60804,18 +62359,20 @@
 	         * Convert a time data(time, value) item to (x, y) point.
 	         *
 	         * @override
-	         * @param  {Array} data  data
-	         * @param  {boolean} noClip  out of range
-	         * @return {Array}       point
+	         * @param  {Array|number} data data
+	         * @param  {boolean} [clamp=true] out of range
+	         * @return {Array} point
 	         */
-	        dataToPoint: function (data, noClip) {
+	        dataToPoint: function (data, clamp) {
+	            zrUtil.isArray(data) && (data = data[0]);
+	            clamp == null && (clamp = true);
 
-	            var dayInfo = this.getDateInfo(data[0]);
+	            var dayInfo = this.getDateInfo(data);
 	            var range = this._rangeInfo;
 	            var date = dayInfo.formatedDate;
 
 	            // if not in range return [NaN, NaN]
-	            if (!noClip && !(dayInfo.time >= range.start.time && dayInfo.time <= range.end.time)) {
+	            if (clamp && !(dayInfo.time >= range.start.time && dayInfo.time <= range.end.time)) {
 	                return [NaN, NaN];
 	            }
 
@@ -60855,12 +62412,11 @@
 	         * Convert a time date item to (x, y) four point.
 	         *
 	         * @param  {Array} data  date[0] is date
-	         * @param  {boolean} noClip  out of range
+	         * @param  {boolean} [clamp=true]  out of range
 	         * @return {Object}       point
 	         */
-	        dataToRect: function (data, noClip) {
-
-	            var point = this.dataToPoint(data, noClip);
+	        dataToRect: function (data, clamp) {
+	            var point = this.dataToPoint(data, clamp);
 
 	            return {
 	                contentShape: {
@@ -60914,16 +62470,12 @@
 	        },
 
 	        /**
-	         * @override
-	         * @implements
-	         * see {module:echarts/CoodinateSystem}
+	         * @inheritDoc
 	         */
 	        convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),
 
 	        /**
-	         * @override
-	         * @implements
-	         * see {module:echarts/CoodinateSystem}
+	         * @inheritDoc
 	         */
 	        convertFromPixel: zrUtil.curry(doConvert, 'pointToData'),
 
@@ -61059,22 +62611,22 @@
 	        return coordSys === this ? coordSys[methodName](value) : null;
 	    }
 
-	    __webpack_require__(26).register('calendar', Calendar);
+	    __webpack_require__(76).register('calendar', Calendar);
 
 	    module.exports = Calendar;
 
 
 
 /***/ },
-/* 352 */
+/* 359 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 	    var zrUtil = __webpack_require__(4);
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 
 	    var CalendarModel = ComponentModel.extend({
 
@@ -61220,14 +62772,14 @@
 
 
 /***/ },
-/* 353 */
+/* 360 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var formatUtil = __webpack_require__(6);
 	    var numberUtil = __webpack_require__(7);
 
@@ -61288,7 +62840,7 @@
 	            var coordSys = calendarModel.coordinateSystem;
 
 	            // range info
-	            var rangeData = coordSys.getHandledRangeInfo();
+	            var rangeData = coordSys.getRangeInfo();
 	            var orient = coordSys.getOrient();
 
 	            this._renderDayRect(calendarModel, rangeData, group);
@@ -61315,7 +62867,7 @@
 	                i = coordSys.getNextNDay(i, 1).time
 	            ) {
 
-	                var point = coordSys.dataToRect([i], true).tl;
+	                var point = coordSys.dataToRect([i], false).tl;
 
 	                // every rect
 	                var rect = new graphic.Rect({
@@ -61370,7 +62922,7 @@
 	            function addPoints(date) {
 
 	                self._firstDayOfMonth.push(coordSys.getDateInfo(date));
-	                self._firstDayPoints.push(coordSys.dataToRect([date], true).tl);
+	                self._firstDayPoints.push(coordSys.dataToRect([date], false).tl);
 
 	                var points = self._getLinePointsOfOneWeek(calendarModel, date, orient);
 
@@ -61426,7 +62978,7 @@
 	            for (var i = 0; i < 7; i++) {
 
 	                var tmpD = coordSys.getNextNDay(date.time, i);
-	                var point = coordSys.dataToRect([tmpD.time], true);
+	                var point = coordSys.dataToRect([tmpD.time], false);
 
 	                points[2 * tmpD.day] = point.tl;
 	                points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr'];
@@ -61704,7 +63256,7 @@
 	            for (var i = 0; i < 7; i++) {
 
 	                var tmpD = coordSys.getNextNDay(start, i);
-	                var point = coordSys.dataToRect([tmpD.time], true).center;
+	                var point = coordSys.dataToRect([tmpD.time], false).center;
 	                var day = i;
 	                day = Math.abs((i + firstDayOfWeek) % 7);
 	                var weekText = new graphic.Text({
@@ -61723,15 +63275,15 @@
 
 
 /***/ },
-/* 354 */
+/* 361 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var echarts = __webpack_require__(1);
-	    var graphic = __webpack_require__(44);
-	    var layout = __webpack_require__(21);
+	    var graphic = __webpack_require__(18);
+	    var layout = __webpack_require__(71);
 
 	    // Model
 	    echarts.extendComponentModel({
@@ -61937,7 +63489,7 @@
 
 
 /***/ },
-/* 355 */
+/* 362 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -61945,29 +63497,29 @@
 	 */
 
 
-	    __webpack_require__(356);
-
-	    __webpack_require__(357);
-	    __webpack_require__(360);
-
-	    __webpack_require__(361);
-	    __webpack_require__(362);
-
 	    __webpack_require__(363);
-	    __webpack_require__(364);
 
-	    __webpack_require__(366);
+	    __webpack_require__(364);
 	    __webpack_require__(367);
 
+	    __webpack_require__(368);
+	    __webpack_require__(369);
+
+	    __webpack_require__(370);
+	    __webpack_require__(371);
+
+	    __webpack_require__(373);
+	    __webpack_require__(374);
+
 
 
 /***/ },
-/* 356 */
+/* 363 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(19).registerSubTypeDefaulter('dataZoom', function (option) {
+	    __webpack_require__(69).registerSubTypeDefaulter('dataZoom', function (option) {
 	        // Default 'slider' when no type specified.
 	        return 'slider';
 	    });
@@ -61975,7 +63527,7 @@
 
 
 /***/ },
-/* 357 */
+/* 364 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -61987,8 +63539,8 @@
 	    var env = __webpack_require__(2);
 	    var echarts = __webpack_require__(1);
 	    var modelUtil = __webpack_require__(5);
-	    var helper = __webpack_require__(358);
-	    var AxisProxy = __webpack_require__(359);
+	    var helper = __webpack_require__(365);
+	    var AxisProxy = __webpack_require__(366);
 	    var each = zrUtil.each;
 	    var eachAxisDim = helper.eachAxisDim;
 
@@ -62010,12 +63562,18 @@
 	            xAxisIndex: null,       // Default the first horizontal category axis.
 	            yAxisIndex: null,       // Default the first vertical category axis.
 
-	            filterMode: 'filter',   // Possible values: 'filter' or 'empty'.
-	                                    // 'filter': data items which are out of window will be removed.
-	                                    //           This option is applicable when filtering outliers.
+	            filterMode: 'filter',   // Possible values: 'filter' or 'empty' or 'weakFilter'.
+	                                    // 'filter': data items which are out of window will be removed. This option is
+	                                    //          applicable when filtering outliers. For each data item, it will be
+	                                    //          filtered if one of the relevant dimensions is out of the window.
+	                                    // 'weakFilter': data items which are out of window will be removed. This option
+	                                    //          is applicable when filtering outliers. For each data item, it will be
+	                                    //          filtered only if all  of the relevant dimensions are out of the same
+	                                    //          side of the window.
 	                                    // 'empty': data items which are out of window will be set to empty.
 	                                    //          This option is applicable when user should not neglect
 	                                    //          that there are some data items out of window.
+	                                    // 'none': Do not filter.
 	                                    // Taking line chart as an example, line will be broken in
 	                                    // the filtered points when filterModel is set to 'empty', but
 	                                    // be connected when set to 'filter'.
@@ -62027,7 +63585,11 @@
 	            start: 0,               // Start percent. 0 ~ 100
 	            end: 100,               // End percent. 0 ~ 100
 	            startValue: null,       // Start value. If startValue specified, start is ignored.
-	            endValue: null          // End value. If endValue specified, end is ignored.
+	            endValue: null,         // End value. If endValue specified, end is ignored.
+	            minSpan: null,          // 0 ~ 100
+	            maxSpan: null,          // 0 ~ 100
+	            minValueSpan: null,     // The range of dataZoom can not be smaller than that.
+	            maxValueSpan: null      // The range of dataZoom can not be larger than that.
 	        },
 
 	        /**
@@ -62449,9 +64011,15 @@
 
 	        /**
 	         * @public
+	         * @param {module:echarts/model/Model} [axisModel] If axisModel given, find axisProxy
+	         *      corresponding to the axisModel
 	         * @return {module:echarts/component/dataZoom/AxisProxy}
 	         */
-	        findRepresentativeAxisProxy: function () {
+	        findRepresentativeAxisProxy: function (axisModel) {
+	            if (axisModel) {
+	                return axisModel.__dzAxisProxy;
+	            }
+
 	            // Find the first hosted axisProxy
 	            var axisProxies = this._axisProxies;
 	            for (var key in axisProxies) {
@@ -62509,7 +64077,7 @@
 
 
 /***/ },
-/* 358 */
+/* 365 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -62647,7 +64215,7 @@
 
 
 /***/ },
-/* 359 */
+/* 366 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -62657,7 +64225,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var numberUtil = __webpack_require__(7);
-	    var helper = __webpack_require__(358);
+	    var helper = __webpack_require__(365);
 	    var each = zrUtil.each;
 	    var asc = numberUtil.asc;
 
@@ -62702,6 +64270,13 @@
 	        this._dataExtent;
 
 	        /**
+	         * {minSpan, maxSpan, minValueSpan, maxValueSpan}
+	         * @private
+	         * @type {Object}
+	         */
+	        this._minMaxSpan;
+
+	        /**
 	         * @readOnly
 	         * @type {module: echarts/model/Global}
 	         */
@@ -62799,6 +64374,10 @@
 	            return foundOtherAxisModel;
 	        },
 
+	        getMinMaxSpan: function () {
+	            return zrUtil.clone(this._minMaxSpan);
+	        },
+
 	        /**
 	         * Only calculate by given range and this._dataExtent, do not change anything.
 	         *
@@ -62893,6 +64472,8 @@
 	            this._valueWindow = dataWindow.valueWindow;
 	            this._percentWindow = dataWindow.percentWindow;
 
+	            setMinMaxSpan(this);
+
 	            // Update axis setting then.
 	            setAxisModel(this);
 	        },
@@ -62922,6 +64503,10 @@
 	            var filterMode = dataZoomModel.get('filterMode');
 	            var valueWindow = this._valueWindow;
 
+	            if (filterMode === 'none') {
+	                return;
+	            }
+
 	            // FIXME
 	            // Toolbox may has dataZoom injected. And if there are stacked bar chart
 	            // with NaN data, NaN will be filtered and stack will be wrong.
@@ -62941,19 +64526,43 @@
 	            // Process series data
 	            each(seriesModels, function (seriesModel) {
 	                var seriesData = seriesModel.getData();
+	                var dataDims = seriesModel.coordDimToDataDim(axisDim);
 
-	                seriesData && each(seriesModel.coordDimToDataDim(axisDim), function (dim) {
-	                    if (filterMode === 'empty') {
-	                        seriesModel.setData(
-	                            seriesData.map(dim, function (value) {
-	                                return !isInWindow(value) ? NaN : value;
-	                            })
-	                        );
-	                    }
-	                    else {
-	                        seriesData.filterSelf(dim, isInWindow);
-	                    }
-	                });
+	                if (filterMode === 'weakFilter') {
+	                    seriesData && seriesData.filterSelf(function (dataIndex) {
+	                        var leftOut;
+	                        var rightOut;
+	                        var hasValue;
+	                        for (var i = 0; i < dataDims.length; i++) {
+	                            var value = seriesData.get(dataDims[i], dataIndex);
+	                            var thisHasValue = !isNaN(value);
+	                            var thisLeftOut = value < valueWindow[0];
+	                            var thisRightOut = value > valueWindow[1];
+	                            if (thisHasValue && !thisLeftOut && !thisRightOut) {
+	                                return true;
+	                            }
+	                            thisHasValue && (hasValue = true);
+	                            thisLeftOut && (leftOut = true);
+	                            thisRightOut && (rightOut = true);
+	                        }
+	                        // If both left out and right out, do not filter.
+	                        return hasValue && leftOut && rightOut;
+	                    });
+	                }
+	                else {
+	                    seriesData && each(dataDims, function (dim) {
+	                        if (filterMode === 'empty') {
+	                            seriesModel.setData(
+	                                seriesData.map(dim, function (value) {
+	                                    return !isInWindow(value) ? NaN : value;
+	                                })
+	                            );
+	                        }
+	                        else {
+	                            seriesData.filterSelf(dim, isInWindow);
+	                        }
+	                    });
+	                }
 	            });
 
 	            function isInWindow(value) {
@@ -63052,17 +64661,39 @@
 	        );
 	    }
 
+	    function setMinMaxSpan(axisProxy) {
+	        var minMaxSpan = axisProxy._minMaxSpan = {};
+	        var dataZoomModel = axisProxy._dataZoomModel;
+
+	        each(['min', 'max'], function (minMax) {
+	            minMaxSpan[minMax + 'Span'] = dataZoomModel.get(minMax + 'Span');
+
+	            // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan
+	            var valueSpan = dataZoomModel.get(minMax + 'ValueSpan');
+	            if (valueSpan != null) {
+	                minMaxSpan[minMax + 'ValueSpan'] = valueSpan;
+
+	                valueSpan = axisProxy.getAxisModel().axis.scale.parse(valueSpan);
+	                if (valueSpan != null) {
+	                    minMaxSpan[minMax + 'Span'] = numberUtil.linearMap(
+	                        valueSpan, axisProxy._dataExtent, [0, 100], true
+	                    );
+	                }
+	            }
+	        });
+	    }
+
 	    module.exports = AxisProxy;
 
 
 
 /***/ },
-/* 360 */
+/* 367 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var ComponentView = __webpack_require__(29);
+	    var ComponentView = __webpack_require__(79);
 
 	    module.exports = ComponentView.extend({
 
@@ -63134,7 +64765,7 @@
 
 
 /***/ },
-/* 361 */
+/* 368 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -63142,7 +64773,7 @@
 	 */
 
 
-	    var DataZoomModel = __webpack_require__(357);
+	    var DataZoomModel = __webpack_require__(364);
 
 	    var SliderZoomModel = DataZoomModel.extend({
 
@@ -63213,19 +64844,19 @@
 
 
 /***/ },
-/* 362 */
+/* 369 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var throttle = __webpack_require__(81);
-	    var DataZoomView = __webpack_require__(360);
+	    var DataZoomView = __webpack_require__(367);
 	    var Rect = graphic.Rect;
 	    var numberUtil = __webpack_require__(7);
 	    var linearMap = numberUtil.linearMap;
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var sliderMove = __webpack_require__(238);
 	    var eventTool = __webpack_require__(88);
 
@@ -63466,11 +65097,12 @@
 	            return [0, this._size[0]];
 	        },
 
-	        _renderBackground : function () {
+	        _renderBackground: function () {
 	            var dataZoomModel = this.dataZoomModel;
 	            var size = this._size;
+	            var barGroup = this._displayables.barGroup;
 
-	            this._displayables.barGroup.add(new Rect({
+	            barGroup.add(new Rect({
 	                silent: true,
 	                shape: {
 	                    x: 0, y: 0, width: size[0], height: size[1]
@@ -63480,6 +65112,18 @@
 	                },
 	                z2: -40
 	            }));
+
+	            // Click panel, over shadow, below handles.
+	            barGroup.add(new Rect({
+	                shape: {
+	                    x: 0, y: 0, width: size[0], height: size[1]
+	                },
+	                style: {
+	                    fill: 'transparent'
+	                },
+	                z2: 0,
+	                onclick: zrUtil.bind(this._onClickPanelClick, this)
+	            }));
 	        },
 
 	        _renderDataShadow: function () {
@@ -63668,7 +65312,7 @@
 
 	            var iconStr = dataZoomModel.get('handleIcon');
 	            each([0, 1], function (handleIndex) {
-	                var path = graphic.makePath(iconStr, {
+	                var iconOpt = {
 	                    style: {
 	                        strokeNoScale: true
 	                    },
@@ -63683,12 +65327,21 @@
 	                    ondragend: bind(this._onDragEnd, this),
 	                    onmouseover: bind(this._showDataInfo, this, true),
 	                    onmouseout: bind(this._showDataInfo, this, false)
-	                }, {
-	                    x: -0.5,
-	                    y: 0,
-	                    width: 1,
-	                    height: 1
-	                }, 'center');
+	                };
+	                var iconStyle = {x: -1, y: 0, width: 2, height: 2};
+
+	                var path = iconStr.indexOf('image://') === 0
+	                    ? (
+	                        iconStyle.image = iconStr.slice(8),
+	                        iconOpt.style = iconStyle,
+	                        new graphic.Image(iconOpt)
+	                    )
+	                    : graphic.makePath(
+	                        iconStr.replace('path://', ''),
+	                        iconOpt,
+	                        iconStyle,
+	                        'center'
+	                    );
 
 	                var bRect = path.getBoundingRect();
 	                this._handleHeight = numberUtil.parsePercent(dataZoomModel.get('handleSize'), this._size[1]);
@@ -63738,25 +65391,29 @@
 	        /**
 	         * @private
 	         * @param {(number|string)} handleIndex 0 or 1 or 'all'
-	         * @param {number} dx
-	         * @param {number} dy
+	         * @param {number} delta
 	         */
 	        _updateInterval: function (handleIndex, delta) {
+	            var dataZoomModel = this.dataZoomModel;
 	            var handleEnds = this._handleEnds;
 	            var viewExtend = this._getViewExtent();
+	            var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();
+	            var percentExtent = [0, 100];
 
 	            sliderMove(
 	                delta,
 	                handleEnds,
 	                viewExtend,
-	                (handleIndex === 'all' || this.dataZoomModel.get('zoomLock'))
-	                    ? 'rigid' : 'cross',
-	                handleIndex
+	                dataZoomModel.get('zoomLock') ? 'all' : handleIndex,
+	                minMaxSpan.minSpan != null
+	                    ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null,
+	                minMaxSpan.maxSpan != null
+	                    ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null
 	            );
 
 	            this._range = asc([
-	                linearMap(handleEnds[0], viewExtend, [0, 100], true),
-	                linearMap(handleEnds[1], viewExtend, [0, 100], true)
+	                linearMap(handleEnds[0], viewExtend, percentExtent, true),
+	                linearMap(handleEnds[1], viewExtend, percentExtent, true)
 	            ]);
 	        },
 
@@ -63774,7 +65431,7 @@
 	                var handle = displaybles.handles[handleIndex];
 	                var handleHeight = this._handleHeight;
 	                handle.attr({
-	                    scale: [handleHeight, handleHeight],
+	                    scale: [handleHeight / 2, handleHeight / 2],
 	                    position: [handleEnds[handleIndex], size[1] / 2 - handleHeight / 2]
 	                });
 	            }, this);
@@ -63900,7 +65557,8 @@
 	            this._dragging = true;
 
 	            // Transform dx, dy to bar coordination.
-	            var vertex = this._applyBarTransform([dx, dy], true);
+	            var barTransform = this._displayables.barGroup.getLocalTransform();
+	            var vertex = graphic.applyTransform([dx, dy], barTransform, true);
 
 	            this._updateInterval(handleIndex, vertex[0]);
 
@@ -63919,6 +65577,24 @@
 	            this._dispatchZoomAction();
 	        },
 
+	        _onClickPanelClick: function (e) {
+	            var size = this._size;
+	            var localPoint = this._displayables.barGroup.transformCoordToLocal(e.offsetX, e.offsetY);
+
+	            if (localPoint[0] < 0 || localPoint[0] > size[0]
+	                || localPoint[1] < 0 || localPoint[1] > size[1]
+	            ) {
+	                return;
+	            }
+
+	            var handleEnds = this._handleEnds;
+	            var center = (handleEnds[0] + handleEnds[1]) / 2;
+
+	            this._updateInterval('all', localPoint[0] - center);
+	            this._updateView();
+	            this._dispatchZoomAction();
+	        },
+
 	        /**
 	         * This action will be throttled.
 	         * @private
@@ -63938,14 +65614,6 @@
 	        /**
 	         * @private
 	         */
-	        _applyBarTransform: function (vertex, inverse) {
-	            var barTransform = this._displayables.barGroup.getLocalTransform();
-	            return graphic.applyTransform(vertex, barTransform, inverse);
-	        },
-
-	        /**
-	         * @private
-	         */
 	        _findCoordRect: function () {
 	            // Find the grid coresponding to the first axis referred by dataZoom.
 	            var rect;
@@ -63983,7 +65651,7 @@
 
 
 /***/ },
-/* 363 */
+/* 370 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -63991,7 +65659,7 @@
 	 */
 
 
-	    module.exports = __webpack_require__(357).extend({
+	    module.exports = __webpack_require__(364).extend({
 
 	        type: 'dataZoom.inside',
 
@@ -64000,21 +65668,24 @@
 	         */
 	        defaultOption: {
 	            disabled: false,   // Whether disable this inside zoom.
-	            zoomLock: false  // Whether disable zoom but only pan.
+	            zoomLock: false,   // Whether disable zoom but only pan.
+	            zoomOnMouseWheel: true, // Can be: true / false / 'shift' / 'ctrl' / 'alt'.
+	            moveOnMouseMove: true,   // Can be: true / false / 'shift' / 'ctrl' / 'alt'.
+	            preventDefaultMouseMove: true
 	        }
 	    });
 
 
 /***/ },
-/* 364 */
+/* 371 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var DataZoomView = __webpack_require__(360);
+	    var DataZoomView = __webpack_require__(367);
 	    var zrUtil = __webpack_require__(4);
 	    var sliderMove = __webpack_require__(238);
-	    var roams = __webpack_require__(365);
+	    var roams = __webpack_require__(372);
 	    var bind = zrUtil.bind;
 
 	    var InsideZoomView = DataZoomView.extend({
@@ -64056,6 +65727,7 @@
 
 	                zrUtil.each(coordInfoList, function (coordInfo) {
 	                    var coordModel = coordInfo.model;
+	                    var dataZoomOption = dataZoomModel.option;
 
 	                    roams.register(
 	                        api,
@@ -64068,7 +65740,14 @@
 	                            dataZoomId: dataZoomModel.id,
 	                            throttleRate: dataZoomModel.get('throttle', true),
 	                            panGetRange: bind(this._onPan, this, coordInfo, coordSysName),
-	                            zoomGetRange: bind(this._onZoom, this, coordInfo, coordSysName)
+	                            zoomGetRange: bind(this._onZoom, this, coordInfo, coordSysName),
+	                            zoomLock: dataZoomOption.zoomLock,
+	                            disabled: dataZoomOption.disabled,
+	                            roamControllerOpt: {
+	                                zoomOnMouseWheel: dataZoomOption.zoomOnMouseWheel,
+	                                moveOnMouseMove: dataZoomOption.moveOnMouseMove,
+	                                preventDefaultMouseMove: dataZoomOption.preventDefaultMouseMove
+	                            }
 	                        }
 	                    );
 	                }, this);
@@ -64089,10 +65768,6 @@
 	         * @private
 	         */
 	        _onPan: function (coordInfo, coordSysName, controller, dx, dy, oldX, oldY, newX, newY) {
-	            if (this.dataZoomModel.option.disabled) {
-	                return this._range;
-	            }
-
 	            var range = this._range.slice();
 
 	            // Calculate transform by the first axis.
@@ -64109,7 +65784,7 @@
 	                * (range[1] - range[0])
 	                * directionInfo.pixel / directionInfo.pixelLength;
 
-	            sliderMove(percentDelta, range, [0, 100], 'rigid');
+	            sliderMove(percentDelta, range, [0, 100], 'all');
 
 	            return (this._range = range);
 	        },
@@ -64118,12 +65793,6 @@
 	         * @private
 	         */
 	        _onZoom: function (coordInfo, coordSysName, controller, scale, mouseX, mouseY) {
-	            var option = this.dataZoomModel.option;
-
-	            if (option.disabled || option.zoomLock) {
-	                return this._range;
-	            }
-
 	            var range = this._range.slice();
 
 	            // Calculate transform by the first axis.
@@ -64142,7 +65811,12 @@
 	            scale = Math.max(1 / scale, 0);
 	            range[0] = (range[0] - percentPoint) * scale + percentPoint;
 	            range[1] = (range[1] - percentPoint) * scale + percentPoint;
-	            return (this._range = fixRange(range));
+
+	            // Restrict range.
+	            var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();
+	            sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan);
+
+	            return (this._range = range);
 	        }
 
 	    });
@@ -64225,24 +65899,11 @@
 	        }
 	    };
 
-	    function fixRange(range) {
-	        // Clamp, using !(<= or >=) to handle NaN.
-	        // jshint ignore:start
-	        var bound = [0, 100];
-	        !(range[0] <= bound[1]) && (range[0] = bound[1]);
-	        !(range[1] <= bound[1]) && (range[1] = bound[1]);
-	        !(range[0] >= bound[0]) && (range[0] = bound[0]);
-	        !(range[1] >= bound[0]) && (range[1] = bound[0]);
-	        // jshint ignore:end
-
-	        return range;
-	    }
-
 	    module.exports = InsideZoomView;
 
 
 /***/ },
-/* 365 */
+/* 372 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -64276,6 +65937,8 @@
 	         * @param {number} dataZoomInfo.throttleRate
 	         * @param {Function} dataZoomInfo.panGetRange
 	         * @param {Function} dataZoomInfo.zoomGetRange
+	         * @param {boolean} [dataZoomInfo.zoomLock]
+	         * @param {boolean} [dataZoomInfo.disabled]
 	         */
 	        register: function (api, dataZoomInfo) {
 	            var store = giveStore(api);
@@ -64304,9 +65967,13 @@
 	                    dataZoomInfos: {},
 	                    count: 0
 	                };
-	                record.controller = createController(api, dataZoomInfo, record);
+	                record.controller = createController(api, record);
 	                record.dispatchAction = zrUtil.curry(dispatchAction, api);
 	            }
+	            record.controller.enable(
+	                dataZoomInfo.disabled ? false : dataZoomInfo.zoomLock ? 'move' : true,
+	                dataZoomInfo.roamControllerOpt
+	            );
 
 	            // Consider resize, area should be always updated.
 	            record.controller.setPointerChecker(dataZoomInfo.containsPoint);
@@ -64377,9 +66044,8 @@
 	        return zr[ATTR] || (zr[ATTR] = {});
 	    }
 
-	    function createController(api, dataZoomInfo, newRecord) {
+	    function createController(api, newRecord) {
 	        var controller = new RoamController(api.getZr());
-	        controller.enable();
 	        controller.on('pan', curry(onPan, newRecord));
 	        controller.on('zoom', curry(onZoom, newRecord));
 
@@ -64437,7 +66103,7 @@
 
 
 /***/ },
-/* 366 */
+/* 373 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -64500,7 +66166,7 @@
 
 
 /***/ },
-/* 367 */
+/* 374 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -64509,7 +66175,7 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var helper = __webpack_require__(358);
+	    var helper = __webpack_require__(365);
 	    var echarts = __webpack_require__(1);
 
 
@@ -64548,7 +66214,7 @@
 
 
 /***/ },
-/* 368 */
+/* 375 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -64556,13 +66222,13 @@
 	 */
 
 
-	    __webpack_require__(369);
-	    __webpack_require__(380);
+	    __webpack_require__(376);
+	    __webpack_require__(387);
 
 
 
 /***/ },
-/* 369 */
+/* 376 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -64571,19 +66237,19 @@
 
 
 	    __webpack_require__(1).registerPreprocessor(
-	        __webpack_require__(370)
+	        __webpack_require__(377)
 	    );
 
-	    __webpack_require__(371);
-	    __webpack_require__(372);
-	    __webpack_require__(373);
-	    __webpack_require__(376);
+	    __webpack_require__(378);
 	    __webpack_require__(379);
+	    __webpack_require__(380);
+	    __webpack_require__(383);
+	    __webpack_require__(386);
 
 
 
 /***/ },
-/* 370 */
+/* 377 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -64635,12 +66301,12 @@
 
 
 /***/ },
-/* 371 */
+/* 378 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(19).registerSubTypeDefaulter('visualMap', function (option) {
+	    __webpack_require__(69).registerSubTypeDefaulter('visualMap', function (option) {
 	        // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used.
 	        return (
 	                !option.categories
@@ -64659,7 +66325,7 @@
 
 
 /***/ },
-/* 372 */
+/* 379 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -64668,7 +66334,7 @@
 
 
 	    var echarts = __webpack_require__(1);
-	    var visualSolution = __webpack_require__(342);
+	    var visualSolution = __webpack_require__(349);
 	    var VisualMapping = __webpack_require__(202);
 	    var zrUtil = __webpack_require__(4);
 
@@ -64749,7 +66415,7 @@
 
 
 /***/ },
-/* 373 */
+/* 380 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -64757,7 +66423,7 @@
 	 */
 
 
-	    var VisualMapModel = __webpack_require__(374);
+	    var VisualMapModel = __webpack_require__(381);
 	    var zrUtil = __webpack_require__(4);
 	    var numberUtil = __webpack_require__(7);
 
@@ -65003,7 +66669,7 @@
 
 
 /***/ },
-/* 374 */
+/* 381 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -65014,9 +66680,9 @@
 	    var echarts = __webpack_require__(1);
 	    var zrUtil = __webpack_require__(4);
 	    var env = __webpack_require__(2);
-	    var visualDefault = __webpack_require__(375);
+	    var visualDefault = __webpack_require__(382);
 	    var VisualMapping = __webpack_require__(202);
-	    var visualSolution = __webpack_require__(342);
+	    var visualSolution = __webpack_require__(349);
 	    var mapVisual = VisualMapping.mapVisual;
 	    var modelUtil = __webpack_require__(5);
 	    var eachVisual = VisualMapping.eachVisual;
@@ -65530,7 +67196,7 @@
 
 
 /***/ },
-/* 375 */
+/* 382 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -65606,18 +67272,18 @@
 
 
 /***/ },
-/* 376 */
+/* 383 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var VisualMapView = __webpack_require__(377);
-	    var graphic = __webpack_require__(44);
+	    var VisualMapView = __webpack_require__(384);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var numberUtil = __webpack_require__(7);
 	    var sliderMove = __webpack_require__(238);
-	    var LinearGradient = __webpack_require__(78);
-	    var helper = __webpack_require__(378);
+	    var LinearGradient = __webpack_require__(65);
+	    var helper = __webpack_require__(385);
 	    var modelUtil = __webpack_require__(5);
 	    var eventTool = __webpack_require__(88);
 
@@ -65966,16 +67632,18 @@
 	            delta = delta || 0;
 	            var visualMapModel = this.visualMapModel;
 	            var handleEnds = this._handleEnds;
+	            var sizeExtent = [0, visualMapModel.itemSize[1]];
 
 	            sliderMove(
 	                delta,
 	                handleEnds,
-	                [0, visualMapModel.itemSize[1]],
-	                handleIndex === 'all' ? 'rigid' : 'push',
-	                handleIndex
+	                sizeExtent,
+	                handleIndex,
+	                // cross is forbiden
+	                0
 	            );
+
 	            var dataExtent = visualMapModel.getExtent();
-	            var sizeExtent = [0, visualMapModel.itemSize[1]];
 	            // Update data interval.
 	            this._dataInterval = [
 	                linearMap(handleEnds[0], sizeExtent, dataExtent, true),
@@ -66454,15 +68122,15 @@
 
 
 /***/ },
-/* 377 */
+/* 384 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var formatUtil = __webpack_require__(6);
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 	    var echarts = __webpack_require__(1);
 	    var VisualMapping = __webpack_require__(202);
 
@@ -66614,13 +68282,13 @@
 
 
 /***/ },
-/* 378 */
+/* 385 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var layout = __webpack_require__(21);
+	    var layout = __webpack_require__(71);
 
 	    var helper = {
 
@@ -66686,7 +68354,7 @@
 
 
 /***/ },
-/* 379 */
+/* 386 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -66714,7 +68382,7 @@
 
 
 /***/ },
-/* 380 */
+/* 387 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -66723,27 +68391,27 @@
 
 
 	    __webpack_require__(1).registerPreprocessor(
-	        __webpack_require__(370)
+	        __webpack_require__(377)
 	    );
 
-	    __webpack_require__(371);
-	    __webpack_require__(372);
-	    __webpack_require__(381);
-	    __webpack_require__(382);
+	    __webpack_require__(378);
 	    __webpack_require__(379);
+	    __webpack_require__(388);
+	    __webpack_require__(389);
+	    __webpack_require__(386);
 
 
 
 /***/ },
-/* 381 */
+/* 388 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var VisualMapModel = __webpack_require__(374);
+	    var VisualMapModel = __webpack_require__(381);
 	    var zrUtil = __webpack_require__(4);
 	    var VisualMapping = __webpack_require__(202);
-	    var visualDefault = __webpack_require__(375);
+	    var visualDefault = __webpack_require__(382);
 	    var reformIntervals = __webpack_require__(7).reformIntervals;
 
 	    var PiecewiseModel = VisualMapModel.extend({
@@ -67268,17 +68936,17 @@
 
 
 /***/ },
-/* 382 */
+/* 389 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var VisualMapView = __webpack_require__(377);
+	    var VisualMapView = __webpack_require__(384);
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
-	    var symbolCreators = __webpack_require__(104);
-	    var layout = __webpack_require__(21);
-	    var helper = __webpack_require__(378);
+	    var graphic = __webpack_require__(18);
+	    var symbolCreators = __webpack_require__(111);
+	    var layout = __webpack_require__(71);
+	    var helper = __webpack_require__(385);
 
 	    var PiecewiseVisualMapView = VisualMapView.extend({
 
@@ -67496,14 +69164,14 @@
 
 
 /***/ },
-/* 383 */
+/* 390 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// HINT Markpoint can't be used too much
 
 
-	    __webpack_require__(384);
-	    __webpack_require__(386);
+	    __webpack_require__(391);
+	    __webpack_require__(393);
 
 	    __webpack_require__(1).registerPreprocessor(function (opt) {
 	        // Make sure markPoint component is enabled
@@ -67512,12 +69180,12 @@
 
 
 /***/ },
-/* 384 */
+/* 391 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    module.exports = __webpack_require__(385).extend({
+	    module.exports = __webpack_require__(392).extend({
 
 	        type: 'markPoint',
 
@@ -67550,7 +69218,7 @@
 
 
 /***/ },
-/* 385 */
+/* 392 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -67688,7 +69356,7 @@
 
 
 /***/ },
-/* 386 */
+/* 393 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -67699,7 +69367,7 @@
 
 	    var List = __webpack_require__(98);
 
-	    var markerHelper = __webpack_require__(387);
+	    var markerHelper = __webpack_require__(394);
 
 	    function updateMarkerLayout(mpData, seriesModel, api) {
 	        var coordSys = seriesModel.coordinateSystem;
@@ -67737,7 +69405,7 @@
 	        });
 	    }
 
-	    __webpack_require__(388).extend({
+	    __webpack_require__(395).extend({
 
 	        type: 'markPoint',
 
@@ -67746,7 +69414,7 @@
 	                var mpModel = seriesModel.markPointModel;
 	                if (mpModel) {
 	                    updateMarkerLayout(mpModel.getData(), seriesModel, api);
-	                    this.markerGroupMap[seriesModel.name].updateLayout(mpModel);
+	                    this.markerGroupMap.get(seriesModel.name).updateLayout(mpModel);
 	                }
 	            }, this);
 	        },
@@ -67757,10 +69425,8 @@
 	            var seriesData = seriesModel.getData();
 
 	            var symbolDrawMap = this.markerGroupMap;
-	            var symbolDraw = symbolDrawMap[seriesName];
-	            if (!symbolDraw) {
-	                symbolDraw = symbolDrawMap[seriesName] = new SymbolDraw();
-	            }
+	            var symbolDraw = symbolDrawMap.get(seriesName)
+	                || symbolDrawMap.set(seriesName, new SymbolDraw());
 
 	            var mpData = createList(coordSys, seriesModel, mpModel);
 
@@ -67849,7 +69515,7 @@
 
 
 /***/ },
-/* 387 */
+/* 394 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -68053,11 +69719,13 @@
 
 
 /***/ },
-/* 388 */
+/* 395 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
+	    var zrUtil = __webpack_require__(4);
+
 	    module.exports = __webpack_require__(1).extendComponentView({
 
 	        type: 'marker',
@@ -68066,18 +69734,16 @@
 	            /**
 	             * Markline grouped by series
 	             * @private
-	             * @type {Object}
+	             * @type {module:zrender/core/util.HashMap}
 	             */
-	            this.markerGroupMap = {};
+	            this.markerGroupMap = zrUtil.createHashMap();
 	        },
 
 	        render: function (markerModel, ecModel, api) {
 	            var markerGroupMap = this.markerGroupMap;
-	            for (var name in markerGroupMap) {
-	                if (markerGroupMap.hasOwnProperty(name)) {
-	                    markerGroupMap[name].__keep = false;
-	                }
-	            }
+	            markerGroupMap.each(function (item) {
+	                item.__keep = false;
+	            });
 
 	            var markerModelKey = this.type + 'Model';
 	            ecModel.eachSeries(function (seriesModel) {
@@ -68085,11 +69751,9 @@
 	                markerModel && this.renderSeries(seriesModel, markerModel, ecModel, api);
 	            }, this);
 
-	            for (var name in markerGroupMap) {
-	                if (markerGroupMap.hasOwnProperty(name) && !markerGroupMap[name].__keep) {
-	                    this.group.remove(markerGroupMap[name].group);
-	                }
-	            }
+	            markerGroupMap.each(function (item) {
+	                !item.__keep && this.group.remove(item.group);
+	            }, this);
 	        },
 
 	        renderSeries: function () {}
@@ -68097,13 +69761,13 @@
 
 
 /***/ },
-/* 389 */
+/* 396 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(390);
-	    __webpack_require__(391);
+	    __webpack_require__(397);
+	    __webpack_require__(398);
 
 	    __webpack_require__(1).registerPreprocessor(function (opt) {
 	        // Make sure markLine component is enabled
@@ -68112,12 +69776,12 @@
 
 
 /***/ },
-/* 390 */
+/* 397 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    module.exports = __webpack_require__(385).extend({
+	    module.exports = __webpack_require__(392).extend({
 
 	        type: 'markLine',
 
@@ -68157,7 +69821,7 @@
 
 
 /***/ },
-/* 391 */
+/* 398 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -68166,7 +69830,7 @@
 	    var List = __webpack_require__(98);
 	    var numberUtil = __webpack_require__(7);
 
-	    var markerHelper = __webpack_require__(387);
+	    var markerHelper = __webpack_require__(394);
 
 	    var LineDraw = __webpack_require__(209);
 
@@ -68338,7 +70002,7 @@
 	        data.setItemLayout(idx, point);
 	    }
 
-	    __webpack_require__(388).extend({
+	    __webpack_require__(395).extend({
 
 	        type: 'markLine',
 
@@ -68362,7 +70026,7 @@
 	                        ]);
 	                    });
 
-	                    this.markerGroupMap[seriesModel.name].updateLayout();
+	                    this.markerGroupMap.get(seriesModel.name).updateLayout();
 
 	                }
 	            }, this);
@@ -68374,10 +70038,8 @@
 	            var seriesData = seriesModel.getData();
 
 	            var lineDrawMap = this.markerGroupMap;
-	            var lineDraw = lineDrawMap[seriesName];
-	            if (!lineDraw) {
-	                lineDraw = lineDrawMap[seriesName] = new LineDraw();
-	            }
+	            var lineDraw = lineDrawMap.get(seriesName)
+	                || lineDrawMap.set(seriesName, new LineDraw());
 	            this.group.add(lineDraw.group);
 
 	            var mlData = createList(coordSys, seriesModel, mlModel);
@@ -68517,13 +70179,13 @@
 
 
 /***/ },
-/* 392 */
+/* 399 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(393);
-	    __webpack_require__(394);
+	    __webpack_require__(400);
+	    __webpack_require__(401);
 
 	    __webpack_require__(1).registerPreprocessor(function (opt) {
 	        // Make sure markArea component is enabled
@@ -68532,12 +70194,12 @@
 
 
 /***/ },
-/* 393 */
+/* 400 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    module.exports = __webpack_require__(385).extend({
+	    module.exports = __webpack_require__(392).extend({
 
 	        type: 'markArea',
 
@@ -68573,7 +70235,7 @@
 
 
 /***/ },
-/* 394 */
+/* 401 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// TODO Better on polar
@@ -68582,10 +70244,10 @@
 	    var zrUtil = __webpack_require__(4);
 	    var List = __webpack_require__(98);
 	    var numberUtil = __webpack_require__(7);
-	    var graphic = __webpack_require__(44);
-	    var colorUtil = __webpack_require__(39);
+	    var graphic = __webpack_require__(18);
+	    var colorUtil = __webpack_require__(31);
 
-	    var markerHelper = __webpack_require__(387);
+	    var markerHelper = __webpack_require__(394);
 
 	    var markAreaTransform = function (seriesModel, coordSys, maModel, item) {
 	        var lt = markerHelper.dataTransform(seriesModel, item[0]);
@@ -68705,7 +70367,7 @@
 
 	    var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']];
 
-	    __webpack_require__(388).extend({
+	    __webpack_require__(395).extend({
 
 	        type: 'markArea',
 
@@ -68733,12 +70395,9 @@
 	            var seriesData = seriesModel.getData();
 
 	            var areaGroupMap = this.markerGroupMap;
-	            var polygonGroup = areaGroupMap[seriesName];
-	            if (!polygonGroup) {
-	                polygonGroup = areaGroupMap[seriesName] = {
-	                    group: new graphic.Group()
-	                };
-	            }
+	            var polygonGroup = areaGroupMap.get(seriesName)
+	                || areaGroupMap.set(seriesName, {group: new graphic.Group()});
+
 	            this.group.add(polygonGroup.group);
 	            polygonGroup.__keep = true;
 
@@ -68895,7 +70554,7 @@
 
 
 /***/ },
-/* 395 */
+/* 402 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -68905,17 +70564,17 @@
 
 	    var echarts = __webpack_require__(1);
 
-	    echarts.registerPreprocessor(__webpack_require__(396));
+	    echarts.registerPreprocessor(__webpack_require__(403));
 
-	    __webpack_require__(397);
-	    __webpack_require__(398);
-	    __webpack_require__(399);
-	    __webpack_require__(401);
+	    __webpack_require__(404);
+	    __webpack_require__(405);
+	    __webpack_require__(406);
+	    __webpack_require__(408);
 
 
 
 /***/ },
-/* 396 */
+/* 403 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -69006,12 +70665,12 @@
 
 
 /***/ },
-/* 397 */
+/* 404 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(19).registerSubTypeDefaulter('timeline', function () {
+	    __webpack_require__(69).registerSubTypeDefaulter('timeline', function () {
 	        // Only slider now.
 	        return 'slider';
 	    });
@@ -69019,7 +70678,7 @@
 
 
 /***/ },
-/* 398 */
+/* 405 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -69069,7 +70728,7 @@
 
 
 /***/ },
-/* 399 */
+/* 406 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -69077,7 +70736,7 @@
 	 */
 
 
-	    var TimelineModel = __webpack_require__(400);
+	    var TimelineModel = __webpack_require__(407);
 	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
 
@@ -69185,7 +70844,7 @@
 
 
 /***/ },
-/* 400 */
+/* 407 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -69193,7 +70852,7 @@
 	 */
 
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 	    var List = __webpack_require__(98);
 	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
@@ -69387,7 +71046,7 @@
 
 
 /***/ },
-/* 401 */
+/* 408 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -69396,12 +71055,12 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
-	    var layout = __webpack_require__(21);
-	    var TimelineView = __webpack_require__(402);
-	    var TimelineAxis = __webpack_require__(403);
-	    var symbolUtil = __webpack_require__(104);
-	    var axisHelper = __webpack_require__(105);
+	    var graphic = __webpack_require__(18);
+	    var layout = __webpack_require__(71);
+	    var TimelineView = __webpack_require__(409);
+	    var TimelineAxis = __webpack_require__(410);
+	    var symbolUtil = __webpack_require__(111);
+	    var axisHelper = __webpack_require__(101);
 	    var BoundingRect = __webpack_require__(9);
 	    var matrix = __webpack_require__(11);
 	    var numberUtil = __webpack_require__(7);
@@ -69439,7 +71098,7 @@
 	            this._timer;
 
 	            /**
-	             * @type {module:zrende/Element}
+	             * @type {module:zrender/Element}
 	             */
 	            this._currentPointer;
 
@@ -70105,7 +71764,7 @@
 
 
 /***/ },
-/* 402 */
+/* 409 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -70115,7 +71774,7 @@
 
 	    // var zrUtil = require('zrender/lib/core/util');
 	    // var graphic = require('../../util/graphic');
-	    var ComponentView = __webpack_require__(29);
+	    var ComponentView = __webpack_require__(79);
 
 	    module.exports = ComponentView.extend({
 
@@ -70125,14 +71784,14 @@
 
 
 /***/ },
-/* 403 */
+/* 410 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
 	    var Axis = __webpack_require__(100);
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 
 	    /**
 	     * Extend axis 2d
@@ -70226,28 +71885,28 @@
 
 
 /***/ },
-/* 404 */
+/* 411 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    __webpack_require__(405);
-	    __webpack_require__(406);
+	    __webpack_require__(412);
+	    __webpack_require__(413);
 
-	    __webpack_require__(407);
-	    __webpack_require__(408);
-	    __webpack_require__(409);
-	    __webpack_require__(410);
+	    __webpack_require__(414);
 	    __webpack_require__(415);
+	    __webpack_require__(416);
+	    __webpack_require__(417);
+	    __webpack_require__(422);
 
 
 /***/ },
-/* 405 */
+/* 412 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var featureManager = __webpack_require__(349);
+	    var featureManager = __webpack_require__(356);
 	    var zrUtil = __webpack_require__(4);
 
 	    var ToolboxModel = __webpack_require__(1).extendComponentModel({
@@ -70318,17 +71977,17 @@
 
 
 /***/ },
-/* 406 */
+/* 413 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/* WEBPACK VAR INJECTION */(function(process) {
 
-	    var featureManager = __webpack_require__(349);
+	    var featureManager = __webpack_require__(356);
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Model = __webpack_require__(12);
 	    var DataDiffer = __webpack_require__(99);
-	    var listComponentHelper = __webpack_require__(318);
+	    var listComponentHelper = __webpack_require__(324);
 	    var textContain = __webpack_require__(8);
 
 	    module.exports = __webpack_require__(1).extendComponentView({
@@ -70573,7 +72232,7 @@
 	/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(309)))
 
 /***/ },
-/* 407 */
+/* 414 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -70637,7 +72296,7 @@
 	        }
 	    };
 
-	    __webpack_require__(349).register(
+	    __webpack_require__(356).register(
 	        'saveAsImage', SaveAsImage
 	    );
 
@@ -70645,7 +72304,7 @@
 
 
 /***/ },
-/* 408 */
+/* 415 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -70819,13 +72478,13 @@
 	        ecModel.mergeOption(payload.newOption);
 	    });
 
-	    __webpack_require__(349).register('magicType', MagicType);
+	    __webpack_require__(356).register('magicType', MagicType);
 
 	    module.exports = MagicType;
 
 
 /***/ },
-/* 409 */
+/* 416 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -71272,7 +72931,7 @@
 	        });
 	    }
 
-	    __webpack_require__(349).register('dataView', DataView);
+	    __webpack_require__(356).register('dataView', DataView);
 
 	    __webpack_require__(1).registerAction({
 	        type: 'changeDataView',
@@ -71308,7 +72967,7 @@
 
 
 /***/ },
-/* 410 */
+/* 417 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -71316,13 +72975,14 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var BrushController = __webpack_require__(244);
-	    var BrushTargetManager = __webpack_require__(344);
-	    var history = __webpack_require__(411);
+	    var BrushTargetManager = __webpack_require__(351);
+	    var history = __webpack_require__(418);
+	    var sliderMove = __webpack_require__(238);
 
 	    var each = zrUtil.each;
 
 	    // Use dataZoomSelect
-	    __webpack_require__(412);
+	    __webpack_require__(419);
 
 	    // Spectial component id start with \0ec\0, see echarts/model/Global.js~hasInnerId
 	    var DATA_ZOOM_ID_BASE = '\0_ec_\0toolbox-dataZoom_';
@@ -71435,7 +73095,19 @@
 	        this._dispatchZoomAction(snapshot);
 
 	        function setBatch(dimName, coordSys, minMax) {
-	            var dataZoomModel = findDataZoom(dimName, coordSys.getAxis(dimName).model, ecModel);
+	            var axis = coordSys.getAxis(dimName);
+	            var axisModel = axis.model;
+	            var dataZoomModel = findDataZoom(dimName, axisModel, ecModel);
+
+	            // Restrict range.
+	            var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan();
+	            if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) {
+	                minMax = sliderMove(
+	                    0, minMax.slice(), axis.scale.getExtent(), 0,
+	                    minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan
+	                );
+	            }
+
 	            dataZoomModel && (snapshot[dataZoomModel.id] = {
 	                dataZoomId: dataZoomModel.id,
 	                startValue: minMax[0],
@@ -71528,7 +73200,7 @@
 	    }
 
 
-	    __webpack_require__(349).register('dataZoom', DataZoom);
+	    __webpack_require__(356).register('dataZoom', DataZoom);
 
 
 	    // Create special dataZoom option for select
@@ -71604,7 +73276,7 @@
 
 
 /***/ },
-/* 411 */
+/* 418 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -71718,7 +73390,7 @@
 
 
 /***/ },
-/* 412 */
+/* 419 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -71726,21 +73398,21 @@
 	 */
 
 
-	    __webpack_require__(356);
+	    __webpack_require__(363);
 
-	    __webpack_require__(357);
-	    __webpack_require__(360);
-
-	    __webpack_require__(413);
-	    __webpack_require__(414);
-
-	    __webpack_require__(366);
+	    __webpack_require__(364);
 	    __webpack_require__(367);
 
+	    __webpack_require__(420);
+	    __webpack_require__(421);
+
+	    __webpack_require__(373);
+	    __webpack_require__(374);
+
 
 
 /***/ },
-/* 413 */
+/* 420 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -71748,7 +73420,7 @@
 	 */
 
 
-	    var DataZoomModel = __webpack_require__(357);
+	    var DataZoomModel = __webpack_require__(364);
 
 	    module.exports = DataZoomModel.extend({
 
@@ -71759,12 +73431,12 @@
 
 
 /***/ },
-/* 414 */
+/* 421 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    module.exports = __webpack_require__(360).extend({
+	    module.exports = __webpack_require__(367).extend({
 
 	        type: 'dataZoom.select'
 
@@ -71773,13 +73445,13 @@
 
 
 /***/ },
-/* 415 */
+/* 422 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var history = __webpack_require__(411);
+	    var history = __webpack_require__(418);
 
 	    function Restore(model) {
 	        this.model = model;
@@ -71803,7 +73475,7 @@
 	    };
 
 
-	    __webpack_require__(349).register('restore', Restore);
+	    __webpack_require__(356).register('restore', Restore);
 
 
 	    __webpack_require__(1).registerAction(
@@ -71817,16 +73489,16 @@
 
 
 /***/ },
-/* 416 */
+/* 423 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
-	    __webpack_require__(417);
-	    __webpack_require__(82).registerPainter('vml', __webpack_require__(419));
+	    __webpack_require__(424);
+	    __webpack_require__(82).registerPainter('vml', __webpack_require__(426));
 
 
 /***/ },
-/* 417 */
+/* 424 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// http://www.w3.org/TR/NOTE-VML
@@ -71836,19 +73508,19 @@
 	if (!__webpack_require__(2).canvasSupported) {
 	    var vec2 = __webpack_require__(10);
 	    var BoundingRect = __webpack_require__(9);
-	    var CMD = __webpack_require__(50).CMD;
-	    var colorTool = __webpack_require__(39);
+	    var CMD = __webpack_require__(36).CMD;
+	    var colorTool = __webpack_require__(31);
 	    var textContain = __webpack_require__(8);
-	    var RectText = __webpack_require__(49);
-	    var Displayable = __webpack_require__(47);
-	    var ZImage = __webpack_require__(62);
-	    var Text = __webpack_require__(63);
-	    var Path = __webpack_require__(46);
-	    var PathProxy = __webpack_require__(50);
+	    var RectText = __webpack_require__(35);
+	    var Displayable = __webpack_require__(21);
+	    var ZImage = __webpack_require__(49);
+	    var Text = __webpack_require__(50);
+	    var Path = __webpack_require__(20);
+	    var PathProxy = __webpack_require__(36);
 
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 
-	    var vmlCore = __webpack_require__(418);
+	    var vmlCore = __webpack_require__(425);
 
 	    var round = Math.round;
 	    var sqrt = Math.sqrt;
@@ -72887,7 +74559,7 @@
 
 
 /***/ },
-/* 418 */
+/* 425 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
@@ -72940,7 +74612,7 @@
 
 
 /***/ },
-/* 419 */
+/* 426 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -72951,8 +74623,8 @@
 
 
 
-	    var zrLog = __webpack_require__(41);
-	    var vmlCore = __webpack_require__(418);
+	    var zrLog = __webpack_require__(33);
+	    var vmlCore = __webpack_require__(425);
 
 	    function parseInt10(val) {
 	        return parseInt(val, 10);
diff --git a/dist/echarts.min.js b/dist/echarts.min.js
index 5be79b2..2c85b2c 100644
--- a/dist/echarts.min.js
+++ b/dist/echarts.min.js
@@ -1,4 +1,4 @@
-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(n){if(i[n])return i[n].exports;var o=i[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){t.exports=i(2),i(107),i(101),i(111),i(191),i(330),i(318),i(345),i(292),i(288),i(284),i(325),i(335),i(270),i(275),i(281),i(313),i(305),i(329),i(340),i(207),i(208),i(209),i(232),i(55),i(372),i(369),i(251),i(252),i(360),i(367),i(223),i(197),i(386),i(216),i(215),i(214),i(376),i(224),i(239)},function(t,e){function i(t){if(null==t||"object"!=typeof t)return t;var e=t,n=N.call(t);if("[object Array]"===n){e=[];for(var o=0,a=t.length;o<a;o++)e[o]=i(t[o])}else if(R[n])e=t.constructor.from(t);else if(!z[n]&&!P(t)&&!I(t)){e={};for(var r in t)t.hasOwnProperty(r)&&(e[r]=i(t[r]))}return e}function n(t,e,o){if(!S(e)||!S(t))return o?i(e):t;for(var a in e)if(e.hasOwnProperty(a)){var r=t[a],s=e[a];!S(s)||!S(r)||_(s)||_(r)||I(s)||I(r)||M(s)||M(r)||P(s)||P(r)?!o&&a in t||(t[a]=i(e[a],!0)):n(r,s,o)}return t}function o(t,e){for(var i=t[0],o=1,a=t.length;o<a;o++)i=n(i,t[o],e);return i}function a(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function r(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null==t[n])&&(t[n]=e[n]);return t}function s(){return document.createElement("canvas")}function l(){return E||(E=U.createCanvas().getContext("2d")),E}function u(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i}return-1}function c(t,e){function i(){}var n=t.prototype;i.prototype=e.prototype,t.prototype=new i;for(var o in n)t.prototype[o]=n[o];t.prototype.constructor=t,t.superClass=e}function h(t,e,i){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,r(t,e,i)}function d(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function f(t,e,i){if(t&&e)if(t.forEach&&t.forEach===B)t.forEach(e,i);else if(t.length===+t.length)for(var n=0,o=t.length;n<o;n++)e.call(i,t[n],n,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(i,t[a],a,t)}function p(t,e,i){if(t&&e){if(t.map&&t.map===H)return t.map(e,i);for(var n=[],o=0,a=t.length;o<a;o++)n.push(e.call(i,t[o],o,t));return n}}function g(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===W)return t.reduce(e,i,n);for(var o=0,a=t.length;o<a;o++)i=e.call(n,i,t[o],o,t);return i}}function m(t,e,i){if(t&&e){if(t.filter&&t.filter===G)return t.filter(e,i);for(var n=[],o=0,a=t.length;o<a;o++)e.call(i,t[o],o,t)&&n.push(t[o]);return n}}function v(t,e,i){if(t&&e)for(var n=0,o=t.length;n<o;n++)if(e.call(i,t[n],n,t))return t[n]}function y(t,e){var i=F.call(arguments,2);return function(){return t.apply(e,i.concat(F.call(arguments)))}}function x(t){var e=F.call(arguments,1);return function(){return t.apply(this,e.concat(F.call(arguments)))}}function _(t){return"[object Array]"===N.call(t)}function b(t){return"function"==typeof t}function w(t){return"[object String]"===N.call(t)}function S(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function M(t){return!!z[N.call(t)]}function I(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function T(t){return t!==t}function A(t){for(var e=0,i=arguments.length;e<i;e++)if(null!=arguments[e])return arguments[e]}function C(){return Function.call.apply(F,arguments)}function L(t,e){if(!t)throw new Error(e)}function D(t){t[Z]=!0}function P(t){return t[Z]}function k(t){t&&a(this,t)}function O(){return new k}var E,z={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},R={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},N=Object.prototype.toString,V=Array.prototype,B=V.forEach,G=V.filter,F=V.slice,H=V.map,W=V.reduce,Z="__ec_primitive__",q="_ec_",j=4;k.prototype={constructor:k,get:function(t){return this[q+t]},set:function(t,e){return this[q+t]=e,e},each:function(t,e){void 0!==e&&(t=y(t,e));for(var i in this)this.hasOwnProperty(i)&&t(this[i],i.slice(j))},removeKey:function(t){delete this[t]}};var U={inherits:c,mixin:h,clone:i,merge:n,mergeAll:o,extend:a,defaults:r,getContext:l,createCanvas:s,indexOf:u,slice:C,find:v,isArrayLike:d,each:f,map:p,reduce:g,filter:m,bind:y,curry:x,isArray:_,isString:w,isObject:S,isFunction:b,isBuiltInObject:M,isDom:I,eqNaN:T,retrieve:A,assert:L,setAsPrimitive:D,createHashMap:O,noop:function(){}};t.exports=U},function(t,e,i){function n(t){return function(e,i,n){e=e&&e.toLowerCase(),V.prototype[t].call(this,e,i,n)}}function o(){V.call(this)}function a(t,e,i){function n(t,e){return t.prio-e.prio}i=i||{},"string"==typeof e&&(e=lt[e]),this.id,this.group,this._dom=t;var a=this._zr=z.init(t,{renderer:i.renderer||"canvas",devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height});this._throttledZrFlush=E.throttle(R.bind(a.flush,a),17),this._theme=R.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new T,this._api=b(this),V.call(this),this._messageCenter=new o,this._initEvents(),this.resize=R.bind(this.resize,this),this._pendingActions=[],B(st,n),B(ot,n),a.animation.on("frame",this._onframe,this),R.setAsPrimitive(this)}function r(t,e,i){var n,o=this._model,a=this._coordSysMgr.getCoordinateSystems();e=O.parseFinder(o,e);for(var r=0;r<a.length;r++){var s=a[r];if(s[t]&&null!=(n=s[t](o,e,i)))return n}}function s(t,e,i,n,o){function a(n){n&&n.__alive&&n[e]&&n[e](n.__model,r,t._api,i)}var r=t._model;if(!n)return void G(t._componentsViews.concat(t._chartsViews),a);var s={};s[n+"Id"]=i[n+"Id"],s[n+"Index"]=i[n+"Index"],s[n+"Name"]=i[n+"Name"];var l={mainType:n,query:s};o&&(l.subType=o),r&&r.eachComponent(l,function(e,i){a(t["series"===n?"_chartsMap":"_componentsMap"][e.__viewId])},t)}function l(t,e){var i=t.type,n=t.escapeConnect,o=it[i],a=o.actionInfo,r=(a.update||"update").split(":"),l=r.pop();r=null!=r[0]&&F(r[0]),this[Y]=!0;var u=[t],c=!1;t.batch&&(c=!0,u=R.map(t.batch,function(e){return e=R.defaults(R.extend({},e),t),e.batch=null,e}));var h,d=[],f="highlight"===i||"downplay"===i;G(u,function(t){h=o.action(t,this._model,this._api),h=h||R.extend({},t),h.type=a.event||h.type,d.push(h),f?s(this,l,t,"series"):r&&s(this,l,t,r.main,r.sub)},this),"none"===l||f||r||(this[K]?(tt.prepareAndUpdate.call(this,t),this[K]=!1):tt[l].call(this,t)),h=c?{type:a.event||i,escapeConnect:n,batch:d}:d[0],this[Y]=!1,!e&&this._messageCenter.trigger(h.type,h)}function u(t){for(var e=this._pendingActions;e.length;){var i=e.shift();l.call(this,i,t)}}function c(t){!t&&this.trigger("updated")}function h(t,e,i){var n=this._api;G(this._componentsViews,function(o){var a=o.__model;o[t](a,e,n,i),_(a,o)},this),e.eachSeries(function(o,a){var r=this._chartsMap[o.__viewId];r[t](o,e,n,i),_(o,r),x(o,r)},this),y(this._zr,e),G(rt,function(t){t(e,n)})}function d(t,e){for(var i="component"===t,n=i?this._componentsViews:this._chartsViews,o=i?this._componentsMap:this._chartsMap,a=this._zr,r=0;r<n.length;r++)n[r].__alive=!1;e[i?"eachComponent":"eachSeries"](function(t,r){if(i){if("series"===t)return}else r=t;var s=r.id+"_"+r.type,l=o[s];if(!l){var u=F(r.type),c=i?D.getClass(u.main,u.sub):P.getClass(u.sub);if(!c)return;l=new c,l.init(e,this._api),o[s]=l,n.push(l),a.add(l.group)}r.__viewId=l.__id=s,l.__alive=!0,l.__model=r,l.group.__ecComponentInfo={mainType:r.mainType,index:r.componentIndex}},this);for(var r=0;r<n.length;){var s=n[r];s.__alive?r++:(a.remove(s.group),s.dispose(e,this._api),n.splice(r,1),delete o[s.__id],s.__id=s.group.__ecComponentInfo=null)}}function f(t,e){G(ot,function(i){i.func(t,e)})}function p(t){var e={};t.eachSeries(function(t){var i=t.get("stack"),n=t.getData();if(i&&"list"===n.type){var o=e[i];o&&(n.stackedOn=o),e[i]=n}})}function g(t,e){var i=this._api;G(st,function(n){n.isLayout&&n.func(t,i,e)})}function m(t,e,i){var n=this._api;t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()}),G(st,function(o){(!i||!o.isLayout)&&o.func(t,n,e)})}function v(t,e){var i=this._api;G(this._componentsViews,function(n){var o=n.__model;n.render(o,t,i,e),_(o,n)},this),G(this._chartsViews,function(t){t.__alive=!1},this),t.eachSeries(function(n,o){var a=this._chartsMap[n.__viewId];a.__alive=!0,a.render(n,t,i,e),a.group.silent=!!n.get("silent"),_(n,a),x(n,a)},this),y(this._zr,t),G(this._chartsViews,function(e){e.__alive||e.remove(t,i)},this)}function y(t,e){var i=t.storage,n=0;i.traverse(function(t){t.isGroup||n++}),n>e.get("hoverLayerThreshold")&&!S.node&&i.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function x(t,e){var i=0;e.group.traverse(function(t){"group"===t.type||t.ignore||i++});var n=+t.get("progressive"),o=i>t.get("progressiveThreshold")&&n&&!S.node;o&&e.group.traverse(function(t){t.isGroup||(t.progressive=o?Math.floor(i++/n):-1,o&&t.stopAnimation(!0))});var a=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.setStyle("blend",a)})}function _(t,e){var i=t.get("z"),n=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=n&&(t.zlevel=n))})}function b(t){var e=t._coordSysMgr;return R.extend(new I(t),{getCoordinateSystems:R.bind(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var i=e.__ecComponentInfo;if(null!=i)return t._model.getComponent(i.mainType,i.index);e=e.parent}}})}function w(t){function e(t,e){for(var i=0;i<t.length;i++){var n=t[i];n[a]=e}}var i=0,n=1,o=2,a="__connectUpdateStatus";R.each(nt,function(r,s){t._messageCenter.on(s,function(r){if(ht[t.group]&&t[a]!==i){if(r&&r.escapeConnect)return;var s=t.makeActionFromEvent(r),l=[];R.each(ct,function(e){e!==t&&e.group===t.group&&l.push(e)}),e(l,i),G(l,function(t){t[a]!==n&&t.dispatchAction(s)}),e(l,o)}})})}/*!
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(n){if(i[n])return i[n].exports;var a=i[n]={exports:{},id:n,loaded:!1};return t[n].call(a.exports,a,a.exports,e),a.loaded=!0,a.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){t.exports=i(2),i(108),i(102),i(112),i(191),i(331),i(319),i(346),i(293),i(289),i(285),i(326),i(336),i(270),i(275),i(282),i(314),i(306),i(330),i(341),i(281),i(207),i(208),i(209),i(232),i(55),i(373),i(370),i(251),i(252),i(361),i(368),i(223),i(197),i(387),i(216),i(215),i(214),i(377),i(224),i(239)},function(t,e){function i(t){if(null==t||"object"!=typeof t)return t;var e=t,n=N.call(t);if("[object Array]"===n){e=[];for(var a=0,o=t.length;a<o;a++)e[a]=i(t[a])}else if(R[n])e=t.constructor.from(t);else if(!E[n]&&!P(t)&&!I(t)){e={};for(var r in t)t.hasOwnProperty(r)&&(e[r]=i(t[r]))}return e}function n(t,e,a){if(!S(e)||!S(t))return a?i(e):t;for(var o in e)if(e.hasOwnProperty(o)){var r=t[o],s=e[o];!S(s)||!S(r)||_(s)||_(r)||I(s)||I(r)||M(s)||M(r)||P(s)||P(r)?!a&&o in t||(t[o]=i(e[o],!0)):n(r,s,a)}return t}function a(t,e){for(var i=t[0],a=1,o=t.length;a<o;a++)i=n(i,t[a],e);return i}function o(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function r(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null==t[n])&&(t[n]=e[n]);return t}function s(){return document.createElement("canvas")}function l(){return z||(z=U.createCanvas().getContext("2d")),z}function u(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i}return-1}function c(t,e){function i(){}var n=t.prototype;i.prototype=e.prototype,t.prototype=new i;for(var a in n)t.prototype[a]=n[a];t.prototype.constructor=t,t.superClass=e}function h(t,e,i){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,r(t,e,i)}function d(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function f(t,e,i){if(t&&e)if(t.forEach&&t.forEach===B)t.forEach(e,i);else if(t.length===+t.length)for(var n=0,a=t.length;n<a;n++)e.call(i,t[n],n,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(i,t[o],o,t)}function p(t,e,i){if(t&&e){if(t.map&&t.map===F)return t.map(e,i);for(var n=[],a=0,o=t.length;a<o;a++)n.push(e.call(i,t[a],a,t));return n}}function g(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===W)return t.reduce(e,i,n);for(var a=0,o=t.length;a<o;a++)i=e.call(n,i,t[a],a,t);return i}}function m(t,e,i){if(t&&e){if(t.filter&&t.filter===G)return t.filter(e,i);for(var n=[],a=0,o=t.length;a<o;a++)e.call(i,t[a],a,t)&&n.push(t[a]);return n}}function v(t,e,i){if(t&&e)for(var n=0,a=t.length;n<a;n++)if(e.call(i,t[n],n,t))return t[n]}function y(t,e){var i=H.call(arguments,2);return function(){return t.apply(e,i.concat(H.call(arguments)))}}function x(t){var e=H.call(arguments,1);return function(){return t.apply(this,e.concat(H.call(arguments)))}}function _(t){return"[object Array]"===N.call(t)}function b(t){return"function"==typeof t}function w(t){return"[object String]"===N.call(t)}function S(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function M(t){return!!E[N.call(t)]}function I(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function T(t){return t!==t}function A(t){for(var e=0,i=arguments.length;e<i;e++)if(null!=arguments[e])return arguments[e]}function C(){return Function.call.apply(H,arguments)}function L(t,e){if(!t)throw new Error(e)}function D(t){t[Z]=!0}function P(t){return t[Z]}function k(t){t&&f(t,function(t,e){this.set(e,t)},this)}function O(t){return new k(t)}var z,E={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},R={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},N=Object.prototype.toString,V=Array.prototype,B=V.forEach,G=V.filter,H=V.slice,F=V.map,W=V.reduce,Z="__ec_primitive__",q="_ec_",j=4;k.prototype={constructor:k,get:function(t){return this[q+t]},set:function(t,e){return this[q+t]=e,e},each:function(t,e){void 0!==e&&(t=y(t,e));for(var i in this)this.hasOwnProperty(i)&&t(this[i],i.slice(j))},removeKey:function(t){delete this[t]}};var U={inherits:c,mixin:h,clone:i,merge:n,mergeAll:a,extend:o,defaults:r,getContext:l,createCanvas:s,indexOf:u,slice:C,find:v,isArrayLike:d,each:f,map:p,reduce:g,filter:m,bind:y,curry:x,isArray:_,isString:w,isObject:S,isFunction:b,isBuiltInObject:M,isDom:I,eqNaN:T,retrieve:A,assert:L,setAsPrimitive:D,createHashMap:O,noop:function(){}};t.exports=U},function(t,e,i){function n(t){return function(e,i,n){e=e&&e.toLowerCase(),V.prototype[t].call(this,e,i,n)}}function a(){V.call(this)}function o(t,e,i){function n(t,e){return t.prio-e.prio}i=i||{},"string"==typeof e&&(e=lt[e]),this.id,this.group,this._dom=t;var o=this._zr=E.init(t,{renderer:i.renderer||"canvas",devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height});this._throttledZrFlush=z.throttle(R.bind(o.flush,o),17),this._theme=R.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new T,this._api=b(this),V.call(this),this._messageCenter=new a,this._initEvents(),this.resize=R.bind(this.resize,this),this._pendingActions=[],B(st,n),B(at,n),o.animation.on("frame",this._onframe,this),R.setAsPrimitive(this)}function r(t,e,i){var n,a=this._model,o=this._coordSysMgr.getCoordinateSystems();e=O.parseFinder(a,e);for(var r=0;r<o.length;r++){var s=o[r];if(s[t]&&null!=(n=s[t](a,e,i)))return n}}function s(t,e,i,n,a){function o(n){n&&n.__alive&&n[e]&&n[e](n.__model,r,t._api,i)}var r=t._model;if(!n)return void G(t._componentsViews.concat(t._chartsViews),o);var s={};s[n+"Id"]=i[n+"Id"],s[n+"Index"]=i[n+"Index"],s[n+"Name"]=i[n+"Name"];var l={mainType:n,query:s};a&&(l.subType=a),r&&r.eachComponent(l,function(e,i){o(t["series"===n?"_chartsMap":"_componentsMap"][e.__viewId])},t)}function l(t,e){var i=t.type,n=t.escapeConnect,a=it[i],o=a.actionInfo,r=(o.update||"update").split(":"),l=r.pop();r=null!=r[0]&&H(r[0]),this[Y]=!0;var u=[t],c=!1;t.batch&&(c=!0,u=R.map(t.batch,function(e){return e=R.defaults(R.extend({},e),t),e.batch=null,e}));var h,d=[],f="highlight"===i||"downplay"===i;G(u,function(t){h=a.action(t,this._model,this._api),h=h||R.extend({},t),h.type=o.event||h.type,d.push(h),f?s(this,l,t,"series"):r&&s(this,l,t,r.main,r.sub)},this),"none"===l||f||r||(this[K]?(tt.prepareAndUpdate.call(this,t),this[K]=!1):tt[l].call(this,t)),h=c?{type:o.event||i,escapeConnect:n,batch:d}:d[0],this[Y]=!1,!e&&this._messageCenter.trigger(h.type,h)}function u(t){for(var e=this._pendingActions;e.length;){var i=e.shift();l.call(this,i,t)}}function c(t){!t&&this.trigger("updated")}function h(t,e,i){var n=this._api;G(this._componentsViews,function(a){var o=a.__model;a[t](o,e,n,i),_(o,a)},this),e.eachSeries(function(a,o){var r=this._chartsMap[a.__viewId];r[t](a,e,n,i),_(a,r),x(a,r)},this),y(this._zr,e),G(rt,function(t){t(e,n)})}function d(t,e){for(var i="component"===t,n=i?this._componentsViews:this._chartsViews,a=i?this._componentsMap:this._chartsMap,o=this._zr,r=0;r<n.length;r++)n[r].__alive=!1;e[i?"eachComponent":"eachSeries"](function(t,r){if(i){if("series"===t)return}else r=t;var s="_ec_"+r.id+"_"+r.type,l=a[s];if(!l){var u=H(r.type),c=i?D.getClass(u.main,u.sub):P.getClass(u.sub);if(!c)return;l=new c,l.init(e,this._api),a[s]=l,n.push(l),o.add(l.group)}r.__viewId=l.__id=s,l.__alive=!0,l.__model=r,l.group.__ecComponentInfo={mainType:r.mainType,index:r.componentIndex}},this);for(var r=0;r<n.length;){var s=n[r];s.__alive?r++:(o.remove(s.group),s.dispose(e,this._api),n.splice(r,1),delete a[s.__id],s.__id=s.group.__ecComponentInfo=null)}}function f(t,e){G(at,function(i){i.func(t,e)})}function p(t){var e={};t.eachSeries(function(t){var i=t.get("stack"),n=t.getData();if(i&&"list"===n.type){var a=e[i];e.hasOwnProperty(i)&&a&&(n.stackedOn=a),e[i]=n}})}function g(t,e){var i=this._api;G(st,function(n){n.isLayout&&n.func(t,i,e)})}function m(t,e,i){var n=this._api;t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()}),G(st,function(a){(!i||!a.isLayout)&&a.func(t,n,e)})}function v(t,e){var i=this._api;G(this._componentsViews,function(n){var a=n.__model;n.render(a,t,i,e),_(a,n)},this),G(this._chartsViews,function(t){t.__alive=!1},this),t.eachSeries(function(n,a){var o=this._chartsMap[n.__viewId];o.__alive=!0,o.render(n,t,i,e),o.group.silent=!!n.get("silent"),_(n,o),x(n,o)},this),y(this._zr,t),G(this._chartsViews,function(e){e.__alive||e.remove(t,i)},this)}function y(t,e){var i=t.storage,n=0;i.traverse(function(t){t.isGroup||n++}),n>e.get("hoverLayerThreshold")&&!S.node&&i.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function x(t,e){var i=0;e.group.traverse(function(t){"group"===t.type||t.ignore||i++});var n=+t.get("progressive"),a=i>t.get("progressiveThreshold")&&n&&!S.node;a&&e.group.traverse(function(t){t.isGroup||(t.progressive=a?Math.floor(i++/n):-1,a&&t.stopAnimation(!0))});var o=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.setStyle("blend",o)})}function _(t,e){var i=t.get("z"),n=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=n&&(t.zlevel=n))})}function b(t){var e=t._coordSysMgr;return R.extend(new I(t),{getCoordinateSystems:R.bind(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var i=e.__ecComponentInfo;if(null!=i)return t._model.getComponent(i.mainType,i.index);e=e.parent}}})}function w(t){function e(t,e){for(var i=0;i<t.length;i++){var n=t[i];n[o]=e}}var i=0,n=1,a=2,o="__connectUpdateStatus";R.each(nt,function(r,s){t._messageCenter.on(s,function(r){if(ht[t.group]&&t[o]!==i){if(r&&r.escapeConnect)return;var s=t.makeActionFromEvent(r),l=[];R.each(ct,function(e){e!==t&&e.group===t.group&&l.push(e)}),e(l,i),G(l,function(t){t[o]!==n&&t.dispatchAction(s)}),e(l,a)}})})}/*!
 	 * ECharts, a javascript interactive chart library.
 	 *
 	 * Copyright (c) 2015, Baidu Inc.
@@ -7,11 +7,12 @@
 	 * LICENSE
 	 * https://github.com/ecomfe/echarts/blob/master/LICENSE.txt
 	 */
-var S=i(9),M=i(137),I=i(100),T=i(26),A=i(138),C=i(13),L=i(18),D=i(64),P=i(30),k=i(3),O=i(6),E=i(37),z=i(87),R=i(1),N=i(22),V=i(23),B=i(51),G=R.each,F=C.parseClassType,H=1e3,W=5e3,Z=1e3,q=2e3,j=3e3,U=4e3,X=5e3,Y="__flagInMainProcess",$="__hasGradientOrPatternBg",K="__optionUpdated",J=/^[a-zA-Z0-9_]+$/;o.prototype.on=n("on"),o.prototype.off=n("off"),o.prototype.one=n("one"),R.mixin(o,V);var Q=a.prototype;Q._onframe=function(){if(this[K]){var t=this[K].silent;this[Y]=!0,tt.prepareAndUpdate.call(this),this[Y]=!1,this[K]=!1,u.call(this,t),c.call(this,t)}},Q.getDom=function(){return this._dom},Q.getZr=function(){return this._zr},Q.setOption=function(t,e,i){var n;if(R.isObject(e)&&(i=e.lazyUpdate,n=e.silent,e=e.notMerge),this[Y]=!0,!this._model||e){var o=new A(this._api),a=this._theme,r=this._model=new M(null,null,a,o);r.init(null,null,a,o)}this.__lastOnlyGraphic=!(!t||!t.graphic),R.each(t,function(t,e){"graphic"!==e&&(this.__lastOnlyGraphic=!1)},this),this._model.setOption(t,at,this.__lastOnlyGraphic),i?(this[K]={silent:n},this[Y]=!1):(tt.prepareAndUpdate.call(this),this._zr.flush(),this[K]=!1,this[Y]=!1,u.call(this,n),c.call(this,n))},Q.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},Q.getModel=function(){return this._model},Q.getOption=function(){return this._model&&this._model.getOption()},Q.getWidth=function(){return this._zr.getWidth()},Q.getHeight=function(){return this._zr.getHeight()},Q.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},Q.getRenderedCanvas=function(t){if(S.canvasSupported){t=t||{},t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr,i=e.storage.getDisplayList();return R.each(i,function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},Q.getDataURL=function(t){t=t||{};var e=t.excludeComponents,i=this._model,n=[],o=this;G(e,function(t){i.eachComponent({mainType:t},function(t){var e=o._componentsMap[t.__viewId];e.group.ignore||(n.push(e),e.group.ignore=!0)})});var a=this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return G(n,function(t){t.group.ignore=!1}),a},Q.getConnectedDataURL=function(t){if(S.canvasSupported){var e=this.group,i=Math.min,n=Math.max,o=1/0;if(ht[e]){var a=o,r=o,s=-o,l=-o,u=[],c=t&&t.pixelRatio||1;R.each(ct,function(o,c){if(o.group===e){var h=o.getRenderedCanvas(R.clone(t)),d=o.getDom().getBoundingClientRect();a=i(d.left,a),r=i(d.top,r),s=n(d.right,s),l=n(d.bottom,l),u.push({dom:h,left:d.left,top:d.top})}}),a*=c,r*=c,s*=c,l*=c;var h=s-a,d=l-r,f=R.createCanvas();f.width=h,f.height=d;var p=z.init(f);return G(u,function(t){var e=new k.Image({style:{x:t.left*c-a,y:t.top*c-r,image:t.dom}});p.add(e)}),p.refreshImmediately(),f.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},Q.convertToPixel=R.curry(r,"convertToPixel"),Q.convertFromPixel=R.curry(r,"convertFromPixel"),Q.containPixel=function(t,e){var i,n=this._model;return t=O.parseFinder(n,t),R.each(t,function(t,n){n.indexOf("Models")>=0&&R.each(t,function(t){var o=t.coordinateSystem;if(o&&o.containPoint)i|=!!o.containPoint(e);else if("seriesModels"===n){var a=this._chartsMap[t.__viewId];a&&a.containPoint&&(i|=a.containPoint(e,t))}},this)},this),!!i},Q.getVisual=function(t,e){var i=this._model;t=O.parseFinder(i,t,{defaultMainType:"series"});var n=t.seriesModel,o=n.getData(),a=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?o.indexOfRawIndex(t.dataIndex):null;return null!=a?o.getItemVisual(a,e):o.getVisual(e)},Q.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},Q.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var tt={update:function(t){var e=this._model,i=this._api,n=this._coordSysMgr,o=this._zr;if(e){e.restoreData(),n.create(this._model,this._api),f.call(this,e,i),p.call(this,e),n.update(e,i),m.call(this,e,t),v.call(this,e,t);var a=e.get("backgroundColor")||"transparent",r=o.painter;if(r.isSingleCanvas&&r.isSingleCanvas())o.configLayer(0,{clearColor:a});else{if(!S.canvasSupported){var s=N.parse(a);a=N.stringify(s,"rgb"),0===s[3]&&(a="transparent")}a.colorStops||a.image?(o.configLayer(0,{clearColor:a}),this[$]=!0,this._dom.style.background="transparent"):(this[$]&&o.configLayer(0,{clearColor:null}),this[$]=!1,this._dom.style.background=a)}G(rt,function(t){t(e,i)})}},updateView:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),m.call(this,e,t),h.call(this,"updateView",e,t))},updateVisual:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),m.call(this,e,t,!0),h.call(this,"updateVisual",e,t))},updateLayout:function(t){var e=this._model;e&&(g.call(this,e,t),h.call(this,"updateLayout",e,t))},prepareAndUpdate:function(t){var e=this._model;d.call(this,"component",e),d.call(this,"chart",e),this.__lastOnlyGraphic?(G(this._componentsViews,function(i){var n=i.__model;n&&"graphic"===n.mainType&&(i.render(n,e,this._api,t),_(n,i))},this),this.__lastOnlyGraphic=!1):tt.update.call(this,t)}};Q.resize=function(t){this[Y]=!0,this._zr.resize(t);var e=this._model&&this._model.resetOption("media"),i=e?"prepareAndUpdate":"update";tt[i].call(this),this._loadingFX&&this._loadingFX.resize(),this[Y]=!1;var n=t&&t.silent;u.call(this,n),c.call(this,n)},Q.showLoading=function(t,e){if(R.isObject(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),ut[t]){var i=ut[t](this._api,e),n=this._zr;this._loadingFX=i,n.add(i)}},Q.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},Q.makeActionFromEvent=function(t){var e=R.extend({},t);return e.type=nt[t.type],e},Q.dispatchAction=function(t,e){if(R.isObject(e)||(e={silent:!!e}),it[t.type]){if(this[Y])return void this._pendingActions.push(t);l.call(this,t,e.silent),e.flush?this._zr.flush(!0):e.flush!==!1&&S.browser.weChat&&this._throttledZrFlush(),u.call(this,e.silent),c.call(this,e.silent)}},Q.on=n("on"),Q.off=n("off"),Q.one=n("one");var et=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];Q._initEvents=function(){G(et,function(t){this._zr.on(t,function(e){var i,n=this.getModel(),o=e.target;if("globalout"===t)i={};else if(o&&null!=o.dataIndex){var a=o.dataModel||n.getSeriesByIndex(o.seriesIndex);i=a&&a.getDataParams(o.dataIndex,o.dataType)||{}}else o&&o.eventData&&(i=R.extend({},o.eventData));i&&(i.event=e,i.type=t,this.trigger(t,i))},this)},this),G(nt,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},Q.isDisposed=function(){return this._disposed},Q.clear=function(){this.setOption({series:[]},!0)},Q.dispose=function(){if(!this._disposed){this._disposed=!0;var t=this._api,e=this._model;G(this._componentsViews,function(i){i.dispose(e,t)}),G(this._chartsViews,function(i){i.dispose(e,t)}),this._zr.dispose(),delete ct[this.id]}},R.mixin(a,V);var it={},nt={},ot=[],at=[],rt=[],st=[],lt={},ut={},ct={},ht={},dt=new Date-0,ft=new Date-0,pt="_echarts_instance_",gt={version:"3.5.4",dependencies:{zrender:"3.4.4"}};gt.init=function(t,e,i){var n=new a(t,e,i);return n.id="ec_"+dt++,ct[n.id]=n,t.setAttribute&&t.setAttribute(pt,n.id),w(n),n},gt.connect=function(t){if(R.isArray(t)){var e=t;t=null,R.each(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+ft++,R.each(e,function(e){e.group=t})}return ht[t]=!0,t},gt.disConnect=function(t){ht[t]=!1},gt.disconnect=gt.disConnect,gt.dispose=function(t){R.isDom(t)?t=gt.getInstanceByDom(t):"string"==typeof t&&(t=ct[t]),t instanceof a&&!t.isDisposed()&&t.dispose()},gt.getInstanceByDom=function(t){var e=t.getAttribute(pt);return ct[e]},gt.getInstanceById=function(t){return ct[t]},gt.registerTheme=function(t,e){lt[t]=e},gt.registerPreprocessor=function(t){at.push(t)},gt.registerProcessor=function(t,e){"function"==typeof t&&(e=t,t=H),ot.push({prio:t,func:e})},gt.registerPostUpdate=function(t){rt.push(t)},gt.registerAction=function(t,e,i){"function"==typeof e&&(i=e,e="");var n=R.isObject(t)?t.type:[t,t={event:e}][0];t.event=(t.event||n).toLowerCase(),e=t.event,R.assert(J.test(n)&&J.test(e)),it[n]||(it[n]={action:i,actionInfo:t}),nt[e]=n},gt.registerCoordinateSystem=function(t,e){T.register(t,e)},gt.registerLayout=function(t,e){"function"==typeof t&&(e=t,t=Z),st.push({prio:t,func:e,isLayout:!0})},gt.registerVisual=function(t,e){"function"==typeof t&&(e=t,t=j),st.push({prio:t,func:e})},gt.registerLoading=function(t,e){ut[t]=e},gt.extendComponentModel=function(t){return C.extend(t)},gt.extendComponentView=function(t){return D.extend(t)},gt.extendSeriesModel=function(t){return L.extend(t)},gt.extendChartView=function(t){return P.extend(t)},gt.setCanvasCreator=function(t){R.createCanvas=t},gt.registerVisual(q,i(151)),gt.registerPreprocessor(i(145)),gt.registerLoading("default",i(136)),gt.registerAction({type:"highlight",event:"highlight",update:"highlight"},R.noop),gt.registerAction({type:"downplay",event:"downplay",update:"downplay"},R.noop),gt.zrender=z,gt.List=i(14),gt.Model=i(10),gt.Axis=i(33),gt.graphic=i(3),gt.number=i(4),gt.format=i(7),gt.throttle=E.throttle,gt.matrix=i(19),gt.vector=i(5),gt.color=i(22),gt.util={},G(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){gt.util[t]=R[t]}),gt.helper=i(135),gt.PRIORITY={PROCESSOR:{FILTER:H,STATISTIC:W},VISUAL:{LAYOUT:Z,GLOBAL:q,CHART:j,COMPONENT:U,BRUSH:X}},t.exports=gt},function(t,e,i){"use strict";function n(t){return null!=t&&"none"!=t}function o(t){return"string"==typeof t?_.lift(t,-.1):t}function a(t){if(t.__hoverStlDirty){var e=t.style.stroke,i=t.style.fill,a=t.__hoverStl;a.fill=a.fill||(n(i)?o(i):null),a.stroke=a.stroke||(n(e)?o(e):null);var r={};for(var s in a)a.hasOwnProperty(s)&&(r[s]=t.style[s]);t.__normalStl=r,t.__hoverStlDirty=!1}}function r(t){t.__isHover||(a(t),t.useHoverLayer?t.__zr&&t.__zr.addHover(t,t.__hoverStl):(t.setStyle(t.__hoverStl),t.z2+=1),t.__isHover=!0)}function s(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function l(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&r(t)}):r(t)}function u(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&s(t)}):s(t)}function c(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&a(t)}function h(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&l(this)}function d(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&u(this)}function f(){this.__isEmphasis=!0,l(this)}function p(){this.__isEmphasis=!1,u(this)}function g(t,e,i,n,o,a){"function"==typeof o&&(a=o,o=null);var r=n&&n.isAnimationEnabled();if(r){var s=t?"Update":"",l=n.getShallow("animationDuration"+s),u=n.getShallow("animationEasing"+s),c=n.getShallow("animationDelay"+s);"function"==typeof c&&(c=c(o,n.getAnimationDelayParams?n.getAnimationDelayParams(e,o):null)),"function"==typeof l&&(l=l(o)),l>0?e.animateTo(i,l,c||0,u,a):(e.stopAnimation(),e.attr(i),a&&a())}else e.stopAnimation(),e.attr(i),a&&a()}var m=i(1),v=i(180),y=Math.round,x=i(8),_=i(22),b=i(19),w=i(5),S=i(57),M=i(11),I={};I.Group=i(36),I.Image=i(53),I.Text=i(85),I.Circle=i(171),I.Sector=i(177),I.Ring=i(176),I.Polygon=i(173),I.Polyline=i(174),I.Rect=i(175),I.Line=i(172),I.BezierCurve=i(170),I.Arc=i(169),I.CompoundPath=i(164),I.LinearGradient=i(99),I.RadialGradient=i(165),I.BoundingRect=M,I.extendShape=function(t){return x.extend(t)},I.extendPath=function(t,e){return v.extendFromString(t,e)},I.makePath=function(t,e,i,n){var o=v.createFromString(t,e),a=o.getBoundingRect();if(i){var r=a.width/a.height;if("center"===n){var s,l=i.height*r;l<=i.width?s=i.height:(l=i.width,s=l/r);var u=i.x+i.width/2,c=i.y+i.height/2;i.x=u-l/2,i.y=c-s/2,i.width=l,i.height=s}I.resizePath(o,i)}return o},I.mergePath=v.mergePath,I.resizePath=function(t,e){if(t.applyTransform){var i=t.getBoundingRect(),n=i.calculateTransform(e);t.applyTransform(n)}},I.subPixelOptimizeLine=function(t){var e=I.subPixelOptimize,i=t.shape,n=t.style.lineWidth;return y(2*i.x1)===y(2*i.x2)&&(i.x1=i.x2=e(i.x1,n,!0)),y(2*i.y1)===y(2*i.y2)&&(i.y1=i.y2=e(i.y1,n,!0)),t},I.subPixelOptimizeRect=function(t){var e=I.subPixelOptimize,i=t.shape,n=t.style.lineWidth,o=i.x,a=i.y,r=i.width,s=i.height;return i.x=e(i.x,n,!0),i.y=e(i.y,n,!0),i.width=Math.max(e(o+r,n,!1)-i.x,0===r?0:1),i.height=Math.max(e(a+s,n,!1)-i.y,0===s?0:1),t},I.subPixelOptimize=function(t,e,i){var n=y(2*t);return(n+y(e))%2===0?n/2:(n+(i?1:-1))/2},I.setHoverStyle=function(t,e,i){t.__hoverSilentOnTouch=i&&i.hoverSilentOnTouch,"group"===t.type?t.traverse(function(t){"group"!==t.type&&c(t,e)}):c(t,e),t.on("mouseover",h).on("mouseout",d),t.on("emphasis",f).on("normal",p)},I.setText=function(t,e,i){var n=e.getShallow("position")||"inside",o=e.getShallow("offset"),a=n.indexOf("inside")>=0?"white":i,r=e.getModel("textStyle");m.extend(t,{textDistance:e.getShallow("distance")||5,textFont:r.getFont(),textPosition:n,textOffset:o,textFill:r.getTextColor()||a})},I.updateProps=function(t,e,i,n,o){g(!0,t,e,i,n,o)},I.initProps=function(t,e,i,n,o){g(!1,t,e,i,n,o)},I.getTransform=function(t,e){for(var i=b.identity([]);t&&t!==e;)b.mul(i,t.getLocalTransform(),i),t=t.parent;return i},I.applyTransform=function(t,e,i){return e&&!m.isArrayLike(e)&&(e=S.getLocalTransform(e)),i&&(e=b.invert([],e)),w.applyTransform([],t,e)},I.transformDirection=function(t,e,i){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),o=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-n:"right"===t?n:0,"top"===t?-o:"bottom"===t?o:0];return a=I.applyTransform(a,e,i),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?"bottom":"top"},I.groupTransition=function(t,e,i,n){function o(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}function a(t){var e={position:w.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=m.extend({},t.shape)),e}if(t&&e){var r=o(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=r[t.anid];if(e){var n=a(t);t.attr(a(e)),I.updateProps(t,n,i,t.dataIndex)}}})}},t.exports=I},function(t,e){function i(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function n(t){return Math.floor(Math.log(t)/Math.LN10)}var o={},a=1e-4;o.linearMap=function(t,e,i,n){var o=e[1]-e[0],a=i[1]-i[0];if(0===o)return 0===a?i[0]:(i[0]+i[1])/2;if(n)if(o>0){if(t<=e[0])return i[0];if(t>=e[1])return i[1]}else{if(t>=e[0])return i[0];if(t<=e[1])return i[1]}else{if(t===e[0])return i[0];if(t===e[1])return i[1]}return(t-e[0])/o*a+i[0]},o.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?i(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},o.round=function(t,e,i){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),i?t:+t},o.asc=function(t){return t.sort(function(t,e){return t-e}),t},o.getPrecision=function(t){if(t=+t,isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i},o.getPrecisionSafe=function(t){var e=t.toString(),i=e.indexOf("e");if(i>0){var n=+e.slice(i+1);return n<0?-n:0}var o=e.indexOf(".");return o<0?0:e.length-1-o},o.getPixelPrecision=function(t,e){var i=Math.log,n=Math.LN10,o=Math.floor(i(t[1]-t[0])/n),a=Math.round(i(Math.abs(e[1]-e[0]))/n),r=Math.min(Math.max(-o+a,0),20);return isFinite(r)?r:20},o.MAX_SAFE_INTEGER=9007199254740991,o.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},o.isRadianAroundZero=function(t){return t>-a&&t<a};var r=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;o.getTimezoneOffset=function(){return(new Date).getTimezoneOffset()},o.parseDate=function(t){if(t instanceof Date)return t;if("string"==typeof t){var e=r.exec(t);if(!e)return new Date(NaN);var i=o.getTimezoneOffset(),n=e[8]?"Z"===e[8].toUpperCase()?i:60*+e[8].slice(0,3)+i:0;return new Date((+e[1]),+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0)-n,+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))},o.quantity=function(t){return Math.pow(10,n(t))},o.nice=function(t,e){var i,o=n(t),a=Math.pow(10,o),r=t/a;return i=e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10,t=i*a,o>=-20?+t.toFixed(o<0?-o:0):t},o.reformIntervals=function(t){function e(t,i,n){return t.interval[n]<i.interval[n]||t.interval[n]===i.interval[n]&&(t.close[n]-i.close[n]===(n?-1:1)||!n&&e(t,i,1))}t.sort(function(t,i){return e(t,i,0)?-1:1});for(var i=-(1/0),n=1,o=0;o<t.length;){for(var a=t[o].interval,r=t[o].close,s=0;s<2;s++)a[s]<=i&&(a[s]=i,r[s]=s?1:1-n),i=a[s],n=r[s];a[0]===a[1]&&r[0]*r[1]!==1?t.splice(o,1):o++}return t},o.isNumeric=function(t){return t-parseFloat(t)>=0},t.exports=o},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(t,e){var n=new i(2);return null==t&&(t=0),null==e&&(e=0),n[0]=t,n[1]=e,n},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new i(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,i){return t[0]=e,t[1]=i,t},add:function(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t},scaleAndAdd:function(t,e,i,n){return t[0]=e[0]+i[0]*n,t[1]=e[1]+i[1]*n,t},sub:function(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t},div:function(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t},normalize:function(t,e){var i=n.len(e);return 0===i?(t[0]=0,t[1]=0):(t[0]=e[0]/i,t[1]=e[1]/i),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,i,n){return t[0]=e[0]+n*(i[0]-e[0]),t[1]=e[1]+n*(i[1]-e[1]),t},applyTransform:function(t,e,i){var n=e[0],o=e[1];return t[0]=i[0]*n+i[2]*o+i[4],t[1]=i[1]*n+i[3]*o+i[5],t},min:function(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t},max:function(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t}};n.length=n.len,n.lengthSquare=n.lenSquare,n.dist=n.distance,n.distSquare=n.distanceSquare,t.exports=n},function(t,e,i){function n(t,e){return t&&t.hasOwnProperty(e)}var o=i(7),a=i(4),r=i(10),s=i(1),l=s.each,u=s.isObject,c={};c.normalizeToArray=function(t){return t instanceof Array?t:null==t?[]:[t]},c.defaultEmphasis=function(t,e){if(t){var i=t.emphasis=t.emphasis||{},n=t.normal=t.normal||{};l(e,function(t){var e=s.retrieve(i[t],n[t]);null!=e&&(i[t]=e)})}},c.LABEL_OPTIONS=["position","offset","show","textStyle","distance","formatter"],c.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},c.isDataItemOption=function(t){return u(t)&&!(t instanceof Array)},c.converDataValue=function(t,e){var i=e&&e.type;return"ordinal"===i?t:("time"===i&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+a.parseDate(t)),null==t||""===t?NaN:+t)},c.createDataFormatModel=function(t,e){var i=new r;return s.mixin(i,c.dataFormatMixin),i.seriesIndex=e.seriesIndex,i.name=e.name||"",i.mainType=e.mainType,i.subType=e.subType,i.getData=function(){return t},i},c.dataFormatMixin={getDataParams:function(t,e){var i=this.getData(e),n=this.getRawValue(t,e),o=i.getRawIndex(t),a=i.getName(t,!0),r=i.getRawDataItem(t);return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:this.seriesIndex,seriesId:this.id,seriesName:this.name,name:a,dataIndex:o,data:r,dataType:e,value:n,color:i.getItemVisual(t,"color"),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,i,n){e=e||"normal";var a=this.getData(i),r=a.getItemModel(t),s=this.getDataParams(t,i);null!=n&&s.value instanceof Array&&(s.value=s.value[n]);var l=r.get(["label",e,"formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?o.formatTpl(l,s):void 0},getRawValue:function(t,e){var i=this.getData(e),n=i.getRawDataItem(t);if(null!=n)return!u(n)||n instanceof Array?n:n.value},formatTooltip:s.noop},c.mappingToExists=function(t,e){e=(e||[]).slice();var i=s.map(t||[],function(t,e){return{exist:t}});return l(e,function(t,n){if(u(t)){for(var o=0;o<i.length;o++)if(!i[o].option&&null!=t.id&&i[o].exist.id===t.id+"")return i[o].option=t,void(e[n]=null);for(var o=0;o<i.length;o++){var a=i[o].exist;if(!(i[o].option||null!=a.id&&null!=t.id||null==t.name||c.isIdInner(t)||c.isIdInner(a)||a.name!==t.name+""))return i[o].option=t,void(e[n]=null)}}}),l(e,function(t,e){if(u(t)){for(var n=0;n<i.length;n++){var o=i[n].exist;if(!i[n].option&&!c.isIdInner(o)&&null==t.id){i[n].option=t;break}}n>=i.length&&i.push({option:t})}}),i},c.makeIdAndName=function(t){var e={};l(t,function(t,i){var n=t.exist;n&&(e[n.id]=t)}),l(t,function(t,i){var n=t.option;s.assert(!n||null==n.id||!e[n.id]||e[n.id]===t,"id duplicates: "+(n&&n.id)),n&&null!=n.id&&(e[n.id]=t),!t.keyInfo&&(t.keyInfo={})}),l(t,function(t,i){var n=t.exist,o=t.option,a=t.keyInfo;if(u(o)){if(a.name=null!=o.name?o.name+"":n?n.name:"\0-",n)a.id=n.id;else if(null!=o.id)a.id=o.id+"";else{var r=0;do a.id="\0"+a.name+"\0"+r++;while(e[a.id])}e[a.id]=t}})},c.isIdInner=function(t){return u(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")},c.compressBatches=function(t,e){function i(t,e,i){for(var n=0,o=t.length;n<o;n++)for(var a=t[n].seriesId,r=c.normalizeToArray(t[n].dataIndex),s=i&&i[a],l=0,u=r.length;l<u;l++){var h=r[l];s&&s[h]?s[h]=null:(e[a]||(e[a]={}))[h]=1}}function n(t,e){var i=[];for(var o in t)if(t.hasOwnProperty(o)&&null!=t[o])if(e)i.push(+o);else{var a=n(t[o],!0);a.length&&i.push({seriesId:o,dataIndex:a})}return i}var o={},a={};return i(t||[],o),i(e||[],a,o),[n(o),n(a)]},c.queryDataIndex=function(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?s.isArray(e.dataIndex)?s.map(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?s.isArray(e.name)?s.map(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0},c.makeGetter=function(){var t=0;return function(){var e="\0__ec_prop_getter_"+t++;return function(t){return t[e]||(t[e]={})}}}(),c.parseFinder=function(t,e,i){if(s.isString(e)){var o={};o[e+"Index"]=0,e=o}var a=i&&i.defaultMainType;!a||n(e,a+"Index")||n(e,a+"Id")||n(e,a+"Name")||(e[a+"Index"]=0);var r={};return l(e,function(n,o){var n=e[o];if("dataIndex"===o||"dataIndexInside"===o)return void(r[o]=n);var a=o.match(/^(\w+)(Index|Id|Name)$/)||[],l=a[1],u=(a[2]||"").toLowerCase();if(!(!l||!u||null==n||"index"===u&&"none"===n||i&&i.includeMainTypes&&s.indexOf(i.includeMainTypes,l)<0)){var c={mainType:l};"index"===u&&"all"===n||(c[u]=n);var h=t.queryComponents(c);r[l+"Models"]=h,r[l+"Model"]=h[0]}}),r},t.exports=c},function(t,e,i){var n=i(1),o=i(4),a=i(16),r={};r.addCommas=function(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))},r.toCamelCase=function(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t},r.normalizeCssArray=function(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t};var s=r.encodeHTML=function(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")},l=["a","b","c","d","e","f","g"],u=function(t,e){return"{"+t+(null==e?"":e)+"}"};r.formatTpl=function(t,e,i){n.isArray(e)||(e=[e]);var o=e.length;if(!o)return"";for(var a=e[0].$vars||[],r=0;r<a.length;r++){var c=l[r],h=u(c,0);t=t.replace(u(c),i?s(h):h)}for(var d=0;d<o;d++)for(var f=0;f<a.length;f++){var h=e[d][a[f]];t=t.replace(u(l[f],d),i?s(h):h)}return t},r.formatTplSimple=function(t,e,i){return n.each(e,function(e,n){t=t.replace("{"+n+"}",i?s(e):e)}),t};var c=function(t){return t<10?"0"+t:t};r.formatTime=function(t,e,i){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var n=o.parseDate(e),a=i?"UTC":"",r=n["get"+a+"FullYear"](),s=n["get"+a+"Month"]()+1,l=n["get"+a+"Date"](),u=n["get"+a+"Hours"](),h=n["get"+a+"Minutes"](),d=n["get"+a+"Seconds"]();return t=t.replace("MM",c(s)).toLowerCase().replace("yyyy",r).replace("yy",r%100).replace("dd",c(l)).replace("d",l).replace("hh",c(u)).replace("h",u).replace("mm",c(h)).replace("m",h).replace("ss",c(d)).replace("s",d)},r.capitalFirst=function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},r.truncateText=a.truncateText,t.exports=r},function(t,e,i){function n(t){o.call(this,t),this.path=null}var o=i(38),a=i(1),r=i(27),s=i(161),l=i(71),u=l.prototype.getCanvasPattern,c=Math.abs,h=new r((!0));n.prototype={constructor:n,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var i=this.style,n=this.path||h,o=i.hasStroke(),a=i.hasFill(),r=i.fill,s=i.stroke,l=a&&!!r.colorStops,c=o&&!!s.colorStops,d=a&&!!r.image,f=o&&!!s.image;if(i.bind(t,this,e),this.setTransform(t),this.__dirty){var p;l&&(p=p||this.getBoundingRect(),this._fillGradient=i.getGradient(t,r,p)),c&&(p=p||this.getBoundingRect(),this._strokeGradient=i.getGradient(t,s,p))}l?t.fillStyle=this._fillGradient:d&&(t.fillStyle=u.call(r,t)),c?t.strokeStyle=this._strokeGradient:f&&(t.strokeStyle=u.call(s,t));var g=i.lineDash,m=i.lineDashOffset,v=!!t.setLineDash,y=this.getGlobalScale();n.setScale(y[0],y[1]),this.__dirtyPath||g&&!v&&o?(n.beginPath(t),g&&!v&&(n.setLineDash(g),n.setLineDashOffset(m)),this.buildPath(n,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),a&&n.fill(t),g&&v&&(t.setLineDash(g),t.lineDashOffset=m),o&&n.stroke(t),g&&v&&t.setLineDash([]),this.restoreTransform(t),null!=i.text&&this.drawRectText(t,this.getBoundingRect())},buildPath:function(t,e,i){},createPathProxy:function(){this.path=new r},getBoundingRect:function(){var t=this._rect,e=this.style,i=!t;if(i){var n=this.path;n||(n=this.path=new r),this.__dirtyPath&&(n.beginPath(),this.buildPath(n,this.shape,!1)),t=n.getBoundingRect()}if(this._rect=t,e.hasStroke()){var o=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||i){o.copy(t);var a=e.lineWidth,s=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(a=Math.max(a,this.strokeContainThreshold||4)),s>1e-10&&(o.width+=a/s,o.height+=a/s,o.x-=a/s/2,o.y-=a/s/2)}return o}return t},contain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect(),o=this.style;if(t=i[0],e=i[1],n.contain(t,e)){var a=this.path.data;if(o.hasStroke()){var r=o.lineWidth,l=o.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(o.hasFill()||(r=Math.max(r,this.strokeContainThreshold)),s.containStroke(a,r/l,t,e)))return!0}if(o.hasFill())return s.contain(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):o.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var i=this.shape;if(i){if(a.isObject(t))for(var n in t)t.hasOwnProperty(n)&&(i[n]=t[n]);else i[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&c(t[0]-1)>1e-10&&c(t[3]-1)>1e-10?Math.sqrt(c(t[0]*t[3]-t[2]*t[1])):1}},n.extend=function(t){var e=function(e){n.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var i=t.shape;if(i){this.shape=this.shape||{};var o=this.shape;for(var a in i)!o.hasOwnProperty(a)&&i.hasOwnProperty(a)&&(o[a]=i[a])}t.init&&t.init.call(this,e)};a.inherits(e,n);for(var i in t)"style"!==i&&"shape"!==i&&(e.prototype[i]=t[i]);return e},a.inherits(n,o),t.exports=n},function(t,e){function i(t){var e={},i={},n=t.match(/Firefox\/([\d.]+)/),o=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),a=t.match(/Edge\/([\d.]+)/),r=/micromessenger/i.test(t);return n&&(i.firefox=!0,i.version=n[1]),o&&(i.ie=!0,i.version=o[1]),a&&(i.edge=!0,i.version=a[1]),r&&(i.weChat=!0),{browser:i,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!i.ie&&!i.edge,pointerEventsSupported:"onpointerdown"in window&&(i.edge||i.ie&&i.version>=11)}}var n={};n="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:i(navigator.userAgent),t.exports=n},function(t,e,i){function n(t,e,i){this.parentModel=e,this.ecModel=i,this.option=t}function o(t,e,i){for(var n=0;n<e.length&&(!e[n]||(t=t&&"object"==typeof t?t[e[n]]:null,null!=t));n++);return null==t&&i&&(t=i.get(e)),t}function a(t,e){var i=s.get(t,"getParent");return i?i.call(t,e):t.parentModel}var r=i(1),s=i(15),l=i(9);n.prototype={constructor:n,init:null,mergeOption:function(t){r.merge(this.option,t,!0)},get:function(t,e){return null==t?this.option:o(this.option,this.parsePath(t),!e&&a(this,t))},getShallow:function(t,e){var i=this.option,n=null==i?i:i[t],o=!e&&a(this,t);return null==n&&o&&(n=o.getShallow(t)),n},getModel:function(t,e){var i,r=null==t?this.option:o(this.option,t=this.parsePath(t));return e=e||(i=a(this,t))&&i.getModel(t),new n(r,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){var t=this.constructor;return new t(r.clone(this.option))},setReadOnly:function(t){s.setReadOnly(this,t)},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){s.set(this,"getParent",t)},isAnimationEnabled:function(){if(!l.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},s.enableClassExtend(n);var u=r.mixin;u(n,i(143)),u(n,i(140)),u(n,i(144)),u(n,i(142)),t.exports=n},function(t,e,i){"use strict";function n(t,e,i,n){i<0&&(t+=i,i=-i),n<0&&(e+=n,n=-n),this.x=t,this.y=e,this.width=i,this.height=n}var o=i(5),a=i(19),r=o.applyTransform,s=Math.min,l=Math.max;n.prototype={constructor:n,union:function(t){var e=s(t.x,this.x),i=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-i,this.x=e,this.y=i},applyTransform:function(){var t=[],e=[],i=[],n=[];return function(o){if(o){t[0]=i[0]=this.x,t[1]=n[1]=this.y,e[0]=n[0]=this.x+this.width,e[1]=i[1]=this.y+this.height,r(t,t,o),r(e,e,o),r(i,i,o),r(n,n,o),this.x=s(t[0],e[0],i[0],n[0]),this.y=s(t[1],e[1],i[1],n[1]);var a=l(t[0],e[0],i[0],n[0]),u=l(t[1],e[1],i[1],n[1]);this.width=a-this.x,this.height=u-this.y}}}(),calculateTransform:function(t){var e=this,i=t.width/e.width,n=t.height/e.height,o=a.create();return a.translate(o,o,[-e.x,-e.y]),a.scale(o,o,[i,n]),a.translate(o,o,[t.x,t.y]),o},intersect:function(t){if(!t)return!1;t instanceof n||(t=n.create(t));var e=this,i=e.x,o=e.x+e.width,a=e.y,r=e.y+e.height,s=t.x,l=t.x+t.width,u=t.y,c=t.y+t.height;return!(o<s||l<i||r<u||c<a)},contain:function(t,e){var i=this;return t>=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new n(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},n.create=function(t){return new n(t.x,t.y,t.width,t.height)},t.exports=n},function(t,e,i){"use strict";function n(t,e,i,n,o){var a=0,r=0;null==n&&(n=1/0),null==o&&(o=1/0);var s=0;e.eachChild(function(l,u){var c,h,d=l.position,f=l.getBoundingRect(),p=e.childAt(u+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=f.width+(g?-g.x+f.x:0);c=a+m,c>n||l.newline?(a=0,c=m,r+=s+i,s=f.height):s=Math.max(s,f.height)}else{var v=f.height+(g?-g.y+f.y:0);h=r+v,h>o||l.newline?(a+=s+i,r=0,h=v,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=a,d[1]=r,"horizontal"===t?a=c+i:r=h+i)})}var o=i(1),a=i(11),r=i(4),s=i(7),l=r.parsePercent,u=o.each,c={},h=c.LOCATION_PARAMS=["left","right","top","bottom","width","height"],d=c.HV_NAMES=[["width","left","right"],["height","top","bottom"]];
-c.box=n,c.vbox=o.curry(n,"vertical"),c.hbox=o.curry(n,"horizontal"),c.getAvailableSize=function(t,e,i){var n=e.width,o=e.height,a=l(t.x,n),r=l(t.y,o),u=l(t.x2,n),c=l(t.y2,o);return(isNaN(a)||isNaN(parseFloat(t.x)))&&(a=0),(isNaN(u)||isNaN(parseFloat(t.x2)))&&(u=n),(isNaN(r)||isNaN(parseFloat(t.y)))&&(r=0),(isNaN(c)||isNaN(parseFloat(t.y2)))&&(c=o),i=s.normalizeCssArray(i||0),{width:Math.max(u-a-i[1]-i[3],0),height:Math.max(c-r-i[0]-i[2],0)}},c.getLayoutRect=function(t,e,i){i=s.normalizeCssArray(i||0);var n=e.width,o=e.height,r=l(t.left,n),u=l(t.top,o),c=l(t.right,n),h=l(t.bottom,o),d=l(t.width,n),f=l(t.height,o),p=i[2]+i[0],g=i[1]+i[3],m=t.aspect;switch(isNaN(d)&&(d=n-c-g-r),isNaN(f)&&(f=o-h-p-u),isNaN(d)&&isNaN(f)&&(m>n/o?d=.8*n:f=.8*o),null!=m&&(isNaN(d)&&(d=m*f),isNaN(f)&&(f=d/m)),isNaN(r)&&(r=n-c-d-g),isNaN(u)&&(u=o-h-f-p),t.left||t.right){case"center":r=n/2-d/2-i[3];break;case"right":r=n-d-g}switch(t.top||t.bottom){case"middle":case"center":u=o/2-f/2-i[0];break;case"bottom":u=o-f-p}r=r||0,u=u||0,isNaN(d)&&(d=n-r-(c||0)),isNaN(f)&&(f=o-u-(h||0));var v=new a(r+i[3],u+i[0],d,f);return v.margin=i,v},c.positionElement=function(t,e,i,n,r){var s=!r||!r.hv||r.hv[0],l=!r||!r.hv||r.hv[1],u=r&&r.boundingMode||"all";if(s||l){var h;if("raw"===u)h="group"===t.type?new a(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(h=t.getBoundingRect(),t.needLocalTransform()){var d=t.getLocalTransform();h=h.clone(),h.applyTransform(d)}e=c.getLayoutRect(o.defaults({width:h.width,height:h.height},e),i,n);var f=t.position,p=s?e.x-h.x:0,g=l?e.y-h.y:0;t.attr("position","raw"===u?[p,g]:[f[0]+p,f[1]+g])}},c.sizeCalculable=function(t,e){return null!=t[d[e][0]]||null!=t[d[e][1]]&&null!=t[d[e][2]]},c.mergeLayoutParam=function(t,e,i){function n(i,n){var o={},s=0,c={},h=0,d=2;if(u(i,function(e){c[e]=t[e]}),u(i,function(t){a(e,t)&&(o[t]=c[t]=e[t]),r(o,t)&&s++,r(c,t)&&h++}),l[n])return r(e,i[1])?c[i[2]]=null:r(e,i[2])&&(c[i[1]]=null),c;if(h!==d&&s){if(s>=d)return o;for(var f=0;f<i.length;f++){var p=i[f];if(!a(o,p)&&a(t,p)){o[p]=t[p];break}}return o}return c}function a(t,e){return t.hasOwnProperty(e)}function r(t,e){return null!=t[e]&&"auto"!==t[e]}function s(t,e,i){u(t,function(t){e[t]=i[t]})}!o.isObject(i)&&(i={});var l=i.ignoreSize;!o.isArray(l)&&(l=[l,l]);var c=n(d[0],0),h=n(d[1],1);s(d[0],t,c),s(d[1],t,h)},c.getLayoutParams=function(t){return c.copyLayoutParams({},t)},c.copyLayoutParams=function(t,e){return e&&t&&u(h,function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t},t.exports=c},function(t,e,i){function n(t){var e=[];return a.each(c.getClassesByMainType(t),function(t){r.apply(e,t.prototype.dependencies||[])}),a.map(e,function(t){return l.parseClassType(t).main})}var o=i(10),a=i(1),r=Array.prototype.push,s=i(49),l=i(15),u=i(12),c=o.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,i,n){o.call(this,t,e,i,n),this.uid=s.getUID("componentModel")},init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i)},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,n=i?u.getLayoutParams(t):{},o=e.getTheme();a.merge(t,o.get(this.mainType)),a.merge(t,this.getDefaultOption()),i&&u.mergeLayoutParam(t,n,i)},mergeOption:function(t,e){a.merge(this.option,t,!0);var i=this.layoutMode;i&&u.mergeLayoutParam(this.option,t,i)},optionUpdated:function(t,e){},getDefaultOption:function(){if(!l.hasOwn(this,"__defaultOption")){for(var t=[],e=this.constructor;e;){var i=e.prototype.defaultOption;i&&t.push(i),e=e.superClass}for(var n={},o=t.length-1;o>=0;o--)n=a.merge(n,t[o],!0);l.set(this,"__defaultOption",n)}return l.get(this,"__defaultOption")},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});l.enableClassManagement(c,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(c),s.enableTopologicalTravel(c,n),a.mixin(c,i(141)),t.exports=c},function(t,e,i){(function(e){function n(t){return d.isArray(t)||(t=[t]),t}function o(t,e){var i=t.dimensions,n=new v(d.map(i,t.getDimensionInfo,t),t.hostModel);m(n,t);for(var o=n._storage={},a=t._storage,r=0;r<i.length;r++){var s=i[r],l=a[s];d.indexOf(e,s)>=0?o[s]=new l.constructor(a[s].length):o[s]=a[s]}return n}var a="undefined",r="undefined"==typeof window?e:window,s=typeof r.Float64Array===a?Array:r.Float64Array,l=typeof r.Int32Array===a?Array:r.Int32Array,u={"float":s,"int":l,ordinal:Array,number:Array,time:Array},c=i(10),h=i(48),d=i(1),f=i(6),p=d.isObject,g=["stackedOn","hasItemOption","_nameList","_idList","_rawData"],m=function(t,e){d.each(g.concat(e.__wrappedMethods||[]),function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t.__wrappedMethods=e.__wrappedMethods},v=function(t,e){t=t||["x","y"];for(var i={},n=[],o=0;o<t.length;o++){var a,r={};"string"==typeof t[o]?(a=t[o],r={name:a,stackable:!1,type:"number"}):(r=t[o],a=r.name,r.type=r.type||"number"),n.push(a),i[a]=r}this.dimensions=n,this._dimensionInfos=i,this.hostModel=e,this.dataType,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData,this._extent},y=v.prototype;y.type="list",y.hasItemOption=!0,y.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},y.getDimensionInfo=function(t){return d.clone(this._dimensionInfos[this.getDimension(t)])},y.initData=function(t,e,i){t=t||[],this._rawData=t;var n=this._storage={},o=this.indices=[],a=this.dimensions,r=t.length,s=this._dimensionInfos,l=[],c={};e=e||[];for(var h=0;h<a.length;h++){var d=s[a[h]],p=u[d.type];n[a[h]]=new p(r)}var g=this;i||(g.hasItemOption=!1),i=i||function(t,e,i,n){var o=f.getDataItemValue(t);return f.isDataItemOption(t)&&(g.hasItemOption=!0),f.converDataValue(o instanceof Array?o[n]:o,s[e])};for(var m=0;m<t.length;m++){for(var v=t[m],y=0;y<a.length;y++){var x=a[y],_=n[x];_[m]=i(v,x,m,y)}o.push(m)}for(var h=0;h<t.length;h++){e[h]||t[h]&&null!=t[h].name&&(e[h]=t[h].name);var b=e[h]||"",w=t[h]&&t[h].id;!w&&b&&(c[b]=c[b]||0,w=b,c[b]>0&&(w+="__ec__"+c[b]),c[b]++),w&&(l[h]=w)}this._nameList=e,this._idList=l},y.count=function(){return this.indices.length},y.get=function(t,e,i){var n=this._storage,o=this.indices[e];if(null==o)return NaN;var a=n[t]&&n[t][o];if(i){var r=this._dimensionInfos[t];if(r&&r.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(a>=0&&l>0||a<=0&&l<0)&&(a+=l),s=s.stackedOn}}return a},y.getValues=function(t,e,i){var n=[];d.isArray(t)||(i=e,e=t,t=this.dimensions);for(var o=0,a=t.length;o<a;o++)n.push(this.get(t[o],e,i));return n},y.hasValue=function(t){for(var e=this.dimensions,i=this._dimensionInfos,n=0,o=e.length;n<o;n++)if("ordinal"!==i[e[n]].type&&isNaN(this.get(e[n],t)))return!1;return!0},y.getDataExtent=function(t,e,i){t=this.getDimension(t);var n=this._storage[t],o=this.getDimensionInfo(t);e=o&&o.stackable&&e;var a,r=(this._extent||(this._extent={}))[t+!!e];if(r)return r;if(n){for(var s=1/0,l=-(1/0),u=0,c=this.count();u<c;u++)a=this.get(t,u,e),i&&!i(a,t,u)||(a<s&&(s=a),a>l&&(l=a));return this._extent[t+!!e]=[s,l]}return[1/0,-(1/0)]},y.getSum=function(t,e){var i=this._storage[t],n=0;if(i)for(var o=0,a=this.count();o<a;o++){var r=this.get(t,o,e);isNaN(r)||(n+=r)}return n},y.indexOf=function(t,e){var i=this._storage,n=i[t],o=this.indices;if(n)for(var a=0,r=o.length;a<r;a++){var s=o[a];if(n[s]===e)return a}return-1},y.indexOfName=function(t){for(var e=this.indices,i=this._nameList,n=0,o=e.length;n<o;n++){var a=e[n];if(i[a]===t)return n}return-1},y.indexOfRawIndex=function(t){var e=this.indices,i=e[t];if(null!=i&&i===t)return t;for(var n=0,o=e.length-1;n<=o;){var a=(n+o)/2|0;if(e[a]<t)n=a+1;else{if(!(e[a]>t))return a;o=a-1}}return-1},y.indicesOfNearest=function(t,e,i,n){var o=this._storage,a=o[t],r=[];if(!a)return r;null==n&&(n=1/0);for(var s=Number.MAX_VALUE,l=-1,u=0,c=this.count();u<c;u++){var h=e-this.get(t,u,i),d=Math.abs(h);h<=n&&d<=s&&((d<s||h>=0&&l<0)&&(s=d,l=h,r.length=0),r.push(u))}return r},y.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},y.getRawDataItem=function(t){return this._rawData[this.getRawIndex(t)]},y.getName=function(t){return this._nameList[this.indices[t]]||""},y.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},y.each=function(t,e,i,o){"function"==typeof t&&(o=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var a=[],r=t.length,s=this.indices;o=o||this;for(var l=0;l<s.length;l++)switch(r){case 0:e.call(o,l);break;case 1:e.call(o,this.get(t[0],l,i),l);break;case 2:e.call(o,this.get(t[0],l,i),this.get(t[1],l,i),l);break;default:for(var u=0;u<r;u++)a[u]=this.get(t[u],l,i);a[u]=l,e.apply(o,a)}},y.filterSelf=function(t,e,i,o){"function"==typeof t&&(o=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var a=[],r=[],s=t.length,l=this.indices;o=o||this;for(var u=0;u<l.length;u++){var c;if(1===s)c=e.call(o,this.get(t[0],u,i),u);else{for(var h=0;h<s;h++)r[h]=this.get(t[h],u,i);r[h]=u,c=e.apply(o,r)}c&&a.push(l[u])}return this.indices=a,this._extent={},this},y.mapArray=function(t,e,i,n){"function"==typeof t&&(n=i,i=e,e=t,t=[]);var o=[];return this.each(t,function(){o.push(e&&e.apply(this,arguments))},i,n),o},y.map=function(t,e,i,a){t=d.map(n(t),this.getDimension,this);var r=o(this,t),s=r.indices=this.indices,l=r._storage,u=[];return this.each(t,function(){var i=arguments[arguments.length-1],n=e&&e.apply(this,arguments);if(null!=n){"number"==typeof n&&(u[0]=n,n=u);for(var o=0;o<n.length;o++){var a=t[o],r=l[a],c=s[i];r&&(r[c]=n[o])}}},i,a),r},y.downSample=function(t,e,i,n){for(var a=o(this,[t]),r=this._storage,s=a._storage,l=this.indices,u=a.indices=[],c=[],h=[],d=Math.floor(1/e),f=s[t],p=this.count(),g=0;g<r[t].length;g++)s[t][g]=r[t][g];for(var g=0;g<p;g+=d){d>p-g&&(d=p-g,c.length=d);for(var m=0;m<d;m++){var v=l[g+m];c[m]=f[v],h[m]=v}var y=i(c),v=h[n(c,y)||0];f[v]=y,u.push(v)}return a},y.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new c(this._rawData[t],e,e&&e.ecModel)},y.diff=function(t){var e,i=this._idList,n=t&&t._idList,o="e\0\0";return new h(t?t.indices:[],this.indices,function(t){return null!=(e=n[t])?e:o+t},function(t){return null!=(e=i[t])?e:o+t})},y.getVisual=function(t){var e=this._visual;return e&&e[t]},y.setVisual=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},y.setLayout=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},y.getLayout=function(t){return this._layout[t]},y.getItemLayout=function(t){return this._itemLayouts[t]},y.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?d.extend(this._itemLayouts[t]||{},e):e},y.clearItemLayouts=function(){this._itemLayouts.length=0},y.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],o=n&&n[e];return null!=o||i?o:this.getVisual(e)},y.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{};if(this._itemVisuals[t]=n,p(e))for(var o in e)e.hasOwnProperty(o)&&(n[o]=e[o]);else n[e]=i},y.clearAllVisual=function(){this._visual={},this._itemVisuals=[]};var x=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};y.setItemGraphicEl=function(t,e){var i=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=i&&i.seriesIndex,"group"===e.type&&e.traverse(x,e)),this._graphicEls[t]=e},y.getItemGraphicEl=function(t){return this._graphicEls[t]},y.eachItemGraphicEl=function(t,e){d.each(this._graphicEls,function(i,n){i&&t&&t.call(e,i,n)})},y.cloneShallow=function(){var t=d.map(this.dimensions,this.getDimensionInfo,this),e=new v(t,this.hostModel);return e._storage=this._storage,m(e,this),e.indices=this.indices.slice(),this._extent&&(e._extent=d.extend({},this._extent)),e},y.wrapMethod=function(t,e){var i=this[t];"function"==typeof i&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=i.apply(this,arguments);return e.apply(this,[t].concat(d.slice(arguments)))})},y.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],y.CHANGABLE_METHODS=["filterSelf"],t.exports=v}).call(e,function(){return this}())},function(t,e,i){function n(t){r.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function o(t,e){var i=r.slice(arguments,2);return this.superClass.prototype[e].apply(t,i)}function a(t,e,i){return this.superClass.prototype[e].apply(t,i)}var r=i(1),s={},l=".",u="___EC__COMPONENT__CONTAINER___",c="\0ec_\0";s.set=function(t,e,i){return t[c+e]=i},s.get=function(t,e){return t[c+e]},s.hasOwn=function(t,e){return t.hasOwnProperty(c+e)};var h=s.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(l),e.main=t[0]||"",e.sub=t[1]||""),e};s.enableClassExtend=function(t,e){t.$constructor=t,t.extend=function(t){var e=this,i=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return r.extend(i.prototype,t),i.extend=this.extend,i.superCall=o,i.superApply=a,r.inherits(i,this),i.superClass=e,i}},s.enableClassManagement=function(t,e){function i(t){var e=o[t.main];return e&&e[u]||(e=o[t.main]={},e[u]=!0),e}e=e||{};var o={};if(t.registerClass=function(t,e){if(e)if(n(e),e=h(e),e.sub){if(e.sub!==u){var a=i(e);a[e.sub]=t}}else o[e.main]=t;return t},t.getClass=function(t,e,i){var n=o[t];if(n&&n[u]&&(n=e?n[e]:null),i&&!n)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return n},t.getClassesByMainType=function(t){t=h(t);var e=[],i=o[t.main];return i&&i[u]?r.each(i,function(t,i){i!==u&&e.push(t)}):e.push(i),e},t.hasClass=function(t){return t=h(t),!!o[t.main]},t.getAllClassMainTypes=function(){var t=[];return r.each(o,function(e,i){t.push(i)}),t},t.hasSubTypes=function(t){t=h(t);var e=o[t.main];return e&&e[u]},t.parseClassType=h,e.registerWhenExtend){var a=t.extend;a&&(t.extend=function(e){var i=a.call(this,e);return t.registerClass(i,e.type)})}return t},s.setReadOnly=function(t,e){},t.exports=s},function(t,e,i){function n(t,e){var i=t+":"+e;if(l[i])return l[i];for(var n=(t+"").split("\n"),o=0,a=0,r=n.length;a<r;a++)o=Math.max(p.measureText(n[a],e).width,o);return u>c&&(u=0,l={}),u++,l[i]=o,o}function o(t,e,i,o){var a=((t||"")+"").split("\n").length,r=n(t,e),s=n("国",e),l=a*s,u=new d(0,0,r,l);switch(u.lineHeight=s,o){case"bottom":case"alphabetic":u.y-=s;break;case"middle":u.y-=s/2}switch(i){case"end":case"right":u.x-=u.width;break;case"center":u.x-=u.width/2}return u}function a(t,e,i,n){var o=e.x,a=e.y,r=e.height,s=e.width,l=i.height,u=i.lineHeight,c=r/2-l/2+u,h="left";switch(t){case"left":o-=n,a+=c,h="right";break;case"right":o+=n+s,a+=c,h="left";break;case"top":o+=s/2,a-=n+l-u,h="center";break;case"bottom":o+=s/2,a+=r+n+u,h="center";break;case"inside":o+=s/2,a+=c,h="center";break;case"insideLeft":o+=n,a+=c,h="left";break;case"insideRight":o+=s-n,a+=c,h="right";break;case"insideTop":o+=s/2,a+=n+u,h="center";break;case"insideBottom":o+=s/2,a+=r-l-n+u,h="center";break;case"insideTopLeft":o+=n,a+=n+u,h="left";break;case"insideTopRight":o+=s-n,a+=n+u,h="right";break;case"insideBottomLeft":o+=n,a+=r-l-n+u;break;case"insideBottomRight":o+=s-n,a+=r-l-n+u,h="right"}return{x:o,y:a,textAlign:h,textBaseline:"alphabetic"}}function r(t,e,i,o,a){if(!e)return"";a=a||{},o=f(o,"...");for(var r=f(a.maxIterations,2),l=f(a.minChar,0),u=n("国",i),c=n("a",i),h=f(a.placeholder,""),d=e=Math.max(0,e-1),p=0;p<l&&d>=c;p++)d-=c;var g=n(o);g>d&&(o="",g=0),d=e-g;for(var m=(t+"").split("\n"),p=0,v=m.length;p<v;p++){var y=m[p],x=n(y,i);if(!(x<=e)){for(var _=0;;_++){if(x<=d||_>=r){y+=o;break}var b=0===_?s(y,d,c,u):x>0?Math.floor(y.length*d/x):0;y=y.substr(0,b),x=n(y,i)}""===y&&(y=h),m[p]=y}}return m.join("\n")}function s(t,e,i,n){for(var o=0,a=0,r=t.length;a<r&&o<e;a++){var s=t.charCodeAt(a);o+=0<=s&&s<=127?i:n}return a}var l={},u=0,c=5e3,h=i(1),d=i(11),f=h.retrieve,p={getWidth:n,getBoundingRect:o,adjustTextPositionOnRect:a,truncateText:r,measureText:function(t,e){var i=h.getContext();return i.font=e||"12px sans-serif",i.measureText(t)}};t.exports=p},function(t,e,i){var n=i(149),o=i(43);i(150),i(148);var a=i(34),r=i(4),s=i(1),l=i(16),u={};u.getScaleExtent=function(t,e){var i,n,o,a=t.type,l=e.getMin(),u=e.getMax(),c=null!=l,h=null!=u,d=t.getExtent();return"ordinal"===a?i=(e.get("data")||[]).length:(n=e.get("boundaryGap"),s.isArray(n)||(n=[n||0,n||0]),"boolean"==typeof n[0]&&(n=[0,0]),n[0]=r.parsePercent(n[0],1),n[1]=r.parsePercent(n[1],1),o=d[1]-d[0]||Math.abs(d[0])),null==l&&(l="ordinal"===a?i?0:NaN:d[0]-n[0]*o),null==u&&(u="ordinal"===a?i?i-1:NaN:d[1]+n[1]*o),"dataMin"===l&&(l=d[0]),"dataMax"===u&&(u=d[1]),(null==l||!isFinite(l))&&(l=NaN),(null==u||!isFinite(u))&&(u=NaN),t.setBlank(s.eqNaN(l)||s.eqNaN(u)),e.getNeedCrossZero()&&(l>0&&u>0&&!c&&(l=0),l<0&&u<0&&!h&&(u=0)),[l,u]},u.niceScaleExtent=function(t,e){var i=u.getScaleExtent(t,e),n=null!=e.getMin(),o=null!=e.getMax(),a=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase")),t.setExtent(i[0],i[1]),t.niceExtent(a,n,o);var r=e.get("minInterval");if(isFinite(r)&&!n&&!o&&"interval"===t.type){var s=t.getInterval(),l=Math.max(Math.abs(s),r)/s;i=t.getExtent();var c=(i[1]+i[0])/2;t.setExtent(l*(i[0]-c)+c,l*(i[1]-c)+c),t.niceExtent(a)}var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)},u.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new n(t.getCategories(),[1/0,-(1/0)]);case"value":return new o;default:return(a.getClass(e)||o).create(t)}},u.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(i>0&&n>0||i<0&&n<0)},u.getAxisLabelInterval=function(t,e,i,n){var o,a=0,r=0,s=1;e.length>40&&(s=Math.floor(e.length/40));for(var u=0;u<t.length;u+=s){var c=t[u],h=l.getBoundingRect(e[u],i,"center","top");h[n?"x":"y"]+=c,h[n?"width":"height"]*=1.3,o?o.intersect(h)?(r++,a=Math.max(a,r)):(o.union(h),r=0):o=h.clone()}return 0===a&&s>1?s:(a+1)*s-1},u.getFormattedLabels=function(t,e){var i=t.scale,n=i.getTicksLabels(),o=i.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),s.map(n,e)):"function"==typeof e?s.map(o,function(i,n){return e(u.getAxisRawValue(t,i),n)},this):n},u.getAxisRawValue=function(t,e){return"category"===t.type?t.scale.getLabel(e):e},t.exports=u},function(t,e,i){"use strict";var n=i(1),o=i(7),a=i(15),r=i(6),s=i(13),l=i(61),u=i(9),c=i(12),h=a.set,d=a.get,f=o.encodeHTML,p=o.addCommas,g=s.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.normal.color",layoutMode:null,init:function(t,e,i,n){this.seriesIndex=this.componentIndex,this.mergeDefaultAndTheme(t,i);var o=this.getInitialData(t,i);h(this,"dataBeforeProcessed",o),this.restoreData()},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,o=i?c.getLayoutParams(t):{};n.merge(t,e.getTheme().get(this.subType)),n.merge(t,this.getDefaultOption()),r.defaultEmphasis(t.label,r.LABEL_OPTIONS),this.fillDataTextStyle(t.data),i&&c.mergeLayoutParam(t,o,i)},mergeOption:function(t,e){t=n.merge(this.option,t,!0),this.fillDataTextStyle(t.data);var i=this.layoutMode;i&&c.mergeLayoutParam(this.option,t,i);var o=this.getInitialData(t,e);o&&(h(this,"data",o),h(this,"dataBeforeProcessed",o.cloneShallow()))},fillDataTextStyle:function(t){if(t)for(var e=0;e<t.length;e++)t[e]&&t[e].label&&r.defaultEmphasis(t[e].label,r.LABEL_OPTIONS)},getInitialData:function(){},getData:function(t){var e=d(this,"data");return null==t?e:e.getLinkedData(t)},setData:function(t){h(this,"data",t)},getRawData:function(){return d(this,"dataBeforeProcessed")},coordDimToDataDim:function(t){return[t]},dataDimToCoordDim:function(t){return t},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,i){function a(t){var i=[];return n.each(t,function(t,n){var a,s=r.getDimensionInfo(n),l=s&&s.type;a="ordinal"===l?t+"":"time"===l?e?"":o.formatTime("yyyy/MM/dd hh:mm:ss",t):p(t),a&&i.push(a)}),i.join(", ")}var r=d(this,"data"),s=this.getRawValue(t),l=f(n.isArray(s)?a(s):p(s)),u=r.getName(t),c=r.getItemVisual(t,"color");n.isObject(c)&&c.colorStops&&(c=(c.colorStops[0]||{}).color),c=c||"transparent";var h='<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+f(c)+'"></span>',g=this.name;return"\0-"===g&&(g=""),e?h+f(this.name)+" : "+l:(g&&f(g)+"<br />")+h+(u?f(u)+" : "+l:l)},isAnimationEnabled:function(){if(u.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){h(this,"data",d(this,"dataBeforeProcessed").cloneShallow())},getColorFromPalette:function(t,e){var i=this.ecModel,n=l.getColorFromPalette.call(this,t,e);return n||(n=i.getColorFromPalette(t,e)),n},getAxisTooltipData:null,getTooltipPosition:null});n.mixin(g,r.dataFormatMixin),n.mixin(g,l),t.exports=g},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(){var t=new i(6);return n.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,i){var n=e[0]*i[0]+e[2]*i[1],o=e[1]*i[0]+e[3]*i[1],a=e[0]*i[2]+e[2]*i[3],r=e[1]*i[2]+e[3]*i[3],s=e[0]*i[4]+e[2]*i[5]+e[4],l=e[1]*i[4]+e[3]*i[5]+e[5];return t[0]=n,t[1]=o,t[2]=a,t[3]=r,t[4]=s,t[5]=l,t},translate:function(t,e,i){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+i[0],t[5]=e[5]+i[1],t},rotate:function(t,e,i){var n=e[0],o=e[2],a=e[4],r=e[1],s=e[3],l=e[5],u=Math.sin(i),c=Math.cos(i);return t[0]=n*c+r*u,t[1]=-n*u+r*c,t[2]=o*c+s*u,t[3]=-o*u+c*s,t[4]=c*a+u*l,t[5]=c*l-u*a,t},scale:function(t,e,i){var n=i[0],o=i[1];return t[0]=e[0]*n,t[1]=e[1]*o,t[2]=e[2]*n,t[3]=e[3]*o,t[4]=e[4]*n,t[5]=e[5]*o,t},invert:function(t,e){var i=e[0],n=e[2],o=e[4],a=e[1],r=e[3],s=e[5],l=i*r-a*n;return l?(l=1/l,t[0]=r*l,t[1]=-a*l,t[2]=-n*l,t[3]=i*l,t[4]=(n*s-r*o)*l,t[5]=(a*o-i*s)*l,t):null}};t.exports=n},function(t,e,i){"use strict";function n(t){return t>-w&&t<w}function o(t){return t>w||t<-w}function a(t,e,i,n,o){var a=1-o;return a*a*(a*t+3*o*e)+o*o*(o*n+3*a*i)}function r(t,e,i,n,o){var a=1-o;return 3*(((e-t)*a+2*(i-e)*o)*a+(n-i)*o*o)}function s(t,e,i,o,a,r){var s=o+3*(e-i)-t,l=3*(i-2*e+t),u=3*(e-t),c=t-a,h=l*l-3*s*u,d=l*u-9*s*c,f=u*u-3*l*c,p=0;if(n(h)&&n(d))if(n(l))r[0]=0;else{var g=-u/l;g>=0&&g<=1&&(r[p++]=g)}else{var m=d*d-4*h*f;if(n(m)){var v=d/h,g=-l/s+v,y=-v/2;g>=0&&g<=1&&(r[p++]=g),y>=0&&y<=1&&(r[p++]=y)}else if(m>0){var x=b(m),w=h*l+1.5*s*(-d+x),S=h*l+1.5*s*(-d-x);w=w<0?-_(-w,I):_(w,I),S=S<0?-_(-S,I):_(S,I);var g=(-l-(w+S))/(3*s);g>=0&&g<=1&&(r[p++]=g)}else{var T=(2*h*l-3*s*d)/(2*b(h*h*h)),A=Math.acos(T)/3,C=b(h),L=Math.cos(A),g=(-l-2*C*L)/(3*s),y=(-l+C*(L+M*Math.sin(A)))/(3*s),D=(-l+C*(L-M*Math.sin(A)))/(3*s);g>=0&&g<=1&&(r[p++]=g),y>=0&&y<=1&&(r[p++]=y),D>=0&&D<=1&&(r[p++]=D)}}return p}function l(t,e,i,a,r){var s=6*i-12*e+6*t,l=9*e+3*a-3*t-9*i,u=3*e-3*t,c=0;if(n(l)){if(o(s)){var h=-u/s;h>=0&&h<=1&&(r[c++]=h)}}else{var d=s*s-4*l*u;if(n(d))r[0]=-s/(2*l);else if(d>0){var f=b(d),h=(-s+f)/(2*l),p=(-s-f)/(2*l);h>=0&&h<=1&&(r[c++]=h),p>=0&&p<=1&&(r[c++]=p)}}return c}function u(t,e,i,n,o,a){var r=(e-t)*o+t,s=(i-e)*o+e,l=(n-i)*o+i,u=(s-r)*o+r,c=(l-s)*o+s,h=(c-u)*o+u;a[0]=t,a[1]=r,a[2]=u,a[3]=h,a[4]=h,a[5]=c,a[6]=l,a[7]=n}function c(t,e,i,n,o,r,s,l,u,c,h){var d,f,p,g,m,v=.005,y=1/0;T[0]=u,T[1]=c;for(var _=0;_<1;_+=.05)A[0]=a(t,i,o,s,_),A[1]=a(e,n,r,l,_),g=x(T,A),g<y&&(d=_,y=g);y=1/0;for(var w=0;w<32&&!(v<S);w++)f=d-v,p=d+v,A[0]=a(t,i,o,s,f),A[1]=a(e,n,r,l,f),g=x(A,T),f>=0&&g<y?(d=f,y=g):(C[0]=a(t,i,o,s,p),C[1]=a(e,n,r,l,p),m=x(C,T),p<=1&&m<y?(d=p,y=m):v*=.5);return h&&(h[0]=a(t,i,o,s,d),h[1]=a(e,n,r,l,d)),b(y)}function h(t,e,i,n){var o=1-n;return o*(o*t+2*n*e)+n*n*i}function d(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}function f(t,e,i,a,r){var s=t-2*e+i,l=2*(e-t),u=t-a,c=0;if(n(s)){if(o(l)){var h=-u/l;h>=0&&h<=1&&(r[c++]=h)}}else{var d=l*l-4*s*u;if(n(d)){var h=-l/(2*s);h>=0&&h<=1&&(r[c++]=h)}else if(d>0){var f=b(d),h=(-l+f)/(2*s),p=(-l-f)/(2*s);h>=0&&h<=1&&(r[c++]=h),p>=0&&p<=1&&(r[c++]=p)}}return c}function p(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}function g(t,e,i,n,o){var a=(e-t)*n+t,r=(i-e)*n+e,s=(r-a)*n+a;o[0]=t,o[1]=a,o[2]=s,o[3]=s,o[4]=r,o[5]=i}function m(t,e,i,n,o,a,r,s,l){var u,c=.005,d=1/0;T[0]=r,T[1]=s;for(var f=0;f<1;f+=.05){A[0]=h(t,i,o,f),A[1]=h(e,n,a,f);var p=x(T,A);p<d&&(u=f,d=p)}d=1/0;for(var g=0;g<32&&!(c<S);g++){var m=u-c,v=u+c;A[0]=h(t,i,o,m),A[1]=h(e,n,a,m);var p=x(A,T);if(m>=0&&p<d)u=m,d=p;else{C[0]=h(t,i,o,v),C[1]=h(e,n,a,v);var y=x(C,T);v<=1&&y<d?(u=v,d=y):c*=.5}}return l&&(l[0]=h(t,i,o,u),l[1]=h(e,n,a,u)),b(d)}var v=i(5),y=v.create,x=v.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,S=1e-4,M=b(3),I=1/3,T=y(),A=y(),C=y();t.exports={cubicAt:a,cubicDerivativeAt:r,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:u,cubicProjectPoint:c,quadraticAt:h,quadraticDerivativeAt:d,quadraticRootAt:f,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:m}},function(t,e,i){"use strict";function n(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function o(t,e,i,n){return i=i||{},n||!c.canvasSupported?a(t,e,i):c.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(i.zrX=e.layerX,i.zrY=e.layerY):null!=e.offsetX?(i.zrX=e.offsetX,i.zrY=e.offsetY):a(t,e,i),i}function a(t,e,i){var o=n(t);i.zrX=e.clientX-o.left,i.zrY=e.clientY-o.top}function r(t,e,i){if(e=e||window.event,null!=e.zrX)return e;var n=e.type,a=n&&n.indexOf("touch")>=0;if(a){var r="touchend"!=n?e.targetTouches[0]:e.changedTouches[0];r&&o(t,r,e,i)}else o(t,e,e,i),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;return e}function s(t,e,i){h?t.addEventListener(e,i):t.attachEvent("on"+e,i)}function l(t,e,i){h?t.removeEventListener(e,i):t.detachEvent("on"+e,i)}var u=i(23),c=i(9),h="undefined"!=typeof window&&!!window.addEventListener,d=h?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={clientToLocal:o,normalizeEvent:r,addEventListener:s,removeEventListener:l,stop:d,Dispatcher:u}},function(t,e,i){function n(t){return t=Math.round(t),t<0?0:t>255?255:t}function o(t){return t=Math.round(t),t<0?0:t>360?360:t}function a(t){return t<0?0:t>1?1:t}function r(t){return n(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function s(t){return a(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function l(t,e,i){return i<0?i+=1:i>1&&(i-=1),6*i<1?t+(e-t)*i*6:2*i<1?e:3*i<2?t+(e-t)*(2/3-i)*6:t}function u(t,e,i){return t+(e-t)*i}function c(t,e,i,n,o){return t[0]=e,t[1]=i,t[2]=n,t[3]=o,t}function h(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function d(t,e){T&&h(T,e),T=I.put(t,T||e.slice())}function f(t,e){if(t){e=e||[];var i=I.get(t);if(i)return h(e,i);t+="";var n=t.replace(/ /g,"").toLowerCase();if(n in M)return h(e,M[n]),d(t,e),e;if("#"!==n.charAt(0)){var o=n.indexOf("("),a=n.indexOf(")");if(o!==-1&&a+1===n.length){var l=n.substr(0,o),u=n.substr(o+1,a-(o+1)).split(","),f=1;switch(l){case"rgba":if(4!==u.length)return void c(e,0,0,0,1);f=s(u.pop());case"rgb":return 3!==u.length?void c(e,0,0,0,1):(c(e,r(u[0]),r(u[1]),r(u[2]),f),d(t,e),e);case"hsla":return 4!==u.length?void c(e,0,0,0,1):(u[3]=s(u[3]),p(u,e),d(t,e),e);case"hsl":return 3!==u.length?void c(e,0,0,0,1):(p(u,e),d(t,e),e);default:return}}c(e,0,0,0,1)}else{if(4===n.length){var g=parseInt(n.substr(1),16);return g>=0&&g<=4095?(c(e,(3840&g)>>4|(3840&g)>>8,240&g|(240&g)>>4,15&g|(15&g)<<4,1),d(t,e),e):void c(e,0,0,0,1)}if(7===n.length){var g=parseInt(n.substr(1),16);return g>=0&&g<=16777215?(c(e,(16711680&g)>>16,(65280&g)>>8,255&g,1),d(t,e),e):void c(e,0,0,0,1)}}}}function p(t,e){var i=(parseFloat(t[0])%360+360)%360/360,o=s(t[1]),a=s(t[2]),r=a<=.5?a*(o+1):a+o-a*o,u=2*a-r;return e=e||[],c(e,n(255*l(u,r,i+1/3)),n(255*l(u,r,i)),n(255*l(u,r,i-1/3)),1),4===t.length&&(e[3]=t[3]),e}function g(t){if(t){var e,i,n=t[0]/255,o=t[1]/255,a=t[2]/255,r=Math.min(n,o,a),s=Math.max(n,o,a),l=s-r,u=(s+r)/2;if(0===l)e=0,i=0;else{i=u<.5?l/(s+r):l/(2-s-r);var c=((s-n)/6+l/2)/l,h=((s-o)/6+l/2)/l,d=((s-a)/6+l/2)/l;n===s?e=d-h:o===s?e=1/3+c-d:a===s&&(e=2/3+h-c),e<0&&(e+=1),e>1&&(e-=1)}var f=[360*e,i,u];return null!=t[3]&&f.push(t[3]),f}}function m(t,e){var i=f(t);if(i){for(var n=0;n<3;n++)e<0?i[n]=i[n]*(1-e)|0:i[n]=(255-i[n])*e+i[n]|0;return w(i,4===i.length?"rgba":"rgb")}}function v(t,e){var i=f(t);if(i)return((1<<24)+(i[0]<<16)+(i[1]<<8)+ +i[2]).toString(16).slice(1)}function y(t,e,i){if(e&&e.length&&t>=0&&t<=1){i=i||[];var o=t*(e.length-1),r=Math.floor(o),s=Math.ceil(o),l=e[r],c=e[s],h=o-r;return i[0]=n(u(l[0],c[0],h)),i[1]=n(u(l[1],c[1],h)),i[2]=n(u(l[2],c[2],h)),i[3]=a(u(l[3],c[3],h)),i}}function x(t,e,i){if(e&&e.length&&t>=0&&t<=1){var o=t*(e.length-1),r=Math.floor(o),s=Math.ceil(o),l=f(e[r]),c=f(e[s]),h=o-r,d=w([n(u(l[0],c[0],h)),n(u(l[1],c[1],h)),n(u(l[2],c[2],h)),a(u(l[3],c[3],h))],"rgba");return i?{color:d,leftIndex:r,rightIndex:s,value:o}:d}}function _(t,e,i,n){if(t=f(t))return t=g(t),null!=e&&(t[0]=o(e)),null!=i&&(t[1]=s(i)),null!=n&&(t[2]=s(n)),w(p(t),"rgba")}function b(t,e){if(t=f(t),t&&null!=e)return t[3]=a(e),w(t,"rgba")}function w(t,e){if(t&&t.length){var i=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(i+=","+t[3]),e+"("+i+")"}}var S=i(69),M={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],
-mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},I=new S(20),T=null;t.exports={parse:f,lift:m,toHex:v,fastMapToColor:y,mapToColor:x,modifyHSL:_,modifyAlpha:b,stringify:w}},function(t,e){var i=Array.prototype.slice,n=function(){this._$handlers={}};n.prototype={constructor:n,one:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var o=0;o<n[t].length;o++)if(n[t][o].h===e)return this;return n[t].push({h:e,one:!0,ctx:i||this}),this},on:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var o=0;o<n[t].length;o++)if(n[t][o].h===e)return this;return n[t].push({h:e,one:!1,ctx:i||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var i=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(i[t]){for(var n=[],o=0,a=i[t].length;o<a;o++)i[t][o].h!=e&&n.push(i[t][o]);i[t]=n}i[t]&&0===i[t].length&&delete i[t]}else delete i[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>3&&(e=i.call(e,1));for(var o=this._$handlers[t],a=o.length,r=0;r<a;){switch(n){case 1:o[r].h.call(o[r].ctx);break;case 2:o[r].h.call(o[r].ctx,e[1]);break;case 3:o[r].h.call(o[r].ctx,e[1],e[2]);break;default:o[r].h.apply(o[r].ctx,e)}o[r].one?(o.splice(r,1),a--):r++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>4&&(e=i.call(e,1,e.length-1));for(var o=e[e.length-1],a=this._$handlers[t],r=a.length,s=0;s<r;){switch(n){case 1:a[s].h.call(o);break;case 2:a[s].h.call(o,e[1]);break;case 3:a[s].h.call(o,e[1],e[2]);break;default:a[s].h.apply(o,e)}a[s].one?(a.splice(s,1),r--):s++}}return this}},t.exports=n},function(t,e,i){"use strict";var n=i(3),o=i(11),a=n.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,o=e.width/2,a=e.height/2;t.moveTo(i,n-a),t.lineTo(i+o,n+a),t.lineTo(i-o,n+a),t.closePath()}}),r=n.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,o=e.width/2,a=e.height/2;t.moveTo(i,n-a),t.lineTo(i+o,n),t.lineTo(i,n+a),t.lineTo(i-o,n),t.closePath()}}),s=n.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,o=e.width/5*3,a=Math.max(o,e.height),r=o/2,s=r*r/(a-r),l=n-a+r+s,u=Math.asin(s/r),c=Math.cos(u)*r,h=Math.sin(u),d=Math.cos(u);t.arc(i,l,r,Math.PI-u,2*Math.PI+u);var f=.6*r,p=.7*r;t.bezierCurveTo(i+c-h*f,l+s+d*f,i,n-p,i,n),t.bezierCurveTo(i,n-p,i-c+h*f,l+s+d*f,i-c,l+s),t.closePath()}}),l=n.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.height,n=e.width,o=e.x,a=e.y,r=n/3*2;t.moveTo(o,a),t.lineTo(o+r,a+i),t.lineTo(o,a+i/4*3),t.lineTo(o-r,a+i),t.lineTo(o,a),t.closePath()}}),u={line:n.Line,rect:n.Rect,roundRect:n.Rect,square:n.Rect,circle:n.Circle,diamond:r,pin:s,arrow:l,triangle:a},c={line:function(t,e,i,n,o){o.x1=t,o.y1=e+n/2,o.x2=t+i,o.y2=e+n/2},rect:function(t,e,i,n,o){o.x=t,o.y=e,o.width=i,o.height=n},roundRect:function(t,e,i,n,o){o.x=t,o.y=e,o.width=i,o.height=n,o.r=Math.min(i,n)/4},square:function(t,e,i,n,o){var a=Math.min(i,n);o.x=t,o.y=e,o.width=a,o.height=a},circle:function(t,e,i,n,o){o.cx=t+i/2,o.cy=e+n/2,o.r=Math.min(i,n)/2},diamond:function(t,e,i,n,o){o.cx=t+i/2,o.cy=e+n/2,o.width=i,o.height=n},pin:function(t,e,i,n,o){o.x=t+i/2,o.y=e+n/2,o.width=i,o.height=n},arrow:function(t,e,i,n,o){o.x=t+i/2,o.y=e+n/2,o.width=i,o.height=n},triangle:function(t,e,i,n,o){o.cx=t+i/2,o.cy=e+n/2,o.width=i,o.height=n}},h={};for(var d in u)u.hasOwnProperty(d)&&(h[d]=new u[d]);var f=n.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,i){var n=e.symbolType,o=h[n];"none"!==e.symbolType&&(o||(n="rect",o=h[n]),c[n](e.x,e.y,e.width,e.height,o.shape),o.buildPath(t,o.shape,i))}}),p=function(t){if("image"!==this.type){var e=this.style,i=this.shape;i&&"line"===i.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty(!1)}},g={createSymbol:function(t,e,i,a,r,s){var l=0===t.indexOf("empty");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var u;return u=0===t.indexOf("image://")?new n.Image({style:{image:t.slice(8),x:e,y:i,width:a,height:r}}):0===t.indexOf("path://")?n.makePath(t.slice(7),{},new o(e,i,a,r)):new f({shape:{symbolType:t,x:e,y:i,width:a,height:r}}),u.__isEmptyBrush=l,u.setColor=p,u.setColor(s),u}};t.exports=g},function(t,e,i){function n(t,e,i){if(!e)return t;i=i||{};var n=i.dimCount;if(null==n){var s=o(e[0]);n=a.isArray(s)&&s.length||1}for(var l=i.defaultNames||[],u=i.extraPrefix||"extra",c=0;c<n;c++)if(!t[c]){var h=l[c]||u+(c-l.length);t[c]=r(e,c)?{type:"ordinal",name:h}:h}return t}function o(t){return a.isArray(t)?t:a.isObject(t)?t.value:t}var a=i(1),r=n.guessOrdinal=function(t,e){for(var i=0,n=t.length;i<n;i++){var r=o(t[i]);if(!a.isArray(r))return!1;var r=r[e];if(null!=r&&isFinite(r))return!1;if(a.isString(r)&&"-"!==r)return!0}return!1};t.exports=n},function(t,e,i){"use strict";function n(){this._coordinateSystems=[]}var o=i(1),a={};n.prototype={constructor:n,create:function(t,e){var i=[];o.each(a,function(n,o){var a=n.create(t,e);i=i.concat(a||[])}),this._coordinateSystems=i},update:function(t,e){o.each(this._coordinateSystems,function(i){i.update&&i.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},n.register=function(t,e){a[t]=e},n.get=function(t){return a[t]},t.exports=n},function(t,e,i){"use strict";var n=i(20),o=i(5),a=i(84),r=i(11),s=i(35).devicePixelRatio,l={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},u=[],c=[],h=[],d=[],f=Math.min,p=Math.max,g=Math.cos,m=Math.sin,v=Math.sqrt,y=Math.abs,x="undefined"!=typeof Float32Array,_=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};_.prototype={constructor:_,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=y(1/s/t)||0,this._uy=y(1/s/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(l.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var i=y(t-this._xi)>this._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(l.L,t,e),this._ctx&&i&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),i&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,i,n,o,a){return this.addData(l.C,t,e,i,n,o,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,i,n,o,a):this._ctx.bezierCurveTo(t,e,i,n,o,a)),this._xi=o,this._yi=a,this},quadraticCurveTo:function(t,e,i,n){return this.addData(l.Q,t,e,i,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,i,n):this._ctx.quadraticCurveTo(t,e,i,n)),this._xi=i,this._yi=n,this},arc:function(t,e,i,n,o,a){return this.addData(l.A,t,e,i,i,n,o-n,0,a?0:1),this._ctx&&this._ctx.arc(t,e,i,n,o,a),this._xi=g(o)*i+t,this._yi=m(o)*i+t,this},arcTo:function(t,e,i,n,o){return this._ctx&&this._ctx.arcTo(t,e,i,n,o),this},rect:function(t,e,i,n){return this._ctx&&this._ctx.rect(t,e,i,n),this.addData(l.R,t,e,i,n),this},closePath:function(){this.addData(l.Z);var t=this._ctx,e=this._x0,i=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,i),t.closePath()),this._xi=e,this._yi=i,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,i=0;i<t.length;i++)e+=t[i];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!x||(this.data=new Float32Array(e));for(var i=0;i<e;i++)this.data[i]=t[i];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,i=0,n=this._len,o=0;o<e;o++)i+=t[o].len();x&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+i));for(var o=0;o<e;o++)for(var a=t[o].data,r=0;r<a.length;r++)this.data[n++]=a[r];this._len=n},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var i=0;i<arguments.length;i++)e[this._len++]=arguments[i];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var i,n,o=this._dashSum,a=this._dashOffset,r=this._lineDash,s=this._ctx,l=this._xi,u=this._yi,c=t-l,h=e-u,d=v(c*c+h*h),g=l,m=u,y=r.length;for(c/=d,h/=d,a<0&&(a=o+a),a%=o,g-=a*c,m-=a*h;c>0&&g<=t||c<0&&g>=t||0==c&&(h>0&&m<=e||h<0&&m>=e);)n=this._dashIdx,i=r[n],g+=c*i,m+=h*i,this._dashIdx=(n+1)%y,c>0&&g<l||c<0&&g>l||h>0&&m<u||h<0&&m>u||s[n%2?"moveTo":"lineTo"](c>=0?f(g,t):p(g,t),h>=0?f(m,e):p(m,e));c=g-t,h=m-e,this._dashOffset=-v(c*c+h*h)},_dashedBezierTo:function(t,e,i,o,a,r){var s,l,u,c,h,d=this._dashSum,f=this._dashOffset,p=this._lineDash,g=this._ctx,m=this._xi,y=this._yi,x=n.cubicAt,_=0,b=this._dashIdx,w=p.length,S=0;for(f<0&&(f=d+f),f%=d,s=0;s<1;s+=.1)l=x(m,t,i,a,s+.1)-x(m,t,i,a,s),u=x(y,e,o,r,s+.1)-x(y,e,o,r,s),_+=v(l*l+u*u);for(;b<w&&(S+=p[b],!(S>f));b++);for(s=(S-f)/_;s<=1;)c=x(m,t,i,a,s),h=x(y,e,o,r,s),b%2?g.moveTo(c,h):g.lineTo(c,h),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(a,r),l=a-c,u=r-h,this._dashOffset=-v(l*l+u*u)},_dashedQuadraticTo:function(t,e,i,n){var o=i,a=n;i=(i+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,i,n,o,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,x&&(this.data=new Float32Array(t)))},getBoundingRect:function(){u[0]=u[1]=h[0]=h[1]=Number.MAX_VALUE,c[0]=c[1]=d[0]=d[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,i=0,n=0,s=0,f=0;f<t.length;){var p=t[f++];switch(1==f&&(e=t[f],i=t[f+1],n=e,s=i),p){case l.M:n=t[f++],s=t[f++],e=n,i=s,h[0]=n,h[1]=s,d[0]=n,d[1]=s;break;case l.L:a.fromLine(e,i,t[f],t[f+1],h,d),e=t[f++],i=t[f++];break;case l.C:a.fromCubic(e,i,t[f++],t[f++],t[f++],t[f++],t[f],t[f+1],h,d),e=t[f++],i=t[f++];break;case l.Q:a.fromQuadratic(e,i,t[f++],t[f++],t[f],t[f+1],h,d),e=t[f++],i=t[f++];break;case l.A:var v=t[f++],y=t[f++],x=t[f++],_=t[f++],b=t[f++],w=t[f++]+b,S=(t[f++],1-t[f++]);1==f&&(n=g(b)*x+v,s=m(b)*_+y),a.fromArc(v,y,x,_,b,w,S,h,d),e=g(w)*x+v,i=m(w)*_+y;break;case l.R:n=e=t[f++],s=i=t[f++];var M=t[f++],I=t[f++];a.fromLine(n,s,n+M,s+I,h,d);break;case l.Z:e=n,i=s}o.min(u,u,h),o.max(c,c,d)}return 0===f&&(u[0]=u[1]=c[0]=c[1]=0),new r(u[0],u[1],c[0]-u[0],c[1]-u[1])},rebuildPath:function(t){for(var e,i,n,o,a,r,s=this.data,u=this._ux,c=this._uy,h=this._len,d=0;d<h;){var f=s[d++];switch(1==d&&(n=s[d],o=s[d+1],e=n,i=o),f){case l.M:e=n=s[d++],i=o=s[d++],t.moveTo(n,o);break;case l.L:a=s[d++],r=s[d++],(y(a-n)>u||y(r-o)>c||d===h-1)&&(t.lineTo(a,r),n=a,o=r);break;case l.C:t.bezierCurveTo(s[d++],s[d++],s[d++],s[d++],s[d++],s[d++]),n=s[d-2],o=s[d-1];break;case l.Q:t.quadraticCurveTo(s[d++],s[d++],s[d++],s[d++]),n=s[d-2],o=s[d-1];break;case l.A:var p=s[d++],v=s[d++],x=s[d++],_=s[d++],b=s[d++],w=s[d++],S=s[d++],M=s[d++],I=x>_?x:_,T=x>_?1:x/_,A=x>_?_/x:1,C=Math.abs(x-_)>.001,L=b+w;C?(t.translate(p,v),t.rotate(S),t.scale(T,A),t.arc(0,0,I,b,L,1-M),t.scale(1/T,1/A),t.rotate(-S),t.translate(-p,-v)):t.arc(p,v,I,b,L,1-M),1==d&&(e=g(b)*x+p,i=m(b)*_+v),n=g(L)*x+p,o=m(L)*_+v;break;case l.R:e=n=s[d],i=o=s[d+1],t.rect(s[d++],s[d++],s[d++],s[d++]);break;case l.Z:t.closePath(),n=e,o=i}}}},_.CMD=l,t.exports=_},function(t,e,i){"use strict";function n(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function o(t){var e=n(t);return null!=e&&!h.isArray(p(e))}function a(t,e,i){t=t||[];var n=e.get("coordinateSystem"),a=m[n],r=f.get(n),s=a&&a(t,e,i),v=s&&s.dimensions;v||(v=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"],v=c(v,t,{defaultNames:v.concat(["value"])}));var y=s?s.categoryIndex:-1,x=new u(v,e),_=l(s,t),b={},w=y>=0&&o(t)?function(t,e,i,n){return d.isDataItemOption(t)&&(x.hasItemOption=!0),n===y?i:g(p(t),v[n])}:function(t,e,i,n){var o=p(t),a=g(o&&o[n],v[n]);d.isDataItemOption(t)&&(x.hasItemOption=!0);var r=s&&s.categoryAxesModels;return r&&r[e]&&"string"==typeof a&&(b[e]=b[e]||r[e].getCategories(),a=h.indexOf(b[e],a),a<0&&!isNaN(a)&&(a=+a)),a};return x.hasItemOption=!1,x.initData(t,_,w),x}function r(t){return"category"!==t&&"time"!==t}function s(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function l(t,e){var i,n=[],o=t&&t.dimensions[t.categoryIndex];if(o&&(i=t.categoryAxesModels[o.name]),i){var a=i.getCategories();if(a){var r=e.length;if(h.isArray(e[0])&&e[0].length>1){n=[];for(var s=0;s<r;s++)n[s]=a[e[s][t.categoryIndex||0]]}else n=a.slice(0)}}return n}var u=i(14),c=i(25),h=i(1),d=i(6),f=i(26),p=d.getDataItemValue,g=d.converDataValue,m={cartesian2d:function(t,e,i){var n=h.map(["xAxis","yAxis"],function(t){return i.queryComponents({mainType:t,index:e.get(t+"Index"),id:e.get(t+"Id")})[0]}),o=n[0],a=n[1],l=o.get("type"),u=a.get("type"),d=[{name:"x",type:s(l),stackable:r(l)},{name:"y",type:s(u),stackable:r(u)}],f="category"===l,p="category"===u;c(d,t,{defaultNames:["x","y","z"]});var g={};return f&&(g.x=o),p&&(g.y=a),{dimensions:d,categoryIndex:f?0:p?1:-1,categoryAxesModels:g}},singleAxis:function(t,e,i){var n=i.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0],o=n.get("type"),a="category"===o,l=[{name:"single",type:s(o),stackable:r(o)}];c(l,t);var u={};return a&&(u.single=n),{dimensions:l,categoryIndex:a?0:-1,categoryAxesModels:u}},polar:function(t,e,i){var n=i.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0],o=n.findAxisModel("angleAxis"),a=n.findAxisModel("radiusAxis"),l=a.get("type"),u=o.get("type"),h=[{name:"radius",type:s(l),stackable:r(l)},{name:"angle",type:s(u),stackable:r(u)}],d="category"===u,f="category"===l;c(h,t,{defaultNames:["radius","angle","value"]});var p={};return f&&(p.radius=a),d&&(p.angle=o),{dimensions:h,categoryIndex:d?1:f?0:-1,categoryAxesModels:p}},geo:function(t,e,i){return{dimensions:c([{name:"lng"},{name:"lat"}],t,{defaultNames:["lng","lat","value"]})}}};t.exports=a},function(t,e){"use strict";var i={};t.exports={register:function(t,e){i[t]=e},get:function(t){return i[t]}}},function(t,e,i){function n(){this.group=new r,this.uid=s.getUID("viewChart")}function o(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var i=0;i<t.childCount();i++)o(t.childAt(i),e)}function a(t,e,i){var n=u.queryDataIndex(t,e);null!=n?c.each(u.normalizeToArray(n),function(e){o(t.getItemGraphicEl(e),i)}):t.eachItemGraphicEl(function(t){o(t,i)})}var r=i(36),s=i(49),l=i(15),u=i(6),c=i(1);n.prototype={type:"chart",init:function(t,e){},render:function(t,e,i,n){},highlight:function(t,e,i,n){a(t.getData(),n,"emphasis")},downplay:function(t,e,i,n){a(t.getData(),n,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){}};var h=n.prototype;h.updateView=h.updateLayout=h.updateVisual=function(t,e,i,n){this.render(t,e,i,n)},l.enableClassExtend(n,["dispose"]),l.enableClassManagement(n,{registerWhenExtend:!0}),t.exports=n},function(t,e,i){var n=i(1);t.exports=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e,i){for(var o={},a=0;a<t.length;a++){var r=t[a][1];if(!(e&&n.indexOf(e,r)>=0||i&&n.indexOf(i,r)<0)){var s=this.getShallow(r);null!=s&&(o[t[a][0]]=s)}}return o}}},function(t,e,i){"use strict";var n=i(3),o=i(1),a=i(2);i(56),i(116),a.extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new n.Rect({shape:t.coordinateSystem.getRect(),style:o.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),a.registerPreprocessor(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})})},function(t,e,i){function n(t,e){var i=t[1]-t[0],n=e,o=i/n/2;t[0]+=o,t[1]-=o}var o=i(4),a=o.linearMap,r=i(1),s=[0,1],l=function(t,e,i){this.dim=t,this.scale=e,this._extent=i||[0,0],this.inverse=!1,this.onBand=!1};l.prototype={constructor:l,contain:function(t){var e=this._extent,i=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return t>=i&&t<=n},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){var t=this._extent.slice();return t},getPixelPrecision:function(t){return o.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var i=this._extent;i[0]=t,i[1]=e},dataToCoord:function(t,e){var i=this._extent,o=this.scale;return t=o.normalize(t),this.onBand&&"ordinal"===o.type&&(i=i.slice(),n(i,o.count())),a(t,s,i,e)},coordToData:function(t,e){var i=this._extent,o=this.scale;this.onBand&&"ordinal"===o.type&&(i=i.slice(),n(i,o.count()));var r=a(t,i,s,e);return this.scale.scale(r)},pointToData:function(t,e){},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),i=[],n=0;n<e.length;n++)i.push(e[n][0]);return e[n-1]&&i.push(e[n-1][1]),i}return r.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return r.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],i=this.scale.count(),n=t[0],o=t[1],a=o-n,r=0;r<i;r++)e.push([a*r/i+n,a*(r+1)/i+n]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),i=e[1]-e[0]+(this.onBand?1:0);0===i&&(i=1);var n=Math.abs(t[1]-t[0]);return Math.abs(n)/i}},t.exports=l},function(t,e,i){function n(t){this._setting=t||{},this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var o=i(15),a=n.prototype;a.parse=function(t){return t},a.getSetting=function(t){return this._setting[t]},a.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},a.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},a.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},a.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},a.unionExtentFromData=function(t,e){this.unionExtent(t.getDataExtent(e,!0))},a.getExtent=function(){return this._extent.slice()},a.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},a.getTicksLabels=function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},a.isBlank=function(){return this._isBlank},a.setBlank=function(t){this._isBlank=t},o.enableClassExtend(n),o.enableClassManagement(n,{registerWhenExtend:!0}),t.exports=n},function(t,e){var i=1;"undefined"!=typeof window&&(i=Math.max(window.devicePixelRatio||1,1));var n={debugMode:0,devicePixelRatio:i};t.exports=n},function(t,e,i){var n=i(1),o=i(65),a=i(11),r=function(t){t=t||{},o.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};r.prototype={constructor:r,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,i=0;i<e.length;i++)if(e[i].name===t)return e[i]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var i=this._children,n=i.indexOf(e);n>=0&&(i.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,i=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof r&&t.addChildrenToStorage(e)),i&&i.refresh()},remove:function(t){var e=this.__zr,i=this.__storage,o=this._children,a=n.indexOf(o,t);return a<0?this:(o.splice(a,1),t.parent=null,i&&(i.delFromStorage(t),t instanceof r&&t.delChildrenFromStorage(i)),e&&e.refresh(),this)},removeAll:function(){var t,e,i=this._children,n=this.__storage;for(e=0;e<i.length;e++)t=i[e],n&&(n.delFromStorage(t),t instanceof r&&t.delChildrenFromStorage(n)),t.parent=null;return i.length=0,this},eachChild:function(t,e){for(var i=this._children,n=0;n<i.length;n++){var o=i[n];t.call(e,o,n)}return this},traverse:function(t,e){for(var i=0;i<this._children.length;i++){var n=this._children[i];t.call(e,n),"group"===n.type&&n.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.addToStorage(i),i instanceof r&&i.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.delFromStorage(i),i instanceof r&&i.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,i=new a(0,0,0,0),n=t||this._children,o=[],r=0;r<n.length;r++){var s=n[r];if(!s.ignore&&!s.invisible){var l=s.getBoundingRect(),u=s.getLocalTransform(o);u?(i.copy(l),i.applyTransform(u),e=e||i.clone(),e.union(i)):(e=e||l.clone(),e.union(l))}}return e||i}},n.inherits(r,o),t.exports=r},function(t,e){var i={},n="\0__throttleOriginMethod",o="\0__throttleRate",a="\0__throttleType";i.throttle=function(t,e,i){function n(){c=(new Date).getTime(),h=null,t.apply(r,s||[])}var o,a,r,s,l,u=0,c=0,h=null;e=e||0;var d=function(){o=(new Date).getTime(),r=this,s=arguments;var t=l||e,d=l||i;l=null,a=o-(d?u:c)-t,clearTimeout(h),d?h=setTimeout(n,t):a>=0?n():h=setTimeout(n,-a),u=o};return d.clear=function(){h&&(clearTimeout(h),h=null)},d.debounceNextCall=function(t){l=t},d},i.createOrUpdate=function(t,e,r,s){var l=t[e];if(l){var u=l[n]||l,c=l[a],h=l[o];if(h!==r||c!==s){if(null==r||!s)return t[e]=u;l=t[e]=i.throttle(u,r,"debounce"===s),l[n]=u,l[a]=s,l[o]=r}return l}},i.clear=function(t,e){var i=t[e];i&&i[n]&&(t[e]=i[n])},t.exports=i},function(t,e,i){function n(t){t=t||{},r.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new a(t.style),this._rect=null,this.__clipPaths=[]}var o=i(1),a=i(72),r=i(65),s=i(86);n.prototype={constructor:n,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect();return n.contain(i[0],i[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?r.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new a(t),this.dirty(!1),this}},o.inherits(n,r),o.mixin(n,s),t.exports=n},function(t,e){var i=function(t){this.colorStops=t||[]};i.prototype={constructor:i,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=i},function(t,e,i){function n(t){var e={componentType:t.mainType};return e[t.mainType+"Index"]=t.componentIndex,e}function o(t,e,i,n){var o,a,r=f(i-t.rotation),s=n[0]>n[1],l="start"===e&&!s||"start"!==e&&s;return p(r-x/2)?(a=l?"bottom":"top",o="center"):p(r-1.5*x)?(a=l?"top":"bottom",o="center"):(a="middle",o=r<1.5*x&&r>x/2?l?"left":"right":l?"right":"left"),{rotation:r,textAlign:o,textVerticalAlign:a}}function a(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function r(t,e){var i=t.get("axisLabel.showMinLabel"),n=t.get("axisLabel.showMaxLabel"),o=e[0],a=e[1],r=e[e.length-1],l=e[e.length-2];i===!1?o.ignore=!0:null!=t.getMin()&&s(o,a)&&(i?a.ignore=!0:o.ignore=!0),n===!1?r.ignore=!0:null!=t.getMax()&&s(l,r)&&(n?l.ignore=!0:r.ignore=!0)}function s(t,e,i){var n=t&&t.getBoundingRect().clone(),o=e&&e.getBoundingRect().clone();if(n&&o){var a=m.identity([]);return m.rotate(a,a,-t.rotation),n.applyTransform(m.mul([],a,t.getLocalTransform())),o.applyTransform(m.mul([],a,e.getLocalTransform())),n.intersect(o)}}var l=i(1),u=i(7),c=i(3),h=i(10),d=i(4),f=d.remRadian,p=d.isRadianAroundZero,g=i(5),m=i(19),v=g.applyTransform,y=l.retrieve,x=Math.PI,_=function(t,e){this.opt=e,this.axisModel=t,l.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new c.Group;var i=new c.Group({position:e.position.slice(),rotation:e.rotation});i.updateTransform(),this._transform=i.transform,this._dumbGroup=i};_.prototype={constructor:_,hasBuilder:function(t){return!!b[t]},add:function(t){b[t].call(this)},getGroup:function(){return this.group}};var b={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var i=this.axisModel.axis.getExtent(),n=this._transform,o=[i[0],0],a=[i[1],0];n&&(v(o,o,n),v(a,a,n)),this.group.add(new c.Line(c.subPixelOptimizeLine({anid:"line",shape:{x1:o[0],y1:o[1],x2:a[0],y2:a[1]},style:l.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})))}},axisTick:function(){var t=this.axisModel,e=t.axis;if(t.get("axisTick.show")&&!e.scale.isBlank())for(var i=t.getModel("axisTick"),n=this.opt,o=i.getModel("lineStyle"),a=i.get("length"),r=M(i,n.labelInterval),s=e.getTicksCoords(i.get("alignWithLabel")),u=e.scale.getTicks(),h=[],d=[],f=this._transform,p=0;p<s.length;p++)if(!S(e,p,r)){var g=s[p];h[0]=g,h[1]=0,d[0]=g,d[1]=n.tickDirection*a,f&&(v(h,h,f),v(d,d,f)),this.group.add(new c.Line(c.subPixelOptimizeLine({anid:"tick_"+u[p],shape:{x1:h[0],y1:h[1],x2:d[0],y2:d[1]},style:l.defaults(o.getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")}),z2:2,silent:!0})))}},axisLabel:function(){var t=this.opt,e=this.axisModel,i=e.axis,o=y(t.axisLabelShow,e.get("axisLabel.show"));if(o&&!i.scale.isBlank()){var s=e.getModel("axisLabel"),u=s.getModel("textStyle"),d=s.get("margin"),f=i.scale.getTicks(),p=e.getFormattedLabels(),g=(y(t.labelRotate,s.get("rotate"))||0)*x/180,m=w(t.rotation,g,t.labelDirection),v=e.get("data"),_=[],b=a(e),M=e.get("triggerEvent");l.each(f,function(o,a){if(!S(i,a,t.labelInterval)){var r=u;v&&v[o]&&v[o].textStyle&&(r=new h(v[o].textStyle,u,e.ecModel));var s=r.getTextColor()||e.get("axisLine.lineStyle.color"),l=i.dataToCoord(o),f=[l,t.labelOffset+t.labelDirection*d],g=i.scale.getLabel(o),y=new c.Text({anid:"label_"+o,style:{text:p[a],textAlign:r.get("align",!0)||m.textAlign,textVerticalAlign:r.get("baseline",!0)||m.textVerticalAlign,textFont:r.getFont(),fill:"function"==typeof s?s("category"===i.type?g:"value"===i.type?o+"":o,a):s},position:f,rotation:m.rotation,silent:b,z2:10});M&&(y.eventData=n(e),y.eventData.targetType="axisLabel",y.eventData.value=g),this._dumbGroup.add(y),y.updateTransform(),_.push(y),this.group.add(y),y.decomposeTransform()}},this),r(e,_)}},axisName:function(){var t=this.opt,e=this.axisModel,i=y(t.axisName,e.get("name"));if(i){var r,s=e.get("nameLocation"),h=t.nameDirection,d=e.getModel("nameTextStyle"),f=e.get("nameGap")||0,p=this.axisModel.axis.getExtent(),g=p[0]>p[1]?-1:1,m=["start"===s?p[0]-g*f:"end"===s?p[1]+g*f:(p[0]+p[1])/2,"middle"===s?t.labelOffset+h*f:0],v=e.get("nameRotate");null!=v&&(v=v*x/180);var _;"middle"===s?r=w(t.rotation,null!=v?v:t.rotation,h):(r=o(t,s,v||0,p),_=t.axisNameAvailableWidth,null!=_&&(_=Math.abs(_/Math.sin(r.rotation)),!isFinite(_)&&(_=null)));var b=d.getFont(),S=e.get("nameTruncate",!0)||{},M=S.ellipsis,I=y(t.nameTruncateMaxWidth,S.maxWidth,_),T=null!=M&&null!=I?u.truncateText(i,I,b,M,{minChar:2,placeholder:S.placeholder}):i,A=e.get("tooltip",!0),C=e.mainType,L={componentType:C,name:i,$vars:["name"]};L[C+"Index"]=e.componentIndex;var D=new c.Text({anid:"name",__fullText:i,__truncatedText:T,style:{text:T,textFont:b,fill:d.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:r.textAlign,textVerticalAlign:r.textVerticalAlign},position:m,rotation:r.rotation,silent:a(e),z2:1,tooltip:A&&A.show?l.extend({content:i,formatter:function(){return i},formatterParams:L},A):null});e.get("triggerEvent")&&(D.eventData=n(e),D.eventData.targetType="axisName",D.eventData.name=i),this._dumbGroup.add(D),D.updateTransform(),this.group.add(D),D.decomposeTransform()}}},w=_.innerTextLayout=function(t,e,i){var n,o,a=f(e-t);return p(a)?(o=i>0?"top":"bottom",n="center"):p(a-x)?(o=i>0?"bottom":"top",n="center"):(o="middle",n=a>0&&a<x?i>0?"right":"left":i>0?"left":"right"),{rotation:a,textAlign:n,textVerticalAlign:o}},S=_.ifIgnoreOnTick=function(t,e,i){var n,o=t.scale;return"ordinal"===o.type&&("function"==typeof i?(n=o.getTicks()[e],!i(n,o.getLabel(n))):e%(i+1))},M=_.getInterval=function(t,e){var i=t.get("interval");return null!=i&&"auto"!=i||(i=e),i};t.exports=_},function(t,e,i){function n(t,e,i,n,s,l){var u=r.getAxisPointerClass(t.axisPointerClass);if(u){var c=a.getAxisPointerModel(e);c?(t._axisPointer||(t._axisPointer=new u)).render(e,c,n,l):o(t,n)}}function o(t,e,i){var n=t._axisPointer;n&&n.dispose(e,i),t._axisPointer=null}var a=i(45),r=i(2).extendComponentView({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,i,o){this.axisPointerClass&&a.fixValue(t),r.superApply(this,"render",arguments),n(this,t,e,i,o,!0)},updateAxisPointer:function(t,e,i,o,a){n(this,t,e,i,o,!1)},remove:function(t,e){var i=this._axisPointer;i&&i.remove(e),r.superApply(this,"remove",arguments)},dispose:function(t,e){o(this,e),r.superApply(this,"dispose",arguments)}}),s=[];r.registerAxisPointerClass=function(t,e){s[t]=e},r.getAxisPointerClass=function(t){return t&&s[t]},t.exports=r},function(t,e,i){function n(t){return o.isObject(t)&&null!=t.value?t.value:t}var o=i(1),a=i(17);t.exports={getFormattedLabels:function(){return a.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))},getCategories:function(){return"category"===this.get("type")&&o.map(this.get("data"),n)},getMin:function(t){var e=this.option,i=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=i&&"dataMin"!==i&&!o.eqNaN(i)&&(i=this.axis.scale.parse(i)),i},getMax:function(t){var e=this.option,i=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=i&&"dataMax"!==i&&!o.eqNaN(i)&&(i=this.axis.scale.parse(i)),i},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:o.noop,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}}},function(t,e,i){var n=i(4),o=i(7),a=i(34),r=i(63),s=n.round,l=a.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e));
-},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),l.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval||this.niceTicks(),this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){return this._interval||this.niceTicks(),r.intervalScaleGetTicks(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},getLabel:function(t,e){if(null==t)return"";var i=e&&e.precision;return null==i?i=n.getPrecisionSafe(t)||0:"auto"===i&&(i=this._intervalPrecision),t=s(t,i,!0),o.addCommas(t)},niceTicks:function(t){t=t||5;var e=this._extent,i=e[1]-e[0];if(isFinite(i)){i<0&&(i=-i,e.reverse());var n=r.intervalScaleNiceTicks(e,t);this._intervalPrecision=n.intervalPrecision,this._interval=n.interval,this._niceExtent=n.niceTickExtent}},niceExtent:function(t,e,i){var n=this._extent;if(n[0]===n[1])if(0!==n[0]){var o=n[0];i?n[0]-=o/2:(n[1]+=o/2,n[0]-=o/2)}else n[1]=1;var a=n[1]-n[0];isFinite(a)||(n[0]=0,n[1]=1),this.niceTicks(t);var r=this._interval;e||(n[0]=s(Math.floor(n[0]/r)*r)),i||(n[1]=s(Math.ceil(n[1]/r)*r))}});l.create=function(){return new l},t.exports=l},function(t,e,i){function n(t){this.group=new a.Group,this._symbolCtor=t||r}function o(t,e,i){var n=t.getItemLayout(e);return n&&!isNaN(n[0])&&!isNaN(n[1])&&!(i&&i(e))&&"none"!==t.getItemVisual(e,"symbol")}var a=i(3),r=i(54),s=n.prototype;s.updateData=function(t,e){var i=this.group,n=t.hostModel,r=this._data,s=this._symbolCtor,l={itemStyle:n.getModel("itemStyle.normal").getItemStyle(["color"]),hoverItemStyle:n.getModel("itemStyle.emphasis").getItemStyle(),symbolRotate:n.get("symbolRotate"),symbolOffset:n.get("symbolOffset"),hoverAnimation:n.get("hoverAnimation"),labelModel:n.getModel("label.normal"),hoverLabelModel:n.getModel("label.emphasis")};t.diff(r).add(function(n){var a=t.getItemLayout(n);if(o(t,n,e)){var r=new s(t,n,l);r.attr("position",a),t.setItemGraphicEl(n,r),i.add(r)}}).update(function(u,c){var h=r.getItemGraphicEl(c),d=t.getItemLayout(u);return o(t,u,e)?(h?(h.updateData(t,u,l),a.updateProps(h,{position:d},n)):(h=new s(t,u),h.attr("position",d)),i.add(h),void t.setItemGraphicEl(u,h)):void i.remove(h)}).remove(function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut(function(){i.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,i){var n=t.getItemLayout(i);e.attr("position",n)})},s.remove=function(t){var e=this.group,i=this._data;i&&(t?i.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=n},function(t,e,i){function n(t,e,i){var n=e.getComponent("tooltip"),a=e.getComponent("axisPointer"),s=a.get("link",!0)||[],u=[];h(i.getCoordinateSystems(),function(i){function c(n,c,h){var d=h.model.getModel("axisPointer",a),f=d.get("show");if(f&&("auto"!==f||n||l(d))){null==c&&(c=d.get("triggerTooltip")),d=n?o(h,v,a,e,n,c):d;var m=d.get("snap"),y=p(h.model),x=c||m||"category"===h.type,_=t.axesInfo[y]={key:y,axis:h,coordSys:i,axisPointerModel:d,triggerTooltip:c,involveSeries:x,snap:m,useHandle:l(d),seriesModels:[]};g[y]=_,t.seriesInvolved|=x;var b=r(s,h);if(null!=b){var w=u[b]||(u[b]={axesInfo:{}});w.axesInfo[y]=_,w.mapper=s[b].mapper,_.linkGroup=w}}}if(i.axisPointerEnabled){var f=p(i.model),g=t.coordSysAxesInfo[f]={};t.coordSysMap[f]=i;var m=i.model,v=m.getModel("tooltip",n);if(h(i.getAxes(),d(c,!1,null)),i.getTooltipAxes&&n&&v.get("show")){var y="axis"===v.get("trigger"),x="cross"===v.get("axisPointer.type"),_=i.getTooltipAxes(v.get("axisPointer.axis"));(y||x)&&h(_.baseAxes,d(c,!x||"cross",y)),x&&h(_.otherAxes,d(c,"cross",!1))}}})}function o(t,e,i,n,o,a){var r=e.getModel("axisPointer"),s={};h(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(t){s[t]=u.clone(r.get(t))}),s.snap="category"!==t.type&&!!a,"cross"===r.get("type")&&(s.type="line");var l=s.label||(s.label={});if(null==l.show&&(l.show=!1),"cross"===o&&(l.show=!0,!a)){var d=s.lineStyle=r.get("crossStyle");d&&u.defaults(l.textStyle||(l.textStyle={}),d.textStyle)}return t.model.getModel("axisPointer",new c(s,i,n))}function a(t,e){e.eachSeries(function(e){var i=e.coordinateSystem,n=e.get("tooltip.trigger",!0);i&&"none"!==n&&n!==!1&&"item"!==n&&e.get("axisPointer.show",!0)!==!1&&h(t.coordSysAxesInfo[p(i.model)],function(t){var n=t.axis;i.getAxis(n.dim)===n&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())})},this)}function r(t,e){for(var i=e.model,n=e.dim,o=0;o<t.length;o++){var a=t[o]||{};if(s(a[n+"AxisId"],i.id)||s(a[n+"AxisIndex"],i.componentIndex)||s(a[n+"AxisName"],i.name))return o}}function s(t,e){return"all"===t||u.isArray(t)&&u.indexOf(t,e)>=0||t===e}function l(t){return!!t.get("handle.show")}var u=i(1),c=i(10),h=u.each,d=u.curry,f={};f.collect=function(t,e){var i={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return n(i,t,e),i.seriesInvolved&&a(i,t),i},f.fixValue=function(t){var e=f.getAxisInfo(t);if(e){var i=e.axisPointerModel,n=e.axis.scale,o=i.option,a=i.get("status"),r=i.get("value");null!=r&&(r=n.parse(r));var s=l(i);null==a&&(o.status=s?"show":"hide");var u=n.getExtent().slice();u[0]>u[1]&&u.reverse(),(null==r||r>u[1])&&(r=u[1]),r<u[0]&&(r=u[0]),o.value=r,s&&(o.status=e.axis.scale.isBlank()?"hide":"show")}},f.getAxisInfo=function(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[p(t)]},f.getAxisPointerModel=function(t){var e=f.getAxisInfo(t);return e&&e.axisPointerModel};var p=f.makeKey=function(t){return t.type+"||"+t.id};t.exports=f},function(t,e,i){function n(t){var e={};return h(["start","end","startValue","endValue","throttle"],function(i){t.hasOwnProperty(i)&&(e[i]=t[i])}),e}function o(t,e){h([["start","startValue"],["end","endValue"]],function(i,n){var o=t._rangePropMode;null!=e[i[0]]?o[n]="percent":null!=e[i[1]]&&(o[n]="value")})}var a=i(1),r=i(9),s=i(2),l=i(6),u=i(76),c=i(198),h=a.each,d=u.eachAxisDim,f=s.extendComponentModel({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var o=n(t);this.mergeDefaultAndTheme(t,i),this.doInit(o)},mergeOption:function(t){var e=n(t);a.merge(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;r.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),o(this,t),h([["start","startValue"],["end","endValue"]],function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,i,n,o){var a=this.dependentModels[e.axis][i],r=a.__dzAxisProxy||(a.__dzAxisProxy=new c(e.name,i,this,o));t[e.name+"_"+i]=r},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();d(function(e){var i=e.axisIndex;t[i]=l.normalizeToArray(t[i])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;d(function(i){null!=t[i.axisIndex]&&(e=!0)},this);var i=t.orient;return null==i&&e?"orient":e?void 0:(null==i&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),i=this.option,n=this.dependentModels;if(t){var o="vertical"===e?"y":"x";n[o+"Axis"].length?(i[o+"AxisIndex"]=[0],t=!1):h(n.singleAxis,function(n){t&&n.get("orient",!0)===e&&(i.singleAxisIndex=[n.componentIndex],t=!1)})}t&&d(function(e){if(t){var n=[],o=this.dependentModels[e.axis];if(o.length&&!n.length)for(var a=0,r=o.length;a<r;a++)"category"===o[a].get("type")&&n.push(a);i[e.axisIndex]=n,n.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&d(function(e){var n=i[e.axisIndex],o=t.get(e.axisIndex),r=t.get(e.axisId),s=t.ecModel.queryComponents({mainType:e.axis,index:o,id:r})[0];o=s.componentIndex,a.indexOf(n,o)<0&&n.push(o)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var i=!0;return d(function(n){var o=t.get(n.axisIndex),a=this.dependentModels[n.axis][o];a&&a.get("type")===e||(i=!1)},this),i},_setDefaultThrottle:function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var t;return d(function(e){if(null==t){var i=this.get(e.axisIndex);i.length&&(t=this.dependentModels[e.axis][i[0]])}},this),t},eachTargetAxis:function(t,e){var i=this.ecModel;d(function(n){h(this.get(n.axisIndex),function(o){t.call(e,n,o,this,i)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},getAxisModel:function(t,e){var i=this.getAxisProxy(t,e);return i&&i.getAxisModel()},setRawRange:function(t,e){h(["start","end","startValue","endValue"],function(e){this.option[e]=t[e]},this),!e&&o(this,t)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var i=this.findRepresentativeAxisProxy();return i?i.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(){var t=this._axisProxies;for(var e in t)if(t.hasOwnProperty(e)&&t[e].hostedBy(this))return t[e];for(var e in t)if(t.hasOwnProperty(e)&&!t[e].hostedBy(this))return t[e]},getRangePropMode:function(){return this._rangePropMode.slice()}});t.exports=f},function(t,e,i){var n=i(64);t.exports=n.extend({type:"dataZoom",render:function(t,e,i,n){this.dataZoomModel=t,this.ecModel=e,this.api=i},getTargetCoordInfo:function(){function t(t,e,i,n){for(var o,a=0;a<i.length;a++)if(i[a].model===t){o=i[a];break}o||i.push(o={model:t,axisModels:[],coordIndex:n}),o.axisModels.push(e)}var e=this.dataZoomModel,i=this.ecModel,n={};return e.eachTargetAxis(function(e,o){var a=i.getComponent(e.axis,o);if(a){var r=a.getCoordSysModel();r&&t(r,a,n[r.mainType]||(n[r.mainType]=[]),r.componentIndex)}},this),n}})},function(t,e){"use strict";function i(t){return t}function n(t,e,n,o){this._old=t,this._new=e,this._oldKeyGetter=n||i,this._newKeyGetter=o||i}function o(t,e,i,n){for(var o=0;o<t.length;o++){var a=n(t[o],o),r=e[a];null==r?(i.push(a),e[a]=o):(r.length||(e[a]=r=[r]),r.push(o))}}n.prototype={constructor:n,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,i=this._new,n=this._oldKeyGetter,a=this._newKeyGetter,r={},s={},l=[],u=[];for(o(e,r,l,n),o(i,s,u,a),t=0;t<e.length;t++){var c=l[t],h=s[c];if(null!=h){var d=h.length;d?(1===d&&(s[c]=null),h=h.unshift()):s[c]=null,this._update&&this._update(h,t)}else this._remove&&this._remove(t)}for(var t=0;t<u.length;t++){var c=u[t];if(s.hasOwnProperty(c)){var h=s[c];if(null==h)continue;if(h.length)for(var f=0,d=h.length;f<d;f++)this._add&&this._add(h[f]);else this._add&&this._add(h)}}}},t.exports=n},function(t,e,i){var n=i(1),o=i(15),a=o.parseClassType,r=0,s={},l="_";s.getUID=function(t){return[t||"",r++,Math.random()].join(l)},s.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,i){t=a(t),e[t.main]=i},t.determineSubType=function(i,n){var o=n.type;if(!o){var r=a(i).main;t.hasSubTypes(i)&&e[r]&&(o=e[r](n))}return o},t},s.enableTopologicalTravel=function(t,e){function i(t){var i={},r=[];return n.each(t,function(s){var l=o(i,s),u=l.originalDeps=e(s),c=a(u,t);l.entryCount=c.length,0===l.entryCount&&r.push(s),n.each(c,function(t){n.indexOf(l.predecessor,t)<0&&l.predecessor.push(t);var e=o(i,t);n.indexOf(e.successor,t)<0&&e.successor.push(s)})}),{graph:i,noEntryList:r}}function o(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function a(t,e){var i=[];return n.each(t,function(t){n.indexOf(e,t)>=0&&i.push(t)}),i}t.topologicalTravel=function(t,e,o,a){function r(t){u[t].entryCount--,0===u[t].entryCount&&c.push(t)}function s(t){h[t]=!0,r(t)}if(t.length){var l=i(e),u=l.graph,c=l.noEntryList,h={};for(n.each(t,function(t){h[t]=!0});c.length;){var d=c.pop(),f=u[d],p=!!h[d];p&&(o.call(a,d,f.originalDeps.slice()),delete h[d]),n.each(f.successor,p?s:r)}n.each(h,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){t.exports=function(t,e,i,n,o){n.eachRawSeriesByType(t,function(t){var o=t.getData(),a=t.get("symbol")||e,r=t.get("symbolSize");o.setVisual({legendSymbol:i||a,symbol:a,symbolSize:r}),n.isSeriesFiltered(t)||("function"==typeof r&&o.each(function(e){var i=t.getRawValue(e),n=t.getDataParams(e);o.setItemVisual(e,"symbolSize",r(i,n))}),o.each(function(t){var e=o.getItemModel(t),i=e.getShallow("symbol",!0),n=e.getShallow("symbolSize",!0);null!=i&&o.setItemVisual(t,"symbol",i),null!=n&&o.setItemVisual(t,"symbolSize",n)}))})}},function(t,e){function i(t){for(var e=0;t>=c;)e|=1&t,t>>=1;return t+e}function n(t,e,i,n){var a=e+1;if(a===i)return 1;if(n(t[a++],t[e])<0){for(;a<i&&n(t[a],t[a-1])<0;)a++;o(t,e,a)}else for(;a<i&&n(t[a],t[a-1])>=0;)a++;return a-e}function o(t,e,i){for(i--;e<i;){var n=t[e];t[e++]=t[i],t[i--]=n}}function a(t,e,i,n,o){for(n===e&&n++;n<i;n++){for(var a,r=t[n],s=e,l=n;s<l;)a=s+l>>>1,o(r,t[a])<0?l=a:s=a+1;var u=n-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=r}}function r(t,e,i,n,o,a){var r=0,s=0,l=1;if(a(t,e[i+o])>0){for(s=n-o;l<s&&a(t,e[i+o+l])>0;)r=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),r+=o,l+=o}else{for(s=o+1;l<s&&a(t,e[i+o-l])<=0;)r=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=r;r=o-l,l=o-u}for(r++;r<l;){var c=r+(l-r>>>1);a(t,e[i+c])>0?r=c+1:l=c}return l}function s(t,e,i,n,o,a){var r=0,s=0,l=1;if(a(t,e[i+o])<0){for(s=o+1;l<s&&a(t,e[i+o-l])<0;)r=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=r;r=o-l,l=o-u}else{for(s=n-o;l<s&&a(t,e[i+o+l])>=0;)r=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),r+=o,l+=o}for(r++;r<l;){var c=r+(l-r>>>1);a(t,e[i+c])<0?l=c:r=c+1}return l}function l(t,e){function i(t,e){c[y]=t,f[y]=e,y+=1}function n(){for(;y>1;){var t=y-2;if(t>=1&&f[t-1]<=f[t]+f[t+1]||t>=2&&f[t-2]<=f[t]+f[t-1])f[t-1]<f[t+1]&&t--;else if(f[t]>f[t+1])break;a(t)}}function o(){for(;y>1;){var t=y-2;t>0&&f[t-1]<f[t+1]&&t--,a(t)}}function a(i){var n=c[i],o=f[i],a=c[i+1],h=f[i+1];f[i]=o+h,i===y-3&&(c[i+1]=c[i+2],f[i+1]=f[i+2]),y--;var d=s(t[a],t,n,o,0,e);n+=d,o-=d,0!==o&&(h=r(t[n+o-1],t,a,h,h-1,e),0!==h&&(o<=h?l(n,o,a,h):u(n,o,a,h)))}function l(i,n,o,a){var l=0;for(l=0;l<n;l++)x[l]=t[i+l];var u=0,c=o,d=i;if(t[d++]=t[c++],0!==--a){if(1===n){for(l=0;l<a;l++)t[d+l]=t[c+l];return void(t[d+a]=x[u])}for(var f,g,m,v=p;;){f=0,g=0,m=!1;do if(e(t[c],x[u])<0){if(t[d++]=t[c++],g++,f=0,0===--a){m=!0;break}}else if(t[d++]=x[u++],f++,g=0,1===--n){m=!0;break}while((f|g)<v);if(m)break;do{if(f=s(t[c],x,u,n,0,e),0!==f){for(l=0;l<f;l++)t[d+l]=x[u+l];if(d+=f,u+=f,n-=f,n<=1){m=!0;break}}if(t[d++]=t[c++],0===--a){m=!0;break}if(g=r(x[u],t,c,a,0,e),0!==g){for(l=0;l<g;l++)t[d+l]=t[c+l];if(d+=g,c+=g,a-=g,0===a){m=!0;break}}if(t[d++]=x[u++],1===--n){m=!0;break}v--}while(f>=h||g>=h);if(m)break;v<0&&(v=0),v+=2}if(p=v,p<1&&(p=1),1===n){for(l=0;l<a;l++)t[d+l]=t[c+l];t[d+a]=x[u]}else{if(0===n)throw new Error;for(l=0;l<n;l++)t[d+l]=x[u+l]}}else for(l=0;l<n;l++)t[d+l]=x[u+l]}function u(i,n,o,a){var l=0;for(l=0;l<a;l++)x[l]=t[o+l];var u=i+n-1,c=a-1,d=o+a-1,f=0,g=0;if(t[d--]=t[u--],0!==--n){if(1===a){for(d-=n,u-=n,g=d+1,f=u+1,l=n-1;l>=0;l--)t[g+l]=t[f+l];return void(t[d]=x[c])}for(var m=p;;){var v=0,y=0,_=!1;do if(e(x[c],t[u])<0){if(t[d--]=t[u--],v++,y=0,0===--n){_=!0;break}}else if(t[d--]=x[c--],y++,v=0,1===--a){_=!0;break}while((v|y)<m);if(_)break;do{if(v=n-s(x[c],t,i,n,n-1,e),0!==v){for(d-=v,u-=v,n-=v,g=d+1,f=u+1,l=v-1;l>=0;l--)t[g+l]=t[f+l];if(0===n){_=!0;break}}if(t[d--]=x[c--],1===--a){_=!0;break}if(y=a-r(t[u],x,0,a,a-1,e),0!==y){for(d-=y,c-=y,a-=y,g=d+1,f=c+1,l=0;l<y;l++)t[g+l]=x[f+l];if(a<=1){_=!0;break}}if(t[d--]=t[u--],0===--n){_=!0;break}m--}while(v>=h||y>=h);if(_)break;m<0&&(m=0),m+=2}if(p=m,p<1&&(p=1),1===a){for(d-=n,u-=n,g=d+1,f=u+1,l=n-1;l>=0;l--)t[g+l]=t[f+l];t[d]=x[c]}else{if(0===a)throw new Error;for(f=d-(a-1),l=0;l<a;l++)t[f+l]=x[l]}}else for(f=d-(a-1),l=0;l<a;l++)t[f+l]=x[l]}var c,f,p=h,g=0,m=d,v=0,y=0;g=t.length,g<2*d&&(m=g>>>1);var x=[];v=g<120?5:g<1542?10:g<119151?19:40,c=[],f=[],this.mergeRuns=n,this.forceMergeRuns=o,this.pushRun=i}function u(t,e,o,r){o||(o=0),r||(r=t.length);var s=r-o;if(!(s<2)){var u=0;if(s<c)return u=n(t,o,r,e),void a(t,o,r,o+u,e);var h=new l(t,e),d=i(s);do{if(u=n(t,o,r,e),u<d){var f=s;f>d&&(f=d),a(t,o,o+f,o+u,e),u=f}h.pushRun(o,u),h.mergeRuns(),s-=u,o+=u}while(0!==s);h.forceMergeRuns()}}var c=32,h=7,d=256;t.exports=u},function(t,e,i){var n=i(35);t.exports=function(){if(0!==n.debugMode)if(1==n.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(n.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,i){function n(t){o.call(this,t)}var o=i(38),a=i(11),r=i(1),s=i(69),l=new s(50);n.prototype={constructor:n,type:"image",brush:function(t,e){var i,n=this.style,o=n.image;if(n.bind(t,this,e),i="string"==typeof o?this._image:o,!i&&o){var a=l.get(o);if(!a)return i=new Image,i.onload=function(){i.onload=null;for(var t=0;t<a.pending.length;t++)a.pending[t].dirty()},a={image:i,pending:[this]},i.src=o,l.put(o,a),void(this._image=i);if(i=a.image,this._image=i,!i.width||!i.height)return void a.pending.push(this)}if(i){var r=n.x||0,s=n.y||0;if(!i.width||!i.height)return;var u=n.width,c=n.height,h=i.width/i.height;if(null==u&&null!=c?u=c*h:null==c&&null!=u?c=u/h:null==u&&null==c&&(u=i.width,c=i.height),this.setTransform(t),n.sWidth&&n.sHeight){var d=n.sx||0,f=n.sy||0;t.drawImage(i,d,f,n.sWidth,n.sHeight,r,s,u,c)}else if(n.sx&&n.sy){var d=n.sx,f=n.sy,p=u-d,g=c-f;t.drawImage(i,d,f,p,g,r,s,u,c)}else t.drawImage(i,r,s,u,c);this.restoreTransform(t),null!=n.text&&this.drawRectText(t,this.getBoundingRect())}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new a(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},r.inherits(n,o),t.exports=n},function(t,e,i){function n(t,e){var i=t.getItemVisual(e,"symbolSize");return i instanceof Array?i.slice():[+i,+i]}function o(t){return[t[0]/2,t[1]/2]}function a(t,e,i){u.Group.call(this),this.updateData(t,e,i)}function r(t,e){this.parent.drift(t,e)}var s=i(1),l=i(24),u=i(3),c=i(4),h=a.prototype;h._createSymbol=function(t,e,i,n){this.removeAll();var a=e.hostModel,s=e.getItemVisual(i,"color"),c=l.createSymbol(t,-1,-1,2,2,s);c.attr({z2:100,culling:!0,scale:[0,0]}),c.drift=r,u.initProps(c,{scale:o(n)},a,i),this._symbolType=t,this.add(c)},h.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},h.getSymbolPath=function(){return this.childAt(0)},h.getScale=function(){return this.childAt(0).scale},h.highlight=function(){this.childAt(0).trigger("emphasis")},h.downplay=function(){this.childAt(0).trigger("normal")},h.setZ=function(t,e){var i=this.childAt(0);i.zlevel=t,i.z=e},h.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},h.updateData=function(t,e,i){this.silent=!1;var a=t.getItemVisual(e,"symbol")||"circle",r=t.hostModel,s=n(t,e);if(a!==this._symbolType)this._createSymbol(a,t,e,s);else{var l=this.childAt(0);l.silent=!1,u.updateProps(l,{scale:o(s)},r,e)}this._updateCommon(t,e,s,i),this._seriesModel=r};var d=["itemStyle","normal"],f=["itemStyle","emphasis"],p=["label","normal"],g=["label","emphasis"];h._updateCommon=function(t,e,i,n){var a=this.childAt(0),r=t.hostModel,l=t.getItemVisual(e,"color");"image"!==a.type&&a.useStyle({strokeNoScale:!0}),n=n||null;var h=n&&n.itemStyle,m=n&&n.hoverItemStyle,v=n&&n.symbolRotate,y=n&&n.symbolOffset,x=n&&n.labelModel,_=n&&n.hoverLabelModel,b=n&&n.hoverAnimation;if(!n||t.hasItemOption){var w=t.getItemModel(e);h=w.getModel(d).getItemStyle(["color"]),m=w.getModel(f).getItemStyle(),v=w.getShallow("symbolRotate"),y=w.getShallow("symbolOffset"),x=w.getModel(p),_=w.getModel(g),b=w.getShallow("hoverAnimation")}else m=s.extend({},m);var S=a.style;a.attr("rotation",(v||0)*Math.PI/180||0),y&&a.attr("position",[c.parsePercent(y[0],i[0]),c.parsePercent(y[1],i[1])]),a.setColor(l),a.setStyle(h);var M=t.getItemVisual(e,"opacity");null!=M&&(S.opacity=M);for(var I,T,A=t.dimensions.slice();A.length&&(I=A.pop(),T=t.getDimensionInfo(I).type,"ordinal"===T||"time"===T););null!=I&&x.getShallow("show")?(u.setText(S,x,l),S.text=s.retrieve(r.getFormattedLabel(e,"normal"),t.get(I,e))):S.text="",null!=I&&_.getShallow("show")?(u.setText(m,_,l),m.text=s.retrieve(r.getFormattedLabel(e,"emphasis"),t.get(I,e))):m.text="",a.off("mouseover").off("mouseout").off("emphasis").off("normal"),a.hoverStyle=m,u.setHoverStyle(a);var C=o(i);if(b&&r.isAnimationEnabled()){var L=function(){var t=C[1]/C[0];this.animateTo({scale:[Math.max(1.1*C[0],C[0]+3),Math.max(1.1*C[1],C[1]+3*t)]},400,"elasticOut")},D=function(){this.animateTo({scale:C},400,"elasticOut")};a.on("mouseover",L).on("mouseout",D).on("emphasis",L).on("normal",D)}},h.fadeOut=function(t){var e=this.childAt(0);this.silent=e.silent=!0,e.style.text="",u.updateProps(e,{scale:[0,0]},this._seriesModel,this.dataIndex,t)},s.inherits(a,u.Group),t.exports=a},function(t,e,i){var n=i(2),o=i(45),a=i(196),r=i(1);i(194),i(195),i(119),n.registerPreprocessor(function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!r.isArray(e)&&(t.axisPointer.link=[e])}}),n.registerProcessor(n.PRIORITY.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=o.collect(t,e)}),n.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,i){var n=a(e.getComponent("axisPointer").coordSysAxesInfo,t.currTrigger,[t.x,t.y],t,t.dispatchAction||r.bind(i.dispatchAction,i),e,i,t.tooltipOption,t.highDownKey);return n})},function(t,e,i){function n(t,e,i){return t.getCoordSysModel()===e}function o(t){var e,i=t.model,n=i.getFormattedLabels(),o=i.getModel("axisLabel.textStyle"),a=1,r=n.length;r>40&&(a=Math.ceil(r/40));for(var s=0;s<r;s+=a)if(!t.isLabelIgnored(s)){var l=o.getTextRect(n[s]);e?e.union(l):e=l}return e}function a(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this.model=t}function r(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return n-t+e}}function s(t,e){return h.map(y,function(e){var i=t.getReferringComponents(e)[0];return i})}function l(t){return"cartesian2d"===t.get("coordinateSystem")}var u=i(12),c=i(17),h=i(1),d=i(132),f=i(130),p=h.each,g=c.ifAxisCrossZero,m=c.niceScaleExtent;i(133);var v=a.prototype;v.type="grid",v.axisPointerEnabled=!0,v.getRect=function(){return this._rect},v.update=function(t,e){function i(t){var e=n[t];for(var i in e)if(e.hasOwnProperty(i)){var o=e[i];if(o&&("category"===o.type||!g(o)))return!0}return!1}var n=this._axesMap;this._updateScale(t,this.model),p(n.x,function(t){m(t.scale,t.model)}),p(n.y,function(t){m(t.scale,t.model)}),p(n.x,function(t){i("y")&&(t.onZero=!1)}),p(n.y,function(t){i("x")&&(t.onZero=!1)}),this.resize(this.model,e)},v.resize=function(t,e){function i(){p(a,function(t){var e=t.isHorizontal(),i=e?[0,n.width]:[0,n.height],o=t.inverse?1:0;t.setExtent(i[o],i[1-o]),r(t,e?n.x:n.y)})}var n=u.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=n;var a=this._axesList;i(),t.get("containLabel")&&(p(a,function(t){if(!t.model.get("axisLabel.inside")){var e=o(t);if(e){var i=t.isHorizontal()?"height":"width",a=t.model.get("axisLabel.margin");n[i]-=e[i]+a,"top"===t.position?n.y+=e.height+a:"left"===t.position&&(n.x+=e.width+a)}}}),i())},v.getAxis=function(t,e){var i=this._axesMap[t];if(null!=i){if(null==e)for(var n in i)if(i.hasOwnProperty(n))return i[n];return i[e]}},v.getAxes=function(){return this._axesList.slice()},v.getCartesian=function(t,e){if(null!=t&&null!=e){var i="x"+t+"y"+e;return this._coordsMap[i]}h.isObject(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var n=0,o=this._coordsList;n<o.length;n++)if(o[n].getAxis("x").index===t||o[n].getAxis("y").index===e)return o[n]},v.getCartesians=function(){return this._coordsList.slice()},v.convertToPixel=function(t,e,i){var n=this._findConvertTarget(t,e);return n.cartesian?n.cartesian.dataToPoint(i):n.axis?n.axis.toGlobalCoord(n.axis.dataToCoord(i)):null},v.convertFromPixel=function(t,e,i){var n=this._findConvertTarget(t,e);return n.cartesian?n.cartesian.pointToData(i):n.axis?n.axis.coordToData(n.axis.toLocalCoord(i)):null},v._findConvertTarget=function(t,e){var i,n,o=e.seriesModel,a=e.xAxisModel||o&&o.getReferringComponents("xAxis")[0],r=e.yAxisModel||o&&o.getReferringComponents("yAxis")[0],s=e.gridModel,l=this._coordsList;if(o)i=o.coordinateSystem,h.indexOf(l,i)<0&&(i=null);else if(a&&r)i=this.getCartesian(a.componentIndex,r.componentIndex);else if(a)n=this.getAxis("x",a.componentIndex);else if(r)n=this.getAxis("y",r.componentIndex);else if(s){var u=s.coordinateSystem;u===this&&(i=this._coordsList[0])}return{cartesian:i,axis:n}},v.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},v._initCartesian=function(t,e,i){function o(i){return function(o,l){if(n(o,t,e)){var u=o.get("position");"x"===i?"top"!==u&&"bottom"!==u&&(u="bottom",a[u]&&(u="top"===u?"bottom":"top")):"left"!==u&&"right"!==u&&(u="left",a[u]&&(u="left"===u?"right":"left")),a[u]=!0;var h=new f(i,c.createScaleByModel(o),[0,0],o.get("type"),u),d="category"===h.type;h.onBand=d&&o.get("boundaryGap"),h.inverse=o.get("inverse"),h.onZero=o.get("axisLine.onZero"),o.axis=h,h.model=o,h.grid=this,h.index=l,this._axesList.push(h),r[i][l]=h,s[i]++}}}var a={left:!1,right:!1,top:!1,bottom:!1},r={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",o("x"),this),e.eachComponent("yAxis",o("y"),this),s.x&&s.y?(this._axesMap=r,void p(r.x,function(e,i){p(r.y,function(n,o){var a="x"+i+"y"+o,r=new d(a);r.grid=this,r.model=t,this._coordsMap[a]=r,this._coordsList.push(r),r.addAxis(e),r.addAxis(n)},this)},this)):(this._axesMap={},void(this._axesList=[]))},v._updateScale=function(t,e){function i(t,e,i){p(i.coordDimToDataDim(e.dim),function(i){e.scale.unionExtentFromData(t,i)})}h.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(o){if(l(o)){var a=s(o,t),r=a[0],u=a[1];if(!n(r,e,t)||!n(u,e,t))return;var c=this.getCartesian(r.componentIndex,u.componentIndex),h=o.getData(),d=c.getAxis("x"),f=c.getAxis("y");"list"===h.type&&(i(h,d,o),i(h,f,o))}},this)},v.getTooltipAxes=function(t){var e=[],i=[];return p(this.getCartesians(),function(n){var o=null!=t&&"auto"!==t?n.getAxis(t):n.getBaseAxis(),a=n.getOtherAxis(o);h.indexOf(e,o)<0&&e.push(o),h.indexOf(i,a)<0&&i.push(a)}),{baseAxes:e,otherAxes:i}};var y=["xAxis","yAxis"];a.create=function(t,e){var i=[];return t.eachComponent("grid",function(n,o){var r=new a(n,t,e);r.name="grid_"+o,r.resize(n,e),n.coordinateSystem=r,i.push(r)}),t.eachSeries(function(e){if(l(e)){var i=s(e,t),n=i[0],o=i[1],a=n.getCoordSysModel(),r=a.coordinateSystem;e.coordinateSystem=r.getCartesian(n.componentIndex,o.componentIndex)}}),i},a.dimensions=a.prototype.dimensions=d.prototype.dimensions,i(26).register("cartesian2d",a),t.exports=a},function(t,e,i){"use strict";function n(t){return t>s||t<-s}var o=i(19),a=i(5),r=o.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},u=l.prototype;u.transform=null,u.needLocalTransform=function(){return n(this.rotation)||n(this.position[0])||n(this.position[1])||n(this.scale[0]-1)||n(this.scale[1]-1)},u.updateTransform=function(){var t=this.parent,e=t&&t.transform,i=this.needLocalTransform(),n=this.transform;return i||e?(n=n||o.create(),i?this.getLocalTransform(n):r(n),e&&(i?o.mul(n,t.transform,n):o.copy(n,t.transform)),this.transform=n,this.invTransform=this.invTransform||o.create(),void o.invert(this.invTransform,n)):void(n&&r(n))},u.getLocalTransform=function(t){return l.getLocalTransform(this,t)},u.setTransform=function(t){var e=this.transform,i=t.dpr||1;e?t.setTransform(i*e[0],i*e[1],i*e[2],i*e[3],i*e[4],i*e[5]):t.setTransform(i,0,0,i,0,0)},u.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var c=[];u.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(o.mul(c,t.invTransform,e),e=c);var i=e[0]*e[0]+e[1]*e[1],a=e[2]*e[2]+e[3]*e[3],r=this.position,s=this.scale;n(i-1)&&(i=Math.sqrt(i)),n(a-1)&&(a=Math.sqrt(a)),e[0]<0&&(i=-i),e[3]<0&&(a=-a),r[0]=e[4],r[1]=e[5],s[0]=i,s[1]=a,this.rotation=Math.atan2(-e[1]/a,e[0]/i)}},u.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(i=-i),[e,i]},u.transformCoordToLocal=function(t,e){var i=[t,e],n=this.invTransform;return n&&a.applyTransform(i,i,n),i},u.transformCoordToGlobal=function(t,e){var i=[t,e],n=this.transform;return n&&a.applyTransform(i,i,n),i},l.getLocalTransform=function(t,e){e=e||[],r(e);var i=t.origin,n=t.scale||[1,1],a=t.rotation||0,s=t.position||[0,0];return i&&(e[4]-=i[0],e[5]-=i[1]),o.scale(e,e,n),a&&o.rotate(e,e,a),i&&(e[4]+=i[0],e[5]+=i[1]),e[4]+=s[0],e[5]+=s[1],e},t.exports=l},function(t,e,i){var n=i(94),o=i(1),a=i(13),r=i(12),s=["value","category","time","log"];t.exports=function(t,e,i,l){o.each(s,function(a){e.extend({type:t+"Axis."+a,mergeDefaultAndTheme:function(e,n){var s=this.layoutMode,l=s?r.getLayoutParams(e):{},u=n.getTheme();o.merge(e,u.get(a+"Axis")),o.merge(e,this.getDefaultOption()),e.type=i(t,e),s&&r.mergeLayoutParam(e,l,s)},defaultOption:o.mergeAll([{},n[a+"Axis"],l],!0)})}),a.registerSubTypeDefaulter(t+"Axis",o.curry(i,t))}},function(t,e,i){"use strict";function n(t,e){return e.type||(e.data?"category":"value")}var o=i(13),a=i(1),r=i(58),s=o.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});a.merge(s.prototype,i(42));var l={offset:0};r("x",s,n,l),r("y",s,n,l),t.exports=s},function(t,e){t.exports=function(t,e){e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem;if(i){var n=i.dimensions;1===n.length?e.each(n[0],function(t,n){e.setItemLayout(n,isNaN(t)?[NaN,NaN]:i.dataToPoint(t))}):2===n.length&&e.each(n,function(t,n,o){e.setItemLayout(o,isNaN(t)||isNaN(n)?[NaN,NaN]:i.dataToPoint([t,n]))},!0)}})}},function(t,e,i){var n=i(15),o=n.set,a=n.get;t.exports={clearColorPalette:function(){o(this,"colorIdx",0),o(this,"colorNameMap",{})},getColorFromPalette:function(t,e){e=e||this;var i=a(e,"colorIdx")||0,n=a(e,"colorNameMap")||o(e,"colorNameMap",{});if(n[t])return n[t];var r=this.get("color",!0)||[];if(r.length){var s=r[i];return t&&(n[t]=s),o(e,"colorIdx",(i+1)%r.length),s}}}},function(t,e){t.exports=function(t,e){var i=e.findComponents({mainType:"legend"});i&&i.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var n=e.getName(t),o=0;o<i.length;o++)if(!i[o].isSelected(n))return!1;
-return!0},this)},this)}},function(t,e,i){function n(t,e,i){t[e]=Math.max(Math.min(t[e],i[1]),i[0])}var o=i(4),a=o.round,r={};r.intervalScaleNiceTicks=function(t,e){var i={},n=t[1]-t[0],s=i.interval=o.nice(n/e,!0),l=i.intervalPrecision=o.getPrecisionSafe(s)+2,u=i.niceTickExtent=[a(Math.ceil(t[0]/s)*s,l),a(Math.floor(t[1]/s)*s,l)];return r.fixExtent(u,t),i},r.fixExtent=function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),n(t,0,e),n(t,1,e),t[0]>t[1]&&(t[0]=t[1])},r.intervalScaleGetTicks=function(t,e,i,n){var o=[];if(!t)return o;var r=1e4;e[0]<i[0]&&o.push(e[0]);for(var s=i[0];s<=i[1]&&(o.push(s),s=a(s+t,n),s!==o[o.length-1]);)if(o.length>r)return[];return e[1]>(o.length?o[o.length-1]:i[1])&&o.push(e[1]),o},t.exports=r},function(t,e,i){var n=i(36),o=i(49),a=i(15),r=function(){this.group=new n,this.uid=o.getUID("viewComponent")};r.prototype={constructor:r,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){}};var s=r.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,i,n){},a.enableClassExtend(r),a.enableClassManagement(r,{registerWhenExtend:!0}),t.exports=r},function(t,e,i){"use strict";var n=i(70),o=i(23),a=i(57),r=i(178),s=i(1),l=function(t){a.call(this,t),o.call(this,t),r.call(this,t),this.id=t.id||n()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var i=this[t];i||(i=this[t]=[]),i[0]=e[0],i[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var i in t)t.hasOwnProperty(i)&&this.attrKV(i,t[i]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.addAnimator(e[i]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.removeAnimator(e[i]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},s.mixin(l,r),s.mixin(l,a),s.mixin(l,o),t.exports=l},function(t,e,i){function n(t,e){return t[e]}function o(t,e,i){t[e]=i}function a(t,e,i){return(e-t)*i+t}function r(t,e,i){return i>.5?e:t}function s(t,e,i,n,o){var r=t.length;if(1==o)for(var s=0;s<r;s++)n[s]=a(t[s],e[s],i);else for(var l=t[0].length,s=0;s<r;s++)for(var u=0;u<l;u++)n[s][u]=a(t[s][u],e[s][u],i)}function l(t,e,i){var n=t.length,o=e.length;if(n!==o){var a=n>o;if(a)t.length=o;else for(var r=n;r<o;r++)t.push(1===i?e[r]:x.call(e[r]))}for(var s=t[0]&&t[0].length,r=0;r<t.length;r++)if(1===i)isNaN(t[r])&&(t[r]=e[r]);else for(var l=0;l<s;l++)isNaN(t[r][l])&&(t[r][l]=e[r][l])}function u(t,e,i){if(t===e)return!0;var n=t.length;if(n!==e.length)return!1;if(1===i){for(var o=0;o<n;o++)if(t[o]!==e[o])return!1}else for(var a=t[0].length,o=0;o<n;o++)for(var r=0;r<a;r++)if(t[o][r]!==e[o][r])return!1;return!0}function c(t,e,i,n,o,a,r,s,l){var u=t.length;if(1==l)for(var c=0;c<u;c++)s[c]=h(t[c],e[c],i[c],n[c],o,a,r);else for(var d=t[0].length,c=0;c<u;c++)for(var f=0;f<d;f++)s[c][f]=h(t[c][f],e[c][f],i[c][f],n[c][f],o,a,r)}function h(t,e,i,n,o,a,r){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*r+(-3*(e-i)-2*s-l)*a+s*o+e}function d(t){if(y(t)){var e=t.length;if(y(t[0])){for(var i=[],n=0;n<e;n++)i.push(x.call(t[n]));return i}return x.call(t)}return t}function f(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t,e,i,n,o){var d=t._getter,p=t._setter,v="spline"===e,x=n.length;if(x){var _,b=n[0].value,w=y(b),S=!1,M=!1,I=w&&y(b[0])?2:1;n.sort(function(t,e){return t.time-e.time}),_=n[x-1].time;for(var T=[],A=[],C=n[0].value,L=!0,D=0;D<x;D++){T.push(n[D].time/_);var P=n[D].value;if(w&&u(P,C,I)||!w&&P===C||(L=!1),C=P,"string"==typeof P){var k=m.parse(P);k?(P=k,S=!0):M=!0}A.push(P)}if(!L){for(var O=A[x-1],D=0;D<x-1;D++)w?l(A[D],O,I):!isNaN(A[D])||isNaN(O)||M||S||(A[D]=O);w&&l(d(t._target,o),O,I);var E,z,R,N,V,B,G=0,F=0;if(S)var H=[0,0,0,0];var W=function(t,e){var i;if(e<0)i=0;else if(e<F){for(E=Math.min(G+1,x-1),i=E;i>=0&&!(T[i]<=e);i--);i=Math.min(i,x-2)}else{for(i=G;i<x&&!(T[i]>e);i++);i=Math.min(i-1,x-2)}G=i,F=e;var n=T[i+1]-T[i];if(0!==n)if(z=(e-T[i])/n,v)if(N=A[i],R=A[0===i?i:i-1],V=A[i>x-2?x-1:i+1],B=A[i>x-3?x-1:i+2],w)c(R,N,V,B,z,z*z,z*z*z,d(t,o),I);else{var l;if(S)l=c(R,N,V,B,z,z*z,z*z*z,H,1),l=f(H);else{if(M)return r(N,V,z);l=h(R,N,V,B,z,z*z,z*z*z)}p(t,o,l)}else if(w)s(A[i],A[i+1],z,d(t,o),I);else{var l;if(S)s(A[i],A[i+1],z,H,1),l=f(H);else{if(M)return r(A[i],A[i+1],z);l=a(A[i],A[i+1],z)}p(t,o,l)}},Z=new g({target:t._target,life:_,loop:t._loop,delay:t._delay,onframe:W,ondestroy:i});return e&&"spline"!==e&&(Z.easing=e),Z}}}var g=i(157),m=i(22),v=i(1),y=v.isArrayLike,x=Array.prototype.slice,_=function(t,e,i,a){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||n,this._setter=a||o,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var i=this._tracks;for(var n in e)if(e.hasOwnProperty(n)){if(!i[n]){i[n]=[];var o=this._getter(this._target,n);if(null==o)continue;0!==t&&i[n].push({time:0,value:d(o)})}i[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,i=0;i<e;i++)t[i].call(this)},start:function(t){var e,i=this,n=0,o=function(){n--,n||i._doneCallback()};for(var a in this._tracks)if(this._tracks.hasOwnProperty(a)){var r=p(this,t,o,this._tracks[a],a);r&&(this._clipList.push(r),n++,this.animation&&this.animation.addClip(r),e=r)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var n=0;n<i._onframeList.length;n++)i._onframeList[n](t,e)}}return n||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,i=this.animation,n=0;n<e.length;n++){var o=e[n];t&&o.onframe(this._target,1),i&&i.removeClip(o)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}},t.exports=_},function(t,e){t.exports="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)}},function(t,e){var i=2*Math.PI;t.exports={normalizeRadian:function(t){return t%=i,t<0&&(t+=i),t}}},function(t,e){var i=function(){this.head=null,this.tail=null,this._len=0},n=i.prototype;n.insert=function(t){var e=new o(t);return this.insertEntry(e),e},n.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},n.remove=function(t){var e=t.prev,i=t.next;e?e.next=i:this.head=i,i?i.prev=e:this.tail=e,t.next=t.prev=null,this._len--},n.len=function(){return this._len},n.clear=function(){this.head=this.tail=null,this._len=0};var o=function(t){this.value=t,this.next,this.prev},a=function(t){this._list=new i,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},r=a.prototype;r.put=function(t,e){var i=this._list,n=this._map,a=null;if(null==n[t]){var r=i.len(),s=this._lastRemovedEntry;if(r>=this._maxSize&&r>0){var l=i.head;i.remove(l),delete n[l.key],a=l.value,this._lastRemovedEntry=l}s?s.value=e:s=new o(e),s.key=t,i.insertEntry(s),n[t]=s}return a},r.get=function(t){var e=this._map[t],i=this._list;if(null!=e)return e!==i.tail&&(i.remove(e),i.insertEntry(e)),e.value},r.clear=function(){this._list.clear(),this._map={}},t.exports=a},function(t,e){var i=2311;t.exports=function(){return i++}},function(t,e){var i=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};i.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")},t.exports=i},function(t,e){function i(t,e,i){var n=null==e.x?0:e.x,o=null==e.x2?1:e.x2,a=null==e.y?0:e.y,r=null==e.y2?0:e.y2;e.global||(n=n*i.width+i.x,o=o*i.width+i.x,a=a*i.height+i.y,r=r*i.height+i.y);var s=t.createLinearGradient(n,a,o,r);return s}function n(t,e,i){var n=i.width,o=i.height,a=Math.min(n,o),r=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;e.global||(r=r*n+i.x,s=s*o+i.y,l*=a);var u=t.createRadialGradient(r,s,0,r,s,l);return u}var o=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],a=function(t){this.extendFrom(t)};a.prototype={constructor:a,fill:"#000000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,textFill:"#000",textStroke:null,textPosition:"inside",textOffset:null,textBaseline:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textTransform:!1,textRotation:0,blend:null,bind:function(t,e,i){for(var n=this,a=i&&i.style,r=!a,s=0;s<o.length;s++){var l=o[s],u=l[0];(r||n[u]!==a[u])&&(t[u]=n[u]||l[1])}if((r||n.fill!==a.fill)&&(t.fillStyle=n.fill),(r||n.stroke!==a.stroke)&&(t.strokeStyle=n.stroke),(r||n.opacity!==a.opacity)&&(t.globalAlpha=null==n.opacity?1:n.opacity),(r||n.blend!==a.blend)&&(t.globalCompositeOperation=n.blend||"source-over"),this.hasStroke()){var c=n.lineWidth;t.lineWidth=c/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t){var i=this;for(var n in t)!t.hasOwnProperty(n)||!e&&i.hasOwnProperty(n)||(i[n]=t[n])}},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,o){for(var a="radial"===e.type?n:i,r=a(t,e,o),s=e.colorStops,l=0;l<s.length;l++)r.addColorStop(s[l].offset,s[l].color);return r}};for(var r=a.prototype,s=0;s<o.length;s++){var l=o[s];l[0]in r||(r[l[0]]=l[1])}a.getGradient=r.getGradient,t.exports=a},function(t,e,i){var n=i(168),o=i(167);t.exports={buildPath:function(t,e,i){var a=e.points,r=e.smooth;if(a&&a.length>=2){if(r&&"spline"!==r){var s=o(a,r,i,e.smoothConstraint);t.moveTo(a[0][0],a[0][1]);for(var l=a.length,u=0;u<(i?l:l-1);u++){var c=s[2*u],h=s[2*u+1],d=a[(u+1)%l];t.bezierCurveTo(c[0],c[1],h[0],h[1],d[0],d[1])}}else{"spline"===r&&(a=n(a,i)),t.moveTo(a[0][0],a[0][1]);for(var u=1,f=a.length;u<f;u++)t.lineTo(a[u][0],a[u][1])}i&&t.closePath()}}}},function(t,e,i){var n=i(1),o={};o.layout=function(t,e,i){function o(t,e){var i=a.getAxis(t);return i.toGlobalCoord(i.dataToCoord(0))}i=i||{};var a=t.coordinateSystem,r=e.axis,s={},l=r.position,u=r.onZero?"onZero":l,c=r.dim,h=a.getRect(),d=[h.x,h.x+h.width,h.y,h.y+h.height],f=e.get("offset")||0,p={x:{top:d[2]-f,bottom:d[3]+f},y:{left:d[0]-f,right:d[1]+f}};p.x.onZero=Math.max(Math.min(o("y"),p.x.bottom),p.x.top),p.y.onZero=Math.max(Math.min(o("x"),p.y.right),p.y.left),s.position=["y"===c?p.y[u]:d[0],"x"===c?p.x[u]:d[3]],s.rotation=Math.PI/2*("x"===c?0:1);var g={top:-1,bottom:1,left:-1,right:1};s.labelDirection=s.tickDirection=s.nameDirection=g[l],s.labelOffset=r.onZero?p[c][l]-p[c].onZero:0,e.get("axisTick.inside")&&(s.tickDirection=-s.tickDirection),n.retrieve(i.labelInside,e.get("axisLabel.inside"))&&(s.labelDirection=-s.labelDirection);var m=e.get("axisLabel.rotate");return s.labelRotate="top"===u?-m:m,s.labelInterval=r.getLabelInterval(),s.z2=1,s},t.exports=o},function(t,e,i){"use strict";function n(t,e,i,n){var o=n.getWidth(),a=n.getHeight();t[0]=Math.min(t[0]+e,o)-e,t[1]=Math.min(t[1]+i,a)-i,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}var o=i(1),a=i(3),r=i(16),s=i(7),l=i(19),u=i(17),c=i(40),h={};h.buildElStyle=function(t){var e,i=t.get("type"),n=t.getModel(i+"Style");return"line"===i?(e=n.getLineStyle(),e.fill=null):"shadow"===i&&(e=n.getAreaStyle(),e.stroke=null),e},h.buildLabelElOption=function(t,e,i,o,a){var l=i.get("value"),u=h.getValueLabel(l,e.axis,e.ecModel,i.get("seriesDataIndices"),{precision:i.get("label.precision"),formatter:i.get("label.formatter")}),c=i.getModel("label"),d=c.getModel("textStyle"),f=s.normalizeCssArray(c.get("padding")||0),p=d.getFont(),g=r.getBoundingRect(u,p,a.textAlign,a.textBaseline),m=a.position,v=g.width+f[1]+f[3],y=g.height+f[0]+f[2],x=a.align;"right"===x&&(m[0]-=v),"center"===x&&(m[0]-=v/2);var _=a.verticalAlign;"bottom"===_&&(m[1]-=y),"middle"===_&&(m[1]-=y/2),n(m,v,y,o);var b=c.get("backgroundColor");b&&"auto"!==b||(b=e.get("axisLine.lineStyle.color")),t.label={shape:{x:0,y:0,width:v,height:y,r:c.get("borderRadius")},position:m.slice(),style:{text:u,textFont:p,textFill:d.getTextColor(),textPosition:"inside",fill:b,stroke:c.get("borderColor")||"transparent",lineWidth:c.get("borderWidth")||0,shadowBlur:c.get("shadowBlur"),shadowColor:c.get("shadowColor"),shadowOffsetX:c.get("shadowOffsetX"),shadowOffsetY:c.get("shadowOffsetY")},z2:10}},h.getValueLabel=function(t,e,i,n,a){var r=e.scale.getLabel(t,{precision:a.precision}),s=a.formatter;if(s){var l={value:u.getAxisRawValue(e,t),seriesData:[]};o.each(n,function(t){var e=i.getSeriesByIndex(t.seriesIndex),n=t.dataIndexInside,o=e&&e.getDataParams(n);o&&l.seriesData.push(o)}),o.isString(s)?r=s.replace("{value}",r):o.isFunction(s)&&(r=s(l))}return r},h.getTransformedPosition=function(t,e,i){var n=l.create();return l.rotate(n,n,i.rotation),l.translate(n,n,i.position),a.applyTransform([t.dataToCoord(e),(i.labelOffset||0)+(i.labelDirection||1)*(i.labelMargin||0)],n)},h.buildCartesianSingleLabelElOption=function(t,e,i,n,o,a){var r=c.innerTextLayout(i.rotation,0,i.labelDirection);i.labelMargin=o.get("label.margin"),h.buildLabelElOption(e,n,o,a,{position:h.getTransformedPosition(n.axis,t,i),align:r.textAlign,verticalAlign:r.textVerticalAlign})},h.makeLineShape=function(t,e,i){return i=i||0,{x1:t[i],y1:t[1-i],x2:e[i],y2:e[1-i]}},h.makeRectShape=function(t,e,i){return i=i||0,{x:t[i],y:t[1-i],width:e[i],height:e[1-i]}},h.makeSectorShape=function(t,e,i,n,o,a){return{cx:t,cy:e,r0:i,r:n,startAngle:o,endAngle:a,clockwise:!0}},t.exports=h},function(t,e,i){var n=i(7),o=i(1),a={},r=["x","y","z","radius","angle","single"],s=["cartesian2d","polar","singleAxis"];a.isCoordSupported=function(t){return o.indexOf(s,t)>=0},a.createNameEach=function(t,e){t=t.slice();var i=o.map(t,n.capitalFirst);e=(e||[]).slice();var a=o.map(e,n.capitalFirst);return function(n,r){o.each(t,function(t,o){for(var s={name:t,capital:i[o]},l=0;l<e.length;l++)s[e[l]]=t+a[l];n.call(r,s)})}},a.eachAxisDim=a.createNameEach(r,["axisIndex","axis","index","id"]),a.createLinkedNodesFinder=function(t,e,i){function n(t,e){return o.indexOf(e.nodes,t)>=0}function a(t,n){var a=!1;return e(function(e){o.each(i(t,e)||[],function(t){n.records[e.name][t]&&(a=!0)})}),a}function r(t,n){n.nodes.push(t),e(function(e){o.each(i(t,e)||[],function(t){n.records[e.name][t]=!0})})}return function(i){function o(t){!n(t,s)&&a(t,s)&&(r(t,s),l=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!i)return s;r(i,s);var l;do l=!1,t(o);while(l);return s}},t.exports=a},function(t,e,i){var n=i(1);t.exports={updateSelectedMap:function(t){this._selectTargetMap=n.reduce(t||[],function(t,e){return t[e.name]=e,t},{})},select:function(t){var e=this._selectTargetMap,i=e[t],o=this.get("selectedMode");"single"===o&&n.each(e,function(t){t.selected=!1}),i&&(i.selected=!0)},unSelect:function(t){var e=this._selectTargetMap[t];e&&(e.selected=!1)},toggleSelected:function(t){var e=this._selectTargetMap[t];if(null!=e)return this[e.selected?"unSelect":"select"](t),e.selected},isSelected:function(t){var e=this._selectTargetMap[t];return e&&e.selected}}},function(t,e){t.exports=function(t,e,i,n,o){function a(t,e,i){var n=e.length?e.slice():[e,e];return e[0]>e[1]&&n.reverse(),t<0&&n[0]+t<i[0]&&(t=i[0]-n[0]),t>0&&n[1]+t>i[1]&&(t=i[1]-n[1]),t}return t?("rigid"===n?(t=a(t,e,i),e[0]+=t,e[1]+=t):(t=a(t,e[o],i),e[o]+=t,"push"===n&&e[0]>e[1]&&(e[1-o]=e[o])),e):e}},function(t,e,i){function n(t){o.defaultEmphasis(t.label,o.LABEL_OPTIONS)}var o=i(6),a=i(1),r=i(9),s=i(7),l=s.addCommas,u=s.encodeHTML,c=i(2).extendComponentModel({type:"marker",dependencies:["series","grid","polar","geo"],init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i),this.mergeOption(t,i,n.createdBySelf,!0)},isAnimationEnabled:function(){if(r.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},mergeOption:function(t,e,i,o){var r=this.constructor,s=this.mainType+"Model";i||e.eachSeries(function(t){var i=t.get(this.mainType),l=t[s];return i&&i.data?(l?l.mergeOption(i,e,!0):(o&&n(i),a.each(i.data,function(t){t instanceof Array?(n(t[0]),n(t[1])):n(t)}),l=new r(i,this,e),a.extend(l,{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),l.__hostSeries=t),void(t[s]=l)):void(t[s]=null)},this)},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=a.isArray(i)?a.map(i,l).join(", "):l(i),o=e.getName(t),r=u(this.name);return(null!=i||o)&&(r+="<br />"),o&&(r+=u(o),null!=i&&(r+=" : ")),null!=i&&(r+=u(n)),r},getData:function(){return this._data},setData:function(t){this._data=t}});a.mixin(c,o.dataFormatMixin),t.exports=c},function(t,e,i){t.exports=i(2).extendComponentView({type:"marker",init:function(){this.markerGroupMap={}},render:function(t,e,i){var n=this.markerGroupMap;for(var o in n)n.hasOwnProperty(o)&&(n[o].__keep=!1);var a=this.type+"Model";e.eachSeries(function(t){var n=t[a];n&&this.renderSeries(t,n,e,i)},this);for(var o in n)n.hasOwnProperty(o)&&!n[o].__keep&&this.group.remove(n[o].group)},renderSeries:function(){}})},function(t,e,i){function n(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function o(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function a(t,e,i){var n=-1;do n=Math.max(l.getPrecision(t.get(e,i)),n),t=t.stackedOn;while(t);return n}function r(t,e,i,n,o,r){var s=[],l=m(e,n,t),u=e.indicesOfNearest(n,l,!0)[0];s[o]=e.get(i,u,!0),s[r]=e.get(n,u,!0);var c=a(e,n,u);return c>=0&&(s[r]=+s[r].toFixed(c)),s}var s=i(1),l=i(4),u=s.indexOf,c=s.curry,h={min:c(r,"min"),max:c(r,"max"),average:c(r,"average")},d=function(t,e){var i=t.getData(),n=t.coordinateSystem;if(e&&!o(e)&&!s.isArray(e.coord)&&n){var a=n.dimensions,r=f(e,i,n,t);if(e=s.clone(e),e.type&&h[e.type]&&r.baseAxis&&r.valueAxis){var l=u(a,r.baseAxis.dim),c=u(a,r.valueAxis.dim);e.coord=h[e.type](i,r.baseDataDim,r.valueDataDim,l,c),e.value=e.coord[c]}else{for(var d=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],p=0;p<2;p++)if(h[d[p]]){var g=t.coordDimToDataDim(a[p])[0];d[p]=m(i,g,d[p])}e.coord=d}}return e},f=function(t,e,i,n){var o={};return null!=t.valueIndex||null!=t.valueDim?(o.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,o.valueAxis=i.getAxis(n.dataDimToCoordDim(o.valueDataDim)),o.baseAxis=i.getOtherAxis(o.valueAxis),o.baseDataDim=n.coordDimToDataDim(o.baseAxis.dim)[0]):(o.baseAxis=n.getBaseAxis(),o.valueAxis=i.getOtherAxis(o.baseAxis),o.baseDataDim=n.coordDimToDataDim(o.baseAxis.dim)[0],o.valueDataDim=n.coordDimToDataDim(o.valueAxis.dim)[0]),o},p=function(t,e){return!(t&&t.containData&&e.coord&&!n(e))||t.containData(e.coord)},g=function(t,e,i,n){return n<2?t.coord&&t.coord[n]:t.value},m=function(t,e,i){if("average"===i){var n=0,o=0;return t.each(e,function(t,e){isNaN(t)||(n+=t,o++)},!0),n/o}return t.getDataExtent(e,!0)["max"===i?1:0]};t.exports={dataTransform:d,dataFilter:p,dimValueGetter:g,getAxisInfo:f,numCalculate:m}},function(t,e,i){function n(t){var e=t.pieceList;t.hasSpecialVisual=!1,g.each(e,function(e,i){e.originIndex=i,null!=e.visual&&(t.hasSpecialVisual=!0)})}function o(t){var e=t.categories,i=t.visual,n=t.categoryMap={};if(y(e,function(t,e){n[t]=e}),!g.isArray(i)){var o=[];g.isObject(i)?y(i,function(t,e){var i=n[e];o[null!=i?i:_]=t}):o[_]=i,i=f(t,o)}for(var a=e.length-1;a>=0;a--)null==i[a]&&(delete n[e[a]],e.pop())}function a(t,e){var i=t.visual,n=[];g.isObject(i)?y(i,function(t){n.push(t)}):null!=i&&n.push(i);var o={color:1,symbol:1};e||1!==n.length||o.hasOwnProperty(t.type)||(n[1]=n[0]),f(t,n)}function r(t){return{applyVisual:function(e,i,n){e=this.mapValueToVisual(e),n("color",t(i("color"),e))},_doMap:h([0,1])}}function s(t){var e=this.option.visual;return e[Math.round(v(t,[0,1],[0,e.length-1],!0))]||{}}function l(t){return function(e,i,n){n(t,this.mapValueToVisual(e))}}function u(t){var e=this.option.visual;return e[this.option.loop&&t!==_?t%e.length:t]}function c(){return this.option.visual[0]}function h(t){return{linear:function(e){return v(e,t,this.option.visual,!0)},category:u,piecewise:function(e,i){var n=d.call(this,i);return null==n&&(n=v(e,t,this.option.visual,!0)),n},fixed:c}}function d(t){var e=this.option,i=e.pieceList;if(e.hasSpecialVisual){var n=b.findPieceIndex(t,i),o=i[n];if(o&&o.visual)return o.visual[this.type]}}function f(t,e){return t.visual=e,"color"===t.type&&(t.parsedVisual=g.map(e,function(t){return m.parse(t)})),e}function p(t,e,i){return t?e<=i:e<i}var g=i(1),m=i(22),v=i(4).linearMap,y=g.each,x=g.isObject,_=-1,b=function(t){var e=t.mappingMethod,i=t.type,r=this.option=g.clone(t);this.type=i,this.mappingMethod=e,this._normalizeData=S[e];var s=w[i];this.applyVisual=s.applyVisual,this.getColorMapper=s.getColorMapper,this._doMap=s._doMap[e],"piecewise"===e?(a(r),n(r)):"category"===e?r.categories?o(r):a(r,!0):(g.assert("linear"!==e||r.dataExtent),a(r))};b.prototype={constructor:b,mapValueToVisual:function(t){var e=this._normalizeData(t);return this._doMap(e,t)},getNormalizer:function(){return g.bind(this._normalizeData,this)}};var w=b.visualHandlers={color:{applyVisual:l("color"),getColorMapper:function(){var t=this.option;return g.bind("category"===t.mappingMethod?function(t,e){return!e&&(t=this._normalizeData(t)),u.call(this,t)}:function(e,i,n){var o=!!n;return!i&&(e=this._normalizeData(e)),n=m.fastMapToColor(e,t.parsedVisual,n),o?n:m.stringify(n,"rgba")},this)},_doMap:{linear:function(t){return m.stringify(m.fastMapToColor(t,this.option.parsedVisual),"rgba")},category:u,piecewise:function(t,e){var i=d.call(this,e);return null==i&&(i=m.stringify(m.fastMapToColor(t,this.option.parsedVisual),"rgba")),i},fixed:c}},colorHue:r(function(t,e){return m.modifyHSL(t,e)}),colorSaturation:r(function(t,e){return m.modifyHSL(t,null,e)}),colorLightness:r(function(t,e){return m.modifyHSL(t,null,null,e)}),colorAlpha:r(function(t,e){return m.modifyAlpha(t,e)}),opacity:{applyVisual:l("opacity"),_doMap:h([0,1])},symbol:{applyVisual:function(t,e,i){var n=this.mapValueToVisual(t);if(g.isString(n))i("symbol",n);else if(x(n))for(var o in n)n.hasOwnProperty(o)&&i(o,n[o])},_doMap:{linear:s,category:u,piecewise:function(t,e){var i=d.call(this,e);return null==i&&(i=s.call(this,t)),i},fixed:c}},symbolSize:{applyVisual:l("symbolSize"),_doMap:h([0,1])}},S={linear:function(t){return v(t,this.option.dataExtent,[0,1],!0)},piecewise:function(t){var e=this.option.pieceList,i=b.findPieceIndex(t,e,!0);if(null!=i)return v(i,[0,e.length-1],[0,1],!0)},category:function(t){var e=this.option.categories?this.option.categoryMap[t]:t;return null==e?_:e},fixed:g.noop};b.listVisualTypes=function(){var t=[];return g.each(w,function(e,i){t.push(i)}),t},b.addVisualHandler=function(t,e){w[t]=e},b.isValidType=function(t){return w.hasOwnProperty(t)},b.eachVisual=function(t,e,i){g.isObject(t)?g.each(t,e,i):e.call(i,t)},b.mapVisual=function(t,e,i){var n,o=g.isArray(t)?[]:g.isObject(t)?{}:(n=!0,null);return b.eachVisual(t,function(t,a){var r=e.call(i,t,a);n?o=r:o[a]=r}),o},b.retrieveVisuals=function(t){var e,i={};return t&&y(w,function(n,o){t.hasOwnProperty(o)&&(i[o]=t[o],e=!0)}),e?i:null},b.prepareVisualTypes=function(t){if(x(t)){var e=[];y(t,function(t,i){e.push(i)}),t=e}else{if(!g.isArray(t))return[];t=t.slice()}return t.sort(function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1}),t},b.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},b.findPieceIndex=function(t,e,i){function n(e,i){var n=Math.abs(e-t);n<a&&(a=n,o=i)}for(var o,a=1/0,r=0,s=e.length;r<s;r++){var l=e[r].value;if(null!=l){if(l===t||"string"==typeof l&&l===t+"")return r;i&&n(l,r)}}for(var r=0,s=e.length;r<s;r++){var u=e[r],c=u.interval,h=u.close;if(c){if(c[0]===-(1/0)){if(p(h[1],t,c[1]))return r}else if(c[1]===1/0){if(p(h[0],c[0],t))return r}else if(p(h[0],c[0],t)&&p(h[1],t,c[1]))return r;i&&n(c[0],r),i&&n(c[1],r)}}if(i)return t===1/0?e.length-1:t===-(1/0)?0:o},t.exports=b},function(t,e){t.exports=function(t,e){var i={};e.eachRawSeriesByType(t,function(t){var n=t.getRawData(),o={};if(!e.isSeriesFiltered(t)){var a=t.getData();a.each(function(t){var e=a.getRawIndex(t);o[e]=t}),n.each(function(e){var r=o[e],s=null!=r&&a.getItemVisual(r,"color",!0);if(s)n.setItemVisual(e,"color",s);else{var l=n.getItemModel(e),u=l.get("itemStyle.normal.color")||t.getColorFromPalette(n.getName(e),i);n.setItemVisual(e,"color",u),null!=r&&a.setItemVisual(r,"color",u)}})}})}},function(t,e,i){var n=i(5),o=i(20),a={},r=Math.min,s=Math.max,l=Math.sin,u=Math.cos,c=n.create(),h=n.create(),d=n.create(),f=2*Math.PI;a.fromPoints=function(t,e,i){if(0!==t.length){var n,o=t[0],a=o[0],l=o[0],u=o[1],c=o[1];for(n=1;n<t.length;n++)o=t[n],a=r(a,o[0]),l=s(l,o[0]),u=r(u,o[1]),c=s(c,o[1]);e[0]=a,e[1]=u,i[0]=l,i[1]=c}},a.fromLine=function(t,e,i,n,o,a){o[0]=r(t,i),o[1]=r(e,n),a[0]=s(t,i),a[1]=s(e,n)};var p=[],g=[];a.fromCubic=function(t,e,i,n,a,l,u,c,h,d){var f,m=o.cubicExtrema,v=o.cubicAt,y=m(t,i,a,u,p);for(h[0]=1/0,h[1]=1/0,d[0]=-(1/0),d[1]=-(1/0),f=0;f<y;f++){var x=v(t,i,a,u,p[f]);h[0]=r(x,h[0]),d[0]=s(x,d[0])}for(y=m(e,n,l,c,g),f=0;f<y;f++){var _=v(e,n,l,c,g[f]);h[1]=r(_,h[1]),d[1]=s(_,d[1])}h[0]=r(t,h[0]),d[0]=s(t,d[0]),h[0]=r(u,h[0]),d[0]=s(u,d[0]),h[1]=r(e,h[1]),d[1]=s(e,d[1]),h[1]=r(c,h[1]),d[1]=s(c,d[1])},a.fromQuadratic=function(t,e,i,n,a,l,u,c){var h=o.quadraticExtremum,d=o.quadraticAt,f=s(r(h(t,i,a),1),0),p=s(r(h(e,n,l),1),0),g=d(t,i,a,f),m=d(e,n,l,p);u[0]=r(t,a,g),u[1]=r(e,l,m),c[0]=s(t,a,g),c[1]=s(e,l,m)},a.fromArc=function(t,e,i,o,a,r,s,p,g){var m=n.min,v=n.max,y=Math.abs(a-r);if(y%f<1e-4&&y>1e-4)return p[0]=t-i,p[1]=e-o,g[0]=t+i,void(g[1]=e+o);if(c[0]=u(a)*i+t,c[1]=l(a)*o+e,h[0]=u(r)*i+t,h[1]=l(r)*o+e,m(p,c,h),v(g,c,h),a%=f,a<0&&(a+=f),r%=f,r<0&&(r+=f),a>r&&!s?r+=f:a<r&&s&&(a+=f),s){var x=r;r=a,a=x}for(var _=0;_<r;_+=Math.PI/2)_>a&&(d[0]=u(_)*i+t,d[1]=l(_)*o+e,m(p,d,p),v(g,d,g))},t.exports=a},function(t,e,i){var n=i(38),o=i(1),a=i(16),r=function(t){n.call(this,t)};r.prototype={constructor:r,type:"text",brush:function(t,e){var i=this.style,n=i.x||0,o=i.y||0,r=i.text;if(null!=r&&(r+=""),i.bind(t,this,e),r){this.setTransform(t);var s,l=i.textAlign,u=i.textFont||i.font;if(i.textVerticalAlign){var c=a.getBoundingRect(r,u,i.textAlign,"top");switch(s="middle",i.textVerticalAlign){case"middle":o-=c.height/2-c.lineHeight/2;break;case"bottom":o-=c.height-c.lineHeight/2;break;default:o+=c.lineHeight/2}}else s=i.textBaseline;t.font=u||"12px sans-serif",t.textAlign=l||"left",t.textAlign!==l&&(t.textAlign="left"),t.textBaseline=s||"alphabetic",t.textBaseline!==s&&(t.textBaseline="alphabetic");for(var h=a.measureText("国",t.font).width,d=r.split("\n"),f=0;f<d.length;f++)i.hasStroke()&&t.strokeText(d[f],n,o),i.hasFill()&&t.fillText(d[f],n,o),o+=h;this.restoreTransform(t)}},getBoundingRect:function(){var t=this.style;if(!this._rect){var e=t.textVerticalAlign,i=a.getBoundingRect(t.text+"",t.textFont||t.font,t.textAlign,e?"top":t.textBaseline);switch(e){case"middle":i.y-=i.height/2;break;case"bottom":i.y-=i.height}if(i.x+=t.x||0,i.y+=t.y||0,t.hasStroke()){var n=t.lineWidth;i.x-=n/2,i.y-=n/2,i.width+=n,i.height+=n}this._rect=i}return this._rect}},o.inherits(r,n),t.exports=r},function(t,e,i){function n(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}var o=i(16),a=i(11),r=new a,s=function(){};s.prototype={constructor:s,drawRectText:function(t,e,i){var a=this.style,s=a.text;if(null!=s&&(s+=""),s){t.save();var l,u,c=a.textPosition,h=a.textOffset,d=a.textDistance,f=a.textAlign,p=a.textFont||a.font,g=a.textBaseline,m=a.textVerticalAlign;i=i||o.getBoundingRect(s,p,f,g);var v=this.transform;if(a.textTransform?this.setTransform(t):v&&(r.copy(e),r.applyTransform(v),e=r),c instanceof Array){if(l=e.x+n(c[0],e.width),u=e.y+n(c[1],e.height),f=f||"left",g=g||"top",m){switch(m){case"middle":u-=i.height/2-i.lineHeight/2;break;case"bottom":u-=i.height-i.lineHeight/2;break;default:u+=i.lineHeight/2}g="middle"}}else{var y=o.adjustTextPositionOnRect(c,e,i,d);l=y.x,u=y.y,f=f||y.textAlign,g=g||y.textBaseline}h&&(l+=h[0],u+=h[1]),t.textAlign=f||"left",t.textBaseline=g||"alphabetic";var x=a.textFill,_=a.textStroke;x&&(t.fillStyle=x),_&&(t.strokeStyle=_),t.font=p||"12px sans-serif",t.shadowBlur=a.textShadowBlur,t.shadowColor=a.textShadowColor||"transparent",t.shadowOffsetX=a.textShadowOffsetX,t.shadowOffsetY=a.textShadowOffsetY;var b=s.split("\n");a.textRotation&&(v&&t.translate(v[4],v[5]),t.rotate(a.textRotation),v&&t.translate(-v[4],-v[5]));for(var w=0;w<b.length;w++)_&&t.strokeText(b[w],l,u),x&&t.fillText(b[w],l,u),u+=i.lineHeight;t.restore()}}},t.exports=s},function(t,e,i){function n(t){delete f[t]}/*!
+var S=i(9),M=i(137),I=i(101),T=i(26),A=i(138),C=i(13),L=i(17),D=i(65),P=i(30),k=i(3),O=i(5),z=i(37),E=i(88),R=i(1),N=i(22),V=i(23),B=i(51),G=R.each,H=C.parseClassType,F=1e3,W=5e3,Z=1e3,q=2e3,j=3e3,U=4e3,X=5e3,Y="__flagInMainProcess",$="__hasGradientOrPatternBg",K="__optionUpdated",J=/^[a-zA-Z0-9_]+$/;a.prototype.on=n("on"),a.prototype.off=n("off"),a.prototype.one=n("one"),R.mixin(a,V);var Q=o.prototype;Q._onframe=function(){if(this[K]){var t=this[K].silent;this[Y]=!0,tt.prepareAndUpdate.call(this),this[Y]=!1,this[K]=!1,u.call(this,t),c.call(this,t)}},Q.getDom=function(){return this._dom},Q.getZr=function(){return this._zr},Q.setOption=function(t,e,i){var n;if(R.isObject(e)&&(i=e.lazyUpdate,n=e.silent,e=e.notMerge),this[Y]=!0,!this._model||e){var a=new A(this._api),o=this._theme,r=this._model=new M(null,null,o,a);r.init(null,null,o,a)}this._model.setOption(t,ot),i?(this[K]={silent:n},this[Y]=!1):(tt.prepareAndUpdate.call(this),this._zr.flush(),this[K]=!1,this[Y]=!1,u.call(this,n),c.call(this,n))},Q.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},Q.getModel=function(){return this._model},Q.getOption=function(){return this._model&&this._model.getOption()},Q.getWidth=function(){return this._zr.getWidth()},Q.getHeight=function(){return this._zr.getHeight()},Q.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},Q.getRenderedCanvas=function(t){if(S.canvasSupported){t=t||{},t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr,i=e.storage.getDisplayList();return R.each(i,function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},Q.getDataURL=function(t){t=t||{};var e=t.excludeComponents,i=this._model,n=[],a=this;G(e,function(t){i.eachComponent({mainType:t},function(t){var e=a._componentsMap[t.__viewId];e.group.ignore||(n.push(e),e.group.ignore=!0)})});var o=this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return G(n,function(t){t.group.ignore=!1}),o},Q.getConnectedDataURL=function(t){if(S.canvasSupported){var e=this.group,i=Math.min,n=Math.max,a=1/0;if(ht[e]){var o=a,r=a,s=-a,l=-a,u=[],c=t&&t.pixelRatio||1;R.each(ct,function(a,c){if(a.group===e){var h=a.getRenderedCanvas(R.clone(t)),d=a.getDom().getBoundingClientRect();o=i(d.left,o),r=i(d.top,r),s=n(d.right,s),l=n(d.bottom,l),u.push({dom:h,left:d.left,top:d.top})}}),o*=c,r*=c,s*=c,l*=c;var h=s-o,d=l-r,f=R.createCanvas();f.width=h,f.height=d;var p=E.init(f);return G(u,function(t){var e=new k.Image({style:{x:t.left*c-o,y:t.top*c-r,image:t.dom}});p.add(e)}),p.refreshImmediately(),f.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},Q.convertToPixel=R.curry(r,"convertToPixel"),Q.convertFromPixel=R.curry(r,"convertFromPixel"),Q.containPixel=function(t,e){var i,n=this._model;return t=O.parseFinder(n,t),R.each(t,function(t,n){n.indexOf("Models")>=0&&R.each(t,function(t){var a=t.coordinateSystem;if(a&&a.containPoint)i|=!!a.containPoint(e);else if("seriesModels"===n){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(i|=o.containPoint(e,t))}},this)},this),!!i},Q.getVisual=function(t,e){var i=this._model;t=O.parseFinder(i,t,{defaultMainType:"series"});var n=t.seriesModel,a=n.getData(),o=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?a.indexOfRawIndex(t.dataIndex):null;return null!=o?a.getItemVisual(o,e):a.getVisual(e)},Q.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},Q.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var tt={update:function(t){var e=this._model,i=this._api,n=this._coordSysMgr,a=this._zr;if(e){e.restoreData(),n.create(this._model,this._api),f.call(this,e,i),p.call(this,e),n.update(e,i),m.call(this,e,t),v.call(this,e,t);var o=e.get("backgroundColor")||"transparent",r=a.painter;if(r.isSingleCanvas&&r.isSingleCanvas())a.configLayer(0,{clearColor:o});else{if(!S.canvasSupported){var s=N.parse(o);o=N.stringify(s,"rgb"),0===s[3]&&(o="transparent")}o.colorStops||o.image?(a.configLayer(0,{clearColor:o}),this[$]=!0,this._dom.style.background="transparent"):(this[$]&&a.configLayer(0,{clearColor:null}),this[$]=!1,this._dom.style.background=o)}G(rt,function(t){t(e,i)})}},updateView:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),m.call(this,e,t),h.call(this,"updateView",e,t))},updateVisual:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),m.call(this,e,t,!0),h.call(this,"updateVisual",e,t))},updateLayout:function(t){var e=this._model;e&&(g.call(this,e,t),h.call(this,"updateLayout",e,t))},prepareAndUpdate:function(t){var e=this._model;d.call(this,"component",e),d.call(this,"chart",e),tt.update.call(this,t)}};Q.resize=function(t){this[Y]=!0,this._zr.resize(t);var e=this._model&&this._model.resetOption("media"),i=e?"prepareAndUpdate":"update";tt[i].call(this),this._loadingFX&&this._loadingFX.resize(),this[Y]=!1;var n=t&&t.silent;u.call(this,n),c.call(this,n)},Q.showLoading=function(t,e){if(R.isObject(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),ut[t]){var i=ut[t](this._api,e),n=this._zr;this._loadingFX=i,n.add(i)}},Q.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},Q.makeActionFromEvent=function(t){var e=R.extend({},t);return e.type=nt[t.type],e},Q.dispatchAction=function(t,e){if(R.isObject(e)||(e={silent:!!e}),it[t.type]){if(this[Y])return void this._pendingActions.push(t);l.call(this,t,e.silent),e.flush?this._zr.flush(!0):e.flush!==!1&&S.browser.weChat&&this._throttledZrFlush(),u.call(this,e.silent),c.call(this,e.silent)}},Q.on=n("on"),Q.off=n("off"),Q.one=n("one");var et=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];Q._initEvents=function(){G(et,function(t){this._zr.on(t,function(e){var i,n=this.getModel(),a=e.target;if("globalout"===t)i={};else if(a&&null!=a.dataIndex){var o=a.dataModel||n.getSeriesByIndex(a.seriesIndex);i=o&&o.getDataParams(a.dataIndex,a.dataType)||{}}else a&&a.eventData&&(i=R.extend({},a.eventData));i&&(i.event=e,i.type=t,this.trigger(t,i))},this)},this),G(nt,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},Q.isDisposed=function(){return this._disposed},Q.clear=function(){this.setOption({series:[]},!0)},Q.dispose=function(){if(!this._disposed){this._disposed=!0;var t=this._api,e=this._model;G(this._componentsViews,function(i){i.dispose(e,t)}),G(this._chartsViews,function(i){i.dispose(e,t)}),this._zr.dispose(),delete ct[this.id]}},R.mixin(o,V);var it={},nt={},at=[],ot=[],rt=[],st=[],lt={},ut={},ct={},ht={},dt=new Date-0,ft=new Date-0,pt="_echarts_instance_",gt={version:"3.6.0",dependencies:{zrender:"3.5.0"}};gt.init=function(t,e,i){var n=gt.getInstanceByDom(t);if(n)return n;var a=new o(t,e,i);return a.id="ec_"+dt++,ct[a.id]=a,t.setAttribute?t.setAttribute(pt,a.id):t[pt]=a.id,w(a),a},gt.connect=function(t){if(R.isArray(t)){var e=t;t=null,R.each(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+ft++,R.each(e,function(e){e.group=t})}return ht[t]=!0,t},gt.disConnect=function(t){ht[t]=!1},gt.disconnect=gt.disConnect,gt.dispose=function(t){"string"==typeof t?t=ct[t]:t instanceof o||(t=gt.getInstanceByDom(t)),t instanceof o&&!t.isDisposed()&&t.dispose()},gt.getInstanceByDom=function(t){var e;return e=t.getAttribute?t.getAttribute(pt):t[pt],ct[e]},gt.getInstanceById=function(t){return ct[t]},gt.registerTheme=function(t,e){lt[t]=e},gt.registerPreprocessor=function(t){ot.push(t)},gt.registerProcessor=function(t,e){"function"==typeof t&&(e=t,t=F),at.push({prio:t,func:e})},gt.registerPostUpdate=function(t){rt.push(t)},gt.registerAction=function(t,e,i){"function"==typeof e&&(i=e,e="");var n=R.isObject(t)?t.type:[t,t={event:e}][0];t.event=(t.event||n).toLowerCase(),e=t.event,R.assert(J.test(n)&&J.test(e)),it[n]||(it[n]={action:i,actionInfo:t}),nt[e]=n},gt.registerCoordinateSystem=function(t,e){T.register(t,e)},gt.registerLayout=function(t,e){"function"==typeof t&&(e=t,t=Z),st.push({prio:t,func:e,isLayout:!0})},gt.registerVisual=function(t,e){"function"==typeof t&&(e=t,t=j),st.push({prio:t,func:e})},gt.registerLoading=function(t,e){ut[t]=e},gt.extendComponentModel=function(t){return C.extend(t)},gt.extendComponentView=function(t){return D.extend(t)},gt.extendSeriesModel=function(t){return L.extend(t)},gt.extendChartView=function(t){return P.extend(t)},gt.setCanvasCreator=function(t){R.createCanvas=t},gt.registerVisual(q,i(151)),gt.registerPreprocessor(i(145)),gt.registerLoading("default",i(136)),gt.registerAction({type:"highlight",event:"highlight",update:"highlight"},R.noop),gt.registerAction({type:"downplay",event:"downplay",update:"downplay"},R.noop),gt.zrender=E,gt.List=i(14),gt.Model=i(10),gt.Axis=i(33),gt.graphic=i(3),gt.number=i(4),gt.format=i(7),gt.throttle=z.throttle,gt.matrix=i(19),gt.vector=i(6),gt.color=i(22),gt.util={},G(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){gt.util[t]=R[t]}),gt.helper=i(135),gt.PRIORITY={PROCESSOR:{FILTER:F,STATISTIC:W},VISUAL:{LAYOUT:Z,GLOBAL:q,CHART:j,COMPONENT:U,BRUSH:X}},t.exports=gt},function(t,e,i){"use strict";function n(t){return null!=t&&"none"!=t}function a(t){return"string"==typeof t?x.lift(t,-.1):t}function o(t){if(t.__hoverStlDirty){var e=t.style.stroke,i=t.style.fill,o=t.__hoverStl;o.fill=o.fill||(n(i)?a(i):null),o.stroke=o.stroke||(n(e)?a(e):null);var r={};for(var s in o)o.hasOwnProperty(s)&&(r[s]=t.style[s]);t.__normalStl=r,t.__hoverStlDirty=!1}}function r(t){t.__isHover||(o(t),t.useHoverLayer?t.__zr&&t.__zr.addHover(t,t.__hoverStl):(t.setStyle(t.__hoverStl),t.z2+=1),t.__isHover=!0)}function s(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function l(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&r(t)}):r(t)}function u(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&s(t)}):s(t)}function c(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&o(t)}function h(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&l(this)}function d(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&u(this)}function f(){this.__isEmphasis=!0,l(this)}function p(){this.__isEmphasis=!1,u(this)}function g(t,e,i,n,a,o){"function"==typeof a&&(o=a,a=null);var r=n&&n.isAnimationEnabled();if(r){var s=t?"Update":"",l=n.getShallow("animationDuration"+s),u=n.getShallow("animationEasing"+s),c=n.getShallow("animationDelay"+s);"function"==typeof c&&(c=c(a,n.getAnimationDelayParams?n.getAnimationDelayParams(e,a):null)),"function"==typeof l&&(l=l(a)),l>0?e.animateTo(i,l,c||0,u,o):(e.stopAnimation(),e.attr(i),o&&o())}else e.stopAnimation(),e.attr(i),o&&o()}var m=i(1),v=i(180),y=i(8),x=i(22),_=i(19),b=i(6),w=i(58),S=i(11),M=Math.round,I=Math.max,T=Math.min,A={};A.Group=i(36),A.Image=i(53),A.Text=i(86),A.Circle=i(171),A.Sector=i(177),A.Ring=i(176),A.Polygon=i(173),A.Polyline=i(174),A.Rect=i(175),A.Line=i(172),A.BezierCurve=i(170),A.Arc=i(169),A.CompoundPath=i(164),A.LinearGradient=i(100),A.RadialGradient=i(165),A.BoundingRect=S,A.extendShape=function(t){return y.extend(t)},A.extendPath=function(t,e){return v.extendFromString(t,e)},A.makePath=function(t,e,i,n){var a=v.createFromString(t,e),o=a.getBoundingRect();if(i){var r=o.width/o.height;if("center"===n){var s,l=i.height*r;l<=i.width?s=i.height:(l=i.width,s=l/r);var u=i.x+i.width/2,c=i.y+i.height/2;i.x=u-l/2,i.y=c-s/2,i.width=l,i.height=s}A.resizePath(a,i)}return a},A.mergePath=v.mergePath,A.resizePath=function(t,e){if(t.applyTransform){var i=t.getBoundingRect(),n=i.calculateTransform(e);t.applyTransform(n)}},A.subPixelOptimizeLine=function(t){var e=A.subPixelOptimize,i=t.shape,n=t.style.lineWidth;return M(2*i.x1)===M(2*i.x2)&&(i.x1=i.x2=e(i.x1,n,!0)),M(2*i.y1)===M(2*i.y2)&&(i.y1=i.y2=e(i.y1,n,!0)),t},A.subPixelOptimizeRect=function(t){var e=A.subPixelOptimize,i=t.shape,n=t.style.lineWidth,a=i.x,o=i.y,r=i.width,s=i.height;return i.x=e(i.x,n,!0),i.y=e(i.y,n,!0),i.width=Math.max(e(a+r,n,!1)-i.x,0===r?0:1),i.height=Math.max(e(o+s,n,!1)-i.y,0===s?0:1),t},A.subPixelOptimize=function(t,e,i){var n=M(2*t);return(n+M(e))%2===0?n/2:(n+(i?1:-1))/2},A.setHoverStyle=function(t,e,i){t.__hoverSilentOnTouch=i&&i.hoverSilentOnTouch,"group"===t.type?t.traverse(function(t){"group"!==t.type&&c(t,e)}):c(t,e),t.on("mouseover",h).on("mouseout",d),t.on("emphasis",f).on("normal",p)},A.setText=function(t,e,i){var n=e.getShallow("position")||"inside",a=e.getShallow("offset"),o=n.indexOf("inside")>=0?"white":i,r=e.getModel("textStyle");m.extend(t,{textDistance:e.getShallow("distance")||5,textFont:r.getFont(),textPosition:n,textOffset:a,textFill:r.getTextColor()||o})},A.getFont=function(t,e){var i=e&&e.getModel("textStyle");return[t.fontStyle||i&&i.getShallow("fontStyle")||"",t.fontWeight||i&&i.getShallow("fontWeight")||"",(t.fontSize||i&&i.getShallow("fontSize")||12)+"px",t.fontFamily||i&&i.getShallow("fontFamily")||"sans-serif"].join(" ")},A.updateProps=function(t,e,i,n,a){g(!0,t,e,i,n,a)},A.initProps=function(t,e,i,n,a){g(!1,t,e,i,n,a)},A.getTransform=function(t,e){for(var i=_.identity([]);t&&t!==e;)_.mul(i,t.getLocalTransform(),i),t=t.parent;return i},A.applyTransform=function(t,e,i){return e&&!m.isArrayLike(e)&&(e=w.getLocalTransform(e)),i&&(e=_.invert([],e)),b.applyTransform([],t,e)},A.transformDirection=function(t,e,i){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),a=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-n:"right"===t?n:0,"top"===t?-a:"bottom"===t?a:0];return o=A.applyTransform(o,e,i),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"},A.groupTransition=function(t,e,i,n){function a(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}function o(t){var e={position:b.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=m.extend({},t.shape)),e}if(t&&e){var r=a(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=r[t.anid];if(e){var n=o(t);t.attr(o(e)),A.updateProps(t,n,i,t.dataIndex)}}})}},A.clipPointsByRect=function(t,e){return m.map(t,function(t){var i=t[0];i=I(i,e.x),i=T(i,e.x+e.width);var n=t[1];return n=I(n,e.y),n=T(n,e.y+e.height),[i,n]})},A.clipRectByRect=function(t,e){var i=I(t.x,e.x),n=T(t.x+t.width,e.x+e.width),a=I(t.y,e.y),o=T(t.y+t.height,e.y+e.height);if(n>=i&&o>=a)return{x:i,y:a,width:n-i,height:o-a}},t.exports=A},function(t,e){function i(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function n(t){return Math.floor(Math.log(t)/Math.LN10)}var a={},o=1e-4;a.linearMap=function(t,e,i,n){var a=e[1]-e[0],o=i[1]-i[0];if(0===a)return 0===o?i[0]:(i[0]+i[1])/2;if(n)if(a>0){if(t<=e[0])return i[0];if(t>=e[1])return i[1]}else{if(t>=e[0])return i[0];if(t<=e[1])return i[1]}else{if(t===e[0])return i[0];if(t===e[1])return i[1]}return(t-e[0])/a*o+i[0]},a.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?i(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},a.round=function(t,e,i){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),i?t:+t},a.asc=function(t){return t.sort(function(t,e){return t-e}),t},a.getPrecision=function(t){if(t=+t,isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i},a.getPrecisionSafe=function(t){var e=t.toString(),i=e.indexOf("e");if(i>0){var n=+e.slice(i+1);return n<0?-n:0}var a=e.indexOf(".");return a<0?0:e.length-1-a},a.getPixelPrecision=function(t,e){var i=Math.log,n=Math.LN10,a=Math.floor(i(t[1]-t[0])/n),o=Math.round(i(Math.abs(e[1]-e[0]))/n),r=Math.min(Math.max(-a+o,0),20);return isFinite(r)?r:20},a.MAX_SAFE_INTEGER=9007199254740991,a.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},a.isRadianAroundZero=function(t){return t>-o&&t<o};var r=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;a.getTimezoneOffset=function(){return(new Date).getTimezoneOffset()},a.parseDate=function(t){if(t instanceof Date)return t;if("string"==typeof t){var e=r.exec(t);if(!e)return new Date(NaN);var i=a.getTimezoneOffset(),n=e[8]?"Z"===e[8].toUpperCase()?i:60*+e[8].slice(0,3)+i:0;return new Date((+e[1]),+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0)-n,+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))},a.quantity=function(t){return Math.pow(10,n(t))},a.nice=function(t,e){var i,a=n(t),o=Math.pow(10,a),r=t/o;return i=e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10,t=i*o,a>=-20?+t.toFixed(a<0?-a:0):t},a.reformIntervals=function(t){function e(t,i,n){return t.interval[n]<i.interval[n]||t.interval[n]===i.interval[n]&&(t.close[n]-i.close[n]===(n?-1:1)||!n&&e(t,i,1))}t.sort(function(t,i){return e(t,i,0)?-1:1});for(var i=-(1/0),n=1,a=0;a<t.length;){for(var o=t[a].interval,r=t[a].close,s=0;s<2;s++)o[s]<=i&&(o[s]=i,r[s]=s?1:1-n),i=o[s],n=r[s];o[0]===o[1]&&r[0]*r[1]!==1?t.splice(a,1):a++}return t},a.isNumeric=function(t){return t-parseFloat(t)>=0},t.exports=a},function(t,e,i){function n(t,e){return t&&t.hasOwnProperty(e)}var a=i(7),o=i(4),r=i(10),s=i(1),l=s.each,u=s.isObject,c={};c.normalizeToArray=function(t){return t instanceof Array?t:null==t?[]:[t]},c.defaultEmphasis=function(t,e){if(t){var i=t.emphasis=t.emphasis||{},n=t.normal=t.normal||{};l(e,function(t){var e=s.retrieve(i[t],n[t]);null!=e&&(i[t]=e)})}},c.LABEL_OPTIONS=["position","offset","show","textStyle","distance","formatter"],c.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},c.isDataItemOption=function(t){return u(t)&&!(t instanceof Array)},c.converDataValue=function(t,e){var i=e&&e.type;return"ordinal"===i?t:("time"===i&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+o.parseDate(t)),null==t||""===t?NaN:+t)},c.createDataFormatModel=function(t,e){var i=new r;return s.mixin(i,c.dataFormatMixin),i.seriesIndex=e.seriesIndex,i.name=e.name||"",i.mainType=e.mainType,i.subType=e.subType,i.getData=function(){return t},i},c.dataFormatMixin={getDataParams:function(t,e){var i=this.getData(e),n=this.getRawValue(t,e),o=i.getRawIndex(t),r=i.getName(t,!0),s=i.getRawDataItem(t),l=i.getItemVisual(t,"color");return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:this.seriesIndex,seriesId:this.id,seriesName:this.name,name:r,dataIndex:o,data:s,dataType:e,value:n,color:l,marker:a.getTooltipMarker(l),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,i,n){e=e||"normal";var o=this.getData(i),r=o.getItemModel(t),s=this.getDataParams(t,i);null!=n&&s.value instanceof Array&&(s.value=s.value[n]);var l=r.get(["label",e,"formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?a.formatTpl(l,s):void 0},getRawValue:function(t,e){var i=this.getData(e),n=i.getRawDataItem(t);if(null!=n)return!u(n)||n instanceof Array?n:n.value},formatTooltip:s.noop},c.mappingToExists=function(t,e){e=(e||[]).slice();var i=s.map(t||[],function(t,e){return{exist:t}});return l(e,function(t,n){if(u(t)){for(var a=0;a<i.length;a++)if(!i[a].option&&null!=t.id&&i[a].exist.id===t.id+"")return i[a].option=t,void(e[n]=null);for(var a=0;a<i.length;a++){var o=i[a].exist;if(!(i[a].option||null!=o.id&&null!=t.id||null==t.name||c.isIdInner(t)||c.isIdInner(o)||o.name!==t.name+""))return i[a].option=t,void(e[n]=null)}}}),l(e,function(t,e){if(u(t)){for(var n=0;n<i.length;n++){var a=i[n].exist;if(!i[n].option&&!c.isIdInner(a)&&null==t.id){i[n].option=t;break}}n>=i.length&&i.push({option:t})}}),i},c.makeIdAndName=function(t){var e=s.createHashMap();l(t,function(t,i){var n=t.exist;n&&e.set(n.id,t)}),l(t,function(t,i){var n=t.option;s.assert(!n||null==n.id||!e.get(n.id)||e.get(n.id)===t,"id duplicates: "+(n&&n.id)),n&&null!=n.id&&e.set(n.id,t),!t.keyInfo&&(t.keyInfo={})}),l(t,function(t,i){var n=t.exist,a=t.option,o=t.keyInfo;if(u(a)){if(o.name=null!=a.name?a.name+"":n?n.name:"\0-",n)o.id=n.id;else if(null!=a.id)o.id=a.id+"";else{var r=0;do o.id="\0"+o.name+"\0"+r++;while(e.get(o.id))}e.set(o.id,t)}})},c.isIdInner=function(t){return u(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")},c.compressBatches=function(t,e){function i(t,e,i){for(var n=0,a=t.length;n<a;n++)for(var o=t[n].seriesId,r=c.normalizeToArray(t[n].dataIndex),s=i&&i[o],l=0,u=r.length;l<u;l++){var h=r[l];s&&s[h]?s[h]=null:(e[o]||(e[o]={}))[h]=1}}function n(t,e){var i=[];for(var a in t)if(t.hasOwnProperty(a)&&null!=t[a])if(e)i.push(+a);else{var o=n(t[a],!0);o.length&&i.push({seriesId:a,dataIndex:o})}return i}var a={},o={};return i(t||[],a),i(e||[],o,a),[n(a),n(o)]},c.queryDataIndex=function(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?s.isArray(e.dataIndex)?s.map(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?s.isArray(e.name)?s.map(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0},c.makeGetter=function(){var t=0;return function(){var e="\0__ec_prop_getter_"+t++;return function(t){return t[e]||(t[e]={})}}}(),c.parseFinder=function(t,e,i){if(s.isString(e)){var a={};a[e+"Index"]=0,e=a}var o=i&&i.defaultMainType;!o||n(e,o+"Index")||n(e,o+"Id")||n(e,o+"Name")||(e[o+"Index"]=0);var r={};return l(e,function(n,a){var n=e[a];if("dataIndex"===a||"dataIndexInside"===a)return void(r[a]=n);var o=a.match(/^(\w+)(Index|Id|Name)$/)||[],l=o[1],u=(o[2]||"").toLowerCase();if(!(!l||!u||null==n||"index"===u&&"none"===n||i&&i.includeMainTypes&&s.indexOf(i.includeMainTypes,l)<0)){var c={mainType:l};"index"===u&&"all"===n||(c[u]=n);var h=t.queryComponents(c);r[l+"Models"]=h,r[l+"Model"]=h[0]}}),r},c.dataDimToCoordDim=function(t,e){var i=t.dimensions;e=t.getDimension(e);for(var n=0;n<i.length;n++){var a=t.getDimensionInfo(i[n]);if(a.name===e)return a.coordDim}},c.coordDimToDataDim=function(t,e){var i=[];return l(t.dimensions,function(n){var a=t.getDimensionInfo(n);a.coordDim===e&&(i[a.coordDimIndex]=a.name)}),i},c.otherDimToDataDim=function(t,e){var i=[];return l(t.dimensions,function(n){var a=t.getDimensionInfo(n),o=a.otherDims,r=o[e];null!=r&&r!==!1&&(i[r]=a.name)}),i},t.exports=c},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(t,e){var n=new i(2);return null==t&&(t=0),null==e&&(e=0),n[0]=t,n[1]=e,n},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new i(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,i){return t[0]=e,t[1]=i,t},add:function(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t},scaleAndAdd:function(t,e,i,n){return t[0]=e[0]+i[0]*n,t[1]=e[1]+i[1]*n,t},sub:function(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t},div:function(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t},normalize:function(t,e){var i=n.len(e);return 0===i?(t[0]=0,t[1]=0):(t[0]=e[0]/i,t[1]=e[1]/i),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,i,n){return t[0]=e[0]+n*(i[0]-e[0]),t[1]=e[1]+n*(i[1]-e[1]),t},applyTransform:function(t,e,i){var n=e[0],a=e[1];return t[0]=i[0]*n+i[2]*a+i[4],t[1]=i[1]*n+i[3]*a+i[5],t},min:function(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t},max:function(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t}};n.length=n.len,n.lengthSquare=n.lenSquare,n.dist=n.distance,n.distSquare=n.distanceSquare,t.exports=n},function(t,e,i){var n=i(1),a=i(4),o=i(16),r={};r.addCommas=function(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))},r.toCamelCase=function(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t},r.normalizeCssArray=function(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t};var s=r.encodeHTML=function(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")},l=["a","b","c","d","e","f","g"],u=function(t,e){return"{"+t+(null==e?"":e)+"}"};r.formatTpl=function(t,e,i){n.isArray(e)||(e=[e]);var a=e.length;if(!a)return"";for(var o=e[0].$vars||[],r=0;r<o.length;r++){var c=l[r],h=u(c,0);t=t.replace(u(c),i?s(h):h)}for(var d=0;d<a;d++)for(var f=0;f<o.length;f++){var h=e[d][o[f]];t=t.replace(u(l[f],d),i?s(h):h)}return t},r.formatTplSimple=function(t,e,i){return n.each(e,function(e,n){t=t.replace("{"+n+"}",i?s(e):e)}),t},r.getTooltipMarker=function(t,e){return t?'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+r.encodeHTML(t)+";"+(e||"")+'"></span>':""};var c=function(t){return t<10?"0"+t:t};r.formatTime=function(t,e,i){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var n=a.parseDate(e),o=i?"UTC":"",r=n["get"+o+"FullYear"](),s=n["get"+o+"Month"]()+1,l=n["get"+o+"Date"](),u=n["get"+o+"Hours"](),h=n["get"+o+"Minutes"](),d=n["get"+o+"Seconds"]();return t=t.replace("MM",c(s)).toLowerCase().replace("yyyy",r).replace("yy",r%100).replace("dd",c(l)).replace("d",l).replace("hh",c(u)).replace("h",u).replace("mm",c(h)).replace("m",h).replace("ss",c(d)).replace("s",d)},r.capitalFirst=function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},r.truncateText=o.truncateText,t.exports=r},function(t,e,i){function n(t){a.call(this,t),this.path=null}var a=i(38),o=i(1),r=i(27),s=i(161),l=i(72),u=l.prototype.getCanvasPattern,c=Math.abs,h=new r((!0));n.prototype={constructor:n,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var i=this.style,n=this.path||h,a=i.hasStroke(),o=i.hasFill(),r=i.fill,s=i.stroke,l=o&&!!r.colorStops,c=a&&!!s.colorStops,d=o&&!!r.image,f=a&&!!s.image;if(i.bind(t,this,e),this.setTransform(t),this.__dirty){var p;l&&(p=p||this.getBoundingRect(),this._fillGradient=i.getGradient(t,r,p)),c&&(p=p||this.getBoundingRect(),this._strokeGradient=i.getGradient(t,s,p))}l?t.fillStyle=this._fillGradient:d&&(t.fillStyle=u.call(r,t)),c?t.strokeStyle=this._strokeGradient:f&&(t.strokeStyle=u.call(s,t));var g=i.lineDash,m=i.lineDashOffset,v=!!t.setLineDash,y=this.getGlobalScale();n.setScale(y[0],y[1]),this.__dirtyPath||g&&!v&&a?(n.beginPath(t),g&&!v&&(n.setLineDash(g),n.setLineDashOffset(m)),this.buildPath(n,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),o&&n.fill(t),g&&v&&(t.setLineDash(g),t.lineDashOffset=m),a&&n.stroke(t),g&&v&&t.setLineDash([]),this.restoreTransform(t),null!=i.text&&this.drawRectText(t,this.getBoundingRect())},buildPath:function(t,e,i){},createPathProxy:function(){this.path=new r},getBoundingRect:function(){var t=this._rect,e=this.style,i=!t;if(i){var n=this.path;n||(n=this.path=new r),this.__dirtyPath&&(n.beginPath(),this.buildPath(n,this.shape,!1)),t=n.getBoundingRect()}if(this._rect=t,e.hasStroke()){var a=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||i){a.copy(t);var o=e.lineWidth,s=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(o=Math.max(o,this.strokeContainThreshold||4)),s>1e-10&&(a.width+=o/s,a.height+=o/s,a.x-=o/s/2,a.y-=o/s/2)}return a}return t},contain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect(),a=this.style;if(t=i[0],e=i[1],n.contain(t,e)){var o=this.path.data;if(a.hasStroke()){var r=a.lineWidth,l=a.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(a.hasFill()||(r=Math.max(r,this.strokeContainThreshold)),s.containStroke(o,r/l,t,e)))return!0}if(a.hasFill())return s.contain(o,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):a.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var i=this.shape;if(i){if(o.isObject(t))for(var n in t)t.hasOwnProperty(n)&&(i[n]=t[n]);else i[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&c(t[0]-1)>1e-10&&c(t[3]-1)>1e-10?Math.sqrt(c(t[0]*t[3]-t[2]*t[1])):1}},n.extend=function(t){var e=function(e){n.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var i=t.shape;if(i){this.shape=this.shape||{};var a=this.shape;for(var o in i)!a.hasOwnProperty(o)&&i.hasOwnProperty(o)&&(a[o]=i[o])}t.init&&t.init.call(this,e)};o.inherits(e,n);for(var i in t)"style"!==i&&"shape"!==i&&(e.prototype[i]=t[i]);return e},o.inherits(n,a),t.exports=n},function(t,e){function i(t){var e={},i={},n=t.match(/Firefox\/([\d.]+)/),a=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge\/([\d.]+)/),r=/micromessenger/i.test(t);return n&&(i.firefox=!0,i.version=n[1]),a&&(i.ie=!0,i.version=a[1]),o&&(i.edge=!0,i.version=o[1]),r&&(i.weChat=!0),{browser:i,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!i.ie&&!i.edge,pointerEventsSupported:"onpointerdown"in window&&(i.edge||i.ie&&i.version>=11)}}var n={};n="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:i(navigator.userAgent),t.exports=n},function(t,e,i){function n(t,e,i){this.parentModel=e,this.ecModel=i,this.option=t}function a(t,e,i){for(var n=0;n<e.length&&(!e[n]||(t=t&&"object"==typeof t?t[e[n]]:null,null!=t));n++);return null==t&&i&&(t=i.get(e)),t}function o(t,e){var i=s.get(t,"getParent");return i?i.call(t,e):t.parentModel}var r=i(1),s=i(15),l=i(9);n.prototype={constructor:n,init:null,mergeOption:function(t){r.merge(this.option,t,!0)},get:function(t,e){return null==t?this.option:a(this.option,this.parsePath(t),!e&&o(this,t))},getShallow:function(t,e){var i=this.option,n=null==i?i:i[t],a=!e&&o(this,t);return null==n&&a&&(n=a.getShallow(t)),n},getModel:function(t,e){var i,r=null==t?this.option:a(this.option,t=this.parsePath(t));return e=e||(i=o(this,t))&&i.getModel(t),new n(r,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){var t=this.constructor;return new t(r.clone(this.option))},setReadOnly:function(t){s.setReadOnly(this,t)},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){s.set(this,"getParent",t)},isAnimationEnabled:function(){if(!l.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},s.enableClassExtend(n);var u=r.mixin;u(n,i(143)),u(n,i(140)),u(n,i(144)),u(n,i(142)),t.exports=n},function(t,e,i){"use strict";function n(t,e,i,n){i<0&&(t+=i,i=-i),n<0&&(e+=n,n=-n),this.x=t,this.y=e,this.width=i,this.height=n}var a=i(6),o=i(19),r=a.applyTransform,s=Math.min,l=Math.max;n.prototype={constructor:n,union:function(t){var e=s(t.x,this.x),i=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-i,this.x=e,this.y=i},applyTransform:function(){var t=[],e=[],i=[],n=[];return function(a){if(a){t[0]=i[0]=this.x,t[1]=n[1]=this.y,e[0]=n[0]=this.x+this.width,e[1]=i[1]=this.y+this.height,r(t,t,a),r(e,e,a),r(i,i,a),r(n,n,a),this.x=s(t[0],e[0],i[0],n[0]),this.y=s(t[1],e[1],i[1],n[1]);var o=l(t[0],e[0],i[0],n[0]),u=l(t[1],e[1],i[1],n[1]);this.width=o-this.x,this.height=u-this.y}}}(),calculateTransform:function(t){var e=this,i=t.width/e.width,n=t.height/e.height,a=o.create();return o.translate(a,a,[-e.x,-e.y]),o.scale(a,a,[i,n]),o.translate(a,a,[t.x,t.y]),
+a},intersect:function(t){if(!t)return!1;t instanceof n||(t=n.create(t));var e=this,i=e.x,a=e.x+e.width,o=e.y,r=e.y+e.height,s=t.x,l=t.x+t.width,u=t.y,c=t.y+t.height;return!(a<s||l<i||r<u||c<o)},contain:function(t,e){var i=this;return t>=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new n(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},n.create=function(t){return new n(t.x,t.y,t.width,t.height)},t.exports=n},function(t,e,i){"use strict";function n(t,e,i,n,a){var o=0,r=0;null==n&&(n=1/0),null==a&&(a=1/0);var s=0;e.eachChild(function(l,u){var c,h,d=l.position,f=l.getBoundingRect(),p=e.childAt(u+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=f.width+(g?-g.x+f.x:0);c=o+m,c>n||l.newline?(o=0,c=m,r+=s+i,s=f.height):s=Math.max(s,f.height)}else{var v=f.height+(g?-g.y+f.y:0);h=r+v,h>a||l.newline?(o+=s+i,r=0,h=v,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=o,d[1]=r,"horizontal"===t?o=c+i:r=h+i)})}var a=i(1),o=i(11),r=i(4),s=i(7),l=r.parsePercent,u=a.each,c={},h=c.LOCATION_PARAMS=["left","right","top","bottom","width","height"],d=c.HV_NAMES=[["width","left","right"],["height","top","bottom"]];c.box=n,c.vbox=a.curry(n,"vertical"),c.hbox=a.curry(n,"horizontal"),c.getAvailableSize=function(t,e,i){var n=e.width,a=e.height,o=l(t.x,n),r=l(t.y,a),u=l(t.x2,n),c=l(t.y2,a);return(isNaN(o)||isNaN(parseFloat(t.x)))&&(o=0),(isNaN(u)||isNaN(parseFloat(t.x2)))&&(u=n),(isNaN(r)||isNaN(parseFloat(t.y)))&&(r=0),(isNaN(c)||isNaN(parseFloat(t.y2)))&&(c=a),i=s.normalizeCssArray(i||0),{width:Math.max(u-o-i[1]-i[3],0),height:Math.max(c-r-i[0]-i[2],0)}},c.getLayoutRect=function(t,e,i){i=s.normalizeCssArray(i||0);var n=e.width,a=e.height,r=l(t.left,n),u=l(t.top,a),c=l(t.right,n),h=l(t.bottom,a),d=l(t.width,n),f=l(t.height,a),p=i[2]+i[0],g=i[1]+i[3],m=t.aspect;switch(isNaN(d)&&(d=n-c-g-r),isNaN(f)&&(f=a-h-p-u),isNaN(d)&&isNaN(f)&&(m>n/a?d=.8*n:f=.8*a),null!=m&&(isNaN(d)&&(d=m*f),isNaN(f)&&(f=d/m)),isNaN(r)&&(r=n-c-d-g),isNaN(u)&&(u=a-h-f-p),t.left||t.right){case"center":r=n/2-d/2-i[3];break;case"right":r=n-d-g}switch(t.top||t.bottom){case"middle":case"center":u=a/2-f/2-i[0];break;case"bottom":u=a-f-p}r=r||0,u=u||0,isNaN(d)&&(d=n-r-(c||0)),isNaN(f)&&(f=a-u-(h||0));var v=new o(r+i[3],u+i[0],d,f);return v.margin=i,v},c.positionElement=function(t,e,i,n,r){var s=!r||!r.hv||r.hv[0],l=!r||!r.hv||r.hv[1],u=r&&r.boundingMode||"all";if(s||l){var h;if("raw"===u)h="group"===t.type?new o(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(h=t.getBoundingRect(),t.needLocalTransform()){var d=t.getLocalTransform();h=h.clone(),h.applyTransform(d)}e=c.getLayoutRect(a.defaults({width:h.width,height:h.height},e),i,n);var f=t.position,p=s?e.x-h.x:0,g=l?e.y-h.y:0;t.attr("position","raw"===u?[p,g]:[f[0]+p,f[1]+g])}},c.sizeCalculable=function(t,e){return null!=t[d[e][0]]||null!=t[d[e][1]]&&null!=t[d[e][2]]},c.mergeLayoutParam=function(t,e,i){function n(i,n){var a={},s=0,c={},h=0,d=2;if(u(i,function(e){c[e]=t[e]}),u(i,function(t){o(e,t)&&(a[t]=c[t]=e[t]),r(a,t)&&s++,r(c,t)&&h++}),l[n])return r(e,i[1])?c[i[2]]=null:r(e,i[2])&&(c[i[1]]=null),c;if(h!==d&&s){if(s>=d)return a;for(var f=0;f<i.length;f++){var p=i[f];if(!o(a,p)&&o(t,p)){a[p]=t[p];break}}return a}return c}function o(t,e){return t.hasOwnProperty(e)}function r(t,e){return null!=t[e]&&"auto"!==t[e]}function s(t,e,i){u(t,function(t){e[t]=i[t]})}!a.isObject(i)&&(i={});var l=i.ignoreSize;!a.isArray(l)&&(l=[l,l]);var c=n(d[0],0),h=n(d[1],1);s(d[0],t,c),s(d[1],t,h)},c.getLayoutParams=function(t){return c.copyLayoutParams({},t)},c.copyLayoutParams=function(t,e){return e&&t&&u(h,function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t},t.exports=c},function(t,e,i){function n(t){var e=[];return o.each(c.getClassesByMainType(t),function(t){r.apply(e,t.prototype.dependencies||[])}),o.map(e,function(t){return l.parseClassType(t).main})}var a=i(10),o=i(1),r=Array.prototype.push,s=i(49),l=i(15),u=i(12),c=a.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,i,n){a.call(this,t,e,i,n),this.uid=s.getUID("componentModel")},init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i)},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,n=i?u.getLayoutParams(t):{},a=e.getTheme();o.merge(t,a.get(this.mainType)),o.merge(t,this.getDefaultOption()),i&&u.mergeLayoutParam(t,n,i)},mergeOption:function(t,e){o.merge(this.option,t,!0);var i=this.layoutMode;i&&u.mergeLayoutParam(this.option,t,i)},optionUpdated:function(t,e){},getDefaultOption:function(){if(!l.hasOwn(this,"__defaultOption")){for(var t=[],e=this.constructor;e;){var i=e.prototype.defaultOption;i&&t.push(i),e=e.superClass}for(var n={},a=t.length-1;a>=0;a--)n=o.merge(n,t[a],!0);l.set(this,"__defaultOption",n)}return l.get(this,"__defaultOption")},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});l.enableClassManagement(c,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(c),s.enableTopologicalTravel(c,n),o.mixin(c,i(141)),t.exports=c},function(t,e,i){(function(e){function n(t,e){p.each(v.concat(e.__wrappedMethods||[]),function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t.__wrappedMethods=e.__wrappedMethods}function a(t){this._array=t||[]}function o(t){return p.isArray(t)||(t=[t]),t}function r(t,e){var i=t.dimensions,a=new y(p.map(i,t.getDimensionInfo,t),t.hostModel);n(a,t);for(var o=a._storage={},r=t._storage,s=0;s<i.length;s++){var l=i[s],u=r[l];p.indexOf(e,l)>=0?o[l]=new u.constructor(r[l].length):o[l]=r[l]}return a}var s="undefined",l="undefined"==typeof window?e:window,u=typeof l.Float64Array===s?Array:l.Float64Array,c=typeof l.Int32Array===s?Array:l.Int32Array,h={"float":u,"int":c,ordinal:Array,number:Array,time:Array},d=i(10),f=i(48),p=i(1),g=i(5),m=p.isObject,v=["stackedOn","hasItemOption","_nameList","_idList","_rawData"];a.prototype.pure=!1,a.prototype.count=function(){return this._array.length},a.prototype.getItem=function(t){return this._array[t]};var y=function(t,e){t=t||["x","y"];for(var i={},n=[],a=0;a<t.length;a++){var o,r={};"string"==typeof t[a]?(o=t[a],r={name:o,coordDim:o,coordDimIndex:0,stackable:!1,type:"number"}):(r=t[a],o=r.name,r.type=r.type||"number",r.coordDim||(r.coordDim=o,r.coordDimIndex=0)),r.otherDims=r.otherDims||{},n.push(o),i[o]=r}this.dimensions=n,this._dimensionInfos=i,this.hostModel=e,this.dataType,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData,this._extent},x=y.prototype;x.type="list",x.hasItemOption=!0,x.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},x.getDimensionInfo=function(t){return p.clone(this._dimensionInfos[this.getDimension(t)])},x.initData=function(t,e,i){t=t||[];var n=p.isArray(t);n&&(t=new a(t)),this._rawData=t;var o,r=this._storage={},s=this.indices=[],l=this.dimensions,u=this._dimensionInfos,c=t.count(),d=[],f={};e=e||[];for(var m=0;m<l.length;m++){var v=u[l[m]];0===v.otherDims.itemName&&(o=m);var y=h[v.type];r[l[m]]=new y(c)}var x=this;i||(x.hasItemOption=!1),i=i||function(t,e,i,n){var a=g.getDataItemValue(t);return g.isDataItemOption(t)&&(x.hasItemOption=!0),g.converDataValue(a instanceof Array?a[n]:a,u[e])};for(var m=0;m<c;m++){for(var _=t.getItem(m),b=0;b<l.length;b++){var w=l[b],S=r[w];S[m]=i(_,w,m,b)}s.push(m)}for(var m=0;m<c;m++){var _=t.getItem(m);!e[m]&&_&&(null!=_.name?e[m]=_.name:null!=o&&(e[m]=r[l[o]][m]));var M=e[m]||"",I=_&&_.id;!I&&M&&(f[M]=f[M]||0,I=M,f[M]>0&&(I+="__ec__"+f[M]),f[M]++),I&&(d[m]=I)}this._nameList=e,this._idList=d},x.count=function(){return this.indices.length},x.get=function(t,e,i){var n=this._storage,a=this.indices[e];if(null==a||!n[t])return NaN;var o=n[t][a];if(i){var r=this._dimensionInfos[t];if(r&&r.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(o>=0&&l>0||o<=0&&l<0)&&(o+=l),s=s.stackedOn}}return o},x.getValues=function(t,e,i){var n=[];p.isArray(t)||(i=e,e=t,t=this.dimensions);for(var a=0,o=t.length;a<o;a++)n.push(this.get(t[a],e,i));return n},x.hasValue=function(t){for(var e=this.dimensions,i=this._dimensionInfos,n=0,a=e.length;n<a;n++)if("ordinal"!==i[e[n]].type&&isNaN(this.get(e[n],t)))return!1;return!0},x.getDataExtent=function(t,e,i){t=this.getDimension(t);var n=this._storage[t],a=this.getDimensionInfo(t);e=a&&a.stackable&&e;var o,r=(this._extent||(this._extent={}))[t+!!e];if(r)return r;if(n){for(var s=1/0,l=-(1/0),u=0,c=this.count();u<c;u++)o=this.get(t,u,e),i&&!i(o,t,u)||(o<s&&(s=o),o>l&&(l=o));return this._extent[t+!!e]=[s,l]}return[1/0,-(1/0)]},x.getSum=function(t,e){var i=this._storage[t],n=0;if(i)for(var a=0,o=this.count();a<o;a++){var r=this.get(t,a,e);isNaN(r)||(n+=r)}return n},x.indexOf=function(t,e){var i=this._storage,n=i[t],a=this.indices;if(n)for(var o=0,r=a.length;o<r;o++){var s=a[o];if(n[s]===e)return o}return-1},x.indexOfName=function(t){for(var e=this.indices,i=this._nameList,n=0,a=e.length;n<a;n++){var o=e[n];if(i[o]===t)return n}return-1},x.indexOfRawIndex=function(t){var e=this.indices,i=e[t];if(null!=i&&i===t)return t;for(var n=0,a=e.length-1;n<=a;){var o=(n+a)/2|0;if(e[o]<t)n=o+1;else{if(!(e[o]>t))return o;a=o-1}}return-1},x.indicesOfNearest=function(t,e,i,n){var a=this._storage,o=a[t],r=[];if(!o)return r;null==n&&(n=1/0);for(var s=Number.MAX_VALUE,l=-1,u=0,c=this.count();u<c;u++){var h=e-this.get(t,u,i),d=Math.abs(h);h<=n&&d<=s&&((d<s||h>=0&&l<0)&&(s=d,l=h,r.length=0),r.push(u))}return r},x.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},x.getRawDataItem=function(t){return this._rawData.getItem(this.getRawIndex(t))},x.getName=function(t){return this._nameList[this.indices[t]]||""},x.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},x.each=function(t,e,i,n){"function"==typeof t&&(n=i,i=e,e=t,t=[]),t=p.map(o(t),this.getDimension,this);var a=[],r=t.length,s=this.indices;n=n||this;for(var l=0;l<s.length;l++)switch(r){case 0:e.call(n,l);break;case 1:e.call(n,this.get(t[0],l,i),l);break;case 2:e.call(n,this.get(t[0],l,i),this.get(t[1],l,i),l);break;default:for(var u=0;u<r;u++)a[u]=this.get(t[u],l,i);a[u]=l,e.apply(n,a)}},x.filterSelf=function(t,e,i,n){"function"==typeof t&&(n=i,i=e,e=t,t=[]),t=p.map(o(t),this.getDimension,this);var a=[],r=[],s=t.length,l=this.indices;n=n||this;for(var u=0;u<l.length;u++){var c;if(s)if(1===s)c=e.call(n,this.get(t[0],u,i),u);else{for(var h=0;h<s;h++)r[h]=this.get(t[h],u,i);r[h]=u,c=e.apply(n,r)}else c=e.call(n,u);c&&a.push(l[u])}return this.indices=a,this._extent={},this},x.mapArray=function(t,e,i,n){"function"==typeof t&&(n=i,i=e,e=t,t=[]);var a=[];return this.each(t,function(){a.push(e&&e.apply(this,arguments))},i,n),a},x.map=function(t,e,i,n){t=p.map(o(t),this.getDimension,this);var a=r(this,t),s=a.indices=this.indices,l=a._storage,u=[];return this.each(t,function(){var i=arguments[arguments.length-1],n=e&&e.apply(this,arguments);if(null!=n){"number"==typeof n&&(u[0]=n,n=u);for(var a=0;a<n.length;a++){var o=t[a],r=l[o],c=s[i];r&&(r[c]=n[a])}}},i,n),a},x.downSample=function(t,e,i,n){for(var a=r(this,[t]),o=this._storage,s=a._storage,l=this.indices,u=a.indices=[],c=[],h=[],d=Math.floor(1/e),f=s[t],p=this.count(),g=0;g<o[t].length;g++)s[t][g]=o[t][g];for(var g=0;g<p;g+=d){d>p-g&&(d=p-g,c.length=d);for(var m=0;m<d;m++){var v=l[g+m];c[m]=f[v],h[m]=v}var y=i(c),v=h[n(c,y)||0];f[v]=y,u.push(v)}return a},x.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new d(this._rawData.getItem(t),e,e&&e.ecModel)},x.diff=function(t){var e,i=this._idList,n=t&&t._idList,a="e\0\0";return new f(t?t.indices:[],this.indices,function(t){return null!=(e=n[t])?e:a+t},function(t){return null!=(e=i[t])?e:a+t})},x.getVisual=function(t){var e=this._visual;return e&&e[t]},x.setVisual=function(t,e){if(m(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},x.setLayout=function(t,e){if(m(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},x.getLayout=function(t){return this._layout[t]},x.getItemLayout=function(t){return this._itemLayouts[t]},x.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?p.extend(this._itemLayouts[t]||{},e):e},x.clearItemLayouts=function(){this._itemLayouts.length=0},x.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],a=n&&n[e];return null!=a||i?a:this.getVisual(e)},x.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{};if(this._itemVisuals[t]=n,m(e))for(var a in e)e.hasOwnProperty(a)&&(n[a]=e[a]);else n[e]=i},x.clearAllVisual=function(){this._visual={},this._itemVisuals=[]};var _=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};x.setItemGraphicEl=function(t,e){var i=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=i&&i.seriesIndex,"group"===e.type&&e.traverse(_,e)),this._graphicEls[t]=e},x.getItemGraphicEl=function(t){return this._graphicEls[t]},x.eachItemGraphicEl=function(t,e){p.each(this._graphicEls,function(i,n){i&&t&&t.call(e,i,n)})},x.cloneShallow=function(){var t=p.map(this.dimensions,this.getDimensionInfo,this),e=new y(t,this.hostModel);return e._storage=this._storage,n(e,this),e.indices=this.indices.slice(),this._extent&&(e._extent=p.extend({},this._extent)),e},x.wrapMethod=function(t,e){var i=this[t];"function"==typeof i&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=i.apply(this,arguments);return e.apply(this,[t].concat(p.slice(arguments)))})},x.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],x.CHANGABLE_METHODS=["filterSelf"],t.exports=y}).call(e,function(){return this}())},function(t,e,i){function n(t){r.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function a(t,e){var i=r.slice(arguments,2);return this.superClass.prototype[e].apply(t,i)}function o(t,e,i){return this.superClass.prototype[e].apply(t,i)}var r=i(1),s={},l=".",u="___EC__COMPONENT__CONTAINER___",c="\0ec_\0";s.set=function(t,e,i){return t[c+e]=i},s.get=function(t,e){return t[c+e]},s.hasOwn=function(t,e){return t.hasOwnProperty(c+e)};var h=s.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(l),e.main=t[0]||"",e.sub=t[1]||""),e};s.enableClassExtend=function(t,e){t.$constructor=t,t.extend=function(t){var e=this,i=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return r.extend(i.prototype,t),i.extend=this.extend,i.superCall=a,i.superApply=o,r.inherits(i,this),i.superClass=e,i}},s.enableClassManagement=function(t,e){function i(t){var e=a[t.main];return e&&e[u]||(e=a[t.main]={},e[u]=!0),e}e=e||{};var a={};if(t.registerClass=function(t,e){if(e)if(n(e),e=h(e),e.sub){if(e.sub!==u){var o=i(e);o[e.sub]=t}}else a[e.main]=t;return t},t.getClass=function(t,e,i){var n=a[t];if(n&&n[u]&&(n=e?n[e]:null),i&&!n)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return n},t.getClassesByMainType=function(t){t=h(t);var e=[],i=a[t.main];return i&&i[u]?r.each(i,function(t,i){i!==u&&e.push(t)}):e.push(i),e},t.hasClass=function(t){return t=h(t),!!a[t.main]},t.getAllClassMainTypes=function(){var t=[];return r.each(a,function(e,i){t.push(i)}),t},t.hasSubTypes=function(t){t=h(t);var e=a[t.main];return e&&e[u]},t.parseClassType=h,e.registerWhenExtend){var o=t.extend;o&&(t.extend=function(e){var i=o.call(this,e);return t.registerClass(i,e.type)})}return t},s.setReadOnly=function(t,e){},t.exports=s},function(t,e,i){function n(t,e){var i=t+":"+e;if(l[i])return l[i];for(var n=(t+"").split("\n"),a=0,o=0,r=n.length;o<r;o++)a=Math.max(p.measureText(n[o],e).width,a);return u>c&&(u=0,l={}),u++,l[i]=a,a}function a(t,e,i,a){var o=((t||"")+"").split("\n").length,r=n(t,e),s=n("国",e),l=o*s,u=new d(0,0,r,l);switch(u.lineHeight=s,a){case"bottom":case"alphabetic":u.y-=s;break;case"middle":u.y-=s/2}switch(i){case"end":case"right":u.x-=u.width;break;case"center":u.x-=u.width/2}return u}function o(t,e,i,n){var a=e.x,o=e.y,r=e.height,s=e.width,l=i.height,u=i.lineHeight,c=r/2-l/2+u,h="left";switch(t){case"left":a-=n,o+=c,h="right";break;case"right":a+=n+s,o+=c,h="left";break;case"top":a+=s/2,o-=n+l-u,h="center";break;case"bottom":a+=s/2,o+=r+n+u,h="center";break;case"inside":a+=s/2,o+=c,h="center";break;case"insideLeft":a+=n,o+=c,h="left";break;case"insideRight":a+=s-n,o+=c,h="right";break;case"insideTop":a+=s/2,o+=n+u,h="center";break;case"insideBottom":a+=s/2,o+=r-l-n+u,h="center";break;case"insideTopLeft":a+=n,o+=n+u,h="left";break;case"insideTopRight":a+=s-n,o+=n+u,h="right";break;case"insideBottomLeft":a+=n,o+=r-l-n+u;break;case"insideBottomRight":a+=s-n,o+=r-l-n+u,h="right"}return{x:a,y:o,textAlign:h,textBaseline:"alphabetic"}}function r(t,e,i,a,o){if(!e)return"";o=o||{},a=f(a,"...");for(var r=f(o.maxIterations,2),l=f(o.minChar,0),u=n("国",i),c=n("a",i),h=f(o.placeholder,""),d=e=Math.max(0,e-1),p=0;p<l&&d>=c;p++)d-=c;var g=n(a);g>d&&(a="",g=0),d=e-g;for(var m=(t+"").split("\n"),p=0,v=m.length;p<v;p++){var y=m[p],x=n(y,i);if(!(x<=e)){for(var _=0;;_++){if(x<=d||_>=r){y+=a;break}var b=0===_?s(y,d,c,u):x>0?Math.floor(y.length*d/x):0;y=y.substr(0,b),x=n(y,i)}""===y&&(y=h),m[p]=y}}return m.join("\n")}function s(t,e,i,n){for(var a=0,o=0,r=t.length;o<r&&a<e;o++){var s=t.charCodeAt(o);a+=0<=s&&s<=127?i:n}return o}var l={},u=0,c=5e3,h=i(1),d=i(11),f=h.retrieve,p={getWidth:n,getBoundingRect:a,adjustTextPositionOnRect:o,truncateText:r,measureText:function(t,e){var i=h.getContext();return i.font=e||"12px sans-serif",i.measureText(t)}};t.exports=p},function(t,e,i){"use strict";var n=i(1),a=i(7),o=i(15),r=i(5),s=i(13),l=i(62),u=i(9),c=i(12),h=o.set,d=o.get,f=a.encodeHTML,p=a.addCommas,g=s.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.normal.color",layoutMode:null,init:function(t,e,i,n){this.seriesIndex=this.componentIndex,this.mergeDefaultAndTheme(t,i);var a=this.getInitialData(t,i);h(this,"dataBeforeProcessed",a),this.restoreData()},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,a=i?c.getLayoutParams(t):{};n.merge(t,e.getTheme().get(this.subType)),n.merge(t,this.getDefaultOption()),r.defaultEmphasis(t.label,r.LABEL_OPTIONS),this.fillDataTextStyle(t.data),i&&c.mergeLayoutParam(t,a,i)},mergeOption:function(t,e){t=n.merge(this.option,t,!0),this.fillDataTextStyle(t.data);var i=this.layoutMode;i&&c.mergeLayoutParam(this.option,t,i);var a=this.getInitialData(t,e);a&&(h(this,"data",a),h(this,"dataBeforeProcessed",a.cloneShallow()))},fillDataTextStyle:function(t){if(t)for(var e=0;e<t.length;e++)t[e]&&t[e].label&&r.defaultEmphasis(t[e].label,r.LABEL_OPTIONS)},getInitialData:function(){},getData:function(t){var e=d(this,"data");return null==t?e:e.getLinkedData(t)},setData:function(t){h(this,"data",t)},getRawData:function(){return d(this,"dataBeforeProcessed")},coordDimToDataDim:function(t){return r.coordDimToDataDim(this.getData(),t)},dataDimToCoordDim:function(t){return r.dataDimToCoordDim(this.getData(),t)},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,i){function o(i){function o(t,i){var n=s.getDimensionInfo(i);if(n&&n.otherDims.tooltip!==!1){var o=n.type,r=(l?"- "+(n.tooltipName||n.name)+": ":"")+("ordinal"===o?t+"":"time"===o?e?"":a.formatTime("yyyy/MM/dd hh:mm:ss",t):p(t));r&&u.push(f(r))}}var l=n.reduce(i,function(t,e,i){var n=s.getDimensionInfo(i);return t|=n.tooltip!==!1&&null!=n.tooltipName},0),u=[],c=r.otherDimToDataDim(s,"tooltip");return c.length?n.each(c,function(e){o(s.get(e,t),e)}):n.each(i,o),(l?"<br/>":"")+u.join(l?"<br/>":", ")}var s=d(this,"data"),l=this.getRawValue(t),u=n.isArray(l)?o(l):f(p(l)),c=s.getName(t),h=s.getItemVisual(t,"color");n.isObject(h)&&h.colorStops&&(h=(h.colorStops[0]||{}).color),h=h||"transparent";var g=a.getTooltipMarker(h),m=this.name;return"\0-"===m&&(m=""),m=m?f(m)+(e?": ":"<br/>"):"",e?g+m+u:m+g+(c?f(c)+": "+u:u)},isAnimationEnabled:function(){if(u.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){h(this,"data",d(this,"dataBeforeProcessed").cloneShallow())},getColorFromPalette:function(t,e){var i=this.ecModel,n=l.getColorFromPalette.call(this,t,e);return n||(n=i.getColorFromPalette(t,e)),n},getAxisTooltipData:null,getTooltipPosition:null});n.mixin(g,r.dataFormatMixin),n.mixin(g,l),t.exports=g},function(t,e,i){var n=i(149),a=i(43);i(150),i(148);var o=i(34),r=i(4),s=i(1),l=i(16),u={};u.getScaleExtent=function(t,e){var i,n,a,o=t.type,l=e.getMin(),u=e.getMax(),c=null!=l,h=null!=u,d=t.getExtent();return"ordinal"===o?i=(e.get("data")||[]).length:(n=e.get("boundaryGap"),s.isArray(n)||(n=[n||0,n||0]),"boolean"==typeof n[0]&&(n=[0,0]),n[0]=r.parsePercent(n[0],1),n[1]=r.parsePercent(n[1],1),a=d[1]-d[0]||Math.abs(d[0])),null==l&&(l="ordinal"===o?i?0:NaN:d[0]-n[0]*a),null==u&&(u="ordinal"===o?i?i-1:NaN:d[1]+n[1]*a),"dataMin"===l&&(l=d[0]),"dataMax"===u&&(u=d[1]),(null==l||!isFinite(l))&&(l=NaN),(null==u||!isFinite(u))&&(u=NaN),t.setBlank(s.eqNaN(l)||s.eqNaN(u)),e.getNeedCrossZero()&&(l>0&&u>0&&!c&&(l=0),l<0&&u<0&&!h&&(u=0)),[l,u]},u.niceScaleExtent=function(t,e){var i=u.getScaleExtent(t,e),n=null!=e.getMin(),a=null!=e.getMax(),o=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase")),t.setExtent(i[0],i[1]),t.niceExtent({splitNumber:o,fixMin:n,fixMax:a,minInterval:"interval"===t.type?e.get("minInterval"):null});var r=e.get("interval");null!=r&&t.setInterval&&t.setInterval(r)},u.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new n(t.getCategories(),[1/0,-(1/0)]);case"value":return new a;default:return(o.getClass(e)||a).create(t)}},u.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(i>0&&n>0||i<0&&n<0)},u.getAxisLabelInterval=function(t,e,i,n){var a,o=0,r=0,s=1;e.length>40&&(s=Math.floor(e.length/40));for(var u=0;u<t.length;u+=s){var c=t[u],h=l.getBoundingRect(e[u],i,"center","top");h[n?"x":"y"]+=c,h[n?"width":"height"]*=1.3,a?a.intersect(h)?(r++,o=Math.max(o,r)):(a.union(h),r=0):a=h.clone()}return 0===o&&s>1?s:(o+1)*s-1},u.getFormattedLabels=function(t,e){var i=t.scale,n=i.getTicksLabels(),a=i.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),s.map(n,e)):"function"==typeof e?s.map(a,function(i,n){return e(u.getAxisRawValue(t,i),n)},this):n},u.getAxisRawValue=function(t,e){return"category"===t.type?t.scale.getLabel(e):e},t.exports=u},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(){var t=new i(6);return n.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,i){var n=e[0]*i[0]+e[2]*i[1],a=e[1]*i[0]+e[3]*i[1],o=e[0]*i[2]+e[2]*i[3],r=e[1]*i[2]+e[3]*i[3],s=e[0]*i[4]+e[2]*i[5]+e[4],l=e[1]*i[4]+e[3]*i[5]+e[5];return t[0]=n,t[1]=a,t[2]=o,t[3]=r,t[4]=s,t[5]=l,t},translate:function(t,e,i){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+i[0],t[5]=e[5]+i[1],t},rotate:function(t,e,i){var n=e[0],a=e[2],o=e[4],r=e[1],s=e[3],l=e[5],u=Math.sin(i),c=Math.cos(i);return t[0]=n*c+r*u,t[1]=-n*u+r*c,t[2]=a*c+s*u,t[3]=-a*u+c*s,t[4]=c*o+u*l,t[5]=c*l-u*o,t},scale:function(t,e,i){var n=i[0],a=i[1];return t[0]=e[0]*n,t[1]=e[1]*a,t[2]=e[2]*n,t[3]=e[3]*a,t[4]=e[4]*n,t[5]=e[5]*a,t},invert:function(t,e){var i=e[0],n=e[2],a=e[4],o=e[1],r=e[3],s=e[5],l=i*r-o*n;return l?(l=1/l,t[0]=r*l,t[1]=-o*l,t[2]=-n*l,t[3]=i*l,t[4]=(n*s-r*a)*l,t[5]=(o*a-i*s)*l,t):null}};t.exports=n},function(t,e,i){"use strict";function n(t){return t>-w&&t<w}function a(t){return t>w||t<-w}function o(t,e,i,n,a){var o=1-a;return o*o*(o*t+3*a*e)+a*a*(a*n+3*o*i)}function r(t,e,i,n,a){var o=1-a;return 3*(((e-t)*o+2*(i-e)*a)*o+(n-i)*a*a)}function s(t,e,i,a,o,r){var s=a+3*(e-i)-t,l=3*(i-2*e+t),u=3*(e-t),c=t-o,h=l*l-3*s*u,d=l*u-9*s*c,f=u*u-3*l*c,p=0;if(n(h)&&n(d))if(n(l))r[0]=0;else{var g=-u/l;g>=0&&g<=1&&(r[p++]=g)}else{var m=d*d-4*h*f;if(n(m)){var v=d/h,g=-l/s+v,y=-v/2;g>=0&&g<=1&&(r[p++]=g),y>=0&&y<=1&&(r[p++]=y)}else if(m>0){var x=b(m),w=h*l+1.5*s*(-d+x),S=h*l+1.5*s*(-d-x);w=w<0?-_(-w,I):_(w,I),S=S<0?-_(-S,I):_(S,I);var g=(-l-(w+S))/(3*s);g>=0&&g<=1&&(r[p++]=g)}else{var T=(2*h*l-3*s*d)/(2*b(h*h*h)),A=Math.acos(T)/3,C=b(h),L=Math.cos(A),g=(-l-2*C*L)/(3*s),y=(-l+C*(L+M*Math.sin(A)))/(3*s),D=(-l+C*(L-M*Math.sin(A)))/(3*s);g>=0&&g<=1&&(r[p++]=g),y>=0&&y<=1&&(r[p++]=y),D>=0&&D<=1&&(r[p++]=D)}}return p}function l(t,e,i,o,r){var s=6*i-12*e+6*t,l=9*e+3*o-3*t-9*i,u=3*e-3*t,c=0;if(n(l)){if(a(s)){var h=-u/s;h>=0&&h<=1&&(r[c++]=h)}}else{var d=s*s-4*l*u;if(n(d))r[0]=-s/(2*l);else if(d>0){var f=b(d),h=(-s+f)/(2*l),p=(-s-f)/(2*l);h>=0&&h<=1&&(r[c++]=h),p>=0&&p<=1&&(r[c++]=p)}}return c}function u(t,e,i,n,a,o){var r=(e-t)*a+t,s=(i-e)*a+e,l=(n-i)*a+i,u=(s-r)*a+r,c=(l-s)*a+s,h=(c-u)*a+u;o[0]=t,o[1]=r,o[2]=u,o[3]=h,o[4]=h,o[5]=c,o[6]=l,o[7]=n}function c(t,e,i,n,a,r,s,l,u,c,h){var d,f,p,g,m,v=.005,y=1/0;T[0]=u,T[1]=c;for(var _=0;_<1;_+=.05)A[0]=o(t,i,a,s,_),A[1]=o(e,n,r,l,_),g=x(T,A),g<y&&(d=_,y=g);y=1/0;for(var w=0;w<32&&!(v<S);w++)f=d-v,p=d+v,A[0]=o(t,i,a,s,f),A[1]=o(e,n,r,l,f),g=x(A,T),f>=0&&g<y?(d=f,y=g):(C[0]=o(t,i,a,s,p),C[1]=o(e,n,r,l,p),m=x(C,T),p<=1&&m<y?(d=p,y=m):v*=.5);return h&&(h[0]=o(t,i,a,s,d),h[1]=o(e,n,r,l,d)),b(y)}function h(t,e,i,n){var a=1-n;return a*(a*t+2*n*e)+n*n*i}function d(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}function f(t,e,i,o,r){var s=t-2*e+i,l=2*(e-t),u=t-o,c=0;if(n(s)){if(a(l)){var h=-u/l;h>=0&&h<=1&&(r[c++]=h)}}else{var d=l*l-4*s*u;if(n(d)){var h=-l/(2*s);h>=0&&h<=1&&(r[c++]=h)}else if(d>0){var f=b(d),h=(-l+f)/(2*s),p=(-l-f)/(2*s);h>=0&&h<=1&&(r[c++]=h),p>=0&&p<=1&&(r[c++]=p)}}return c}function p(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}function g(t,e,i,n,a){var o=(e-t)*n+t,r=(i-e)*n+e,s=(r-o)*n+o;a[0]=t,a[1]=o,a[2]=s,a[3]=s,a[4]=r,a[5]=i}function m(t,e,i,n,a,o,r,s,l){var u,c=.005,d=1/0;T[0]=r,T[1]=s;for(var f=0;f<1;f+=.05){A[0]=h(t,i,a,f),A[1]=h(e,n,o,f);var p=x(T,A);p<d&&(u=f,d=p)}d=1/0;for(var g=0;g<32&&!(c<S);g++){var m=u-c,v=u+c;A[0]=h(t,i,a,m),A[1]=h(e,n,o,m);var p=x(A,T);if(m>=0&&p<d)u=m,d=p;else{C[0]=h(t,i,a,v),C[1]=h(e,n,o,v);var y=x(C,T);v<=1&&y<d?(u=v,d=y):c*=.5}}return l&&(l[0]=h(t,i,a,u),l[1]=h(e,n,o,u)),b(d)}var v=i(6),y=v.create,x=v.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,S=1e-4,M=b(3),I=1/3,T=y(),A=y(),C=y();t.exports={cubicAt:o,cubicDerivativeAt:r,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:u,cubicProjectPoint:c,quadraticAt:h,quadraticDerivativeAt:d,quadraticRootAt:f,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:m}},function(t,e,i){"use strict";function n(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function a(t,e,i,n){return i=i||{},n||!c.canvasSupported?o(t,e,i):c.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(i.zrX=e.layerX,i.zrY=e.layerY):null!=e.offsetX?(i.zrX=e.offsetX,i.zrY=e.offsetY):o(t,e,i),i}function o(t,e,i){var a=n(t);i.zrX=e.clientX-a.left,i.zrY=e.clientY-a.top}function r(t,e,i){if(e=e||window.event,null!=e.zrX)return e;var n=e.type,o=n&&n.indexOf("touch")>=0;if(o){var r="touchend"!=n?e.targetTouches[0]:e.changedTouches[0];r&&a(t,r,e,i)}else a(t,e,e,i),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;return e}function s(t,e,i){h?t.addEventListener(e,i):t.attachEvent("on"+e,i)}function l(t,e,i){h?t.removeEventListener(e,i):t.detachEvent("on"+e,i)}var u=i(23),c=i(9),h="undefined"!=typeof window&&!!window.addEventListener,d=h?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={clientToLocal:a,normalizeEvent:r,addEventListener:s,removeEventListener:l,stop:d,Dispatcher:u}},function(t,e,i){function n(t){return t=Math.round(t),t<0?0:t>255?255:t}function a(t){return t=Math.round(t),t<0?0:t>360?360:t}function o(t){return t<0?0:t>1?1:t}function r(t){return n(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function s(t){return o(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function l(t,e,i){return i<0?i+=1:i>1&&(i-=1),6*i<1?t+(e-t)*i*6:2*i<1?e:3*i<2?t+(e-t)*(2/3-i)*6:t}function u(t,e,i){return t+(e-t)*i}function c(t,e,i,n,a){return t[0]=e,t[1]=i,t[2]=n,t[3]=a,t}function h(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function d(t,e){T&&h(T,e),T=I.put(t,T||e.slice())}function f(t,e){if(t){e=e||[];var i=I.get(t);if(i)return h(e,i);t+="";var n=t.replace(/ /g,"").toLowerCase();if(n in M)return h(e,M[n]),d(t,e),e;if("#"!==n.charAt(0)){var a=n.indexOf("("),o=n.indexOf(")");if(a!==-1&&o+1===n.length){var l=n.substr(0,a),u=n.substr(a+1,o-(a+1)).split(","),f=1;switch(l){case"rgba":if(4!==u.length)return void c(e,0,0,0,1);f=s(u.pop());case"rgb":return 3!==u.length?void c(e,0,0,0,1):(c(e,r(u[0]),r(u[1]),r(u[2]),f),d(t,e),e);case"hsla":return 4!==u.length?void c(e,0,0,0,1):(u[3]=s(u[3]),p(u,e),d(t,e),e);case"hsl":return 3!==u.length?void c(e,0,0,0,1):(p(u,e),d(t,e),e);default:return}}c(e,0,0,0,1)}else{if(4===n.length){var g=parseInt(n.substr(1),16);return g>=0&&g<=4095?(c(e,(3840&g)>>4|(3840&g)>>8,240&g|(240&g)>>4,15&g|(15&g)<<4,1),d(t,e),e):void c(e,0,0,0,1)}if(7===n.length){var g=parseInt(n.substr(1),16);return g>=0&&g<=16777215?(c(e,(16711680&g)>>16,(65280&g)>>8,255&g,1),d(t,e),e):void c(e,0,0,0,1)}}}}function p(t,e){var i=(parseFloat(t[0])%360+360)%360/360,a=s(t[1]),o=s(t[2]),r=o<=.5?o*(a+1):o+a-o*a,u=2*o-r;return e=e||[],c(e,n(255*l(u,r,i+1/3)),n(255*l(u,r,i)),n(255*l(u,r,i-1/3)),1),4===t.length&&(e[3]=t[3]),e}function g(t){if(t){var e,i,n=t[0]/255,a=t[1]/255,o=t[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r,u=(s+r)/2;if(0===l)e=0,i=0;else{i=u<.5?l/(s+r):l/(2-s-r);var c=((s-n)/6+l/2)/l,h=((s-a)/6+l/2)/l,d=((s-o)/6+l/2)/l;n===s?e=d-h:a===s?e=1/3+c-d:o===s&&(e=2/3+h-c),e<0&&(e+=1),e>1&&(e-=1)}var f=[360*e,i,u];return null!=t[3]&&f.push(t[3]),f}}function m(t,e){var i=f(t);if(i){for(var n=0;n<3;n++)e<0?i[n]=i[n]*(1-e)|0:i[n]=(255-i[n])*e+i[n]|0;return w(i,4===i.length?"rgba":"rgb")}}function v(t,e){var i=f(t);if(i)return((1<<24)+(i[0]<<16)+(i[1]<<8)+ +i[2]).toString(16).slice(1)}function y(t,e,i){if(e&&e.length&&t>=0&&t<=1){i=i||[];var a=t*(e.length-1),r=Math.floor(a),s=Math.ceil(a),l=e[r],c=e[s],h=a-r;return i[0]=n(u(l[0],c[0],h)),i[1]=n(u(l[1],c[1],h)),i[2]=n(u(l[2],c[2],h)),i[3]=o(u(l[3],c[3],h)),i}}function x(t,e,i){if(e&&e.length&&t>=0&&t<=1){var a=t*(e.length-1),r=Math.floor(a),s=Math.ceil(a),l=f(e[r]),c=f(e[s]),h=a-r,d=w([n(u(l[0],c[0],h)),n(u(l[1],c[1],h)),n(u(l[2],c[2],h)),o(u(l[3],c[3],h))],"rgba");return i?{color:d,leftIndex:r,rightIndex:s,value:a}:d}}function _(t,e,i,n){if(t=f(t))return t=g(t),null!=e&&(t[0]=a(e)),null!=i&&(t[1]=s(i)),null!=n&&(t[2]=s(n)),w(p(t),"rgba")}function b(t,e){if(t=f(t),t&&null!=e)return t[3]=o(e),w(t,"rgba")}function w(t,e){if(t&&t.length){var i=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(i+=","+t[3]),e+"("+i+")"}}var S=i(70),M={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],
+darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},I=new S(20),T=null;t.exports={parse:f,lift:m,toHex:v,fastMapToColor:y,mapToColor:x,modifyHSL:_,modifyAlpha:b,stringify:w}},function(t,e){var i=Array.prototype.slice,n=function(){this._$handlers={}};n.prototype={constructor:n,one:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var a=0;a<n[t].length;a++)if(n[t][a].h===e)return this;return n[t].push({h:e,one:!0,ctx:i||this}),this},on:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var a=0;a<n[t].length;a++)if(n[t][a].h===e)return this;return n[t].push({h:e,one:!1,ctx:i||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var i=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(i[t]){for(var n=[],a=0,o=i[t].length;a<o;a++)i[t][a].h!=e&&n.push(i[t][a]);i[t]=n}i[t]&&0===i[t].length&&delete i[t]}else delete i[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>3&&(e=i.call(e,1));for(var a=this._$handlers[t],o=a.length,r=0;r<o;){switch(n){case 1:a[r].h.call(a[r].ctx);break;case 2:a[r].h.call(a[r].ctx,e[1]);break;case 3:a[r].h.call(a[r].ctx,e[1],e[2]);break;default:a[r].h.apply(a[r].ctx,e)}a[r].one?(a.splice(r,1),o--):r++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>4&&(e=i.call(e,1,e.length-1));for(var a=e[e.length-1],o=this._$handlers[t],r=o.length,s=0;s<r;){switch(n){case 1:o[s].h.call(a);break;case 2:o[s].h.call(a,e[1]);break;case 3:o[s].h.call(a,e[1],e[2]);break;default:o[s].h.apply(a,e)}o[s].one?(o.splice(s,1),r--):s++}}return this}},t.exports=n},function(t,e,i){"use strict";var n=i(3),a=i(11),o=n.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,a=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+a,n+o),t.lineTo(i-a,n+o),t.closePath()}}),r=n.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,a=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+a,n),t.lineTo(i,n+o),t.lineTo(i-a,n),t.closePath()}}),s=n.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,a=e.width/5*3,o=Math.max(a,e.height),r=a/2,s=r*r/(o-r),l=n-o+r+s,u=Math.asin(s/r),c=Math.cos(u)*r,h=Math.sin(u),d=Math.cos(u);t.arc(i,l,r,Math.PI-u,2*Math.PI+u);var f=.6*r,p=.7*r;t.bezierCurveTo(i+c-h*f,l+s+d*f,i,n-p,i,n),t.bezierCurveTo(i,n-p,i-c+h*f,l+s+d*f,i-c,l+s),t.closePath()}}),l=n.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.height,n=e.width,a=e.x,o=e.y,r=n/3*2;t.moveTo(a,o),t.lineTo(a+r,o+i),t.lineTo(a,o+i/4*3),t.lineTo(a-r,o+i),t.lineTo(a,o),t.closePath()}}),u={line:n.Line,rect:n.Rect,roundRect:n.Rect,square:n.Rect,circle:n.Circle,diamond:r,pin:s,arrow:l,triangle:o},c={line:function(t,e,i,n,a){a.x1=t,a.y1=e+n/2,a.x2=t+i,a.y2=e+n/2},rect:function(t,e,i,n,a){a.x=t,a.y=e,a.width=i,a.height=n},roundRect:function(t,e,i,n,a){a.x=t,a.y=e,a.width=i,a.height=n,a.r=Math.min(i,n)/4},square:function(t,e,i,n,a){var o=Math.min(i,n);a.x=t,a.y=e,a.width=o,a.height=o},circle:function(t,e,i,n,a){a.cx=t+i/2,a.cy=e+n/2,a.r=Math.min(i,n)/2},diamond:function(t,e,i,n,a){a.cx=t+i/2,a.cy=e+n/2,a.width=i,a.height=n},pin:function(t,e,i,n,a){a.x=t+i/2,a.y=e+n/2,a.width=i,a.height=n},arrow:function(t,e,i,n,a){a.x=t+i/2,a.y=e+n/2,a.width=i,a.height=n},triangle:function(t,e,i,n,a){a.cx=t+i/2,a.cy=e+n/2,a.width=i,a.height=n}},h={};for(var d in u)u.hasOwnProperty(d)&&(h[d]=new u[d]);var f=n.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,i){var n=e.symbolType,a=h[n];"none"!==e.symbolType&&(a||(n="rect",a=h[n]),c[n](e.x,e.y,e.width,e.height,a.shape),a.buildPath(t,a.shape,i))}}),p=function(t){if("image"!==this.type){var e=this.style,i=this.shape;i&&"line"===i.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty(!1)}},g={createSymbol:function(t,e,i,o,r,s){var l=0===t.indexOf("empty");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var u;return u=0===t.indexOf("image://")?new n.Image({style:{image:t.slice(8),x:e,y:i,width:o,height:r}}):0===t.indexOf("path://")?n.makePath(t.slice(7),{},new a(e,i,o,r)):new f({shape:{symbolType:t,x:e,y:i,width:o,height:r}}),u.__isEmptyBrush=l,u.setColor=p,u.setColor(s),u}};t.exports=g},function(t,e,i){function n(t,e,i){function n(t,e,i){h[e]?t.otherDims[e]=i:(t.coordDim=e,t.coordDimIndex=i,m.set(e,!0))}function r(t,e,i){if(i||null!=e.get(t)){for(var n=0;null!=e.get(t+n);)n++;t+=n}return e.set(t,!0),t}e=e||[],i=i||{},t=(t||[]).slice();var f=(i.dimsDef||[]).slice(),p=o.createHashMap(i.encodeDef),g=o.createHashMap(),m=o.createHashMap(),v=[],y=i.dimCount;if(null==y){var x=a(e[0]);y=Math.max(o.isArray(x)&&x.length||1,t.length,f.length),s(t,function(t){var e=t.dimsDef;e&&(y=Math.max(y,e.length))})}for(var _=0;_<y;_++){var b=l(f[_])?{name:f[_]}:f[_]||{},w=b.name,S=v[_]={otherDims:{}};null!=w&&null==g.get(w)&&(S.name=S.tooltipName=w,g.set(w,_)),null!=b.type&&(S.type=b.type)}p.each(function(t,e){t=p.set(e,c(t).slice()),s(t,function(i,a){l(i)&&(i=g.get(i)),null!=i&&i<y&&(t[a]=i,n(v[i],e,a))})});var M=0;s(t,function(t,e){var i,t,a,r;l(t)?(i=t,t={}):(i=t.name,t=o.clone(t),a=t.dimsDef,r=t.otherDims,t.name=t.coordDim=t.coordDimIndex=t.dimsDef=t.otherDims=null);var h=c(p.get(i));if(!h.length)for(var d=0;d<(a&&a.length||1);d++){for(;M<v.length&&null!=v[M].coordDim;)M++;M<v.length&&h.push(M++)}s(h,function(e,o){var s=v[e];n(u(s,t),i,o),null==s.name&&a&&(s.name=s.tooltipName=a[o]),r&&u(s.otherDims,r)})});for(var I=i.extraPrefix||"value",T=0;T<y;T++){var S=v[T]=v[T]||{},A=S.coordDim;null==A&&(S.coordDim=r(I,m,i.extraFromZero),S.coordDimIndex=0,S.isExtraCoord=!0),null==S.name&&(S.name=r(S.coordDim,g)),null==S.type&&d(e,T)&&(S.type="ordinal")}return v}function a(t){return o.isArray(t)?t:o.isObject(t)?t.value:t}var o=i(1),r=i(5),s=o.each,l=o.isString,u=o.defaults,c=r.normalizeToArray,h={tooltip:1,label:1,itemName:1},d=n.guessOrdinal=function(t,e){for(var i=0,n=t.length;i<n;i++){var r=a(t[i]);if(!o.isArray(r))return!1;var r=r[e];if(null!=r&&isFinite(r))return!1;if(l(r)&&"-"!==r)return!0}return!1};t.exports=n},function(t,e,i){"use strict";function n(){this._coordinateSystems=[]}var a=i(1),o={};n.prototype={constructor:n,create:function(t,e){var i=[];a.each(o,function(n,a){var o=n.create(t,e);i=i.concat(o||[])}),this._coordinateSystems=i},update:function(t,e){a.each(this._coordinateSystems,function(i){i.update&&i.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},n.register=function(t,e){o[t]=e},n.get=function(t){return o[t]},t.exports=n},function(t,e,i){"use strict";var n=i(20),a=i(6),o=i(85),r=i(11),s=i(35).devicePixelRatio,l={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},u=[],c=[],h=[],d=[],f=Math.min,p=Math.max,g=Math.cos,m=Math.sin,v=Math.sqrt,y=Math.abs,x="undefined"!=typeof Float32Array,_=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};_.prototype={constructor:_,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=y(1/s/t)||0,this._uy=y(1/s/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(l.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var i=y(t-this._xi)>this._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(l.L,t,e),this._ctx&&i&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),i&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,i,n,a,o){return this.addData(l.C,t,e,i,n,a,o),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,i,n,a,o):this._ctx.bezierCurveTo(t,e,i,n,a,o)),this._xi=a,this._yi=o,this},quadraticCurveTo:function(t,e,i,n){return this.addData(l.Q,t,e,i,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,i,n):this._ctx.quadraticCurveTo(t,e,i,n)),this._xi=i,this._yi=n,this},arc:function(t,e,i,n,a,o){return this.addData(l.A,t,e,i,i,n,a-n,0,o?0:1),this._ctx&&this._ctx.arc(t,e,i,n,a,o),this._xi=g(a)*i+t,this._yi=m(a)*i+t,this},arcTo:function(t,e,i,n,a){return this._ctx&&this._ctx.arcTo(t,e,i,n,a),this},rect:function(t,e,i,n){return this._ctx&&this._ctx.rect(t,e,i,n),this.addData(l.R,t,e,i,n),this},closePath:function(){this.addData(l.Z);var t=this._ctx,e=this._x0,i=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,i),t.closePath()),this._xi=e,this._yi=i,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,i=0;i<t.length;i++)e+=t[i];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!x||(this.data=new Float32Array(e));for(var i=0;i<e;i++)this.data[i]=t[i];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,i=0,n=this._len,a=0;a<e;a++)i+=t[a].len();x&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+i));for(var a=0;a<e;a++)for(var o=t[a].data,r=0;r<o.length;r++)this.data[n++]=o[r];this._len=n},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var i=0;i<arguments.length;i++)e[this._len++]=arguments[i];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var i,n,a=this._dashSum,o=this._dashOffset,r=this._lineDash,s=this._ctx,l=this._xi,u=this._yi,c=t-l,h=e-u,d=v(c*c+h*h),g=l,m=u,y=r.length;for(c/=d,h/=d,o<0&&(o=a+o),o%=a,g-=o*c,m-=o*h;c>0&&g<=t||c<0&&g>=t||0==c&&(h>0&&m<=e||h<0&&m>=e);)n=this._dashIdx,i=r[n],g+=c*i,m+=h*i,this._dashIdx=(n+1)%y,c>0&&g<l||c<0&&g>l||h>0&&m<u||h<0&&m>u||s[n%2?"moveTo":"lineTo"](c>=0?f(g,t):p(g,t),h>=0?f(m,e):p(m,e));c=g-t,h=m-e,this._dashOffset=-v(c*c+h*h)},_dashedBezierTo:function(t,e,i,a,o,r){var s,l,u,c,h,d=this._dashSum,f=this._dashOffset,p=this._lineDash,g=this._ctx,m=this._xi,y=this._yi,x=n.cubicAt,_=0,b=this._dashIdx,w=p.length,S=0;for(f<0&&(f=d+f),f%=d,s=0;s<1;s+=.1)l=x(m,t,i,o,s+.1)-x(m,t,i,o,s),u=x(y,e,a,r,s+.1)-x(y,e,a,r,s),_+=v(l*l+u*u);for(;b<w&&(S+=p[b],!(S>f));b++);for(s=(S-f)/_;s<=1;)c=x(m,t,i,o,s),h=x(y,e,a,r,s),b%2?g.moveTo(c,h):g.lineTo(c,h),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(o,r),l=o-c,u=r-h,this._dashOffset=-v(l*l+u*u)},_dashedQuadraticTo:function(t,e,i,n){var a=i,o=n;i=(i+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,i,n,a,o)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,x&&(this.data=new Float32Array(t)))},getBoundingRect:function(){u[0]=u[1]=h[0]=h[1]=Number.MAX_VALUE,c[0]=c[1]=d[0]=d[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,i=0,n=0,s=0,f=0;f<t.length;){var p=t[f++];switch(1==f&&(e=t[f],i=t[f+1],n=e,s=i),p){case l.M:n=t[f++],s=t[f++],e=n,i=s,h[0]=n,h[1]=s,d[0]=n,d[1]=s;break;case l.L:o.fromLine(e,i,t[f],t[f+1],h,d),e=t[f++],i=t[f++];break;case l.C:o.fromCubic(e,i,t[f++],t[f++],t[f++],t[f++],t[f],t[f+1],h,d),e=t[f++],i=t[f++];break;case l.Q:o.fromQuadratic(e,i,t[f++],t[f++],t[f],t[f+1],h,d),e=t[f++],i=t[f++];break;case l.A:var v=t[f++],y=t[f++],x=t[f++],_=t[f++],b=t[f++],w=t[f++]+b,S=(t[f++],1-t[f++]);1==f&&(n=g(b)*x+v,s=m(b)*_+y),o.fromArc(v,y,x,_,b,w,S,h,d),e=g(w)*x+v,i=m(w)*_+y;break;case l.R:n=e=t[f++],s=i=t[f++];var M=t[f++],I=t[f++];o.fromLine(n,s,n+M,s+I,h,d);break;case l.Z:e=n,i=s}a.min(u,u,h),a.max(c,c,d)}return 0===f&&(u[0]=u[1]=c[0]=c[1]=0),new r(u[0],u[1],c[0]-u[0],c[1]-u[1])},rebuildPath:function(t){for(var e,i,n,a,o,r,s=this.data,u=this._ux,c=this._uy,h=this._len,d=0;d<h;){var f=s[d++];switch(1==d&&(n=s[d],a=s[d+1],e=n,i=a),f){case l.M:e=n=s[d++],i=a=s[d++],t.moveTo(n,a);break;case l.L:o=s[d++],r=s[d++],(y(o-n)>u||y(r-a)>c||d===h-1)&&(t.lineTo(o,r),n=o,a=r);break;case l.C:t.bezierCurveTo(s[d++],s[d++],s[d++],s[d++],s[d++],s[d++]),n=s[d-2],a=s[d-1];break;case l.Q:t.quadraticCurveTo(s[d++],s[d++],s[d++],s[d++]),n=s[d-2],a=s[d-1];break;case l.A:var p=s[d++],v=s[d++],x=s[d++],_=s[d++],b=s[d++],w=s[d++],S=s[d++],M=s[d++],I=x>_?x:_,T=x>_?1:x/_,A=x>_?_/x:1,C=Math.abs(x-_)>.001,L=b+w;C?(t.translate(p,v),t.rotate(S),t.scale(T,A),t.arc(0,0,I,b,L,1-M),t.scale(1/T,1/A),t.rotate(-S),t.translate(-p,-v)):t.arc(p,v,I,b,L,1-M),1==d&&(e=g(b)*x+p,i=m(b)*_+v),n=g(L)*x+p,a=m(L)*_+v;break;case l.R:e=n=s[d],i=a=s[d+1],t.rect(s[d++],s[d++],s[d++],s[d++]);break;case l.Z:t.closePath(),n=e,a=i}}}},_.CMD=l,t.exports=_},function(t,e,i){"use strict";function n(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function a(t){var e=n(t);return null!=e&&!h.isArray(p(e))}function o(t,e,i){t=t||[];var n=e.get("coordinateSystem"),o=m[n],r=f.get(n),s={encodeDef:e.get("encode"),dimsDef:e.get("dimensions")},v=o&&o(t,e,i,s),y=v&&v.dimensions;y||(y=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"],y=c(y,t,s));var x=v?v.categoryIndex:-1,_=new u(y,e),b=l(v,t),w={},S=x>=0&&a(t)?function(t,e,i,n){return d.isDataItemOption(t)&&(_.hasItemOption=!0),n===x?i:g(p(t),y[n])}:function(t,e,i,n){var a=p(t),o=g(a&&a[n],y[n]);d.isDataItemOption(t)&&(_.hasItemOption=!0);var r=v&&v.categoryAxesModels;return r&&r[e]&&"string"==typeof o&&(w[e]=w[e]||r[e].getCategories(),o=h.indexOf(w[e],o),o<0&&!isNaN(o)&&(o=+o)),o};return _.hasItemOption=!1,_.initData(t,b,S),_}function r(t){return"category"!==t&&"time"!==t}function s(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function l(t,e){var i,n=[],a=t&&t.dimensions[t.categoryIndex];if(a&&(i=t.categoryAxesModels[a.name]),i){var o=i.getCategories();if(o){var r=e.length;if(h.isArray(e[0])&&e[0].length>1){n=[];for(var s=0;s<r;s++)n[s]=o[e[s][t.categoryIndex||0]]}else n=o.slice(0)}}return n}var u=i(14),c=i(25),h=i(1),d=i(5),f=i(26),p=d.getDataItemValue,g=d.converDataValue,m={cartesian2d:function(t,e,i,n){var a=h.map(["xAxis","yAxis"],function(t){return i.queryComponents({mainType:t,index:e.get(t+"Index"),id:e.get(t+"Id")})[0]}),o=a[0],l=a[1],u=o.get("type"),d=l.get("type"),f=[{name:"x",type:s(u),stackable:r(u)},{name:"y",type:s(d),stackable:r(d)}],p="category"===u,g="category"===d;f=c(f,t,n);var m={};return p&&(m.x=o),g&&(m.y=l),{dimensions:f,categoryIndex:p?0:g?1:-1,categoryAxesModels:m}},singleAxis:function(t,e,i,n){var a=i.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0],o=a.get("type"),l="category"===o,u=[{name:"single",type:s(o),stackable:r(o)}];u=c(u,t,n);var h={};return l&&(h.single=a),{dimensions:u,categoryIndex:l?0:-1,categoryAxesModels:h}},polar:function(t,e,i,n){var a=i.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0],o=a.findAxisModel("angleAxis"),l=a.findAxisModel("radiusAxis"),u=l.get("type"),h=o.get("type"),d=[{name:"radius",type:s(u),stackable:r(u)},{name:"angle",type:s(h),stackable:r(h)}],f="category"===h,p="category"===u;d=c(d,t,n);var g={};return p&&(g.radius=l),f&&(g.angle=o),{dimensions:d,categoryIndex:f?1:p?0:-1,categoryAxesModels:g}},geo:function(t,e,i,n){return{dimensions:c([{name:"lng"},{name:"lat"}],t,n)}}};t.exports=o},function(t,e){"use strict";var i={};t.exports={register:function(t,e){i[t]=e},get:function(t){return i[t]}}},function(t,e,i){function n(){this.group=new r,this.uid=s.getUID("viewChart")}function a(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var i=0;i<t.childCount();i++)a(t.childAt(i),e)}function o(t,e,i){var n=u.queryDataIndex(t,e);null!=n?c.each(u.normalizeToArray(n),function(e){a(t.getItemGraphicEl(e),i)}):t.eachItemGraphicEl(function(t){a(t,i)})}var r=i(36),s=i(49),l=i(15),u=i(5),c=i(1);n.prototype={type:"chart",init:function(t,e){},render:function(t,e,i,n){},highlight:function(t,e,i,n){o(t.getData(),n,"emphasis")},downplay:function(t,e,i,n){o(t.getData(),n,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){}};var h=n.prototype;h.updateView=h.updateLayout=h.updateVisual=function(t,e,i,n){this.render(t,e,i,n)},l.enableClassExtend(n,["dispose"]),l.enableClassManagement(n,{registerWhenExtend:!0}),t.exports=n},function(t,e,i){var n=i(1);t.exports=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e,i){for(var a={},o=0;o<t.length;o++){var r=t[o][1];if(!(e&&n.indexOf(e,r)>=0||i&&n.indexOf(i,r)<0)){var s=this.getShallow(r);null!=s&&(a[t[o][0]]=s)}}return a}}},function(t,e,i){"use strict";var n=i(3),a=i(1),o=i(2);i(57),i(117),o.extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new n.Rect({shape:t.coordinateSystem.getRect(),style:a.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),o.registerPreprocessor(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})})},function(t,e,i){function n(t,e){var i=t[1]-t[0],n=e,a=i/n/2;t[0]+=a,t[1]-=a}var a=i(4),o=a.linearMap,r=i(1),s=i(18),l=[0,1],u=function(t,e,i){this.dim=t,this.scale=e,this._extent=i||[0,0],this.inverse=!1,this.onBand=!1,this._labelInterval};u.prototype={constructor:u,contain:function(t){var e=this._extent,i=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return t>=i&&t<=n},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return a.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var i=this._extent;i[0]=t,i[1]=e},dataToCoord:function(t,e){var i=this._extent,a=this.scale;return t=a.normalize(t),this.onBand&&"ordinal"===a.type&&(i=i.slice(),n(i,a.count())),o(t,l,i,e)},coordToData:function(t,e){var i=this._extent,a=this.scale;this.onBand&&"ordinal"===a.type&&(i=i.slice(),n(i,a.count()));var r=o(t,i,l,e);return this.scale.scale(r)},pointToData:function(t,e){},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),i=[],n=0;n<e.length;n++)i.push(e[n][0]);return e[n-1]&&i.push(e[n-1][1]),i}return r.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return r.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],i=this.scale.count(),n=t[0],a=t[1],o=a-n,r=0;r<i;r++)e.push([o*r/i+n,o*(r+1)/i+n]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),i=e[1]-e[0]+(this.onBand?1:0);0===i&&(i=1);var n=Math.abs(t[1]-t[0]);return Math.abs(n)/i},getLabelInterval:function(){var t=this._labelInterval;if(!t){var e=this.model,i=e.getModel("axisLabel"),n=i.get("interval");"category"!==this.type||"auto"!==n?t="auto"===n?0:n:this.isHorizontal&&(t=s.getAxisLabelInterval(r.map(this.scale.getTicks(),this.dataToCoord,this),e.getFormattedLabels(),i.getModel("textStyle").getFont(),this.isHorizontal())),this._labelInterval=t}return t}},t.exports=u},function(t,e,i){function n(t){this._setting=t||{},this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var a=i(15),o=n.prototype;o.parse=function(t){return t},o.getSetting=function(t){return this._setting[t]},o.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},o.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},o.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},o.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},o.unionExtentFromData=function(t,e){this.unionExtent(t.getDataExtent(e,!0))},o.getExtent=function(){return this._extent.slice()},o.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},o.getTicksLabels=function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},o.isBlank=function(){return this._isBlank},o.setBlank=function(t){this._isBlank=t},a.enableClassExtend(n),a.enableClassManagement(n,{registerWhenExtend:!0}),t.exports=n},function(t,e){var i=1;"undefined"!=typeof window&&(i=Math.max(window.devicePixelRatio||1,1));var n={debugMode:0,devicePixelRatio:i};t.exports=n},function(t,e,i){var n=i(1),a=i(66),o=i(11),r=function(t){t=t||{},a.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};r.prototype={constructor:r,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,i=0;i<e.length;i++)if(e[i].name===t)return e[i]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var i=this._children,n=i.indexOf(e);n>=0&&(i.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,i=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof r&&t.addChildrenToStorage(e)),i&&i.refresh()},remove:function(t){var e=this.__zr,i=this.__storage,a=this._children,o=n.indexOf(a,t);return o<0?this:(a.splice(o,1),t.parent=null,i&&(i.delFromStorage(t),t instanceof r&&t.delChildrenFromStorage(i)),e&&e.refresh(),this)},removeAll:function(){var t,e,i=this._children,n=this.__storage;for(e=0;e<i.length;e++)t=i[e],n&&(n.delFromStorage(t),t instanceof r&&t.delChildrenFromStorage(n)),t.parent=null;return i.length=0,this},eachChild:function(t,e){for(var i=this._children,n=0;n<i.length;n++){var a=i[n];t.call(e,a,n)}return this},traverse:function(t,e){for(var i=0;i<this._children.length;i++){var n=this._children[i];t.call(e,n),"group"===n.type&&n.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.addToStorage(i),i instanceof r&&i.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.delFromStorage(i),i instanceof r&&i.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,i=new o(0,0,0,0),n=t||this._children,a=[],r=0;r<n.length;r++){var s=n[r];if(!s.ignore&&!s.invisible){var l=s.getBoundingRect(),u=s.getLocalTransform(a);u?(i.copy(l),i.applyTransform(u),e=e||i.clone(),e.union(i)):(e=e||l.clone(),e.union(l))}}return e||i}},n.inherits(r,a),t.exports=r},function(t,e){var i={},n="\0__throttleOriginMethod",a="\0__throttleRate",o="\0__throttleType";i.throttle=function(t,e,i){function n(){c=(new Date).getTime(),h=null,t.apply(r,s||[])}var a,o,r,s,l,u=0,c=0,h=null;e=e||0;var d=function(){a=(new Date).getTime(),r=this,s=arguments;var t=l||e,d=l||i;l=null,o=a-(d?u:c)-t,clearTimeout(h),d?h=setTimeout(n,t):o>=0?n():h=setTimeout(n,-o),u=a};return d.clear=function(){h&&(clearTimeout(h),h=null)},d.debounceNextCall=function(t){l=t},d},i.createOrUpdate=function(t,e,r,s){var l=t[e];if(l){var u=l[n]||l,c=l[o],h=l[a];if(h!==r||c!==s){if(null==r||!s)return t[e]=u;l=t[e]=i.throttle(u,r,"debounce"===s),l[n]=u,l[o]=s,l[a]=r}return l}},i.clear=function(t,e){var i=t[e];i&&i[n]&&(t[e]=i[n])},t.exports=i},function(t,e,i){function n(t){t=t||{},r.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new o(t.style),this._rect=null,this.__clipPaths=[]}var a=i(1),o=i(73),r=i(66),s=i(87);n.prototype={constructor:n,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect();return n.contain(i[0],i[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?r.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new o(t),this.dirty(!1),this}},a.inherits(n,r),a.mixin(n,s),t.exports=n},function(t,e){var i=function(t){this.colorStops=t||[]};i.prototype={constructor:i,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=i},function(t,e,i){function n(t){var e={componentType:t.mainType};return e[t.mainType+"Index"]=t.componentIndex,e}function a(t,e,i,n){var a,o,r=f(i-t.rotation),s=n[0]>n[1],l="start"===e&&!s||"start"!==e&&s;return p(r-x/2)?(o=l?"bottom":"top",a="center"):p(r-1.5*x)?(o=l?"top":"bottom",a="center"):(o="middle",a=r<1.5*x&&r>x/2?l?"left":"right":l?"right":"left"),{rotation:r,textAlign:a,textVerticalAlign:o}}function o(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function r(t,e){var i=t.get("axisLabel.showMinLabel"),n=t.get("axisLabel.showMaxLabel"),a=e[0],o=e[1],r=e[e.length-1],l=e[e.length-2];i===!1?a.ignore=!0:null!=t.getMin()&&s(a,o)&&(i?o.ignore=!0:a.ignore=!0),n===!1?r.ignore=!0:null!=t.getMax()&&s(l,r)&&(n?l.ignore=!0:r.ignore=!0)}function s(t,e,i){var n=t&&t.getBoundingRect().clone(),a=e&&e.getBoundingRect().clone();if(n&&a){var o=m.identity([]);return m.rotate(o,o,-t.rotation),n.applyTransform(m.mul([],o,t.getLocalTransform())),a.applyTransform(m.mul([],o,e.getLocalTransform())),n.intersect(a)}}var l=i(1),u=i(7),c=i(3),h=i(10),d=i(4),f=d.remRadian,p=d.isRadianAroundZero,g=i(6),m=i(19),v=g.applyTransform,y=l.retrieve,x=Math.PI,_=function(t,e){this.opt=e,this.axisModel=t,l.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new c.Group;var i=new c.Group({position:e.position.slice(),rotation:e.rotation});i.updateTransform(),this._transform=i.transform,this._dumbGroup=i};_.prototype={constructor:_,hasBuilder:function(t){return!!b[t]},add:function(t){b[t].call(this)},getGroup:function(){return this.group}};var b={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var i=this.axisModel.axis.getExtent(),n=this._transform,a=[i[0],0],o=[i[1],0];n&&(v(a,a,n),v(o,o,n)),this.group.add(new c.Line(c.subPixelOptimizeLine({anid:"line",shape:{x1:a[0],y1:a[1],x2:o[0],y2:o[1]},style:l.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})))}},axisTick:function(){var t=this.axisModel,e=t.axis;if(t.get("axisTick.show")&&!e.scale.isBlank())for(var i=t.getModel("axisTick"),n=this.opt,a=i.getModel("lineStyle"),o=i.get("length"),r=M(i,n.labelInterval),s=e.getTicksCoords(i.get("alignWithLabel")),u=e.scale.getTicks(),h=[],d=[],f=this._transform,p=0;p<s.length;p++)if(!S(e,p,r)){var g=s[p];h[0]=g,h[1]=0,d[0]=g,d[1]=n.tickDirection*o,f&&(v(h,h,f),v(d,d,f)),this.group.add(new c.Line(c.subPixelOptimizeLine({anid:"tick_"+u[p],shape:{x1:h[0],y1:h[1],x2:d[0],y2:d[1]},style:l.defaults(a.getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")}),z2:2,silent:!0})))}},axisLabel:function(){var t=this.opt,e=this.axisModel,i=e.axis,a=y(t.axisLabelShow,e.get("axisLabel.show"));if(a&&!i.scale.isBlank()){var s=e.getModel("axisLabel"),u=s.getModel("textStyle"),d=s.get("margin"),f=i.scale.getTicks(),p=e.getFormattedLabels(),g=(y(t.labelRotate,s.get("rotate"))||0)*x/180,m=w(t.rotation,g,t.labelDirection),v=e.get("data"),_=[],b=o(e),M=e.get("triggerEvent");l.each(f,function(a,o){if(!S(i,o,t.labelInterval)){var r=u;v&&v[a]&&v[a].textStyle&&(r=new h(v[a].textStyle,u,e.ecModel));var s=r.getTextColor()||e.get("axisLine.lineStyle.color"),l=i.dataToCoord(a),f=[l,t.labelOffset+t.labelDirection*d],g=i.scale.getLabel(a),y=new c.Text({anid:"label_"+a,style:{text:p[o],textAlign:r.get("align",!0)||m.textAlign,textVerticalAlign:r.get("baseline",!0)||m.textVerticalAlign,textFont:r.getFont(),fill:"function"==typeof s?s("category"===i.type?g:"value"===i.type?a+"":a,o):s},position:f,rotation:m.rotation,silent:b,z2:10});M&&(y.eventData=n(e),y.eventData.targetType="axisLabel",y.eventData.value=g),this._dumbGroup.add(y),y.updateTransform(),_.push(y),this.group.add(y),y.decomposeTransform()}},this),r(e,_)}},axisName:function(){var t=this.opt,e=this.axisModel,i=y(t.axisName,e.get("name"));if(i){var r,s=e.get("nameLocation"),h=t.nameDirection,d=e.getModel("nameTextStyle"),f=e.get("nameGap")||0,p=this.axisModel.axis.getExtent(),g=p[0]>p[1]?-1:1,m=["start"===s?p[0]-g*f:"end"===s?p[1]+g*f:(p[0]+p[1])/2,"middle"===s?t.labelOffset+h*f:0],v=e.get("nameRotate");
+null!=v&&(v=v*x/180);var _;"middle"===s?r=w(t.rotation,null!=v?v:t.rotation,h):(r=a(t,s,v||0,p),_=t.axisNameAvailableWidth,null!=_&&(_=Math.abs(_/Math.sin(r.rotation)),!isFinite(_)&&(_=null)));var b=d.getFont(),S=e.get("nameTruncate",!0)||{},M=S.ellipsis,I=y(t.nameTruncateMaxWidth,S.maxWidth,_),T=null!=M&&null!=I?u.truncateText(i,I,b,M,{minChar:2,placeholder:S.placeholder}):i,A=e.get("tooltip",!0),C=e.mainType,L={componentType:C,name:i,$vars:["name"]};L[C+"Index"]=e.componentIndex;var D=new c.Text({anid:"name",__fullText:i,__truncatedText:T,style:{text:T,textFont:b,fill:d.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:r.textAlign,textVerticalAlign:r.textVerticalAlign},position:m,rotation:r.rotation,silent:o(e),z2:1,tooltip:A&&A.show?l.extend({content:i,formatter:function(){return i},formatterParams:L},A):null});e.get("triggerEvent")&&(D.eventData=n(e),D.eventData.targetType="axisName",D.eventData.name=i),this._dumbGroup.add(D),D.updateTransform(),this.group.add(D),D.decomposeTransform()}}},w=_.innerTextLayout=function(t,e,i){var n,a,o=f(e-t);return p(o)?(a=i>0?"top":"bottom",n="center"):p(o-x)?(a=i>0?"bottom":"top",n="center"):(a="middle",n=o>0&&o<x?i>0?"right":"left":i>0?"left":"right"),{rotation:o,textAlign:n,textVerticalAlign:a}},S=_.ifIgnoreOnTick=function(t,e,i){var n,a=t.scale;return"ordinal"===a.type&&("function"==typeof i?(n=a.getTicks()[e],!i(n,a.getLabel(n))):e%(i+1))},M=_.getInterval=function(t,e){var i=t.get("interval");return null!=i&&"auto"!=i||(i=e),i};t.exports=_},function(t,e,i){function n(t,e,i,n,s,l){var u=r.getAxisPointerClass(t.axisPointerClass);if(u){var c=o.getAxisPointerModel(e);c?(t._axisPointer||(t._axisPointer=new u)).render(e,c,n,l):a(t,n)}}function a(t,e,i){var n=t._axisPointer;n&&n.dispose(e,i),t._axisPointer=null}var o=i(45),r=i(2).extendComponentView({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,i,a){this.axisPointerClass&&o.fixValue(t),r.superApply(this,"render",arguments),n(this,t,e,i,a,!0)},updateAxisPointer:function(t,e,i,a,o){n(this,t,e,i,a,!1)},remove:function(t,e){var i=this._axisPointer;i&&i.remove(e),r.superApply(this,"remove",arguments)},dispose:function(t,e){a(this,e),r.superApply(this,"dispose",arguments)}}),s=[];r.registerAxisPointerClass=function(t,e){s[t]=e},r.getAxisPointerClass=function(t){return t&&s[t]},t.exports=r},function(t,e,i){function n(t){return a.isObject(t)&&null!=t.value?t.value:t+""}var a=i(1),o=i(18);t.exports={getFormattedLabels:function(){return o.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))},getCategories:function(){return"category"===this.get("type")&&a.map(this.get("data"),n)},getMin:function(t){var e=this.option,i=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=i&&"dataMin"!==i&&!a.eqNaN(i)&&(i=this.axis.scale.parse(i)),i},getMax:function(t){var e=this.option,i=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=i&&"dataMax"!==i&&!a.eqNaN(i)&&(i=this.axis.scale.parse(i)),i},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:a.noop,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}}},function(t,e,i){var n=i(4),a=i(7),o=i(34),r=i(64),s=n.round,l=o.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),l.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){return r.intervalScaleGetTicks(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},getLabel:function(t,e){if(null==t)return"";var i=e&&e.precision;return null==i?i=n.getPrecisionSafe(t)||0:"auto"===i&&(i=this._intervalPrecision),t=s(t,i,!0),a.addCommas(t)},niceTicks:function(t,e){t=t||5;var i=this._extent,n=i[1]-i[0];if(isFinite(n)){n<0&&(n=-n,i.reverse());var a=r.intervalScaleNiceTicks(i,t,e);this._intervalPrecision=a.intervalPrecision,this._interval=a.interval,this._niceExtent=a.niceTickExtent}},niceExtent:function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var i=e[0];t.fixMax?e[0]-=i/2:(e[1]+=i/2,e[0]-=i/2)}else e[1]=1;var n=e[1]-e[0];isFinite(n)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval);var a=this._interval;t.fixMin||(e[0]=s(Math.floor(e[0]/a)*a)),t.fixMax||(e[1]=s(Math.ceil(e[1]/a)*a))}});l.create=function(){return new l},t.exports=l},function(t,e,i){function n(t){this.group=new o.Group,this._symbolCtor=t||r}function a(t,e,i){var n=t.getItemLayout(e);return n&&!isNaN(n[0])&&!isNaN(n[1])&&!(i&&i(e))&&"none"!==t.getItemVisual(e,"symbol")}var o=i(3),r=i(54),s=n.prototype;s.updateData=function(t,e){var i=this.group,n=t.hostModel,r=this._data,s=this._symbolCtor,l={itemStyle:n.getModel("itemStyle.normal").getItemStyle(["color"]),hoverItemStyle:n.getModel("itemStyle.emphasis").getItemStyle(),symbolRotate:n.get("symbolRotate"),symbolOffset:n.get("symbolOffset"),hoverAnimation:n.get("hoverAnimation"),labelModel:n.getModel("label.normal"),hoverLabelModel:n.getModel("label.emphasis")};t.diff(r).add(function(n){var o=t.getItemLayout(n);if(a(t,n,e)){var r=new s(t,n,l);r.attr("position",o),t.setItemGraphicEl(n,r),i.add(r)}}).update(function(u,c){var h=r.getItemGraphicEl(c),d=t.getItemLayout(u);return a(t,u,e)?(h?(h.updateData(t,u,l),o.updateProps(h,{position:d},n)):(h=new s(t,u),h.attr("position",d)),i.add(h),void t.setItemGraphicEl(u,h)):void i.remove(h)}).remove(function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut(function(){i.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,i){var n=t.getItemLayout(i);e.attr("position",n)})},s.remove=function(t){var e=this.group,i=this._data;i&&(t?i.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=n},function(t,e,i){function n(t,e,i){var n=e.getComponent("tooltip"),o=e.getComponent("axisPointer"),s=o.get("link",!0)||[],u=[];h(i.getCoordinateSystems(),function(i){function c(n,c,h){var d=h.model.getModel("axisPointer",o),f=d.get("show");if(f&&("auto"!==f||n||l(d))){null==c&&(c=d.get("triggerTooltip")),d=n?a(h,v,o,e,n,c):d;var m=d.get("snap"),y=p(h.model),x=c||m||"category"===h.type,_=t.axesInfo[y]={key:y,axis:h,coordSys:i,axisPointerModel:d,triggerTooltip:c,involveSeries:x,snap:m,useHandle:l(d),seriesModels:[]};g[y]=_,t.seriesInvolved|=x;var b=r(s,h);if(null!=b){var w=u[b]||(u[b]={axesInfo:{}});w.axesInfo[y]=_,w.mapper=s[b].mapper,_.linkGroup=w}}}if(i.axisPointerEnabled){var f=p(i.model),g=t.coordSysAxesInfo[f]={};t.coordSysMap[f]=i;var m=i.model,v=m.getModel("tooltip",n);if(h(i.getAxes(),d(c,!1,null)),i.getTooltipAxes&&n&&v.get("show")){var y="axis"===v.get("trigger"),x="cross"===v.get("axisPointer.type"),_=i.getTooltipAxes(v.get("axisPointer.axis"));(y||x)&&h(_.baseAxes,d(c,!x||"cross",y)),x&&h(_.otherAxes,d(c,"cross",!1))}}})}function a(t,e,i,n,a,o){var r=e.getModel("axisPointer"),s={};h(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(t){s[t]=u.clone(r.get(t))}),s.snap="category"!==t.type&&!!o,"cross"===r.get("type")&&(s.type="line");var l=s.label||(s.label={});if(null==l.show&&(l.show=!1),"cross"===a&&(l.show=!0,!o)){var d=s.lineStyle=r.get("crossStyle");d&&u.defaults(l.textStyle||(l.textStyle={}),d.textStyle)}return t.model.getModel("axisPointer",new c(s,i,n))}function o(t,e){e.eachSeries(function(e){var i=e.coordinateSystem,n=e.get("tooltip.trigger",!0);i&&"none"!==n&&n!==!1&&"item"!==n&&e.get("axisPointer.show",!0)!==!1&&h(t.coordSysAxesInfo[p(i.model)],function(t){var n=t.axis;i.getAxis(n.dim)===n&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())})},this)}function r(t,e){for(var i=e.model,n=e.dim,a=0;a<t.length;a++){var o=t[a]||{};if(s(o[n+"AxisId"],i.id)||s(o[n+"AxisIndex"],i.componentIndex)||s(o[n+"AxisName"],i.name))return a}}function s(t,e){return"all"===t||u.isArray(t)&&u.indexOf(t,e)>=0||t===e}function l(t){return!!t.get("handle.show")}var u=i(1),c=i(10),h=u.each,d=u.curry,f={};f.collect=function(t,e){var i={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return n(i,t,e),i.seriesInvolved&&o(i,t),i},f.fixValue=function(t){var e=f.getAxisInfo(t);if(e){var i=e.axisPointerModel,n=e.axis.scale,a=i.option,o=i.get("status"),r=i.get("value");null!=r&&(r=n.parse(r));var s=l(i);null==o&&(a.status=s?"show":"hide");var u=n.getExtent().slice();u[0]>u[1]&&u.reverse(),(null==r||r>u[1])&&(r=u[1]),r<u[0]&&(r=u[0]),a.value=r,s&&(a.status=e.axis.scale.isBlank()?"hide":"show")}},f.getAxisInfo=function(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[p(t)]},f.getAxisPointerModel=function(t){var e=f.getAxisInfo(t);return e&&e.axisPointerModel};var p=f.makeKey=function(t){return t.type+"||"+t.id};t.exports=f},function(t,e,i){function n(t){var e={};return h(["start","end","startValue","endValue","throttle"],function(i){t.hasOwnProperty(i)&&(e[i]=t[i])}),e}function a(t,e){h([["start","startValue"],["end","endValue"]],function(i,n){var a=t._rangePropMode;null!=e[i[0]]?a[n]="percent":null!=e[i[1]]&&(a[n]="value")})}var o=i(1),r=i(9),s=i(2),l=i(5),u=i(77),c=i(198),h=o.each,d=u.eachAxisDim,f=s.extendComponentModel({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null,minSpan:null,maxSpan:null,minValueSpan:null,maxValueSpan:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var a=n(t);this.mergeDefaultAndTheme(t,i),this.doInit(a)},mergeOption:function(t){var e=n(t);o.merge(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;r.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),a(this,t),h([["start","startValue"],["end","endValue"]],function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,i,n,a){var o=this.dependentModels[e.axis][i],r=o.__dzAxisProxy||(o.__dzAxisProxy=new c(e.name,i,this,a));t[e.name+"_"+i]=r},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();d(function(e){var i=e.axisIndex;t[i]=l.normalizeToArray(t[i])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;d(function(i){null!=t[i.axisIndex]&&(e=!0)},this);var i=t.orient;return null==i&&e?"orient":e?void 0:(null==i&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),i=this.option,n=this.dependentModels;if(t){var a="vertical"===e?"y":"x";n[a+"Axis"].length?(i[a+"AxisIndex"]=[0],t=!1):h(n.singleAxis,function(n){t&&n.get("orient",!0)===e&&(i.singleAxisIndex=[n.componentIndex],t=!1)})}t&&d(function(e){if(t){var n=[],a=this.dependentModels[e.axis];if(a.length&&!n.length)for(var o=0,r=a.length;o<r;o++)"category"===a[o].get("type")&&n.push(o);i[e.axisIndex]=n,n.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&d(function(e){var n=i[e.axisIndex],a=t.get(e.axisIndex),r=t.get(e.axisId),s=t.ecModel.queryComponents({mainType:e.axis,index:a,id:r})[0];a=s.componentIndex,o.indexOf(n,a)<0&&n.push(a)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var i=!0;return d(function(n){var a=t.get(n.axisIndex),o=this.dependentModels[n.axis][a];o&&o.get("type")===e||(i=!1)},this),i},_setDefaultThrottle:function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var t;return d(function(e){if(null==t){var i=this.get(e.axisIndex);i.length&&(t=this.dependentModels[e.axis][i[0]])}},this),t},eachTargetAxis:function(t,e){var i=this.ecModel;d(function(n){h(this.get(n.axisIndex),function(a){t.call(e,n,a,this,i)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},getAxisModel:function(t,e){var i=this.getAxisProxy(t,e);return i&&i.getAxisModel()},setRawRange:function(t,e){h(["start","end","startValue","endValue"],function(e){this.option[e]=t[e]},this),!e&&a(this,t)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var i=this.findRepresentativeAxisProxy();return i?i.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(t){if(t)return t.__dzAxisProxy;var e=this._axisProxies;for(var i in e)if(e.hasOwnProperty(i)&&e[i].hostedBy(this))return e[i];for(var i in e)if(e.hasOwnProperty(i)&&!e[i].hostedBy(this))return e[i]},getRangePropMode:function(){return this._rangePropMode.slice()}});t.exports=f},function(t,e,i){var n=i(65);t.exports=n.extend({type:"dataZoom",render:function(t,e,i,n){this.dataZoomModel=t,this.ecModel=e,this.api=i},getTargetCoordInfo:function(){function t(t,e,i,n){for(var a,o=0;o<i.length;o++)if(i[o].model===t){a=i[o];break}a||i.push(a={model:t,axisModels:[],coordIndex:n}),a.axisModels.push(e)}var e=this.dataZoomModel,i=this.ecModel,n={};return e.eachTargetAxis(function(e,a){var o=i.getComponent(e.axis,a);if(o){var r=o.getCoordSysModel();r&&t(r,o,n[r.mainType]||(n[r.mainType]=[]),r.componentIndex)}},this),n}})},function(t,e){"use strict";function i(t){return t}function n(t,e,n,a){this._old=t,this._new=e,this._oldKeyGetter=n||i,this._newKeyGetter=a||i}function a(t,e,i,n){for(var a=0;a<t.length;a++){var o="_ec_"+n(t[a],a),r=e[o];null==r?(i.push(o),e[o]=a):(r.length||(e[o]=r=[r]),r.push(a))}}n.prototype={constructor:n,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,i=this._new,n=this._oldKeyGetter,o=this._newKeyGetter,r={},s={},l=[],u=[];for(a(e,r,l,n),a(i,s,u,o),t=0;t<e.length;t++){var c=l[t],h=s[c];if(null!=h){var d=h.length;d?(1===d&&(s[c]=null),h=h.unshift()):s[c]=null,this._update&&this._update(h,t)}else this._remove&&this._remove(t)}for(var t=0;t<u.length;t++){var c=u[t];if(s.hasOwnProperty(c)){var h=s[c];if(null==h)continue;if(h.length)for(var f=0,d=h.length;f<d;f++)this._add&&this._add(h[f]);else this._add&&this._add(h)}}}},t.exports=n},function(t,e,i){var n=i(1),a=i(15),o=a.parseClassType,r=0,s={},l="_";s.getUID=function(t){return[t||"",r++,Math.random()].join(l)},s.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,i){t=o(t),e[t.main]=i},t.determineSubType=function(i,n){var a=n.type;if(!a){var r=o(i).main;t.hasSubTypes(i)&&e[r]&&(a=e[r](n))}return a},t},s.enableTopologicalTravel=function(t,e){function i(t){var i={},r=[];return n.each(t,function(s){var l=a(i,s),u=l.originalDeps=e(s),c=o(u,t);l.entryCount=c.length,0===l.entryCount&&r.push(s),n.each(c,function(t){n.indexOf(l.predecessor,t)<0&&l.predecessor.push(t);var e=a(i,t);n.indexOf(e.successor,t)<0&&e.successor.push(s)})}),{graph:i,noEntryList:r}}function a(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function o(t,e){var i=[];return n.each(t,function(t){n.indexOf(e,t)>=0&&i.push(t)}),i}t.topologicalTravel=function(t,e,a,o){function r(t){u[t].entryCount--,0===u[t].entryCount&&c.push(t)}function s(t){h[t]=!0,r(t)}if(t.length){var l=i(e),u=l.graph,c=l.noEntryList,h={};for(n.each(t,function(t){h[t]=!0});c.length;){var d=c.pop(),f=u[d],p=!!h[d];p&&(a.call(o,d,f.originalDeps.slice()),delete h[d]),n.each(f.successor,p?s:r)}n.each(h,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){t.exports=function(t,e,i,n,a){n.eachRawSeriesByType(t,function(t){var a=t.getData(),o=t.get("symbol")||e,r=t.get("symbolSize");a.setVisual({legendSymbol:i||o,symbol:o,symbolSize:r}),n.isSeriesFiltered(t)||("function"==typeof r&&a.each(function(e){var i=t.getRawValue(e),n=t.getDataParams(e);a.setItemVisual(e,"symbolSize",r(i,n))}),a.each(function(t){var e=a.getItemModel(t),i=e.getShallow("symbol",!0),n=e.getShallow("symbolSize",!0);null!=i&&a.setItemVisual(t,"symbol",i),null!=n&&a.setItemVisual(t,"symbolSize",n)}))})}},function(t,e){function i(t){for(var e=0;t>=c;)e|=1&t,t>>=1;return t+e}function n(t,e,i,n){var o=e+1;if(o===i)return 1;if(n(t[o++],t[e])<0){for(;o<i&&n(t[o],t[o-1])<0;)o++;a(t,e,o)}else for(;o<i&&n(t[o],t[o-1])>=0;)o++;return o-e}function a(t,e,i){for(i--;e<i;){var n=t[e];t[e++]=t[i],t[i--]=n}}function o(t,e,i,n,a){for(n===e&&n++;n<i;n++){for(var o,r=t[n],s=e,l=n;s<l;)o=s+l>>>1,a(r,t[o])<0?l=o:s=o+1;var u=n-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=r}}function r(t,e,i,n,a,o){var r=0,s=0,l=1;if(o(t,e[i+a])>0){for(s=n-a;l<s&&o(t,e[i+a+l])>0;)r=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),r+=a,l+=a}else{for(s=a+1;l<s&&o(t,e[i+a-l])<=0;)r=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=r;r=a-l,l=a-u}for(r++;r<l;){var c=r+(l-r>>>1);o(t,e[i+c])>0?r=c+1:l=c}return l}function s(t,e,i,n,a,o){var r=0,s=0,l=1;if(o(t,e[i+a])<0){for(s=a+1;l<s&&o(t,e[i+a-l])<0;)r=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=r;r=a-l,l=a-u}else{for(s=n-a;l<s&&o(t,e[i+a+l])>=0;)r=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),r+=a,l+=a}for(r++;r<l;){var c=r+(l-r>>>1);o(t,e[i+c])<0?l=c:r=c+1}return l}function l(t,e){function i(t,e){c[y]=t,f[y]=e,y+=1}function n(){for(;y>1;){var t=y-2;if(t>=1&&f[t-1]<=f[t]+f[t+1]||t>=2&&f[t-2]<=f[t]+f[t-1])f[t-1]<f[t+1]&&t--;else if(f[t]>f[t+1])break;o(t)}}function a(){for(;y>1;){var t=y-2;t>0&&f[t-1]<f[t+1]&&t--,o(t)}}function o(i){var n=c[i],a=f[i],o=c[i+1],h=f[i+1];f[i]=a+h,i===y-3&&(c[i+1]=c[i+2],f[i+1]=f[i+2]),y--;var d=s(t[o],t,n,a,0,e);n+=d,a-=d,0!==a&&(h=r(t[n+a-1],t,o,h,h-1,e),0!==h&&(a<=h?l(n,a,o,h):u(n,a,o,h)))}function l(i,n,a,o){var l=0;for(l=0;l<n;l++)x[l]=t[i+l];var u=0,c=a,d=i;if(t[d++]=t[c++],0!==--o){if(1===n){for(l=0;l<o;l++)t[d+l]=t[c+l];return void(t[d+o]=x[u])}for(var f,g,m,v=p;;){f=0,g=0,m=!1;do if(e(t[c],x[u])<0){if(t[d++]=t[c++],g++,f=0,0===--o){m=!0;break}}else if(t[d++]=x[u++],f++,g=0,1===--n){m=!0;break}while((f|g)<v);if(m)break;do{if(f=s(t[c],x,u,n,0,e),0!==f){for(l=0;l<f;l++)t[d+l]=x[u+l];if(d+=f,u+=f,n-=f,n<=1){m=!0;break}}if(t[d++]=t[c++],0===--o){m=!0;break}if(g=r(x[u],t,c,o,0,e),0!==g){for(l=0;l<g;l++)t[d+l]=t[c+l];if(d+=g,c+=g,o-=g,0===o){m=!0;break}}if(t[d++]=x[u++],1===--n){m=!0;break}v--}while(f>=h||g>=h);if(m)break;v<0&&(v=0),v+=2}if(p=v,p<1&&(p=1),1===n){for(l=0;l<o;l++)t[d+l]=t[c+l];t[d+o]=x[u]}else{if(0===n)throw new Error;for(l=0;l<n;l++)t[d+l]=x[u+l]}}else for(l=0;l<n;l++)t[d+l]=x[u+l]}function u(i,n,a,o){var l=0;for(l=0;l<o;l++)x[l]=t[a+l];var u=i+n-1,c=o-1,d=a+o-1,f=0,g=0;if(t[d--]=t[u--],0!==--n){if(1===o){for(d-=n,u-=n,g=d+1,f=u+1,l=n-1;l>=0;l--)t[g+l]=t[f+l];return void(t[d]=x[c])}for(var m=p;;){var v=0,y=0,_=!1;do if(e(x[c],t[u])<0){if(t[d--]=t[u--],v++,y=0,0===--n){_=!0;break}}else if(t[d--]=x[c--],y++,v=0,1===--o){_=!0;break}while((v|y)<m);if(_)break;do{if(v=n-s(x[c],t,i,n,n-1,e),0!==v){for(d-=v,u-=v,n-=v,g=d+1,f=u+1,l=v-1;l>=0;l--)t[g+l]=t[f+l];if(0===n){_=!0;break}}if(t[d--]=x[c--],1===--o){_=!0;break}if(y=o-r(t[u],x,0,o,o-1,e),0!==y){for(d-=y,c-=y,o-=y,g=d+1,f=c+1,l=0;l<y;l++)t[g+l]=x[f+l];if(o<=1){_=!0;break}}if(t[d--]=t[u--],0===--n){_=!0;break}m--}while(v>=h||y>=h);if(_)break;m<0&&(m=0),m+=2}if(p=m,p<1&&(p=1),1===o){for(d-=n,u-=n,g=d+1,f=u+1,l=n-1;l>=0;l--)t[g+l]=t[f+l];t[d]=x[c]}else{if(0===o)throw new Error;for(f=d-(o-1),l=0;l<o;l++)t[f+l]=x[l]}}else for(f=d-(o-1),l=0;l<o;l++)t[f+l]=x[l]}var c,f,p=h,g=0,m=d,v=0,y=0;g=t.length,g<2*d&&(m=g>>>1);var x=[];v=g<120?5:g<1542?10:g<119151?19:40,c=[],f=[],this.mergeRuns=n,this.forceMergeRuns=a,this.pushRun=i}function u(t,e,a,r){a||(a=0),r||(r=t.length);var s=r-a;if(!(s<2)){var u=0;if(s<c)return u=n(t,a,r,e),void o(t,a,r,a+u,e);var h=new l(t,e),d=i(s);do{if(u=n(t,a,r,e),u<d){var f=s;f>d&&(f=d),o(t,a,a+f,a+u,e),u=f}h.pushRun(a,u),h.mergeRuns(),s-=u,a+=u}while(0!==s);h.forceMergeRuns()}}var c=32,h=7,d=256;t.exports=u},function(t,e,i){var n=i(35);t.exports=function(){if(0!==n.debugMode)if(1==n.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(n.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,i){function n(t){a.call(this,t)}var a=i(38),o=i(11),r=i(1),s=i(70),l=new s(50);n.prototype={constructor:n,type:"image",brush:function(t,e){var i,n=this.style,a=n.image;if(n.bind(t,this,e),i="string"==typeof a?this._image:a,!i&&a){var o=l.get(a);if(!o)return i=new Image,i.onload=function(){i.onload=null;for(var t=0;t<o.pending.length;t++)o.pending[t].dirty()},o={image:i,pending:[this]},i.src=a,l.put(a,o),void(this._image=i);if(i=o.image,this._image=i,!i.width||!i.height)return void o.pending.push(this)}if(i){var r=n.x||0,s=n.y||0;if(!i.width||!i.height)return;var u=n.width,c=n.height,h=i.width/i.height;if(null==u&&null!=c?u=c*h:null==c&&null!=u?c=u/h:null==u&&null==c&&(u=i.width,c=i.height),this.setTransform(t),n.sWidth&&n.sHeight){var d=n.sx||0,f=n.sy||0;t.drawImage(i,d,f,n.sWidth,n.sHeight,r,s,u,c)}else if(n.sx&&n.sy){var d=n.sx,f=n.sy,p=u-d,g=c-f;t.drawImage(i,d,f,p,g,r,s,u,c)}else t.drawImage(i,r,s,u,c);this.restoreTransform(t),null!=n.text&&this.drawRectText(t,this.getBoundingRect())}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new o(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},r.inherits(n,a),t.exports=n},function(t,e,i){function n(t,e){var i=t.getItemVisual(e,"symbolSize");return i instanceof Array?i.slice():[+i,+i]}function a(t){return[t[0]/2,t[1]/2]}function o(t,e,i){u.Group.call(this),this.updateData(t,e,i)}function r(t,e){this.parent.drift(t,e)}var s=i(1),l=i(24),u=i(3),c=i(4),h=i(92),d=o.prototype;d._createSymbol=function(t,e,i,n){this.removeAll();var o=e.hostModel,s=e.getItemVisual(i,"color"),c=l.createSymbol(t,-1,-1,2,2,s);c.attr({z2:100,culling:!0,scale:[0,0]}),c.drift=r,u.initProps(c,{scale:a(n)},o,i),this._symbolType=t,this.add(c)},d.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},d.getSymbolPath=function(){return this.childAt(0)},d.getScale=function(){return this.childAt(0).scale},d.highlight=function(){this.childAt(0).trigger("emphasis")},d.downplay=function(){this.childAt(0).trigger("normal")},d.setZ=function(t,e){var i=this.childAt(0);i.zlevel=t,i.z=e},d.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},d.updateData=function(t,e,i){this.silent=!1;var o=t.getItemVisual(e,"symbol")||"circle",r=t.hostModel,s=n(t,e);if(o!==this._symbolType)this._createSymbol(o,t,e,s);else{var l=this.childAt(0);l.silent=!1,u.updateProps(l,{scale:a(s)},r,e)}this._updateCommon(t,e,s,i),this._seriesModel=r};var f=["itemStyle","normal"],p=["itemStyle","emphasis"],g=["label","normal"],m=["label","emphasis"];d._updateCommon=function(t,e,i,n){var o=this.childAt(0),r=t.hostModel,l=t.getItemVisual(e,"color");"image"!==o.type&&o.useStyle({strokeNoScale:!0}),n=n||null;var d=n&&n.itemStyle,v=n&&n.hoverItemStyle,y=n&&n.symbolRotate,x=n&&n.symbolOffset,_=n&&n.labelModel,b=n&&n.hoverLabelModel,w=n&&n.hoverAnimation;if(!n||t.hasItemOption){var S=t.getItemModel(e);d=S.getModel(f).getItemStyle(["color"]),v=S.getModel(p).getItemStyle(),y=S.getShallow("symbolRotate"),x=S.getShallow("symbolOffset"),_=S.getModel(g),b=S.getModel(m),w=S.getShallow("hoverAnimation")}else v=s.extend({},v);var M=o.style;o.attr("rotation",(y||0)*Math.PI/180||0),x&&o.attr("position",[c.parsePercent(x[0],i[0]),c.parsePercent(x[1],i[1])]),o.setColor(l),o.setStyle(d);var I=t.getItemVisual(e,"opacity");null!=I&&(M.opacity=I);var T=h.findLabelValueDim(t);h.setTextToStyle(t,e,T,M,r,_,l),h.setTextToStyle(t,e,T,v,r,b,l),o.off("mouseover").off("mouseout").off("emphasis").off("normal"),o.hoverStyle=v,u.setHoverStyle(o);var A=a(i);if(w&&r.isAnimationEnabled()){var C=function(){var t=A[1]/A[0];this.animateTo({scale:[Math.max(1.1*A[0],A[0]+3),Math.max(1.1*A[1],A[1]+3*t)]},400,"elasticOut")},L=function(){this.animateTo({scale:A},400,"elasticOut")};o.on("mouseover",C).on("mouseout",L).on("emphasis",C).on("normal",L)}},d.fadeOut=function(t){var e=this.childAt(0);this.silent=e.silent=!0,e.style.text="",u.updateProps(e,{scale:[0,0]},this._seriesModel,this.dataIndex,t)},s.inherits(o,u.Group),t.exports=o},function(t,e,i){var n=i(2),a=i(45),o=i(196),r=i(1);i(194),i(195),i(120),n.registerPreprocessor(function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!r.isArray(e)&&(t.axisPointer.link=[e])}}),n.registerProcessor(n.PRIORITY.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=a.collect(t,e)}),n.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,i){var n=o(e.getComponent("axisPointer").coordSysAxesInfo,t.currTrigger,[t.x,t.y],t,t.dispatchAction||r.bind(i.dispatchAction,i),e,i,t.tooltipOption);return n})},function(t,e){function i(t,e){var i=t[e]-t[1-e];return{span:Math.abs(i),sign:i>0?-1:i<0?1:e?-1:1}}function n(t,e){return Math.min(e[1],Math.max(e[0],t))}t.exports=function(t,e,a,o,r,s){e[0]=n(e[0],a),e[1]=n(e[1],a),t=t||0;var l=a[1]-a[0];null!=r&&(r=n(r,[0,l])),null!=s&&(s=Math.max(s,null!=r?r:0)),"all"===o&&(r=s=Math.abs(e[1]-e[0]),o=0);var u=i(e,o);e[o]+=t;var c=r||0,h=a.slice();u.sign<0?h[0]+=c:h[1]-=c,e[o]=n(e[o],h);var d=i(e,o);null!=r&&(d.sign!==u.sign||d.span<r)&&(e[1-o]=e[o]+u.sign*r);var d=i(e,o);return null!=s&&d.span>s&&(e[1-o]=e[o]+d.sign*s),e}},function(t,e,i){function n(t,e,i){return t.getCoordSysModel()===e}function a(t){var e,i=t.model,n=i.getFormattedLabels(),a=i.getModel("axisLabel.textStyle"),o=1,r=n.length;r>40&&(o=Math.ceil(r/40));for(var s=0;s<r;s+=o)if(!t.isLabelIgnored(s)){var l=a.getTextRect(n[s]);e?e.union(l):e=l}return e}function o(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this.model=t}function r(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return n-t+e}}function s(t,e){return h.map(y,function(e){var i=t.getReferringComponents(e)[0];return i})}function l(t){return"cartesian2d"===t.get("coordinateSystem")}var u=i(12),c=i(18),h=i(1),d=i(133),f=i(131),p=h.each,g=c.ifAxisCrossZero,m=c.niceScaleExtent;i(134);var v=o.prototype;v.type="grid",v.axisPointerEnabled=!0,v.getRect=function(){return this._rect},v.update=function(t,e){function i(t){var e=n[t];for(var i in e)if(e.hasOwnProperty(i)){var a=e[i];if(a&&("category"===a.type||"time"===a.type||!g(a)))return!0}return!1}var n=this._axesMap;this._updateScale(t,this.model),p(n.x,function(t){m(t.scale,t.model)}),p(n.y,function(t){m(t.scale,t.model)}),p(n.x,function(t){i("y")&&(t.onZero=!1)}),p(n.y,function(t){i("x")&&(t.onZero=!1)}),this.resize(this.model,e)},v.resize=function(t,e){function i(){p(o,function(t){var e=t.isHorizontal(),i=e?[0,n.width]:[0,n.height],a=t.inverse?1:0;t.setExtent(i[a],i[1-a]),r(t,e?n.x:n.y)})}var n=u.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=n;var o=this._axesList;i(),t.get("containLabel")&&(p(o,function(t){if(!t.model.get("axisLabel.inside")){var e=a(t);if(e){var i=t.isHorizontal()?"height":"width",o=t.model.get("axisLabel.margin");n[i]-=e[i]+o,"top"===t.position?n.y+=e.height+o:"left"===t.position&&(n.x+=e.width+o)}}}),i())},v.getAxis=function(t,e){var i=this._axesMap[t];if(null!=i){if(null==e)for(var n in i)if(i.hasOwnProperty(n))return i[n];return i[e]}},v.getAxes=function(){return this._axesList.slice()},v.getCartesian=function(t,e){if(null!=t&&null!=e){var i="x"+t+"y"+e;return this._coordsMap[i]}h.isObject(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var n=0,a=this._coordsList;n<a.length;n++)if(a[n].getAxis("x").index===t||a[n].getAxis("y").index===e)return a[n]},v.getCartesians=function(){return this._coordsList.slice()},v.convertToPixel=function(t,e,i){var n=this._findConvertTarget(t,e);return n.cartesian?n.cartesian.dataToPoint(i):n.axis?n.axis.toGlobalCoord(n.axis.dataToCoord(i)):null},v.convertFromPixel=function(t,e,i){var n=this._findConvertTarget(t,e);return n.cartesian?n.cartesian.pointToData(i):n.axis?n.axis.coordToData(n.axis.toLocalCoord(i)):null},v._findConvertTarget=function(t,e){var i,n,a=e.seriesModel,o=e.xAxisModel||a&&a.getReferringComponents("xAxis")[0],r=e.yAxisModel||a&&a.getReferringComponents("yAxis")[0],s=e.gridModel,l=this._coordsList;if(a)i=a.coordinateSystem,h.indexOf(l,i)<0&&(i=null);else if(o&&r)i=this.getCartesian(o.componentIndex,r.componentIndex);else if(o)n=this.getAxis("x",o.componentIndex);else if(r)n=this.getAxis("y",r.componentIndex);else if(s){var u=s.coordinateSystem;u===this&&(i=this._coordsList[0])}return{cartesian:i,axis:n}},v.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},v._initCartesian=function(t,e,i){function a(i){return function(a,l){if(n(a,t,e)){var u=a.get("position");"x"===i?"top"!==u&&"bottom"!==u&&(u="bottom",o[u]&&(u="top"===u?"bottom":"top")):"left"!==u&&"right"!==u&&(u="left",o[u]&&(u="left"===u?"right":"left")),o[u]=!0;var h=new f(i,c.createScaleByModel(a),[0,0],a.get("type"),u),d="category"===h.type;h.onBand=d&&a.get("boundaryGap"),h.inverse=a.get("inverse"),h.onZero=a.get("axisLine.onZero"),a.axis=h,h.model=a,h.grid=this,h.index=l,this._axesList.push(h),r[i][l]=h,s[i]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},r={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",a("x"),this),e.eachComponent("yAxis",a("y"),this),s.x&&s.y?(this._axesMap=r,void p(r.x,function(e,i){p(r.y,function(n,a){var o="x"+i+"y"+a,r=new d(o);r.grid=this,r.model=t,this._coordsMap[o]=r,this._coordsList.push(r),r.addAxis(e),r.addAxis(n)},this)},this)):(this._axesMap={},void(this._axesList=[]))},v._updateScale=function(t,e){function i(t,e,i){p(i.coordDimToDataDim(e.dim),function(i){e.scale.unionExtentFromData(t,i)})}h.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(a){if(l(a)){var o=s(a,t),r=o[0],u=o[1];if(!n(r,e,t)||!n(u,e,t))return;var c=this.getCartesian(r.componentIndex,u.componentIndex),h=a.getData(),d=c.getAxis("x"),f=c.getAxis("y");"list"===h.type&&(i(h,d,a),i(h,f,a))}},this)},v.getTooltipAxes=function(t){var e=[],i=[];return p(this.getCartesians(),function(n){var a=null!=t&&"auto"!==t?n.getAxis(t):n.getBaseAxis(),o=n.getOtherAxis(a);h.indexOf(e,a)<0&&e.push(a),h.indexOf(i,o)<0&&i.push(o)}),{baseAxes:e,otherAxes:i}};var y=["xAxis","yAxis"];o.create=function(t,e){var i=[];return t.eachComponent("grid",function(n,a){var r=new o(n,t,e);r.name="grid_"+a,n.coordinateSystem=r,i.push(r)}),t.eachSeries(function(e){if(l(e)){var i=s(e,t),n=i[0],a=i[1],o=n.getCoordSysModel(),r=o.coordinateSystem;e.coordinateSystem=r.getCartesian(n.componentIndex,a.componentIndex)}}),i},o.dimensions=o.prototype.dimensions=d.prototype.dimensions,i(26).register("cartesian2d",o),t.exports=o},function(t,e,i){"use strict";function n(t){return t>s||t<-s}var a=i(19),o=i(6),r=a.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},u=l.prototype;u.transform=null,
+u.needLocalTransform=function(){return n(this.rotation)||n(this.position[0])||n(this.position[1])||n(this.scale[0]-1)||n(this.scale[1]-1)},u.updateTransform=function(){var t=this.parent,e=t&&t.transform,i=this.needLocalTransform(),n=this.transform;return i||e?(n=n||a.create(),i?this.getLocalTransform(n):r(n),e&&(i?a.mul(n,t.transform,n):a.copy(n,t.transform)),this.transform=n,this.invTransform=this.invTransform||a.create(),void a.invert(this.invTransform,n)):void(n&&r(n))},u.getLocalTransform=function(t){return l.getLocalTransform(this,t)},u.setTransform=function(t){var e=this.transform,i=t.dpr||1;e?t.setTransform(i*e[0],i*e[1],i*e[2],i*e[3],i*e[4],i*e[5]):t.setTransform(i,0,0,i,0,0)},u.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var c=[];u.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(a.mul(c,t.invTransform,e),e=c);var i=e[0]*e[0]+e[1]*e[1],o=e[2]*e[2]+e[3]*e[3],r=this.position,s=this.scale;n(i-1)&&(i=Math.sqrt(i)),n(o-1)&&(o=Math.sqrt(o)),e[0]<0&&(i=-i),e[3]<0&&(o=-o),r[0]=e[4],r[1]=e[5],s[0]=i,s[1]=o,this.rotation=Math.atan2(-e[1]/o,e[0]/i)}},u.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(i=-i),[e,i]},u.transformCoordToLocal=function(t,e){var i=[t,e],n=this.invTransform;return n&&o.applyTransform(i,i,n),i},u.transformCoordToGlobal=function(t,e){var i=[t,e],n=this.transform;return n&&o.applyTransform(i,i,n),i},l.getLocalTransform=function(t,e){e=e||[],r(e);var i=t.origin,n=t.scale||[1,1],o=t.rotation||0,s=t.position||[0,0];return i&&(e[4]-=i[0],e[5]-=i[1]),a.scale(e,e,n),o&&a.rotate(e,e,o),i&&(e[4]+=i[0],e[5]+=i[1]),e[4]+=s[0],e[5]+=s[1],e},t.exports=l},function(t,e,i){var n=i(96),a=i(1),o=i(13),r=i(12),s=["value","category","time","log"];t.exports=function(t,e,i,l){a.each(s,function(o){e.extend({type:t+"Axis."+o,mergeDefaultAndTheme:function(e,n){var s=this.layoutMode,l=s?r.getLayoutParams(e):{},u=n.getTheme();a.merge(e,u.get(o+"Axis")),a.merge(e,this.getDefaultOption()),e.type=i(t,e),s&&r.mergeLayoutParam(e,l,s)},defaultOption:a.mergeAll([{},n[o+"Axis"],l],!0)})}),o.registerSubTypeDefaulter(t+"Axis",a.curry(i,t))}},function(t,e,i){"use strict";function n(t,e){return e.type||(e.data?"category":"value")}var a=i(13),o=i(1),r=i(59),s=a.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});o.merge(s.prototype,i(42));var l={offset:0};r("x",s,n,l),r("y",s,n,l),t.exports=s},function(t,e){t.exports=function(t,e){e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem;if(i){for(var n=[],a=i.dimensions,o=0;o<a.length;o++)n.push(t.coordDimToDataDim(i.dimensions[o])[0]);1===n.length?e.each(n[0],function(t,n){e.setItemLayout(n,isNaN(t)?[NaN,NaN]:i.dataToPoint(t))}):2===n.length&&e.each(n,function(t,n,a){e.setItemLayout(a,isNaN(t)||isNaN(n)?[NaN,NaN]:i.dataToPoint([t,n]))},!0)}})}},function(t,e,i){var n=i(15),a=n.set,o=n.get;t.exports={clearColorPalette:function(){a(this,"colorIdx",0),a(this,"colorNameMap",{})},getColorFromPalette:function(t,e){e=e||this;var i=o(e,"colorIdx")||0,n=o(e,"colorNameMap")||a(e,"colorNameMap",{});if(n.hasOwnProperty(t))return n[t];var r=this.get("color",!0)||[];if(r.length){var s=r[i];return t&&(n[t]=s),a(e,"colorIdx",(i+1)%r.length),s}}}},function(t,e){t.exports=function(t,e){var i=e.findComponents({mainType:"legend"});i&&i.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var n=e.getName(t),a=0;a<i.length;a++)if(!i[a].isSelected(n))return!1;return!0},this)},this)}},function(t,e,i){function n(t,e,i){t[e]=Math.max(Math.min(t[e],i[1]),i[0])}var a=i(4),o=a.round,r={};r.intervalScaleNiceTicks=function(t,e,i){var n={},s=t[1]-t[0],l=n.interval=a.nice(s/e,!0);null!=i&&l<i&&(l=n.interval=i);var u=n.intervalPrecision=a.getPrecisionSafe(l)+2,c=n.niceTickExtent=[o(Math.ceil(t[0]/l)*l,u),o(Math.floor(t[1]/l)*l,u)];return r.fixExtent(c,t),n},r.fixExtent=function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),n(t,0,e),n(t,1,e),t[0]>t[1]&&(t[0]=t[1])},r.intervalScaleGetTicks=function(t,e,i,n){var a=[];if(!t)return a;var r=1e4;e[0]<i[0]&&a.push(e[0]);for(var s=i[0];s<=i[1]&&(a.push(s),s=o(s+t,n),s!==a[a.length-1]);)if(a.length>r)return[];return e[1]>(a.length?a[a.length-1]:i[1])&&a.push(e[1]),a},t.exports=r},function(t,e,i){var n=i(36),a=i(49),o=i(15),r=function(){this.group=new n,this.uid=a.getUID("viewComponent")};r.prototype={constructor:r,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){}};var s=r.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,i,n){},o.enableClassExtend(r),o.enableClassManagement(r,{registerWhenExtend:!0}),t.exports=r},function(t,e,i){"use strict";var n=i(71),a=i(23),o=i(58),r=i(178),s=i(1),l=function(t){o.call(this,t),a.call(this,t),r.call(this,t),this.id=t.id||n()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var i=this[t];i||(i=this[t]=[]),i[0]=e[0],i[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var i in t)t.hasOwnProperty(i)&&this.attrKV(i,t[i]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.addAnimator(e[i]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.removeAnimator(e[i]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},s.mixin(l,r),s.mixin(l,o),s.mixin(l,a),t.exports=l},function(t,e,i){function n(t,e){return t[e]}function a(t,e,i){t[e]=i}function o(t,e,i){return(e-t)*i+t}function r(t,e,i){return i>.5?e:t}function s(t,e,i,n,a){var r=t.length;if(1==a)for(var s=0;s<r;s++)n[s]=o(t[s],e[s],i);else for(var l=r&&t[0].length,s=0;s<r;s++)for(var u=0;u<l;u++)n[s][u]=o(t[s][u],e[s][u],i)}function l(t,e,i){var n=t.length,a=e.length;if(n!==a){var o=n>a;if(o)t.length=a;else for(var r=n;r<a;r++)t.push(1===i?e[r]:_.call(e[r]))}for(var s=t[0]&&t[0].length,r=0;r<t.length;r++)if(1===i)isNaN(t[r])&&(t[r]=e[r]);else for(var l=0;l<s;l++)isNaN(t[r][l])&&(t[r][l]=e[r][l])}function u(t,e,i){if(t===e)return!0;var n=t.length;if(n!==e.length)return!1;if(1===i){for(var a=0;a<n;a++)if(t[a]!==e[a])return!1}else for(var o=t[0].length,a=0;a<n;a++)for(var r=0;r<o;r++)if(t[a][r]!==e[a][r])return!1;return!0}function c(t,e,i,n,a,o,r,s,l){var u=t.length;if(1==l)for(var c=0;c<u;c++)s[c]=h(t[c],e[c],i[c],n[c],a,o,r);else for(var d=t[0].length,c=0;c<u;c++)for(var f=0;f<d;f++)s[c][f]=h(t[c][f],e[c][f],i[c][f],n[c][f],a,o,r)}function h(t,e,i,n,a,o,r){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*r+(-3*(e-i)-2*s-l)*o+s*a+e}function d(t){if(x(t)){var e=t.length;if(x(t[0])){for(var i=[],n=0;n<e;n++)i.push(_.call(t[n]));return i}return _.call(t)}return t}function f(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t){var e=t[t.length-1].value;return x(e&&e[0])?2:1}function g(t,e,i,n,a){var d=t._getter,g=t._setter,y="spline"===e,_=n.length;if(_){var b,w=n[0].value,S=x(w),M=!1,I=!1,T=S?p(n):0;n.sort(function(t,e){return t.time-e.time}),b=n[_-1].time;for(var A=[],C=[],L=n[0].value,D=!0,P=0;P<_;P++){A.push(n[P].time/b);var k=n[P].value;if(S&&u(k,L,T)||!S&&k===L||(D=!1),L=k,"string"==typeof k){var O=v.parse(k);O?(k=O,M=!0):I=!0}C.push(k)}if(!D){for(var z=C[_-1],P=0;P<_-1;P++)S?l(C[P],z,T):!isNaN(C[P])||isNaN(z)||I||M||(C[P]=z);S&&l(d(t._target,a),z,T);var E,R,N,V,B,G,H=0,F=0;if(M)var W=[0,0,0,0];var Z=function(t,e){var i;if(e<0)i=0;else if(e<F){for(E=Math.min(H+1,_-1),i=E;i>=0&&!(A[i]<=e);i--);i=Math.min(i,_-2)}else{for(i=H;i<_&&!(A[i]>e);i++);i=Math.min(i-1,_-2)}H=i,F=e;var n=A[i+1]-A[i];if(0!==n)if(R=(e-A[i])/n,y)if(V=C[i],N=C[0===i?i:i-1],B=C[i>_-2?_-1:i+1],G=C[i>_-3?_-1:i+2],S)c(N,V,B,G,R,R*R,R*R*R,d(t,a),T);else{var l;if(M)l=c(N,V,B,G,R,R*R,R*R*R,W,1),l=f(W);else{if(I)return r(V,B,R);l=h(N,V,B,G,R,R*R,R*R*R)}g(t,a,l)}else if(S)s(C[i],C[i+1],R,d(t,a),T);else{var l;if(M)s(C[i],C[i+1],R,W,1),l=f(W);else{if(I)return r(C[i],C[i+1],R);l=o(C[i],C[i+1],R)}g(t,a,l)}},q=new m({target:t._target,life:b,loop:t._loop,delay:t._delay,onframe:Z,ondestroy:i});return e&&"spline"!==e&&(q.easing=e),q}}}var m=i(157),v=i(22),y=i(1),x=y.isArrayLike,_=Array.prototype.slice,b=function(t,e,i,o){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||n,this._setter=o||a,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};b.prototype={when:function(t,e){var i=this._tracks;for(var n in e)if(e.hasOwnProperty(n)){if(!i[n]){i[n]=[];var a=this._getter(this._target,n);if(null==a)continue;0!==t&&i[n].push({time:0,value:d(a)})}i[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,i=0;i<e;i++)t[i].call(this)},start:function(t){var e,i=this,n=0,a=function(){n--,n||i._doneCallback()};for(var o in this._tracks)if(this._tracks.hasOwnProperty(o)){var r=g(this,t,a,this._tracks[o],o);r&&(this._clipList.push(r),n++,this.animation&&this.animation.addClip(r),e=r)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var n=0;n<i._onframeList.length;n++)i._onframeList[n](t,e)}}return n||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,i=this.animation,n=0;n<e.length;n++){var a=e[n];t&&a.onframe(this._target,1),i&&i.removeClip(a)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}},t.exports=b},function(t,e){t.exports="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)}},function(t,e){var i=2*Math.PI;t.exports={normalizeRadian:function(t){return t%=i,t<0&&(t+=i),t}}},function(t,e){var i=function(){this.head=null,this.tail=null,this._len=0},n=i.prototype;n.insert=function(t){var e=new a(t);return this.insertEntry(e),e},n.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},n.remove=function(t){var e=t.prev,i=t.next;e?e.next=i:this.head=i,i?i.prev=e:this.tail=e,t.next=t.prev=null,this._len--},n.len=function(){return this._len},n.clear=function(){this.head=this.tail=null,this._len=0};var a=function(t){this.value=t,this.next,this.prev},o=function(t){this._list=new i,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},r=o.prototype;r.put=function(t,e){var i=this._list,n=this._map,o=null;if(null==n[t]){var r=i.len(),s=this._lastRemovedEntry;if(r>=this._maxSize&&r>0){var l=i.head;i.remove(l),delete n[l.key],o=l.value,this._lastRemovedEntry=l}s?s.value=e:s=new a(e),s.key=t,i.insertEntry(s),n[t]=s}return o},r.get=function(t){var e=this._map[t],i=this._list;if(null!=e)return e!==i.tail&&(i.remove(e),i.insertEntry(e)),e.value},r.clear=function(){this._list.clear(),this._map={}},t.exports=o},function(t,e){var i=2311;t.exports=function(){return i++}},function(t,e){var i=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};i.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")},t.exports=i},function(t,e){function i(t,e,i){var n=null==e.x?0:e.x,a=null==e.x2?1:e.x2,o=null==e.y?0:e.y,r=null==e.y2?0:e.y2;e.global||(n=n*i.width+i.x,a=a*i.width+i.x,o=o*i.height+i.y,r=r*i.height+i.y);var s=t.createLinearGradient(n,o,a,r);return s}function n(t,e,i){var n=i.width,a=i.height,o=Math.min(n,a),r=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;e.global||(r=r*n+i.x,s=s*a+i.y,l*=o);var u=t.createRadialGradient(r,s,0,r,s,l);return u}var a=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],o=function(t){this.extendFrom(t)};o.prototype={constructor:o,fill:"#000000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,textFill:"#000",textStroke:null,textPosition:"inside",textOffset:null,textBaseline:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textTransform:!1,textRotation:0,blend:null,bind:function(t,e,i){for(var n=this,o=i&&i.style,r=!o,s=0;s<a.length;s++){var l=a[s],u=l[0];(r||n[u]!==o[u])&&(t[u]=n[u]||l[1])}if((r||n.fill!==o.fill)&&(t.fillStyle=n.fill),(r||n.stroke!==o.stroke)&&(t.strokeStyle=n.stroke),(r||n.opacity!==o.opacity)&&(t.globalAlpha=null==n.opacity?1:n.opacity),(r||n.blend!==o.blend)&&(t.globalCompositeOperation=n.blend||"source-over"),this.hasStroke()){var c=n.lineWidth;t.lineWidth=c/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t){var i=this;for(var n in t)!t.hasOwnProperty(n)||!e&&i.hasOwnProperty(n)||(i[n]=t[n])}},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,a){for(var o="radial"===e.type?n:i,r=o(t,e,a),s=e.colorStops,l=0;l<s.length;l++)r.addColorStop(s[l].offset,s[l].color);return r}};for(var r=o.prototype,s=0;s<a.length;s++){var l=a[s];l[0]in r||(r[l[0]]=l[1])}o.getGradient=r.getGradient,t.exports=o},function(t,e,i){var n=i(168),a=i(167);t.exports={buildPath:function(t,e,i){var o=e.points,r=e.smooth;if(o&&o.length>=2){if(r&&"spline"!==r){var s=a(o,r,i,e.smoothConstraint);t.moveTo(o[0][0],o[0][1]);for(var l=o.length,u=0;u<(i?l:l-1);u++){var c=s[2*u],h=s[2*u+1],d=o[(u+1)%l];t.bezierCurveTo(c[0],c[1],h[0],h[1],d[0],d[1])}}else{"spline"===r&&(o=n(o,i)),t.moveTo(o[0][0],o[0][1]);for(var u=1,f=o.length;u<f;u++)t.lineTo(o[u][0],o[u][1])}i&&t.closePath()}}}},function(t,e,i){var n=i(1),a={};a.layout=function(t,e,i){function a(t,e){var i=o.getAxis(t);return i.toGlobalCoord(i.dataToCoord(0))}i=i||{};var o=t.coordinateSystem,r=e.axis,s={},l=r.position,u=r.onZero?"onZero":l,c=r.dim,h=o.getRect(),d=[h.x,h.x+h.width,h.y,h.y+h.height],f=e.get("offset")||0,p={x:{top:d[2]-f,bottom:d[3]+f},y:{left:d[0]-f,right:d[1]+f}};p.x.onZero=Math.max(Math.min(a("y"),p.x.bottom),p.x.top),p.y.onZero=Math.max(Math.min(a("x"),p.y.right),p.y.left),s.position=["y"===c?p.y[u]:d[0],"x"===c?p.x[u]:d[3]],s.rotation=Math.PI/2*("x"===c?0:1);var g={top:-1,bottom:1,left:-1,right:1};s.labelDirection=s.tickDirection=s.nameDirection=g[l],s.labelOffset=r.onZero?p[c][l]-p[c].onZero:0,e.get("axisTick.inside")&&(s.tickDirection=-s.tickDirection),n.retrieve(i.labelInside,e.get("axisLabel.inside"))&&(s.labelDirection=-s.labelDirection);var m=e.get("axisLabel.rotate");return s.labelRotate="top"===u?-m:m,s.labelInterval=r.getLabelInterval(),s.z2=1,s},t.exports=a},function(t,e,i){"use strict";function n(t,e,i,n){var a=n.getWidth(),o=n.getHeight();t[0]=Math.min(t[0]+e,a)-e,t[1]=Math.min(t[1]+i,o)-i,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}var a=i(1),o=i(3),r=i(16),s=i(7),l=i(19),u=i(18),c=i(40),h={};h.buildElStyle=function(t){var e,i=t.get("type"),n=t.getModel(i+"Style");return"line"===i?(e=n.getLineStyle(),e.fill=null):"shadow"===i&&(e=n.getAreaStyle(),e.stroke=null),e},h.buildLabelElOption=function(t,e,i,a,o){var l=i.get("value"),u=h.getValueLabel(l,e.axis,e.ecModel,i.get("seriesDataIndices"),{precision:i.get("label.precision"),formatter:i.get("label.formatter")}),c=i.getModel("label"),d=c.getModel("textStyle"),f=s.normalizeCssArray(c.get("padding")||0),p=d.getFont(),g=r.getBoundingRect(u,p,o.textAlign,o.textBaseline),m=o.position,v=g.width+f[1]+f[3],y=g.height+f[0]+f[2],x=o.align;"right"===x&&(m[0]-=v),"center"===x&&(m[0]-=v/2);var _=o.verticalAlign;"bottom"===_&&(m[1]-=y),"middle"===_&&(m[1]-=y/2),n(m,v,y,a);var b=c.get("backgroundColor");b&&"auto"!==b||(b=e.get("axisLine.lineStyle.color")),t.label={shape:{x:0,y:0,width:v,height:y,r:c.get("borderRadius")},position:m.slice(),style:{text:u,textFont:p,textFill:d.getTextColor(),textPosition:"inside",fill:b,stroke:c.get("borderColor")||"transparent",lineWidth:c.get("borderWidth")||0,shadowBlur:c.get("shadowBlur"),shadowColor:c.get("shadowColor"),shadowOffsetX:c.get("shadowOffsetX"),shadowOffsetY:c.get("shadowOffsetY")},z2:10}},h.getValueLabel=function(t,e,i,n,o){var r=e.scale.getLabel(t,{precision:o.precision}),s=o.formatter;if(s){var l={value:u.getAxisRawValue(e,t),seriesData:[]};a.each(n,function(t){var e=i.getSeriesByIndex(t.seriesIndex),n=t.dataIndexInside,a=e&&e.getDataParams(n);a&&l.seriesData.push(a)}),a.isString(s)?r=s.replace("{value}",r):a.isFunction(s)&&(r=s(l))}return r},h.getTransformedPosition=function(t,e,i){var n=l.create();return l.rotate(n,n,i.rotation),l.translate(n,n,i.position),o.applyTransform([t.dataToCoord(e),(i.labelOffset||0)+(i.labelDirection||1)*(i.labelMargin||0)],n)},h.buildCartesianSingleLabelElOption=function(t,e,i,n,a,o){var r=c.innerTextLayout(i.rotation,0,i.labelDirection);i.labelMargin=a.get("label.margin"),h.buildLabelElOption(e,n,a,o,{position:h.getTransformedPosition(n.axis,t,i),align:r.textAlign,verticalAlign:r.textVerticalAlign})},h.makeLineShape=function(t,e,i){return i=i||0,{x1:t[i],y1:t[1-i],x2:e[i],y2:e[1-i]}},h.makeRectShape=function(t,e,i){return i=i||0,{x:t[i],y:t[1-i],width:e[i],height:e[1-i]}},h.makeSectorShape=function(t,e,i,n,a,o){return{cx:t,cy:e,r0:i,r:n,startAngle:a,endAngle:o,clockwise:!0}},t.exports=h},function(t,e,i){var n=i(7),a=i(1),o={},r=["x","y","z","radius","angle","single"],s=["cartesian2d","polar","singleAxis"];o.isCoordSupported=function(t){return a.indexOf(s,t)>=0},o.createNameEach=function(t,e){t=t.slice();var i=a.map(t,n.capitalFirst);e=(e||[]).slice();var o=a.map(e,n.capitalFirst);return function(n,r){a.each(t,function(t,a){for(var s={name:t,capital:i[a]},l=0;l<e.length;l++)s[e[l]]=t+o[l];n.call(r,s)})}},o.eachAxisDim=o.createNameEach(r,["axisIndex","axis","index","id"]),o.createLinkedNodesFinder=function(t,e,i){function n(t,e){return a.indexOf(e.nodes,t)>=0}function o(t,n){var o=!1;return e(function(e){a.each(i(t,e)||[],function(t){n.records[e.name][t]&&(o=!0)})}),o}function r(t,n){n.nodes.push(t),e(function(e){a.each(i(t,e)||[],function(t){n.records[e.name][t]=!0})})}return function(i){function a(t){!n(t,s)&&o(t,s)&&(r(t,s),l=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!i)return s;r(i,s);var l;do l=!1,t(a);while(l);return s}},t.exports=o},function(t,e,i){var n=i(1);t.exports={updateSelectedMap:function(t){this._selectTargetMap=n.reduce(t||[],function(t,e){return t.set(e.name,e),t},n.createHashMap())},select:function(t){var e=this._selectTargetMap,i=e.get(t),n=this.get("selectedMode");"single"===n&&e.each(function(t){t.selected=!1}),i&&(i.selected=!0)},unSelect:function(t){var e=this._selectTargetMap.get(t);e&&(e.selected=!1)},toggleSelected:function(t){var e=this._selectTargetMap.get(t);if(null!=e)return this[e.selected?"unSelect":"select"](t),e.selected},isSelected:function(t){var e=this._selectTargetMap.get(t);return e&&e.selected}}},function(t,e,i){function n(t){a.defaultEmphasis(t.label,a.LABEL_OPTIONS)}var a=i(5),o=i(1),r=i(9),s=i(7),l=s.addCommas,u=s.encodeHTML,c=i(2).extendComponentModel({type:"marker",dependencies:["series","grid","polar","geo"],init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i),this.mergeOption(t,i,n.createdBySelf,!0)},isAnimationEnabled:function(){if(r.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},mergeOption:function(t,e,i,a){var r=this.constructor,s=this.mainType+"Model";i||e.eachSeries(function(t){var i=t.get(this.mainType),l=t[s];return i&&i.data?(l?l.mergeOption(i,e,!0):(a&&n(i),o.each(i.data,function(t){t instanceof Array?(n(t[0]),n(t[1])):n(t)}),l=new r(i,this,e),o.extend(l,{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),l.__hostSeries=t),void(t[s]=l)):void(t[s]=null)},this)},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=o.isArray(i)?o.map(i,l).join(", "):l(i),a=e.getName(t),r=u(this.name);return(null!=i||a)&&(r+="<br />"),a&&(r+=u(a),null!=i&&(r+=" : ")),null!=i&&(r+=u(n)),r},getData:function(){return this._data},setData:function(t){this._data=t}});o.mixin(c,a.dataFormatMixin),t.exports=c},function(t,e,i){var n=i(1);t.exports=i(2).extendComponentView({type:"marker",init:function(){this.markerGroupMap=n.createHashMap()},render:function(t,e,i){var n=this.markerGroupMap;n.each(function(t){t.__keep=!1});var a=this.type+"Model";e.eachSeries(function(t){var n=t[a];n&&this.renderSeries(t,n,e,i)},this),n.each(function(t){!t.__keep&&this.group.remove(t.group)},this)},renderSeries:function(){}})},function(t,e,i){function n(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function a(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function o(t,e,i){var n=-1;do n=Math.max(l.getPrecision(t.get(e,i)),n),t=t.stackedOn;while(t);return n}function r(t,e,i,n,a,r){var s=[],l=m(e,n,t),u=e.indicesOfNearest(n,l,!0)[0];s[a]=e.get(i,u,!0),s[r]=e.get(n,u,!0);var c=o(e,n,u);return c>=0&&(s[r]=+s[r].toFixed(c)),s}var s=i(1),l=i(4),u=s.indexOf,c=s.curry,h={min:c(r,"min"),max:c(r,"max"),average:c(r,"average")},d=function(t,e){var i=t.getData(),n=t.coordinateSystem;if(e&&!a(e)&&!s.isArray(e.coord)&&n){var o=n.dimensions,r=f(e,i,n,t);if(e=s.clone(e),e.type&&h[e.type]&&r.baseAxis&&r.valueAxis){var l=u(o,r.baseAxis.dim),c=u(o,r.valueAxis.dim);e.coord=h[e.type](i,r.baseDataDim,r.valueDataDim,l,c),e.value=e.coord[c]}else{for(var d=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],p=0;p<2;p++)if(h[d[p]]){var g=t.coordDimToDataDim(o[p])[0];d[p]=m(i,g,d[p])}e.coord=d}}return e},f=function(t,e,i,n){var a={};return null!=t.valueIndex||null!=t.valueDim?(a.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,a.valueAxis=i.getAxis(n.dataDimToCoordDim(a.valueDataDim)),a.baseAxis=i.getOtherAxis(a.valueAxis),a.baseDataDim=n.coordDimToDataDim(a.baseAxis.dim)[0]):(a.baseAxis=n.getBaseAxis(),a.valueAxis=i.getOtherAxis(a.baseAxis),a.baseDataDim=n.coordDimToDataDim(a.baseAxis.dim)[0],a.valueDataDim=n.coordDimToDataDim(a.valueAxis.dim)[0]),a},p=function(t,e){return!(t&&t.containData&&e.coord&&!n(e))||t.containData(e.coord)},g=function(t,e,i,n){return n<2?t.coord&&t.coord[n]:t.value},m=function(t,e,i){if("average"===i){var n=0,a=0;return t.each(e,function(t,e){isNaN(t)||(n+=t,a++)},!0),n/a}return t.getDataExtent(e,!0)["max"===i?1:0]};t.exports={dataTransform:d,dataFilter:p,dimValueGetter:g,getAxisInfo:f,numCalculate:m}},function(t,e,i){"use strict";function n(t){return t.get("stack")||d+t.seriesIndex}function a(t){return t.dim+t.index}function o(t,e){var i=[],n=t.axis,a="axis0";if("category"===n.type){for(var o=n.getBandWidth(),r=0;r<t.count;r++)i.push(u.defaults({bandWidth:o,axisKey:a,stackId:d+r},t));for(var l=s(i,e),c=[],r=0;r<t.count;r++){var h=l[a][d+r];h.offsetCenter=h.offset+h.width/2,c.push(h)}return c}}function r(t,e){var i=u.map(t,function(t){var e=t.getData(),i=t.coordinateSystem,o=i.getBaseAxis(),r=o.getExtent(),s="category"===o.type?o.getBandWidth():Math.abs(r[1]-r[0])/e.count(),l=h(t.get("barWidth"),s),u=h(t.get("barMaxWidth"),s),c=t.get("barGap"),d=t.get("barCategoryGap");return{bandWidth:s,barWidth:l,barMaxWidth:u,barGap:c,barCategoryGap:d,axisKey:a(o),stackId:n(t)}});return s(i,e)}function s(t,e){var i={};u.each(t,function(t,e){var n=t.axisKey,a=t.bandWidth,o=i[n]||{bandWidth:a,remainedWidth:a,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},r=o.stacks;i[n]=o;var s=t.stackId;r[s]||o.autoWidthCount++,r[s]=r[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!r[s].width&&(l=Math.min(o.remainedWidth,l),r[s].width=l,o.remainedWidth-=l);var u=t.barMaxWidth;u&&(r[s].maxWidth=u);var c=t.barGap;null!=c&&(o.gap=c);var h=t.barCategoryGap;null!=h&&(o.categoryGap=h)});var n={};return u.each(i,function(t,e){n[e]={};var i=t.stacks,a=t.bandWidth,o=h(t.categoryGap,a),r=h(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,c=(s-o)/(l+(l-1)*r);c=Math.max(c,0),u.each(i,function(t,e){var i=t.maxWidth;i&&i<c&&(i=Math.min(i,s),t.width&&(i=Math.min(i,t.width)),s-=i,t.width=i,l--)}),c=(s-o)/(l+(l-1)*r),c=Math.max(c,0);var d,f=0;u.each(i,function(t,e){t.width||(t.width=c),d=t,f+=t.width*(1+r)}),d&&(f-=d.width*r);var p=-f/2;u.each(i,function(t,i){n[e][i]=n[e][i]||{offset:p,width:t.width},p+=t.width*(1+r)})}),n}function l(t,e,i){var o=r(u.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),s={},l={};e.eachSeriesByType(t,function(t){if("cartesian2d"===t.coordinateSystem.type){var e=t.getData(),i=t.coordinateSystem,r=i.getBaseAxis(),u=n(t),c=o[a(r)][u],h=c.offset,d=c.width,f=i.getOtherAxis(r),p=t.get("barMinHeight")||0,g=r.onZero?f.toGlobalCoord(f.dataToCoord(0)):f.getGlobalExtent()[0],m=i.dataToPoints(e,!0);s[u]=s[u]||[],l[u]=l[u]||[],e.setLayout({offset:h,size:d}),e.each(f.dim,function(t,i){if(!isNaN(t)){s[u][i]||(s[u][i]={p:g,n:g},l[u][i]={p:g,n:g});var n,a,o,r,c=t>=0?"p":"n",v=m[i],y=s[u][i][c],x=l[u][i][c];f.isHorizontal()?(n=y,a=v[1]+h,o=v[0]-x,r=d,l[u][i][c]+=o,Math.abs(o)<p&&(o=(o<0?-1:1)*p),s[u][i][c]+=o):(n=v[0]+h,a=y,o=d,r=v[1]-x,l[u][i][c]+=r,Math.abs(r)<p&&(r=(r<=0?-1:1)*p),s[u][i][c]+=r),e.setItemLayout(i,{x:n,y:a,width:o,height:r})}},!0)}},this)}var u=i(1),c=i(4),h=c.parsePercent,d="__ec_stack_";l.getLayoutOnAxis=o,t.exports=l},function(t,e,i){function n(t){var e=t.pieceList;t.hasSpecialVisual=!1,g.each(e,function(e,i){e.originIndex=i,null!=e.visual&&(t.hasSpecialVisual=!0)})}function a(t){var e=t.categories,i=t.visual,n=t.categoryMap={};if(y(e,function(t,e){n[t]=e}),!g.isArray(i)){var a=[];g.isObject(i)?y(i,function(t,e){var i=n[e];a[null!=i?i:_]=t}):a[_]=i,i=f(t,a)}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}function o(t,e){var i=t.visual,n=[];g.isObject(i)?y(i,function(t){n.push(t)}):null!=i&&n.push(i);var a={color:1,symbol:1};e||1!==n.length||a.hasOwnProperty(t.type)||(n[1]=n[0]),f(t,n)}function r(t){return{applyVisual:function(e,i,n){e=this.mapValueToVisual(e),n("color",t(i("color"),e))},_doMap:h([0,1])}}function s(t){var e=this.option.visual;return e[Math.round(v(t,[0,1],[0,e.length-1],!0))]||{}}function l(t){return function(e,i,n){n(t,this.mapValueToVisual(e))}}function u(t){var e=this.option.visual;return e[this.option.loop&&t!==_?t%e.length:t]}function c(){return this.option.visual[0]}function h(t){return{linear:function(e){return v(e,t,this.option.visual,!0)},category:u,piecewise:function(e,i){var n=d.call(this,i);return null==n&&(n=v(e,t,this.option.visual,!0)),n},fixed:c}}function d(t){var e=this.option,i=e.pieceList;if(e.hasSpecialVisual){var n=b.findPieceIndex(t,i),a=i[n];if(a&&a.visual)return a.visual[this.type]}}function f(t,e){return t.visual=e,"color"===t.type&&(t.parsedVisual=g.map(e,function(t){return m.parse(t)})),e}function p(t,e,i){return t?e<=i:e<i}var g=i(1),m=i(22),v=i(4).linearMap,y=g.each,x=g.isObject,_=-1,b=function(t){var e=t.mappingMethod,i=t.type,r=this.option=g.clone(t);this.type=i,this.mappingMethod=e,this._normalizeData=S[e];var s=w[i];this.applyVisual=s.applyVisual,this.getColorMapper=s.getColorMapper,this._doMap=s._doMap[e],"piecewise"===e?(o(r),n(r)):"category"===e?r.categories?a(r):o(r,!0):(g.assert("linear"!==e||r.dataExtent),o(r))};b.prototype={constructor:b,mapValueToVisual:function(t){var e=this._normalizeData(t);return this._doMap(e,t)},getNormalizer:function(){return g.bind(this._normalizeData,this)}};var w=b.visualHandlers={color:{applyVisual:l("color"),getColorMapper:function(){var t=this.option;return g.bind("category"===t.mappingMethod?function(t,e){return!e&&(t=this._normalizeData(t)),u.call(this,t)}:function(e,i,n){var a=!!n;return!i&&(e=this._normalizeData(e)),n=m.fastMapToColor(e,t.parsedVisual,n),a?n:m.stringify(n,"rgba")},this)},_doMap:{linear:function(t){return m.stringify(m.fastMapToColor(t,this.option.parsedVisual),"rgba")},category:u,piecewise:function(t,e){var i=d.call(this,e);return null==i&&(i=m.stringify(m.fastMapToColor(t,this.option.parsedVisual),"rgba")),i},fixed:c}},colorHue:r(function(t,e){return m.modifyHSL(t,e)}),colorSaturation:r(function(t,e){return m.modifyHSL(t,null,e)}),colorLightness:r(function(t,e){return m.modifyHSL(t,null,null,e)}),colorAlpha:r(function(t,e){return m.modifyAlpha(t,e)}),opacity:{applyVisual:l("opacity"),_doMap:h([0,1])},symbol:{applyVisual:function(t,e,i){var n=this.mapValueToVisual(t);if(g.isString(n))i("symbol",n);else if(x(n))for(var a in n)n.hasOwnProperty(a)&&i(a,n[a])},_doMap:{linear:s,category:u,piecewise:function(t,e){var i=d.call(this,e);return null==i&&(i=s.call(this,t)),i},fixed:c}},symbolSize:{applyVisual:l("symbolSize"),_doMap:h([0,1])}},S={linear:function(t){return v(t,this.option.dataExtent,[0,1],!0)},piecewise:function(t){var e=this.option.pieceList,i=b.findPieceIndex(t,e,!0);if(null!=i)return v(i,[0,e.length-1],[0,1],!0)},category:function(t){var e=this.option.categories?this.option.categoryMap[t]:t;return null==e?_:e},fixed:g.noop};b.listVisualTypes=function(){var t=[];return g.each(w,function(e,i){t.push(i)}),t},b.addVisualHandler=function(t,e){w[t]=e},b.isValidType=function(t){return w.hasOwnProperty(t)},b.eachVisual=function(t,e,i){g.isObject(t)?g.each(t,e,i):e.call(i,t)},b.mapVisual=function(t,e,i){var n,a=g.isArray(t)?[]:g.isObject(t)?{}:(n=!0,null);return b.eachVisual(t,function(t,o){var r=e.call(i,t,o);n?a=r:a[o]=r}),a},b.retrieveVisuals=function(t){var e,i={};return t&&y(w,function(n,a){t.hasOwnProperty(a)&&(i[a]=t[a],e=!0)}),e?i:null},b.prepareVisualTypes=function(t){if(x(t)){var e=[];y(t,function(t,i){e.push(i)}),t=e}else{if(!g.isArray(t))return[];t=t.slice()}return t.sort(function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1}),t},b.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},b.findPieceIndex=function(t,e,i){function n(e,i){var n=Math.abs(e-t);n<o&&(o=n,a=i)}for(var a,o=1/0,r=0,s=e.length;r<s;r++){var l=e[r].value;if(null!=l){if(l===t||"string"==typeof l&&l===t+"")return r;i&&n(l,r)}}for(var r=0,s=e.length;r<s;r++){var u=e[r],c=u.interval,h=u.close;if(c){if(c[0]===-(1/0)){if(p(h[1],t,c[1]))return r}else if(c[1]===1/0){if(p(h[0],c[0],t))return r}else if(p(h[0],c[0],t)&&p(h[1],t,c[1]))return r;i&&n(c[0],r),i&&n(c[1],r)}}if(i)return t===1/0?e.length-1:t===-(1/0)?0:a},t.exports=b},function(t,e){t.exports=function(t,e){var i={};
+e.eachRawSeriesByType(t,function(t){var n=t.getRawData(),a={};if(!e.isSeriesFiltered(t)){var o=t.getData();o.each(function(t){var e=o.getRawIndex(t);a[e]=t}),n.each(function(e){var r=a[e],s=null!=r&&o.getItemVisual(r,"color",!0);if(s)n.setItemVisual(e,"color",s);else{var l=n.getItemModel(e),u=l.get("itemStyle.normal.color")||t.getColorFromPalette(n.getName(e),i);n.setItemVisual(e,"color",u),null!=r&&o.setItemVisual(r,"color",u)}})}})}},function(t,e,i){var n=i(6),a=i(20),o={},r=Math.min,s=Math.max,l=Math.sin,u=Math.cos,c=n.create(),h=n.create(),d=n.create(),f=2*Math.PI;o.fromPoints=function(t,e,i){if(0!==t.length){var n,a=t[0],o=a[0],l=a[0],u=a[1],c=a[1];for(n=1;n<t.length;n++)a=t[n],o=r(o,a[0]),l=s(l,a[0]),u=r(u,a[1]),c=s(c,a[1]);e[0]=o,e[1]=u,i[0]=l,i[1]=c}},o.fromLine=function(t,e,i,n,a,o){a[0]=r(t,i),a[1]=r(e,n),o[0]=s(t,i),o[1]=s(e,n)};var p=[],g=[];o.fromCubic=function(t,e,i,n,o,l,u,c,h,d){var f,m=a.cubicExtrema,v=a.cubicAt,y=m(t,i,o,u,p);for(h[0]=1/0,h[1]=1/0,d[0]=-(1/0),d[1]=-(1/0),f=0;f<y;f++){var x=v(t,i,o,u,p[f]);h[0]=r(x,h[0]),d[0]=s(x,d[0])}for(y=m(e,n,l,c,g),f=0;f<y;f++){var _=v(e,n,l,c,g[f]);h[1]=r(_,h[1]),d[1]=s(_,d[1])}h[0]=r(t,h[0]),d[0]=s(t,d[0]),h[0]=r(u,h[0]),d[0]=s(u,d[0]),h[1]=r(e,h[1]),d[1]=s(e,d[1]),h[1]=r(c,h[1]),d[1]=s(c,d[1])},o.fromQuadratic=function(t,e,i,n,o,l,u,c){var h=a.quadraticExtremum,d=a.quadraticAt,f=s(r(h(t,i,o),1),0),p=s(r(h(e,n,l),1),0),g=d(t,i,o,f),m=d(e,n,l,p);u[0]=r(t,o,g),u[1]=r(e,l,m),c[0]=s(t,o,g),c[1]=s(e,l,m)},o.fromArc=function(t,e,i,a,o,r,s,p,g){var m=n.min,v=n.max,y=Math.abs(o-r);if(y%f<1e-4&&y>1e-4)return p[0]=t-i,p[1]=e-a,g[0]=t+i,void(g[1]=e+a);if(c[0]=u(o)*i+t,c[1]=l(o)*a+e,h[0]=u(r)*i+t,h[1]=l(r)*a+e,m(p,c,h),v(g,c,h),o%=f,o<0&&(o+=f),r%=f,r<0&&(r+=f),o>r&&!s?r+=f:o<r&&s&&(o+=f),s){var x=r;r=o,o=x}for(var _=0;_<r;_+=Math.PI/2)_>o&&(d[0]=u(_)*i+t,d[1]=l(_)*a+e,m(p,d,p),v(g,d,g))},t.exports=o},function(t,e,i){var n=i(38),a=i(1),o=i(16),r=function(t){n.call(this,t)};r.prototype={constructor:r,type:"text",brush:function(t,e){var i=this.style,n=i.x||0,a=i.y||0,r=i.text;if(null!=r&&(r+=""),i.bind(t,this,e),r){this.setTransform(t);var s,l=i.textAlign,u=i.textFont||i.font;if(i.textVerticalAlign){var c=o.getBoundingRect(r,u,i.textAlign,"top");switch(s="middle",i.textVerticalAlign){case"middle":a-=c.height/2-c.lineHeight/2;break;case"bottom":a-=c.height-c.lineHeight/2;break;default:a+=c.lineHeight/2}}else s=i.textBaseline;t.font=u||"12px sans-serif",t.textAlign=l||"left",t.textAlign!==l&&(t.textAlign="left"),t.textBaseline=s||"alphabetic",t.textBaseline!==s&&(t.textBaseline="alphabetic");for(var h=o.measureText("国",t.font).width,d=r.split("\n"),f=0;f<d.length;f++)i.hasStroke()&&t.strokeText(d[f],n,a),i.hasFill()&&t.fillText(d[f],n,a),a+=h;this.restoreTransform(t)}},getBoundingRect:function(){var t=this.style;if(!this._rect){var e=t.textVerticalAlign,i=o.getBoundingRect(t.text+"",t.textFont||t.font,t.textAlign,e?"top":t.textBaseline);switch(e){case"middle":i.y-=i.height/2;break;case"bottom":i.y-=i.height}if(i.x+=t.x||0,i.y+=t.y||0,t.hasStroke()){var n=t.lineWidth;i.x-=n/2,i.y-=n/2,i.width+=n,i.height+=n}this._rect=i}return this._rect}},a.inherits(r,n),t.exports=r},function(t,e,i){function n(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}var a=i(16),o=i(11),r=new o,s=function(){};s.prototype={constructor:s,drawRectText:function(t,e,i){var o=this.style,s=o.text;if(null!=s&&(s+=""),s){t.save();var l,u,c=o.textPosition,h=o.textOffset,d=o.textDistance,f=o.textAlign,p=o.textFont||o.font,g=o.textBaseline,m=o.textVerticalAlign;i=i||a.getBoundingRect(s,p,f,g);var v=this.transform;if(o.textTransform?this.setTransform(t):v&&(r.copy(e),r.applyTransform(v),e=r),c instanceof Array){if(l=e.x+n(c[0],e.width),u=e.y+n(c[1],e.height),f=f||"left",g=g||"top",m){switch(m){case"middle":u-=i.height/2-i.lineHeight/2;break;case"bottom":u-=i.height-i.lineHeight/2;break;default:u+=i.lineHeight/2}g="middle"}}else{var y=a.adjustTextPositionOnRect(c,e,i,d);l=y.x,u=y.y,f=f||y.textAlign,g=g||y.textBaseline}h&&(l+=h[0],u+=h[1]),t.textAlign=f||"left",t.textBaseline=g||"alphabetic";var x=o.textFill,_=o.textStroke;x&&(t.fillStyle=x),_&&(t.strokeStyle=_),t.font=p||"12px sans-serif",t.shadowBlur=o.textShadowBlur,t.shadowColor=o.textShadowColor||"transparent",t.shadowOffsetX=o.textShadowOffsetX,t.shadowOffsetY=o.textShadowOffsetY;var b=s.split("\n");o.textRotation&&(v&&t.translate(v[4],v[5]),t.rotate(o.textRotation),v&&t.translate(-v[4],-v[5]));for(var w=0;w<b.length;w++)_&&t.strokeText(b[w],l,u),x&&t.fillText(b[w],l,u),u+=i.lineHeight;t.restore()}}},t.exports=s},function(t,e,i){function n(t){delete f[t]}/*!
 	 * ZRender, a high performance 2d drawing library.
 	 *
 	 * Copyright (c) 2013, Baidu Inc.
@@ -20,18 +21,18 @@
 	 * LICENSE
 	 * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt
 	 */
-var o=i(70),a=i(9),r=i(1),s=i(152),l=i(155),u=i(156),c=i(163),h=!a.canvasSupported,d={canvas:i(154)},f={},p={};p.version="3.4.4",p.init=function(t,e){var i=new g(o(),t,e);return f[i.id]=i,i},p.dispose=function(t){if(t)t.dispose();else{for(var e in f)f.hasOwnProperty(e)&&f[e].dispose();f={}}return p},p.getInstance=function(t){return f[t]},p.registerPainter=function(t,e){d[t]=e};var g=function(t,e,i){i=i||{},this.dom=e,this.id=t;var n=this,o=new l,f=i.renderer;if(h){if(!d.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");f="vml"}else f&&d[f]||(f="canvas");var p=new d[f](e,o,i);this.storage=o,this.painter=p;var g=a.node?null:new c(p.getViewportRoot());this.handler=new s(o,p,g,p.root),this.animation=new u({stage:{update:r.bind(this.flush,this)}}),this.animation.start(),this._needsRefresh;var m=o.delFromStorage,v=o.addToStorage;o.delFromStorage=function(t){m.call(o,t),t&&t.removeSelfFromZr(n)},o.addToStorage=function(t){v.call(o,t),t.addSelfToZr(n)}};g.prototype={constructor:g,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,i){this.handler.on(t,e,i)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,n(this.id)}},t.exports=p},function(t,e,i){var n=i(2),o=i(1);t.exports=function(t,e){o.each(e,function(e){e.update="updateView",n.registerAction(e,function(i,n){var o={};return n.eachComponent({mainType:"series",subType:t,query:i},function(t){t[e.method]&&t[e.method](i.name);var n=t.getData();n.each(function(e){var i=n.getName(e);o[i]=t.isSelected(i)||!1})}),{name:i.name,selected:o}})})}},function(t,e,i){"use strict";var n=i(18),o=i(28);t.exports=n.extend({type:"series.__base_bar__",getInitialData:function(t,e){return o(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var i=e.dataToPoint(t,!0),n=this.getData(),o=n.getLayout("offset"),a=n.getLayout("size"),r=e.getBaseAxis().isHorizontal()?0:1;return i[r]+=o+a/2,i}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,itemStyle:{normal:{},emphasis:{}}}})},function(t,e,i){function n(t,e,i,n,o){a.setText(t,e,i),t.text=n,"outside"===t.textPosition&&(t.textPosition=o)}var o=i(1),a=i(3),r={};r.setLabel=function(t,e,i,a,r,s,l){var u=i.getModel("label.normal"),c=i.getModel("label.emphasis");u.get("show")?n(t,u,a,o.retrieve(r.getFormattedLabel(s,"normal"),r.getRawValue(s)),l):t.text="",c.get("show")?n(e,c,a,o.retrieve(r.getFormattedLabel(s,"emphasis"),r.getRawValue(s)),l):e.text=""},t.exports=r},function(t,e,i){function n(t){return isNaN(t[0])||isNaN(t[1])}function o(t,e,i,o,a,r,g,m,v,y,x){for(var _=0,b=i,w=0;w<o;w++){var S=e[b];if(b>=a||b<0)break;if(n(S)){if(x){b+=r;continue}break}if(b===i)t[r>0?"moveTo":"lineTo"](S[0],S[1]),h(f,S);else if(v>0){var M=b+r,I=e[M];if(x)for(;I&&n(e[M]);)M+=r,I=e[M];var T=.5,A=e[_],I=e[M];if(!I||n(I))h(p,S);else{n(I)&&!x&&(I=S),s.sub(d,I,A);var C,L;if("x"===y||"y"===y){var D="x"===y?0:1;C=Math.abs(S[D]-A[D]),L=Math.abs(S[D]-I[D])}else C=s.dist(S,A),L=s.dist(S,I);T=L/(L+C),c(p,S,d,-v*(1-T))}l(f,f,m),u(f,f,g),l(p,p,m),u(p,p,g),t.bezierCurveTo(f[0],f[1],p[0],p[1],S[0],S[1]),c(f,S,d,v*T)}else t.lineTo(S[0],S[1]);_=b,b+=r}return w}function a(t,e){var i=[1/0,1/0],n=[-(1/0),-(1/0)];if(e)for(var o=0;o<t.length;o++){var a=t[o];a[0]<i[0]&&(i[0]=a[0]),a[1]<i[1]&&(i[1]=a[1]),a[0]>n[0]&&(n[0]=a[0]),a[1]>n[1]&&(n[1]=a[1])}return{min:e?i:n,max:e?n:i}}var r=i(8),s=i(5),l=s.min,u=s.max,c=s.scaleAndAdd,h=s.copy,d=[],f=[],p=[];t.exports={Polyline:r.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},buildPath:function(t,e){var i=e.points,r=0,s=i.length,l=a(i,e.smoothConstraint);if(e.connectNulls){for(;s>0&&n(i[s-1]);s--);for(;r<s&&n(i[r]);r++);}for(;r<s;)r+=o(t,i,r,s,s,1,l.min,l.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),Polygon:r.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},buildPath:function(t,e){var i=e.points,r=e.stackedOnPoints,s=0,l=i.length,u=e.smoothMonotone,c=a(i,e.smoothConstraint),h=a(r,e.smoothConstraint);if(e.connectNulls){for(;l>0&&n(i[l-1]);l--);for(;s<l&&n(i[s]);s++);}for(;s<l;){var d=o(t,i,s,l,l,1,c.min,c.max,e.smooth,u,e.connectNulls);o(t,r,s+d-1,d,l,-1,h.min,h.max,e.stackedOnSmooth,u,e.connectNulls),s+=d+1,t.closePath()}}})}},function(t,e,i){var n=i(1),o={retrieveTargetInfo:function(t,e){if(t&&("treemapZoomToNode"===t.type||"treemapRootToNode"===t.type)){var i=e.getData().tree.root,n=t.targetNode;if(n&&i.contains(n))return{node:n};var o=t.targetNodeId;if(null!=o&&(n=i.getNodeById(o)))return{node:n}}},getPathToRoot:function(t){for(var e=[];t;)t=t.parentNode,t&&e.push(t);return e.reverse()},aboveViewRoot:function(t,e){var i=o.getPathToRoot(t);return n.indexOf(i,e)>=0},wrapTreePathInfo:function(t,e){for(var i=[];t;){var n=t.dataIndex;i.push({name:t.name,dataIndex:n,value:e.getRawValue(n)}),t=t.parentNode}return i.reverse(),i}};t.exports=o},function(t,e,i){function n(t){this.pointerChecker,this._zr=t;var e=h.bind,i=e(o,this),n=e(a,this),u=e(r,this),d=e(s,this),f=e(l,this);c.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(e){this.disable(),null==e&&(e=!0),e!==!0&&"move"!==e&&"pan"!==e||(t.on("mousedown",i),t.on("mousemove",n),t.on("mouseup",u)),e!==!0&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",d),t.on("pinch",f))},this.disable=function(){t.off("mousedown",i),t.off("mousemove",n),t.off("mouseup",u),t.off("mousewheel",d),t.off("pinch",f)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function o(t){if(!t.target||!t.target.draggable){var e=t.offsetX,i=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,i)&&(this._x=e,this._y=i,this._dragging=!0)}}function a(t){if(this._dragging&&(d.stop(t.event),"pinch"!==t.gestureEvent)){if(f.isTaken(this._zr,"globalPan"))return;var e=t.offsetX,i=t.offsetY,n=this._x,o=this._y,a=e-n,r=i-o;this._x=e,this._y=i,d.stop(t.event),this.trigger("pan",a,r,n,o,e,i)}}function r(t){this._dragging=!1}function s(t){if(0!==t.wheelDelta){var e=t.wheelDelta>0?1.1:1/1.1;u.call(this,t,e,t.offsetX,t.offsetY)}}function l(t){if(!f.isTaken(this._zr,"globalPan")){var e=t.pinchScale>1?1.1:1/1.1;u.call(this,t,e,t.pinchX,t.pinchY)}}function u(t,e,i,n){this.pointerChecker&&this.pointerChecker(t,i,n)&&(d.stop(t.event),this.trigger("zoom",e,i,n))}var c=i(23),h=i(1),d=i(21),f=i(128);h.mixin(n,c),t.exports=n},function(t,e,i){var n=i(1),o={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,textStyle:{fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},a=n.merge({boundaryGap:!0,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},o),r=n.merge({boundaryGap:[0,0],splitNumber:5},o),s=n.defaults({scale:!0,min:"dataMin",max:"dataMax"},r),l=n.defaults({logBase:10},r);l.scale=!0,t.exports={categoryAxis:a,valueAxis:r,timeAxis:s,logAxis:l}},function(t,e,i){"use strict";function n(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}function o(t){return t.dim+t.index}function a(t,e){var i={};s.each(t,function(t,e){var a=t.getData(),r=t.coordinateSystem,s=r.getBaseAxis(),l=s.getExtent(),c="category"===s.type?s.getBandWidth():Math.abs(l[1]-l[0])/a.count(),h=i[o(s)]||{bandWidth:c,remainedWidth:c,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},d=h.stacks;i[o(s)]=h;var f=n(t);d[f]||h.autoWidthCount++,d[f]=d[f]||{width:0,maxWidth:0};var p=u(t.get("barWidth"),c),g=u(t.get("barMaxWidth"),c),m=t.get("barGap"),v=t.get("barCategoryGap");p&&!d[f].width&&(p=Math.min(h.remainedWidth,p),d[f].width=p,h.remainedWidth-=p),g&&(d[f].maxWidth=g),null!=m&&(h.gap=m),null!=v&&(h.categoryGap=v)});var a={};return s.each(i,function(t,e){a[e]={};var i=t.stacks,n=t.bandWidth,o=u(t.categoryGap,n),r=u(t.gap,1),l=t.remainedWidth,c=t.autoWidthCount,h=(l-o)/(c+(c-1)*r);h=Math.max(h,0),s.each(i,function(t,e){var i=t.maxWidth;i&&i<h&&(i=Math.min(i,l),t.width&&(i=Math.min(i,t.width)),l-=i,t.width=i,c--)}),h=(l-o)/(c+(c-1)*r),h=Math.max(h,0);var d,f=0;s.each(i,function(t,e){t.width||(t.width=h),d=t,f+=t.width*(1+r)}),d&&(f-=d.width*r);var p=-f/2;s.each(i,function(t,i){a[e][i]=a[e][i]||{offset:p,width:t.width},p+=t.width*(1+r)})}),a}function r(t,e,i){var r=a(s.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),l={},u={};e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem,a=i.getBaseAxis(),s=n(t),c=r[o(a)][s],h=c.offset,d=c.width,f=i.getOtherAxis(a),p=t.get("barMinHeight")||0,g=a.onZero?f.toGlobalCoord(f.dataToCoord(0)):f.getGlobalExtent()[0],m=i.dataToPoints(e,!0);l[s]=l[s]||[],u[s]=u[s]||[],e.setLayout({offset:h,size:d}),e.each(f.dim,function(t,i){if(!isNaN(t)){l[s][i]||(l[s][i]={p:g,n:g},u[s][i]={p:g,n:g});var n,o,a,r,c=t>=0?"p":"n",v=m[i],y=l[s][i][c],x=u[s][i][c];f.isHorizontal()?(n=y,o=v[1]+h,a=v[0]-x,r=d,u[s][i][c]+=a,Math.abs(a)<p&&(a=(a<0?-1:1)*p),l[s][i][c]+=a):(n=v[0]+h,o=y,a=d,r=v[1]-x,u[s][i][c]+=r,Math.abs(r)<p&&(r=(r<=0?-1:1)*p),l[s][i][c]+=r),e.setItemLayout(i,{x:n,y:o,width:a,height:r})}},!0)},this)}var s=i(1),l=i(4),u=l.parsePercent;t.exports=r},function(t,e){t.exports={containStroke:function(t,e,i,n,o,a,r){if(0===o)return!1;var s=o,l=0,u=t;if(r>e+s&&r>n+s||r<e-s&&r<n-s||a>t+s&&a>i+s||a<t-s&&a<i-s)return!1;if(t===i)return Math.abs(a-t)<=s/2;l=(e-n)/(t-i),u=(t*n-i*e)/(t-i);var c=l*a-r+u,h=c*c/(l*l+1);return h<=s/2*s/2}}},function(t,e,i){var n=i(20);t.exports={containStroke:function(t,e,i,o,a,r,s,l,u){if(0===s)return!1;var c=s;if(u>e+c&&u>o+c&&u>r+c||u<e-c&&u<o-c&&u<r-c||l>t+c&&l>i+c&&l>a+c||l<t-c&&l<i-c&&l<a-c)return!1;var h=n.quadraticProjectPoint(t,e,i,o,a,r,l,u,null);return h<=c/2}}},function(t,e){t.exports=function(t,e,i,n,o,a){if(a>e&&a>n||a<e&&a<n)return 0;if(n===e)return 0;var r=n<e?1:-1,s=(a-e)/(n-e);1!==s&&0!==s||(r=n<e?.5:-.5);var l=s*(i-t)+t;return l>o?r:0}},function(t,e,i){"use strict";var n=i(1),o=i(39),a=function(t,e,i,n,a,r){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==i?1:i,this.y2=null==n?0:n,this.type="linear",this.global=r||!1,o.call(this,a)};a.prototype={constructor:a},n.inherits(a,o),t.exports=a},function(t,e,i){"use strict";function n(t){o.each(a,function(e){this[e]=o.bind(t[e],t)},this)}var o=i(1),a=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"];t.exports=n},function(t,e,i){var n=i(1);i(56),i(102),i(103);var o=i(95),a=i(2);a.registerLayout(n.curry(o,"bar")),a.registerVisual(function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),i(32)},function(t,e,i){t.exports=i(89).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"})},function(t,e,i){"use strict";function n(t,e,i,n,o,a,r){var s=new u.Rect({shape:l.extend({},n)});if(a){var c=s.shape,h=o?"height":"width",d={};c[h]=0,d[h]=n[h],u[r?"updateProps":"initProps"](s,{shape:d},a,e)}return s}function o(t,e,i){i.style.text="",u.updateProps(i,{shape:{width:0}},e,t,function(){i.parent&&i.parent.remove(i)})}function a(t,e,i){var n=t.getItemLayout(e),o=s(i,n),a=n.width>0?1:-1,r=n.height>0?1:-1;return{x:n.x+a*o/2,y:n.y+r*o/2,width:n.width-a*o,height:n.height-r*o}}function r(t,e,i,n,o,a,r){var s=e.getItemVisual(i,"color"),h=e.getItemVisual(i,"opacity"),d=n.getModel("itemStyle.normal"),f=n.getModel("itemStyle.emphasis").getBarItemStyle();t.setShape("r",d.get("barBorderRadius")||0),t.useStyle(l.defaults({fill:s,opacity:h},d.getBarItemStyle()));var p=r?o.height>0?"bottom":"top":o.width>0?"left":"right";c.setLabel(t.style,f,n,s,a,i,p),u.setHoverStyle(t,f)}function s(t,e){var i=t.get(h)||0;return Math.min(i,Math.abs(e.width),Math.abs(e.height))}var l=i(1),u=i(3),c=i(90),h=["itemStyle","normal","barBorderWidth"];l.extend(i(10).prototype,i(104));var d=i(2).extendChartView({type:"bar",render:function(t,e,i){var n=t.get("coordinateSystem");return"cartesian2d"===n&&this._renderOnCartesian(t,e,i),this.group},dispose:l.noop,_renderOnCartesian:function(t,e,i){var s=this.group,l=t.getData(),c=this._data,h=t.coordinateSystem,d=h.getBaseAxis(),f=d.isHorizontal(),p=t.isAnimationEnabled()?t:null;l.diff(c).add(function(e){if(l.hasValue(e)){var i=l.getItemModel(e),o=a(l,e,i),u=n(l,e,i,o,f,p);l.setItemGraphicEl(e,u),s.add(u),r(u,l,e,i,o,t,f)}}).update(function(e,i){var o=c.getItemGraphicEl(i);if(!l.hasValue(e))return void s.remove(o);var h=l.getItemModel(e),d=a(l,e,h);o?u.updateProps(o,{shape:d},p,e):o=n(l,e,h,d,f,p,!0),l.setItemGraphicEl(e,o),s.add(o),r(o,l,e,h,d,t,f)}).remove(function(t){var e=c.getItemGraphicEl(t);e&&o(t,p,e)}).execute(),this._data=l},remove:function(t,e){var i=this.group,n=this._data;t.get("animation")?n&&n.eachItemGraphicEl(function(e){o(e.dataIndex,t,e)}):i.removeAll()}});t.exports=d},function(t,e,i){var n=i(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getBarItemStyle:function(t){var e=n.call(this,t);if(this.getBorderLineDash){var i=this.getBorderLineDash();i&&(e.lineDash=i)}return e}}},function(t,e,i){function n(t){return"_"+t+"Type"}function o(t,e,i){var n=e.getItemVisual(i,"color"),o=e.getItemVisual(i,t),a=e.getItemVisual(i,t+"Size");if(o&&"none"!==o){f.isArray(a)||(a=[a,a]);var r=u.createSymbol(o,-a[0]/2,-a[1]/2,a[0],a[1],n);return r.name=t,r}}function a(t){var e=new h({name:"line"});return r(e.shape,t),e}function r(t,e){var i=e[0],n=e[1],o=e[2];t.x1=i[0],t.y1=i[1],t.x2=n[0],t.y2=n[1],t.percent=1,o?(t.cpx1=o[0],t.cpy1=o[1]):(t.cpx1=NaN,t.cpy1=NaN)}function s(){var t=this,e=t.childOfName("fromSymbol"),i=t.childOfName("toSymbol"),n=t.childOfName("label");if(e||i||!n.ignore){for(var o=1,a=this.parent;a;)a.scale&&(o/=a.scale[0]),a=a.parent;var r=t.childOfName("line");if(this.__dirty||r.__dirty){var s=r.shape.percent,l=r.pointAt(0),u=r.pointAt(s),h=c.sub([],u,l);if(c.normalize(h,h),e){e.attr("position",l);var d=r.tangentAt(0);e.attr("rotation",Math.PI/2-Math.atan2(d[1],d[0])),e.attr("scale",[o*s,o*s])}if(i){i.attr("position",u);var d=r.tangentAt(1);i.attr("rotation",-Math.PI/2-Math.atan2(d[1],d[0])),i.attr("scale",[o*s,o*s])}if(!n.ignore){n.attr("position",u);var f,p,g,m=5*o;if("end"===n.__position)f=[h[0]*m+u[0],h[1]*m+u[1]],p=h[0]>.8?"left":h[0]<-.8?"right":"center",g=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";else if("middle"===n.__position){var v=s/2,d=r.tangentAt(v),y=[d[1],-d[0]],x=r.pointAt(v);y[1]>0&&(y[0]=-y[0],y[1]=-y[1]),f=[x[0]+y[0]*m,x[1]+y[1]*m],p="center",g="bottom";var _=-Math.atan2(d[1],d[0]);u[0]<l[0]&&(_=Math.PI+_),n.attr("rotation",_)}else f=[-h[0]*m+l[0],-h[1]*m+l[1]],p=h[0]>.8?"right":h[0]<-.8?"left":"center",g=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";n.attr({style:{textVerticalAlign:n.__verticalAlign||g,textAlign:n.__textAlign||p},position:f,scale:[o,o]})}}}}function l(t,e,i){d.Group.call(this),this._createLine(t,e,i)}var u=i(24),c=i(5),h=i(190),d=i(3),f=i(1),p=i(4),g=["fromSymbol","toSymbol"],m=l.prototype;m.beforeUpdate=s,m._createLine=function(t,e,i){var r=t.hostModel,s=t.getItemLayout(e),l=a(s);l.shape.percent=0,d.initProps(l,{shape:{percent:1}},r,e),this.add(l);var u=new d.Text({name:"label"});this.add(u),f.each(g,function(i){var a=o(i,t,e);this.add(a),this[n(i)]=t.getItemVisual(e,i)},this),this._updateCommonStl(t,e,i)},m.updateData=function(t,e,i){var a=t.hostModel,s=this.childOfName("line"),l=t.getItemLayout(e),u={shape:{}};r(u.shape,l),d.updateProps(s,u,a,e),f.each(g,function(i){var a=t.getItemVisual(e,i),r=n(i);if(this[r]!==a){this.remove(this.childOfName(i));var s=o(i,t,e);this.add(s)}this[r]=a},this),this._updateCommonStl(t,e,i)},m._updateCommonStl=function(t,e,i){var n=t.hostModel,o=this.childOfName("line"),a=i&&i.lineStyle,r=i&&i.hoverLineStyle,s=i&&i.labelModel,l=i&&i.hoverLabelModel;if(!i||t.hasItemOption){var u=t.getItemModel(e);a=u.getModel("lineStyle.normal").getLineStyle(),r=u.getModel("lineStyle.emphasis").getLineStyle(),s=u.getModel("label.normal"),l=u.getModel("label.emphasis")}var c=t.getItemVisual(e,"color"),h=f.retrieve(t.getItemVisual(e,"opacity"),a.opacity,1);o.useStyle(f.defaults({strokeNoScale:!0,fill:"none",stroke:c,opacity:h},a)),o.hoverStyle=r,f.each(g,function(t){var e=this.childOfName(t);e&&(e.setColor(c),e.setStyle({opacity:h}))},this);var m,v,y=s.getShallow("show"),x=l.getShallow("show"),_=this.childOfName("label");if(y||x){var b=n.getRawValue(e);v=null==b?v=t.getName(e):isFinite(b)?p.round(b):b,m=c||"#000"}if(y){var w=s.getModel("textStyle");_.setStyle({text:f.retrieve(n.getFormattedLabel(e,"normal",t.dataType),v),textFont:w.getFont(),fill:w.getTextColor()||m}),_.__textAlign=w.get("align"),_.__verticalAlign=w.get("baseline"),_.__position=s.get("position")}else _.setStyle("text","");if(x){var S=l.getModel("textStyle");_.hoverStyle={text:f.retrieve(n.getFormattedLabel(e,"emphasis",t.dataType),v),textFont:S.getFont(),fill:S.getTextColor()||m}}else _.hoverStyle={text:""};_.ignore=!y&&!x,d.setHoverStyle(this)},m.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},m.setLinePoints=function(t){var e=this.childOfName("line");r(e.shape,t),e.dirty()},f.inherits(l,d.Group),t.exports=l},function(t,e,i){function n(t){return isNaN(t[0])||isNaN(t[1])}function o(t){return!n(t[0])&&!n(t[1])}function a(t){this._ctor=t||s,this.group=new r.Group}var r=i(3),s=i(105),l=a.prototype;l.updateData=function(t){var e=this._lineData,i=this.group,n=this._ctor,a=t.hostModel,r={lineStyle:a.getModel("lineStyle.normal").getLineStyle(),hoverLineStyle:a.getModel("lineStyle.emphasis").getLineStyle(),labelModel:a.getModel("label.normal"),hoverLabelModel:a.getModel("label.emphasis")};t.diff(e).add(function(e){if(o(t.getItemLayout(e))){var a=new n(t,e,r);t.setItemGraphicEl(e,a),i.add(a)}}).update(function(a,s){var l=e.getItemGraphicEl(s);return o(t.getItemLayout(a))?(l?l.updateData(t,a,r):l=new n(t,a,r),t.setItemGraphicEl(a,l),void i.add(l)):void i.remove(l)}).remove(function(t){i.remove(e.getItemGraphicEl(t))}).execute(),this._lineData=t},l.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,i){e.updateLayout(t,i)},this)},l.remove=function(){this.group.removeAll()},t.exports=a},function(t,e,i){var n=i(1),o=i(2),a=o.PRIORITY;i(108),i(109),o.registerVisual(n.curry(i(50),"line","circle","line")),o.registerLayout(n.curry(i(60),"line")),o.registerProcessor(a.PROCESSOR.STATISTIC,n.curry(i(147),"line")),i(32)},function(t,e,i){"use strict";var n=i(28),o=i(18);t.exports=o.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return n(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}})},function(t,e,i){"use strict";function n(t,e){if(t.length===e.length){for(var i=0;i<t.length;i++){var n=t[i],o=e[i];if(n[0]!==o[0]||n[1]!==o[1])return}return!0}}function o(t){return"number"==typeof t?t:t?.3:0}function a(t){var e=t.getGlobalExtent();if(t.onBand){var i=t.getBandWidth()/2-1,n=e[1]>e[0]?1:-1;e[0]+=n*i,e[1]-=n*i}return e}function r(t){return t>=0?1:-1}function s(t,e){var i=t.getBaseAxis(),n=t.getOtherAxis(i),o=i.onZero?0:n.scale.getExtent()[0],a=n.dim,s="x"===a||"radius"===a?1:0;return e.mapArray([a],function(n,l){for(var u,c=e.stackedOn;c&&r(c.get(a,l))===r(n);){u=c;break}var h=[];return h[s]=e.get(i.dim,l),h[1-s]=u?u.get(a,l,!0):o,t.dataToPoint(h)},!0)}function l(t,e,i){var n=a(t.getAxis("x")),o=a(t.getAxis("y")),r=t.getBaseAxis().isHorizontal(),s=Math.min(n[0],n[1]),l=Math.min(o[0],o[1]),u=Math.max(n[0],n[1])-s,c=Math.max(o[0],o[1])-l,h=i.get("lineStyle.normal.width")||2,d=i.get("clipOverflow")?h/2:Math.max(u,c);r?(l-=d,c+=2*d):(s-=d,u+=2*d);var f=new v.Rect({shape:{x:s,y:l,width:u,height:c}});return e&&(f.shape[r?"width":"height"]=0,v.initProps(f,{shape:{width:u,height:c}},i)),f}function u(t,e,i){var n=t.getAngleAxis(),o=t.getRadiusAxis(),a=o.getExtent(),r=n.getExtent(),s=Math.PI/180,l=new v.Sector({shape:{cx:t.cx,cy:t.cy,r0:a[0],r:a[1],startAngle:-r[0]*s,endAngle:-r[1]*s,clockwise:n.inverse}});return e&&(l.shape.endAngle=-r[0]*s,v.initProps(l,{shape:{endAngle:-r[1]*s}},i)),l}function c(t,e,i){return"polar"===t.type?u(t,e,i):l(t,e,i)}function h(t,e,i){for(var n=e.getBaseAxis(),o="x"===n.dim||"radius"===n.dim?0:1,a=[],r=0;r<t.length-1;r++){var s=t[r+1],l=t[r];a.push(l);var u=[];switch(i){case"end":u[o]=s[o],u[1-o]=l[1-o],a.push(u);break;case"middle":var c=(l[o]+s[o])/2,h=[];u[o]=h[o]=c,u[1-o]=l[1-o],h[1-o]=s[1-o],a.push(u),a.push(h);break;default:u[o]=l[o],u[1-o]=s[1-o],a.push(u)}}return t[r]&&a.push(t[r]),a}function d(t,e){var i=t.getVisual("visualMeta");if(i&&i.length&&t.count()){for(var n,o=i.length-1;o>=0;o--)if(i[o].dimension<2){n=i[o];break}if(n&&"cartesian2d"===e.type){var a=n.dimension,r=t.dimensions[a],s=e.getAxis(r),l=f.map(n.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),u=l.length,c=n.outerColors.slice();u&&l[0].coord>l[u-1].coord&&(l.reverse(),c.reverse());var h=10,d=l[0].coord-h,p=l[u-1].coord+h,g=p-d;if(g<.001)return"transparent";f.each(l,function(t){t.offset=(t.coord-d)/g}),l.push({offset:u?l[u-1].offset:.5,color:c[1]||"transparent"}),l.unshift({offset:u?l[0].offset:.5,color:c[0]||"transparent"});var m=new v.LinearGradient(0,0,0,0,l,(!0));return m[r]=d,m[r+"2"]=p,m}}}var f=i(1),p=i(44),g=i(54),m=i(110),v=i(3),y=i(6),x=i(91),_=i(30);t.exports=_.extend({type:"line",init:function(){var t=new v.Group,e=new p;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var a=t.coordinateSystem,r=this.group,l=t.getData(),u=t.getModel("lineStyle.normal"),p=t.getModel("areaStyle.normal"),g=l.mapArray(l.getItemLayout,!0),m="polar"===a.type,v=this._coordSys,y=this._symbolDraw,x=this._polyline,_=this._polygon,b=this._lineGroup,w=t.get("animation"),S=!p.isEmpty(),M=s(a,l),I=t.get("showSymbol"),T=I&&!m&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,a),A=this._data;A&&A.eachItemGraphicEl(function(t,e){t.__temp&&(r.remove(t),A.setItemGraphicEl(e,null))}),I||y.remove(),r.add(b);var C=!m&&t.get("step");x&&v.type===a.type&&C===this._step?(S&&!_?_=this._newPolygon(g,M,a,w):_&&!S&&(b.remove(_),_=this._polygon=null),b.setClipPath(c(a,!1,t)),I&&y.updateData(l,T),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),n(this._stackedOnPoints,M)&&n(this._points,g)||(w?this._updateAnimation(l,M,a,i,C):(C&&(g=h(g,a,C),M=h(M,a,C)),x.setShape({points:g}),_&&_.setShape({points:g,stackedOnPoints:M})))):(I&&y.updateData(l,T),C&&(g=h(g,a,C),M=h(M,a,C)),x=this._newPolyline(g,a,w),S&&(_=this._newPolygon(g,M,a,w)),b.setClipPath(c(a,!0,t)));var L=d(l,a)||l.getVisual("color");x.useStyle(f.defaults(u.getLineStyle(),{fill:"none",stroke:L,lineJoin:"bevel"}));var D=t.get("smooth");if(D=o(t.get("smooth")),x.setShape({smooth:D,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),_){var P=l.stackedOn,k=0;if(_.useStyle(f.defaults(p.getAreaStyle(),{fill:L,opacity:.7,lineJoin:"bevel"})),P){var O=P.hostModel;k=o(O.get("smooth"))}_.setShape({smooth:D,stackedOnSmooth:k,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=l,this._coordSys=a,this._stackedOnPoints=M,this._points=g,this._step=C},dispose:function(){},highlight:function(t,e,i,n){var o=t.getData(),a=y.queryDataIndex(o,n);if(!(a instanceof Array)&&null!=a&&a>=0){var r=o.getItemGraphicEl(a);if(!r){var s=o.getItemLayout(a);if(!s)return;r=new g(o,a),r.position=s,r.setZ(t.get("zlevel"),t.get("z")),r.ignore=isNaN(s[0])||isNaN(s[1]),r.__temp=!0,o.setItemGraphicEl(a,r),r.stopSymbolAnimation(!0),this.group.add(r)}r.highlight()}else _.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var o=t.getData(),a=y.queryDataIndex(o,n);if(null!=a&&a>=0){var r=o.getItemGraphicEl(a);r&&(r.__temp?(o.setItemGraphicEl(a,null),this.group.remove(r)):r.downplay())}else _.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new x.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new x.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i,i},_getSymbolIgnoreFunc:function(t,e){var i=e.getAxesByScale("ordinal")[0];if(i&&i.isLabelIgnored)return f.bind(i.isLabelIgnored,i)},_updateAnimation:function(t,e,i,n,o){var a=this._polyline,r=this._polygon,s=t.hostModel,l=m(this._data,t,this._stackedOnPoints,e,this._coordSys,i),u=l.current,c=l.stackedOnCurrent,d=l.next,f=l.stackedOnNext;o&&(u=h(l.current,i,o),c=h(l.stackedOnCurrent,i,o),d=h(l.next,i,o),f=h(l.stackedOnNext,i,o)),a.shape.__points=l.current,a.shape.points=u,v.updateProps(a,{shape:{points:d}},s),r&&(r.setShape({points:u,stackedOnPoints:c}),v.updateProps(r,{shape:{points:d,stackedOnPoints:f}},s));for(var p=[],g=l.status,y=0;y<g.length;y++){var x=g[y].cmd;if("="===x){var _=t.getItemGraphicEl(g[y].idx1);_&&p.push({el:_,ptIdx:y})}}a.animators&&a.animators.length&&a.animators[0].during(function(){for(var t=0;t<p.length;t++){var e=p[t].el;e.attr("position",a.shape.__points[p[t].ptIdx])}})},remove:function(t){var e=this.group,i=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),i&&i.eachItemGraphicEl(function(t,n){t.__temp&&(e.remove(t),i.setItemGraphicEl(n,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}})},function(t,e){function i(t){return t>=0?1:-1}function n(t,e,n){for(var o,a=t.getBaseAxis(),r=t.getOtherAxis(a),s=a.onZero?0:r.scale.getExtent()[0],l=r.dim,u="x"===l||"radius"===l?1:0,c=e.stackedOn,h=e.get(l,n);c&&i(c.get(l,n))===i(h);){o=c;break}var d=[];return d[u]=e.get(a.dim,n),d[1-u]=o?o.get(l,n,!0):s,t.dataToPoint(d)}function o(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+",idx:t})}).update(function(t,e){i.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){i.push({cmd:"-",idx:t})}).execute(),i}t.exports=function(t,e,i,a,r,s){for(var l=o(t,e),u=[],c=[],h=[],d=[],f=[],p=[],g=[],m=s.dimensions,v=0;v<l.length;v++){var y=l[v],x=!0;switch(y.cmd){case"=":var _=t.getItemLayout(y.idx),b=e.getItemLayout(y.idx1);(isNaN(_[0])||isNaN(_[1]))&&(_=b.slice()),u.push(_),c.push(b),h.push(i[y.idx]),d.push(a[y.idx1]),g.push(e.getRawIndex(y.idx1));break;case"+":var w=y.idx;u.push(r.dataToPoint([e.get(m[0],w,!0),e.get(m[1],w,!0)])),c.push(e.getItemLayout(w).slice()),h.push(n(r,e,w)),d.push(a[w]),g.push(e.getRawIndex(w));break;case"-":var w=y.idx,S=t.getRawIndex(w);S!==w?(u.push(t.getItemLayout(w)),c.push(s.dataToPoint([t.get(m[0],w,!0),t.get(m[1],w,!0)])),h.push(i[w]),d.push(n(s,t,w)),g.push(S)):x=!1}x&&(f.push(y),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});for(var M=[],I=[],T=[],A=[],C=[],v=0;v<p.length;v++){var w=p[v];M[v]=u[w],I[v]=c[w],T[v]=h[w],A[v]=d[w],C[v]=f[w]}return{current:M,next:I,stackedOnCurrent:T,stackedOnNext:A,status:C}}},function(t,e,i){var n=i(1),o=i(2);i(112),i(113),i(88)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),o.registerVisual(n.curry(i(83),"pie")),o.registerLayout(n.curry(i(115),"pie")),o.registerProcessor(n.curry(i(62),"pie"))},function(t,e,i){"use strict";var n=i(14),o=i(1),a=i(6),r=i(25),s=i(77),l=i(2).extendSeriesModel({type:"series.pie",init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(t.data),this._defaultLabelLine(t)},mergeOption:function(t){l.superCall(this,"mergeOption",t),this.updateSelectedMap(this.option.data)},getInitialData:function(t,e){var i=r(["value"],t.data),o=new n(i,this);return o.initData(t.data),o},getDataParams:function(t){var e=this.getData(),i=l.superCall(this,"getDataParams",t),n=e.getSum("value");return i.percent=n?+(e.get("value",t)/n*100).toFixed(2):0,i.$vars.push("percent"),i},_defaultLabelLine:function(t){a.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,stillShowZeroSum:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderWidth:1},emphasis:{}},animationType:"expansion",animationEasing:"cubicOut",data:[]}});o.mixin(l,s),t.exports=l},function(t,e,i){function n(t,e,i,n){var a=e.getData(),r=this.dataIndex,s=a.getName(r),l=e.get("selectedOffset");n.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),a.each(function(t){o(a.getItemGraphicEl(t),a.getItemLayout(t),e.isSelected(a.getName(t)),l,i)})}function o(t,e,i,n,o){var a=(e.startAngle+e.endAngle)/2,r=Math.cos(a),s=Math.sin(a),l=i?n:0,u=[r*l,s*l];o?t.animate().when(200,{position:u}).start("bounceOut"):t.attr("position",u)}function a(t,e){function i(){a.ignore=a.hoverIgnore,r.ignore=r.hoverIgnore}function n(){a.ignore=a.normalIgnore,r.ignore=r.normalIgnore}s.Group.call(this);var o=new s.Sector({z2:2}),a=new s.Polyline,r=new s.Text;this.add(o),this.add(a),this.add(r),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n);
-}function r(t,e,i,n,o){var a=n.getModel("textStyle"),r="inside"===o||"inner"===o;return{fill:a.getTextColor()||(r?"#fff":t.getItemVisual(e,"color")),opacity:t.getItemVisual(e,"opacity"),textFont:a.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var s=i(3),l=i(1),u=a.prototype;u.updateData=function(t,e,i){function n(){r.stopAnimation(!0),r.animateTo({shape:{r:h.r+10}},300,"elasticOut")}function a(){r.stopAnimation(!0),r.animateTo({shape:{r:h.r}},300,"elasticOut")}var r=this.childAt(0),u=t.hostModel,c=t.getItemModel(e),h=t.getItemLayout(e),d=l.extend({},h);if(d.label=null,i){r.setShape(d);var f=u.getShallow("animationType");"scale"===f?(r.shape.r=h.r0,s.initProps(r,{shape:{r:h.r}},u,e)):(r.shape.endAngle=h.startAngle,s.updateProps(r,{shape:{endAngle:h.endAngle}},u,e))}else s.updateProps(r,{shape:d},u,e);var p=c.getModel("itemStyle"),g=t.getItemVisual(e,"color");r.useStyle(l.defaults({lineJoin:"bevel",fill:g},p.getModel("normal").getItemStyle())),r.hoverStyle=p.getModel("emphasis").getItemStyle(),o(this,t.getItemLayout(e),c.get("selected"),u.get("selectedOffset"),u.get("animation")),r.off("mouseover").off("mouseout").off("emphasis").off("normal"),c.get("hoverAnimation")&&u.isAnimationEnabled()&&r.on("mouseover",n).on("mouseout",a).on("emphasis",n).on("normal",a),this._updateLabel(t,e),s.setHoverStyle(this)},u._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),o=t.hostModel,a=t.getItemModel(e),l=t.getItemLayout(e),u=l.label,c=t.getItemVisual(e,"color");s.updateProps(i,{shape:{points:u.linePoints||[[u.x,u.y],[u.x,u.y],[u.x,u.y]]}},o,e),s.updateProps(n,{style:{x:u.x,y:u.y}},o,e),n.attr({style:{textVerticalAlign:u.verticalAlign,textAlign:u.textAlign,textFont:u.font},rotation:u.rotation,origin:[u.x,u.y],z2:10});var h=a.getModel("label.normal"),d=a.getModel("label.emphasis"),f=a.getModel("labelLine.normal"),p=a.getModel("labelLine.emphasis"),g=h.get("position")||d.get("position");n.setStyle(r(t,e,"normal",h,g)),n.ignore=n.normalIgnore=!h.get("show"),n.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:c,opacity:t.getItemVisual(e,"opacity")}),i.setStyle(f.getModel("lineStyle").getLineStyle()),n.hoverStyle=r(t,e,"emphasis",d,g),i.hoverStyle=p.getModel("lineStyle").getLineStyle();var m=f.get("smooth");m&&m===!0&&(m=.4),i.setShape({smooth:m})},l.inherits(a,s.Group);var c=i(30).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,i,o){if(!o||o.from!==this.uid){var r=t.getData(),s=this._data,u=this.group,c=e.get("animation"),h=!s,d=t.get("animationType"),f=l.curry(n,this.uid,t,c,i),p=t.get("selectedMode");if(r.diff(s).add(function(t){var e=new a(r,t);h&&"scale"!==d&&e.eachChild(function(t){t.stopAnimation(!0)}),p&&e.on("click",f),r.setItemGraphicEl(t,e),u.add(e)}).update(function(t,e){var i=s.getItemGraphicEl(e);i.updateData(r,t),i.off("click"),p&&i.on("click",f),u.add(i),r.setItemGraphicEl(t,i)}).remove(function(t){var e=s.getItemGraphicEl(t);u.remove(e)}).execute(),c&&h&&r.count()>0&&"scale"!==d){var g=r.getItemLayout(0),m=Math.max(i.getWidth(),i.getHeight())/2,v=l.bind(u.removeClipPath,u);u.setClipPath(this._createClipPath(g.cx,g.cy,m,g.startAngle,g.clockwise,v,t))}this._data=r}},dispose:function(){},_createClipPath:function(t,e,i,n,o,a,r){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:i,startAngle:n,endAngle:n,clockwise:o}});return s.initProps(l,{shape:{endAngle:n+(o?1:-1)*Math.PI*2}},r,a),l},containPoint:function(t,e){var i=e.getData(),n=i.getItemLayout(0);if(n){var o=t[0]-n.cx,a=t[1]-n.cy,r=Math.sqrt(o*o+a*a);return r<=n.r&&r>=n.r0}}});t.exports=c},function(t,e,i){"use strict";function n(t,e,i,n,o,a,r){function s(e,i,n,o){for(var a=e;a<i;a++)if(t[a].y+=n,a>e&&a+1<i&&t[a+1].y>t[a].y+t[a].height)return void l(a,n/2);l(i-1,n/2)}function l(e,i){for(var n=e;n>=0&&(t[n].y-=i,!(n>0&&t[n].y>t[n-1].y+t[n-1].height));n--);}function u(t,e,i,n,o,a){for(var r=a>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var u=Math.abs(t[s].y-n),c=t[s].len,h=t[s].len2,d=u<o+c?Math.sqrt((o+c+h)*(o+c+h)-u*u):Math.abs(t[s].x-i);e&&d>=r&&(d=r-10),!e&&d<=r&&(d=r+10),t[s].x=i+d*a,r=d}}t.sort(function(t,e){return t.y-e.y});for(var c,h=0,d=t.length,f=[],p=[],g=0;g<d;g++)c=t[g].y-h,c<0&&s(g,d,-c,o),h=t[g].y+t[g].height;r-h<0&&l(d-1,h-r);for(var g=0;g<d;g++)t[g].y>=i?p.push(t[g]):f.push(t[g]);u(f,!1,e,i,n,o),u(p,!0,e,i,n,o)}function o(t,e,i,o,a,r){for(var s=[],l=[],u=0;u<t.length;u++)t[u].x<e?s.push(t[u]):l.push(t[u]);n(l,e,i,o,1,a,r),n(s,e,i,o,-1,a,r);for(var u=0;u<t.length;u++){var c=t[u].linePoints;if(c){var h=c[1][0]-c[2][0];t[u].x<e?c[2][0]=t[u].x+3:c[2][0]=t[u].x-3,c[1][1]=c[2][1]=t[u].y,c[1][0]=c[2][0]+h}}}var a=i(16);t.exports=function(t,e,i,n){var r,s,l=t.getData(),u=[],c=!1;l.each(function(i){var n,o,h,d,f=l.getItemLayout(i),p=l.getItemModel(i),g=p.getModel("label.normal"),m=g.get("position")||p.get("label.emphasis.position"),v=p.getModel("labelLine.normal"),y=v.get("length"),x=v.get("length2"),_=(f.startAngle+f.endAngle)/2,b=Math.cos(_),w=Math.sin(_);r=f.cx,s=f.cy;var S="inside"===m||"inner"===m;if("center"===m)n=f.cx,o=f.cy,d="center";else{var M=(S?(f.r+f.r0)/2*b:f.r*b)+r,I=(S?(f.r+f.r0)/2*w:f.r*w)+s;if(n=M+3*b,o=I+3*w,!S){var T=M+b*(y+e-f.r),A=I+w*(y+e-f.r),C=T+(b<0?-1:1)*x,L=A;n=C+(b<0?-5:5),o=L,h=[[M,I],[T,A],[C,L]]}d=S?"center":b>0?"left":"right"}var D=g.getModel("textStyle").getFont(),P=g.get("rotate")?b<0?-_+Math.PI:-_:0,k=t.getFormattedLabel(i,"normal")||l.getName(i),O=a.getBoundingRect(k,D,d,"top");c=!!P,f.label={x:n,y:o,position:m,height:O.height,len:y,len2:x,linePoints:h,textAlign:d,verticalAlign:"middle",font:D,rotation:P},S||u.push(f.label)}),!c&&t.get("avoidLabelOverlap")&&o(u,r,s,e,i,n)}},function(t,e,i){var n=i(4),o=n.parsePercent,a=i(114),r=i(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,i,u){e.eachSeriesByType(t,function(t){var e=t.get("center"),u=t.get("radius");r.isArray(u)||(u=[0,u]),r.isArray(e)||(e=[e,e]);var c=i.getWidth(),h=i.getHeight(),d=Math.min(c,h),f=o(e[0],c),p=o(e[1],h),g=o(u[0],d/2),m=o(u[1],d/2),v=t.getData(),y=-t.get("startAngle")*l,x=t.get("minAngle")*l,_=v.getSum("value"),b=Math.PI/(_||v.count())*2,w=t.get("clockwise"),S=t.get("roseType"),M=t.get("stillShowZeroSum"),I=v.getDataExtent("value");I[0]=0;var T=s,A=0,C=y,L=w?1:-1;if(v.each("value",function(t,e){var i;if(isNaN(t))return void v.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:w,cx:f,cy:p,r0:g,r:S?NaN:m});i="area"!==S?0===_&&M?b:t*b:s/(v.count()||1),i<x?(i=x,T-=x):A+=t;var o=C+L*i;v.setItemLayout(e,{angle:i,startAngle:C,endAngle:o,clockwise:w,cx:f,cy:p,r0:g,r:S?n.linearMap(t,I,[g,m]):m}),C=o},!0),T<s)if(T<=.001){var D=s/v.count();v.each(function(t){var e=v.getItemLayout(t);e.startAngle=y+L*t*D,e.endAngle=y+L*(t+1)*D})}else b=T/A,C=y,v.each("value",function(t,e){var i=v.getItemLayout(e),n=i.angle===x?x:t*b;i.startAngle=C,i.endAngle=C+L*n,C+=L*n});a(t,m,c,h)})}},function(t,e,i){"use strict";i(59),i(117)},function(t,e,i){var n=i(1),o=i(3),a=i(40),r=i(41),s=i(74),l=a.ifIgnoreOnTick,u=a.getInterval,c=["axisLine","axisLabel","axisTick","axisName"],h=["splitArea","splitLine"],d=r.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,i,r){this.group.removeAll();var l=this._axisGroup;if(this._axisGroup=new o.Group,this.group.add(this._axisGroup),t.get("show")){var u=t.getCoordSysModel(),f=s.layout(u,t),p=new a(t,f);n.each(c,p.add,p),this._axisGroup.add(p.getGroup()),n.each(h,function(e){t.get(e+".show")&&this["_"+e](t,u,f.labelInterval)},this),o.groupTransition(l,this._axisGroup,t),d.superCall(this,"render",t,e,i,r)}},_splitLine:function(t,e,i){var a=t.axis;if(!a.scale.isBlank()){var r=t.getModel("splitLine"),s=r.getModel("lineStyle"),c=s.get("color"),h=u(r,i);c=n.isArray(c)?c:[c];for(var d=e.coordinateSystem.getRect(),f=a.isHorizontal(),p=0,g=a.getTicksCoords(),m=a.scale.getTicks(),v=[],y=[],x=s.getLineStyle(),_=0;_<g.length;_++)if(!l(a,_,h)){var b=a.toGlobalCoord(g[_]);f?(v[0]=b,v[1]=d.y,y[0]=b,y[1]=d.y+d.height):(v[0]=d.x,v[1]=b,y[0]=d.x+d.width,y[1]=b);var w=p++%c.length;this._axisGroup.add(new o.Line(o.subPixelOptimizeLine({anid:"line_"+m[_],shape:{x1:v[0],y1:v[1],x2:y[0],y2:y[1]},style:n.defaults({stroke:c[w]},x),silent:!0})))}}},_splitArea:function(t,e,i){var a=t.axis;if(!a.scale.isBlank()){var r=t.getModel("splitArea"),s=r.getModel("areaStyle"),c=s.get("color"),h=e.coordinateSystem.getRect(),d=a.getTicksCoords(),f=a.scale.getTicks(),p=a.toGlobalCoord(d[0]),g=a.toGlobalCoord(d[0]),m=0,v=u(r,i),y=s.getAreaStyle();c=n.isArray(c)?c:[c];for(var x=1;x<d.length;x++)if(!l(a,x,v)){var _,b,w,S,M=a.toGlobalCoord(d[x]);a.isHorizontal()?(_=p,b=h.y,w=M-_,S=h.height):(_=h.x,b=g,w=h.width,S=M-b);var I=m++%c.length;this._axisGroup.add(new o.Rect({anid:"area_"+f[x],shape:{x:_,y:b,width:w,height:S},style:n.defaults({fill:c[I]},y),silent:!0})),p=_+w,g=b+S}}}});d.extend({type:"xAxis"}),d.extend({type:"yAxis"})},function(t,e,i){"use strict";function n(){}function o(t,e,i,n){a(f(i).lastProp,n)||(f(i).lastProp=n,e?d.updateProps(i,n,t):(i.stopAnimation(),i.attr(n)))}function a(t,e){if(c.isObject(t)&&c.isObject(e)){var i=!0;return c.each(e,function(e,n){i&=a(t[n],e)}),!!i}return t===e}function r(t,e){t[e.get("label.show")?"show":"hide"]()}function s(t){return{position:t.position.slice(),rotation:t.rotation||0}}function l(t,e){var i=t.get("icon"),n={x:-1,y:-1,width:2,height:2},o=c.extend({style:{strokeNoScale:!0},rectHover:!0,cursor:"move",draggable:!0},e);return 0===i.indexOf("image://")?(n.image=i.slice(8),o.style=n,new d.Image(o)):d.makePath(i.replace("path://",""),o,n,"center")}function u(t,e,i){var n=e.get("z"),o=e.get("zlevel");t&&t.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=o&&(t.zlevel=o),t.silent=i)})}var c=i(1),h=i(15),d=i(3),f=i(6).makeGetter(),p=i(45),g=i(21),m=i(37),v=c.clone,y=c.bind;n.prototype={_group:null,_lastGraphicKey:null,_handle:null,_dragging:!1,_lastValue:null,_lastStatus:null,_payloadInfo:null,animationThreshold:15,render:function(t,e,i,n){var a=e.get("value"),r=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=i,n||this._lastValue!==a||this._lastStatus!==r){this._lastValue=a,this._lastStatus=r;var s=this._group,l=this._handle;if(!r||"hide"===r)return s&&s.hide(),void(l&&l.hide());s&&s.show(),l&&l.show();var h={};this.makeElOption(h,a,t,e,i);var f=h.graphicKey;f!==this._lastGraphicKey&&this.clear(i),this._lastGraphicKey=f;var p=this._moveAnimation=this.determineAnimation(t,e);if(s){var g=c.curry(o,e,p);this.updatePointerEl(s,h,g,e),this.updateLabelEl(s,h,g,e)}else s=this._group=new d.Group,this.createPointerEl(s,h,t,e),this.createLabelEl(s,h,t,e),i.getZr().add(s);u(s,e,!0),this._renderHandle(a)}},remove:function(t){this.clear(t)},dispose:function(t){this.clear(t)},determineAnimation:function(t,e){var i=e.get("animation"),n=t.axis,o="category"===n.type,a=e.get("snap");if(!a&&!o)return!1;if("auto"===i||null==i){var r=this.animationThreshold;if(o&&n.getBandWidth()>r)return!0;if(a){var s=p.getAxisInfo(t).seriesDataCount,l=n.getExtent();return Math.abs(l[0]-l[1])/s>r}return!1}return i===!0},makeElOption:function(t,e,i,n,o){},createPointerEl:function(t,e,i,n){var o=e.pointer;if(o){var a=f(t).pointerEl=new d[o.type](v(e.pointer));t.add(a)}},createLabelEl:function(t,e,i,n){if(e.label){var o=f(t).labelEl=new d.Rect(v(e.label));t.add(o),r(o,n)}},updatePointerEl:function(t,e,i){var n=f(t).pointerEl;n&&(n.setStyle(e.pointer.style),i(n,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,i,n){var o=f(t).labelEl;o&&(o.setStyle(e.label.style),i(o,{shape:e.label.shape,position:e.label.position}),r(o,n))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e=this._axisPointerModel,i=this._api.getZr(),n=this._handle,o=e.getModel("handle"),a=e.get("status");if(!o.get("show")||!a||"hide"===a)return n&&i.remove(n),void(this._handle=null);var r;this._handle||(r=!0,n=this._handle=l(o,{onmousemove:function(t){g.stop(t.event)},onmousedown:y(this._onHandleDragMove,this,0,0),drift:y(this._onHandleDragMove,this),ondragend:y(this._onHandleDragEnd,this)}),i.add(n)),u(n,e,!1);var s=["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];n.setStyle(o.getItemStyle(null,s));var h=o.get("size");c.isArray(h)||(h=[h,h]),n.attr("scale",[h[0]/2,h[1]/2]),m.createOrUpdate(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,r)}},_moveHandleToValue:function(t,e){o(this._axisPointerModel,!e&&this._moveAnimation,this._handle,s(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var i=this._handle;if(i){this._dragging=!0;var n=this.updateHandleTransform(s(i),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=n,i.stopAnimation(),i.attr(s(n)),f(i).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){var t=this._handle;if(t){var e=this._payloadInfo,i={type:"updateAxisPointer",x:e.cursorPoint[0],y:e.cursorPoint[1],tooltipOption:e.tooltipOption,highDownKey:"axisPointerHandle"},n=this._axisModel.axis;i[n.dim+"AxisId"]=this._axisModel.id,this._api.dispatchAction(i)}},_onHandleDragEnd:function(t){this._dragging=!1;var e=this._handle;if(e){var i=this._axisPointerModel.get("value");this._moveHandleToValue(i),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),i=this._group,n=this._handle;e&&i&&(this._lastGraphicKey=null,i&&e.remove(i),n&&e.remove(n),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,i){return i=i||0,{x:t[i],y:t[1-i],width:e[i],height:e[1-i]}}},n.prototype.constructor=n,h.enableClassExtend(n),t.exports=n},function(t,e,i){"use strict";function n(t,e){var i={};return i[e.dim+"AxisIndex"]=e.index,t.getCartesian(i)}function o(t){return"x"===t.dim?0:1}var a=i(3),r=i(118),s=i(75),l=i(74),u=i(41),c=r.extend({makeElOption:function(t,e,i,o,a){var r=i.axis,u=r.grid,c=o.get("type"),d=n(u,r).getOtherAxis(r).getGlobalExtent(),f=r.toGlobalCoord(r.dataToCoord(e,!0));if(c&&"none"!==c){var p=s.buildElStyle(o),g=h[c](r,f,d,p);g.style=p,t.graphicKey=g.type,t.pointer=g}var m=l.layout(u.model,i);s.buildCartesianSingleLabelElOption(e,t,m,i,o,a)},getHandleTransform:function(t,e,i){var n=l.layout(e.axis.grid.model,e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:s.getTransformedPosition(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,o){var a=i.axis,r=a.grid,s=a.getGlobalExtent(!0),l=n(r,a).getOtherAxis(a).getGlobalExtent(),u="x"===a.dim?0:1,c=t.position;c[u]+=e[u],c[u]=Math.min(s[1],c[u]),c[u]=Math.max(s[0],c[u]);var h=(l[1]+l[0])/2,d=[h,h];d[u]=c[u];var f=[{verticalAlign:"middle"},{align:"center"}];return{position:c,rotation:t.rotation,cursorPoint:d,tooltipOption:f[u]}}}),h={line:function(t,e,i,n){var r=s.makeLineShape([e,i[0]],[e,i[1]],o(t));return a.subPixelOptimizeLine({shape:r,style:n}),{type:"Line",shape:r}},shadow:function(t,e,i,n){var a=t.getBandWidth(),r=i[1]-i[0];return{type:"Rect",shape:s.makeRectShape([e-a/2,i[0]],[a,r],o(t))}}};u.registerAxisPointerClass("CartesianAxisPointer",c),t.exports=c},function(t,e,i){var n=i(1),o=i(6);t.exports=function(t,e){var i,a=[],r=t.seriesIndex;if(null==r||!(i=e.getSeriesByIndex(r)))return{point:[]};var s=i.getData(),l=o.queryDataIndex(s,t);if(null==l||n.isArray(l))return{point:[]};var u=s.getItemGraphicEl(l),c=i.coordinateSystem;if(i.getTooltipPosition)a=i.getTooltipPosition(l)||[];else if(c&&c.dataToPoint)a=c.dataToPoint(s.getValues(n.map(c.dimensions,function(t){return i.coordDimToDataDim(t)[0]}),l,!0))||[];else if(u){var h=u.getBoundingRect().clone();h.applyTransform(u.transform),a=[h.x+h.width/2,h.y+h.height/2]}return{point:a,el:u}}},function(t,e,i){function n(t,e){function i(i,n){t.on(i,function(i){var a=s(e);h(c(t).records,function(t){t&&n(t,i,a.dispatchAction)}),o(a.pendings,e)})}c(t).initialized||(c(t).initialized=!0,i("click",u.curry(r,"click")),i("mousemove",u.curry(r,"mousemove")),i("globalout",a))}function o(t,e){var i,n=t.showTip.length,o=t.hideTip.length;n?i=t.showTip[n-1]:o&&(i=t.hideTip[o-1]),i&&(i.dispatchAction=null,e.dispatchAction(i))}function a(t,e,i){t.handler("leave",null,i)}function r(t,e,i,n){e.handler(t,i,n)}function s(t){var e={showTip:[],hideTip:[]},i=function(n){var o=e[n.type];o?o.push(n):(n.dispatchAction=i,t.dispatchAction(n))};return{dispatchAction:i,pendings:e}}var l=i(9),u=i(1),c=i(6).makeGetter(),h=u.each,d={};d.register=function(t,e,i){if(!l.node){var o=e.getZr();c(o).records||(c(o).records={}),n(o,e);var a=c(o).records[t]||(c(o).records[t]={});a.handler=i}},d.unregister=function(t,e){if(!l.node){var i=e.getZr(),n=(c(i).records||{})[t];n&&(c(i).records[t]=null)}},t.exports=d},function(t,e,i){var n=i(1),o=i(76),a=i(2);a.registerAction("dataZoom",function(t,e){var i=o.createLinkedNodesFinder(n.bind(e.eachComponent,e,"dataZoom"),o.eachAxisDim,function(t,e){return t.get(e.axisIndex)}),a=[];e.eachComponent({mainType:"dataZoom",query:t},function(t,e){a.push.apply(a,i(t).nodes)}),n.each(a,function(e,i){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})})},function(t,e,i){function n(t,e,i){i.getAxisProxy(t.name,e).reset(i)}function o(t,e,i){i.getAxisProxy(t.name,e).filterData(i)}var a=i(2);a.registerProcessor(function(t,e){t.eachComponent("dataZoom",function(t){t.eachTargetAxis(n),t.eachTargetAxis(o)}),t.eachComponent("dataZoom",function(t){var e=t.findRepresentativeAxisProxy(),i=e.getDataPercentWindow(),n=e.getDataValueWindow();t.setRawRange({start:i[0],end:i[1],startValue:n[0],endValue:n[1]},!0)})})},function(t,e,i){function n(t){var e=t[r];return e||(e=t[r]=[{}]),e}var o=i(1),a=o.each,r="\0_ec_hist_store",s={push:function(t,e){var i=n(t);a(e,function(e,n){for(var o=i.length-1;o>=0;o--){var a=i[o];if(a[n])break}if(o<0){var r=t.queryComponents({mainType:"dataZoom",subType:"select",id:n})[0];if(r){var s=r.getPercentRange();i[0][n]={dataZoomId:n,start:s[0],end:s[1]}}}}),i.push(e)},pop:function(t){var e=n(t),i=e[e.length-1];e.length>1&&e.pop();var o={};return a(i,function(t,i){for(var n=e.length-1;n>=0;n--){var t=e[n][i];if(t){o[i]=t;break}}}),o},clear:function(t){t[r]=null},count:function(t){return n(t).length}};t.exports=s},function(t,e,i){i(13).registerSubTypeDefaulter("dataZoom",function(t){return"slider"})},function(t,e,i){function n(t){V.call(this),this._zr=t,this.group=new G.Group,this._brushType,this._brushOption,this._panels,this._track=[],this._dragging,this._covers=[],this._creatingCover,this._creatingPanel,this._enableGlobalPan,this._uid="brushController_"+it++,this._handlers={},Z(nt,function(t,e){this._handlers[e]=B.bind(t,this)},this)}function o(t,e){var i=t._zr;t._enableGlobalPan||F.take(i,J,t._uid),Z(t._handlers,function(t,e){i.on(e,t)}),t._brushType=e.brushType,t._brushOption=B.merge(B.clone(et),e,!0)}function a(t){var e=t._zr;F.release(e,J,t._uid),Z(t._handlers,function(t,i){e.off(i,t)}),t._brushType=t._brushOption=null}function r(t,e){var i=ot[e.brushType].createCover(t,e);return i.__brushOption=e,u(i,e),t.group.add(i),i}function s(t,e){var i=h(e);return i.endCreating&&(i.endCreating(t,e),u(e,e.__brushOption)),e}function l(t,e){var i=e.__brushOption;h(e).updateCoverShape(t,e,i.range,i)}function u(t,e){var i=e.z;null==i&&(i=Y),t.traverse(function(t){t.z=i,t.z2=i})}function c(t,e){h(e).updateCommon(t,e),l(t,e)}function h(t){return ot[t.__brushOption.brushType]}function d(t,e,i){var n=t._panels;if(!n)return!0;var o,a=t._transform;return Z(n,function(t){t.isTargetByCursor(e,i,a)&&(o=t)}),o}function f(t,e){var i=t._panels;if(!i)return!0;var n=e.__brushOption.panelId;return null==n||i[n]}function p(t){var e=t._covers,i=e.length;return Z(e,function(e){t.group.remove(e)},t),e.length=0,!!i}function g(t,e){var i=q(t._covers,function(t){var e=t.__brushOption,i=B.clone(e.range);return{brushType:e.brushType,panelId:e.panelId,range:i}});t.trigger("brush",i,{isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function m(t){var e=t._track;if(!e.length)return!1;var i=e[e.length-1],n=e[0],o=i[0]-n[0],a=i[1]-n[1],r=X(o*o+a*a,.5);return r>$}function v(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function y(t,e,i,n){var o=new G.Group;return o.add(new G.Rect({name:"main",style:w(i),silent:!0,draggable:!0,cursor:"move",drift:W(t,e,o,"nswe"),ondragend:W(g,e,{isEnd:!0})})),Z(n,function(i){o.add(new G.Rect({name:i,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:W(t,e,o,i),ondragend:W(g,e,{isEnd:!0})}))}),o}function x(t,e,i,n){var o=n.brushStyle.lineWidth||0,a=U(o,K),r=i[0][0],s=i[1][0],l=r-o/2,u=s-o/2,c=i[0][1],h=i[1][1],d=c-a+o/2,f=h-a+o/2,p=c-r,g=h-s,m=p+o,v=g+o;b(t,e,"main",r,s,p,g),n.transformable&&(b(t,e,"w",l,u,a,v),b(t,e,"e",d,u,a,v),b(t,e,"n",l,u,m,a),b(t,e,"s",l,f,m,a),b(t,e,"nw",l,u,a,a),b(t,e,"ne",d,u,a,a),b(t,e,"sw",l,f,a,a),b(t,e,"se",d,f,a,a))}function _(t,e){var i=e.__brushOption,n=i.transformable,o=e.childAt(0);o.useStyle(w(i)),o.attr({silent:!n,cursor:n?"move":"default"}),Z(["w","e","n","s","se","sw","ne","nw"],function(i){var o=e.childOfName(i),a=I(t,i);o&&o.attr({silent:!n,invisible:!n,cursor:n?tt[a]+"-resize":null})})}function b(t,e,i,n,o,a,r){var s=e.childOfName(i);s&&s.setShape(D(L(t,e,[[n,o],[n+a,o+r]])))}function w(t){return B.defaults({strokeNoScale:!0},t.brushStyle)}function S(t,e,i,n){var o=[j(t,i),j(e,n)],a=[U(t,i),U(e,n)];return[[o[0],a[0]],[o[1],a[1]]]}function M(t){return G.getTransform(t.group)}function I(t,e){if(e.length>1){e=e.split("");var i=[I(t,e[0]),I(t,e[1])];return("e"===i[0]||"w"===i[0])&&i.reverse(),i.join("")}var n={w:"left",e:"right",n:"top",s:"bottom"},o={left:"w",right:"e",top:"n",bottom:"s"},i=G.transformDirection(n[e],M(t));return o[i]}function T(t,e,i,n,o,a,r,s){var l=n.__brushOption,u=t(l.range),h=C(i,a,r);Z(o.split(""),function(t){var e=Q[t];u[e[0]][e[1]]+=h[e[0]]}),l.range=e(S(u[0][0],u[1][0],u[0][1],u[1][1])),c(i,n),g(i,{isEnd:!1})}function A(t,e,i,n,o){var a=e.__brushOption.range,r=C(t,i,n);Z(a,function(t){t[0]+=r[0],t[1]+=r[1]}),c(t,e),g(t,{isEnd:!1})}function C(t,e,i){var n=t.group,o=n.transformCoordToLocal(e,i),a=n.transformCoordToLocal(0,0);return[o[0]-a[0],o[1]-a[1]]}function L(t,e,i){var n=f(t,e);return n&&n!==!0?n.clipPath(i,t._transform):B.clone(i)}function D(t){var e=j(t[0][0],t[1][0]),i=j(t[0][1],t[1][1]),n=U(t[0][0],t[1][0]),o=U(t[0][1],t[1][1]);return{x:e,y:i,width:n-e,height:o-i}}function P(t,e,i){if(t._brushType){var n=t._zr,o=t._covers,a=d(t,e,i);if(!t._dragging)for(var r=0;r<o.length;r++){var s=o[r].__brushOption;if(a&&(a===!0||s.panelId===a.panelId)&&ot[s.brushType].contain(o[r],i[0],i[1]))return}a&&n.setCursorStyle("crosshair")}}function k(t){var e=t.event;e.preventDefault&&e.preventDefault()}function O(t,e,i){return t.childOfName("main").contain(e,i)}function E(t,e,i,n){var o,a=t._creatingCover,u=t._creatingPanel,c=t._brushOption;if(t._track.push(i.slice()),m(t)||a){if(u&&!a){"single"===c.brushMode&&p(t);var h=B.clone(c);h.brushType=z(h.brushType,u),h.panelId=u===!0?null:u.panelId,a=t._creatingCover=r(t,h),t._covers.push(a)}if(a){var f=ot[z(t._brushType,u)],g=a.__brushOption;g.range=f.getCreatingRange(L(t,a,t._track)),n&&(s(t,a),f.updateCommon(t,a)),l(t,a),o={isEnd:n}}}else n&&"single"===c.brushMode&&c.removeOnClick&&d(t,e,i)&&p(t)&&(o={isEnd:n,removeOnClick:!0});return o}function z(t,e){return"auto"===t?e.defaultBrushType:t}function R(t){if(this._dragging){k(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY),i=E(this,t,e,!0);this._dragging=!1,this._track=[],this._creatingCover=null,i&&g(this,i)}}function N(t){return{createCover:function(e,i){return y(W(T,function(e){var i=[e,[0,100]];return t&&i.reverse(),i},function(e){return e[t]}),e,i,[["w","e"],["n","s"]][t])},getCreatingRange:function(e){var i=v(e),n=j(i[0][t],i[1][t]),o=U(i[0][t],i[1][t]);return[n,o]},updateCoverShape:function(e,i,n,o){var a,r=f(e,i);if(r!==!0&&r.getLinearBrushOtherExtent)a=r.getLinearBrushOtherExtent(t,e._transform);else{var s=e._zr;a=[0,[s.getWidth(),s.getHeight()][1-t]]}var l=[n,a];t&&l.reverse(),x(e,i,l,o)},updateCommon:_,contain:O}}var V=i(23),B=i(1),G=i(3),F=i(128),H=i(48),W=B.curry,Z=B.each,q=B.map,j=Math.min,U=Math.max,X=Math.pow,Y=1e4,$=6,K=6,J="globalPan",Q={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},tt={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},et={brushStyle:{lineWidth:2,stroke:"rgba(0,0,0,0.3)",fill:"rgba(0,0,0,0.1)"},transformable:!0,brushMode:"single",removeOnClick:!1},it=0;n.prototype={constructor:n,enableBrush:function(t){return this._brushType&&a(this),t.brushType&&o(this,t),this},setPanels:function(t){if(t&&t.length){var e=this._panels={};B.each(t,function(t){e[t.panelId]=B.clone(t)})}else this._panels=null;return this},mount:function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({position:t.position||[0,0],rotation:t.rotation||0,scale:t.scale||[1,1]}),this._transform=e.getLocalTransform(),this},eachCover:function(t,e){Z(this._covers,t,e)},updateCovers:function(t){function e(t,e){return(null!=t.id?t.id:a+e)+"-"+t.brushType}function i(t,i){return e(t.__brushOption,i)}function n(e,i){var n=t[e];if(null!=i&&l[i]===d)u[e]=l[i];else{var o=u[e]=null!=i?(l[i].__brushOption=n,l[i]):s(h,r(h,n));c(h,o)}}function o(t){l[t]!==d&&h.group.remove(l[t])}t=B.map(t,function(t){return B.merge(B.clone(et),t,!0)});var a="\0-brush-index-",l=this._covers,u=this._covers=[],h=this,d=this._creatingCover;return new H(l,t,i,e).add(n).update(n).remove(o).execute(),this},unmount:function(){return this.enableBrush(!1),p(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},B.mixin(n,V);var nt={mousedown:function(t){if(this._dragging)R.call(this,t);else if(!t.target||!t.target.draggable){k(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null;var i=this._creatingPanel=d(this,t,e);i&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);if(P(this,t,e),this._dragging){k(t);var i=E(this,t,e,!1);i&&g(this,i)}},mouseup:R},ot={lineX:N(0),lineY:N(1),rect:{createCover:function(t,e){return y(W(T,function(t){return t},function(t){return t}),t,e,["w","e","n","s","se","sw","ne","nw"])},getCreatingRange:function(t){var e=v(t);return S(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,i,n){x(t,e,i,n)},updateCommon:_,contain:O},polygon:{createCover:function(t,e){var i=new G.Group;return i.add(new G.Polyline({name:"main",style:w(e),silent:!0})),i},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new G.Polygon({name:"main",draggable:!0,drift:W(A,t,e),ondragend:W(g,t,{isEnd:!0})}))},updateCoverShape:function(t,e,i,n){e.childAt(0).setShape({points:L(t,e,i)})},updateCommon:_,contain:O}};t.exports=n},function(t,e){var i={},n={axisPointer:1,tooltip:1,brush:1};i.onIrrelevantElement=function(t,e,i){var o=e.getComponentByElement(t.topTarget),a=o&&o.coordinateSystem;return o&&o!==i&&!n[o.mainType]&&a&&a.model!==i},t.exports=i},function(t,e,i){function n(t){return t[o]||(t[o]={})}var o="\0_ec_interaction_mutex",a={take:function(t,e,i){var o=n(t);o[e]=i},release:function(t,e,i){var o=n(t),a=o[e];a===i&&(o[e]=null)},isTaken:function(t,e){return!!n(t)[e]}};i(2).registerAction({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),t.exports=a},function(t,e,i){function n(t,e,i){o.positionElement(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"))}var o=i(12),a=i(7),r=i(3);t.exports={layout:function(t,e,i){var a=o.getLayoutRect(e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"));o.box(e.get("orient"),t,e.get("itemGap"),a.width,a.height),n(t,e,i)},addBackground:function(t,e){var i=a.normalizeCssArray(e.get("padding")),n=t.getBoundingRect(),o=e.getItemStyle(["color","opacity"]);o.fill=e.get("backgroundColor");var s=new r.Rect({shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[1]+i[3],height:n.height+i[0]+i[2]},style:o,silent:!0,z2:-1});r.subPixelOptimizeRect(s),t.add(s)}}},function(t,e,i){var n=i(1),o=i(33),a=i(134),r=function(t,e,i,n,a){o.call(this,t,e,i),this.type=n||"value",this.position=a||"bottom"};r.prototype={constructor:r,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},getLabelInterval:function(){var t=this._labelInterval;return t||(t=this._labelInterval=a(this)),t},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},n.inherits(r,o),t.exports=r},function(t,e,i){"use strict";function n(t){return this._axes[t]}var o=i(1),a=function(t){this._axes={},this._dimList=[],this.name=t||""};a.prototype={constructor:a,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return o.map(this._dimList,n,this)},getAxesByScale:function(t){return t=t.toLowerCase(),o.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var i=this._dimList,n=t instanceof Array?[]:{},o=0;o<i.length;o++){var a=i[o],r=this._axes[a];n[a]=r[e](t[a])}return n}},t.exports=a},function(t,e,i){"use strict";function n(t){a.call(this,t)}var o=i(1),a=i(131);n.prototype={constructor:n,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),i=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&i.contain(i.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoints:function(t,e){return t.mapArray(["x","y"],function(t,e){return this.dataToPoint([t,e])},e,this)},dataToPoint:function(t,e){var i=this.getAxis("x"),n=this.getAxis("y");return[i.toGlobalCoord(i.dataToCoord(t[0],e)),n.toGlobalCoord(n.dataToCoord(t[1],e))]},pointToData:function(t,e){var i=this.getAxis("x"),n=this.getAxis("y");return[i.coordToData(i.toLocalCoord(t[0]),e),n.coordToData(n.toLocalCoord(t[1]),e)]},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},o.inherits(n,a),t.exports=n},function(t,e,i){"use strict";i(59);var n=i(13);t.exports=n.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}})},function(t,e,i){"use strict";var n=i(1),o=i(17);t.exports=function(t){var e=t.model,i=e.getModel("axisLabel"),a=i.get("interval");return"category"!==t.type||"auto"!==a?"auto"===a?0:a:o.getAxisLabelInterval(n.map(t.scale.getTicks(),t.dataToCoord,t),e.getFormattedLabels(),i.getModel("textStyle").getFont(),t.isHorizontal())}},function(t,e,i){var n=i(28),o=i(24),a=i(17),r=i(42),s=i(10),l=i(1);t.exports={createList:function(t){var e=t.get("data");return n(e,t,t.ecModel)},completeDimensions:i(25),createSymbol:o.createSymbol,createScale:function(t,e){var i=e;e instanceof s||(i=new s(e),l.mixin(i,r));var n=a.createScaleByModel(i);return n.setExtent(t[0],t[1]),a.niceScaleExtent(n,i),n},mixinAxisModelCommonMethods:function(t){l.mixin(t,r)}}},function(t,e,i){var n=i(3),o=i(1),a=Math.PI;t.exports=function(t,e){
-e=e||{},o.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var i=new n.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),r=new n.Arc({shape:{startAngle:-a/2,endAngle:-a/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new n.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});r.animateShape(!0).when(1e3,{endAngle:3*a/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*a/2}).delay(300).start("circularInOut");var l=new n.Group;return l.add(r),l.add(s),l.add(i),l.resize=function(){var e=t.getWidth()/2,n=t.getHeight()/2;r.setShape({cx:e,cy:n});var o=r.shape.r;s.setShape({x:e-o,y:n-o,width:2*o,height:2*o}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,i){function n(t,e){c.each(e,function(e,i){x.hasClass(i)||("object"==typeof e?t[i]=t[i]?c.merge(t[i],e,!1):c.clone(e):null==t[i]&&(t[i]=e))})}function o(t){t=t,this.option={},this.option[b]=1,this._componentsMap={series:[]},this._seriesIndices=null,n(t,this._theme.option),c.merge(t,_,!1),this.mergeOption(t)}function a(t,e){c.isArray(e)||(e=e?[e]:[]);var i={};return f(e,function(e){i[e]=(t[e]||[]).slice()}),i}function r(t,e,i){var n=e.type?e.type:i?i.subType:x.determineSubType(t,e);return n}function s(t){return g(t,function(t){return t.componentIndex})||[]}function l(t,e){return e.hasOwnProperty("subType")?p(t,function(t){return t.subType===e.subType}):t}function u(t){}var c=i(1),h=i(6),d=i(10),f=c.each,p=c.filter,g=c.map,m=c.isArray,v=c.indexOf,y=c.isObject,x=i(13),_=i(139),b="\0_ec_inner",w=d.extend({constructor:w,init:function(t,e,i,n){i=i||{},this.option=null,this._theme=new d(i),this._optionManager=n},setOption:function(t,e,i){c.assert(!(b in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null,i)},resetOption:function(t,e){var i=!1,n=this._optionManager;if(!t||"recreate"===t){var a=n.mountOption("recreate"===t);this.option&&"recreate"!==t?(!e&&this.restoreData(),this.mergeOption(a)):o.call(this,a),i=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var r=n.getTimelineOption(this);r&&(this.mergeOption(r),i=!0)}if(!t||"recreate"===t||"media"===t){var s=n.getMediaOption(this,this._api);s.length&&f(s,function(t){this.mergeOption(t,i=!0)},this)}return i},mergeOption:function(t){function e(e,o){var l=h.normalizeToArray(t[e]),u=h.mappingToExists(n[e],l);h.makeIdAndName(u),f(u,function(t,i){var n=t.option;y(n)&&(t.keyInfo.mainType=e,t.keyInfo.subType=r(e,n,t.exist))});var d=a(n,o);i[e]=[],n[e]=[],f(u,function(t,o){var a=t.exist,r=t.option;if(c.assert(y(r)||a,"Empty component definition"),r){var s=x.getClass(e,t.keyInfo.subType,!0);if(a&&a instanceof s)a.name=t.keyInfo.name,a.mergeOption(r,this),a.optionUpdated(r,!1);else{var l=c.extend({dependentModels:d,componentIndex:o},t.keyInfo);a=new s(r,this,this,l),c.extend(a,l),a.init(r,this,this,l),a.optionUpdated(null,!0)}}else a.mergeOption({},this),a.optionUpdated({},!1);n[e][o]=a,i[e][o]=a.option},this),"series"===e&&(this._seriesIndices=s(n.series))}var i=this.option,n=this._componentsMap,o=[];f(t,function(t,e){null!=t&&(x.hasClass(e)?o.push(e):i[e]=null==i[e]?c.clone(t):c.merge(i[e],t,!0))}),x.topologicalTravel(o,x.getAllClassMainTypes(),e,this),this._seriesIndices=this._seriesIndices||[]},getOption:function(){var t=c.clone(this.option);return f(t,function(e,i){if(x.hasClass(i)){for(var e=h.normalizeToArray(e),n=e.length-1;n>=0;n--)h.isIdInner(e[n])&&e.splice(n,1);t[i]=e}}),delete t[b],t},getTheme:function(){return this._theme},getComponent:function(t,e){var i=this._componentsMap[t];if(i)return i[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var i=t.index,n=t.id,o=t.name,a=this._componentsMap[e];if(!a||!a.length)return[];var r;if(null!=i)m(i)||(i=[i]),r=p(g(i,function(t){return a[t]}),function(t){return!!t});else if(null!=n){var s=m(n);r=p(a,function(t){return s&&v(n,t.id)>=0||!s&&t.id===n})}else if(null!=o){var u=m(o);r=p(a,function(t){return u&&v(o,t.name)>=0||!u&&t.name===o})}else r=a.slice();return l(r,t)},findComponents:function(t){function e(t){var e=o+"Index",i=o+"Id",n=o+"Name";return!t||null==t[e]&&null==t[i]&&null==t[n]?null:{mainType:o,index:t[e],id:t[i],name:t[n]}}function i(e){return t.filter?p(e,t.filter):e}var n=t.query,o=t.mainType,a=e(n),r=a?this.queryComponents(a):this._componentsMap[o];return i(l(r,t))},eachComponent:function(t,e,i){var n=this._componentsMap;if("function"==typeof t)i=e,e=t,f(n,function(t,n){f(t,function(t,o){e.call(i,n,t,o)})});else if(c.isString(t))f(n[t],e,i);else if(y(t)){var o=this.findComponents(t);f(o,e,i)}},getSeriesByName:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.series[t]},getSeriesByType:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.series.slice()},eachSeries:function(t,e){u(this),f(this._seriesIndices,function(i){var n=this._componentsMap.series[i];t.call(e,n,i)},this)},eachRawSeries:function(t,e){f(this._componentsMap.series,t,e)},eachSeriesByType:function(t,e,i){u(this),f(this._seriesIndices,function(n){var o=this._componentsMap.series[n];o.subType===t&&e.call(i,o,n)},this)},eachRawSeriesByType:function(t,e,i){return f(this.getSeriesByType(t),e,i)},isSeriesFiltered:function(t){return u(this),c.indexOf(this._seriesIndices,t.componentIndex)<0},filterSeries:function(t,e){u(this);var i=p(this._componentsMap.series,t,e);this._seriesIndices=s(i)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=s(t.series);var e=[];f(t,function(t,i){e.push(i)}),x.topologicalTravel(e,x.getAllClassMainTypes(),function(e,i){f(t[e],function(t){t.restoreData()})})}});c.mixin(w,i(61)),t.exports=w},function(t,e,i){function n(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function o(t,e,i){var n,o,a=[],r=[],s=t.timeline;if(t.baseOption&&(o=t.baseOption),(s||t.options)&&(o=o||{},a=(t.options||[]).slice()),t.media){o=o||{};var l=t.media;d(l,function(t){t&&t.option&&(t.query?r.push(t):n||(n=t))})}return o||(o=t),o.timeline||(o.timeline=s),d([o].concat(a).concat(u.map(r,function(t){return t.option})),function(t){d(e,function(e){e(t,i)})}),{baseOption:o,timelineOptions:a,mediaDefault:n,mediaList:r}}function a(t,e,i){var n={width:e,height:i,aspectratio:e/i},o=!0;return u.each(t,function(t,e){var i=e.match(m);if(i&&i[1]&&i[2]){var a=i[1],s=i[2].toLowerCase();r(n[s],t,a)||(o=!1)}}),o}function r(t,e,i){return"min"===i?t>=e:"max"===i?t<=e:t===e}function s(t,e){return t.join(",")===e.join(",")}function l(t,e){e=e||{},d(e,function(e,i){if(null!=e){var n=t[i];if(h.hasClass(i)){e=c.normalizeToArray(e),n=c.normalizeToArray(n);var o=c.mappingToExists(n,e);t[i]=p(o,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[i]=g(n,e,!0)}})}var u=i(1),c=i(6),h=i(13),d=u.each,f=u.clone,p=u.map,g=u.merge,m=/^(min|max)?(.+)$/;n.prototype={constructor:n,setOption:function(t,e){t=f(t,!0);var i=this._optionBackup,n=o.call(this,t,e,!i);this._newBaseOption=n.baseOption,i?(l(i.baseOption,n.baseOption),n.timelineOptions.length&&(i.timelineOptions=n.timelineOptions),n.mediaList.length&&(i.mediaList=n.mediaList),n.mediaDefault&&(i.mediaDefault=n.mediaDefault)):this._optionBackup=n},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=p(e.timelineOptions,f),this._mediaList=p(e.mediaList,f),this._mediaDefault=f(e.mediaDefault),this._currentMediaIndices=[],f(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,i=this._timelineOptions;if(i.length){var n=t.getComponent("timeline");n&&(e=f(i[n.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),i=this._api.getHeight(),n=this._mediaList,o=this._mediaDefault,r=[],l=[];if(!n.length&&!o)return l;for(var u=0,c=n.length;u<c;u++)a(n[u].query,e,i)&&r.push(u);return!r.length&&o&&(r=[-1]),r.length&&!s(r,this._currentMediaIndices)&&(l=p(r,function(t){return f(t===-1?o.option:n[t].option)})),this._currentMediaIndices=r,l}},t.exports=n},function(t,e){var i="";"undefined"!=typeof navigator&&(i=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],textStyle:{fontFamily:i.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1}},function(t,e,i){t.exports={getAreaStyle:i(31)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,i){var n=i(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]);t.exports={getItemStyle:function(t,e){var i=n.call(this,t,e),o=this.getBorderLineDash();return o&&(i.lineDash=o),i},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,i){var n=i(31)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=n.call(this,t),i=this.getLineDash(e.lineWidth);return i&&(e.lineDash=i),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),i=Math.max(t,2),n=4*t;return"solid"===e||null==e?null:"dashed"===e?[n,n]:[i,i]}}},function(t,e,i){function n(t,e){return t&&t.getShallow(e)}var o=i(16);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){var t=this.ecModel,e=t&&t.getModel("textStyle");return[this.getShallow("fontStyle")||n(e,"fontStyle"),this.getShallow("fontWeight")||n(e,"fontWeight"),(this.getShallow("fontSize")||n(e,"fontSize")||12)+"px",this.getShallow("fontFamily")||n(e,"fontFamily")||"sans-serif"].join(" ")},getTextRect:function(t){return o.getBoundingRect(t,this.getFont(),this.getShallow("align"),this.getShallow("baseline"))},truncateText:function(t,e,i,n){return o.truncateText(t,e,this.getFont(),i,n)}}},function(t,e,i){function n(t,e){e=e.split(",");for(var i=t,n=0;n<e.length&&(i=i&&i[e[n]],null!=i);n++);return i}function o(t,e,i,n){e=e.split(",");for(var o,a=t,r=0;r<e.length-1;r++)o=e[r],null==a[o]&&(a[o]={}),a=a[o];(n||null==a[e[r]])&&(a[e[r]]=i)}function a(t){h(l,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}var r=i(1),s=i(146),l=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],u=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],c=["bar","boxplot","candlestick","chord","effectScatter","funnel","gauge","lines","graph","heatmap","line","map","parallel","pie","radar","sankey","scatter","treemap"],h=r.each;t.exports=function(t){h(t.series,function(t){if(r.isObject(t)){var e=t.type;if(s(t),"pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var i=n(t,"pointer.color");null!=i&&o(t,"itemStyle.normal.color",i)}for(var l=0;l<c.length;l++)if(c[l]===t.type){a(t);break}}}),t.dataRange&&(t.visualMap=t.dataRange),h(u,function(e){var i=t[e];i&&(r.isArray(i)||(i=[i]),h(i,function(t){a(t)}))})}},function(t,e,i){function n(t){var e=t&&t.itemStyle;e&&o.each(a,function(i){var n=e.normal,a=e.emphasis;n&&n[i]&&(t[i]=t[i]||{},t[i].normal?o.merge(t[i].normal,n[i]):t[i].normal=n[i],n[i]=null),a&&a[i]&&(t[i]=t[i]||{},t[i].emphasis?o.merge(t[i].emphasis,a[i]):t[i].emphasis=a[i],a[i]=null)})}var o=i(1),a=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];t.exports=function(t){if(t){n(t),n(t.markPoint),n(t.markLine);var e=t.data;if(e){for(var i=0;i<e.length;i++)n(e[i]);var a=t.markPoint;if(a&&a.data)for(var r=a.data,i=0;i<r.length;i++)n(r[i]);var s=t.markLine;if(s&&s.data)for(var l=s.data,i=0;i<l.length;i++)o.isArray(l[i])?(n(l[i][0]),n(l[i][1])):n(l[i])}}}},function(t,e){var i={average:function(t){for(var e=0,i=0,n=0;n<t.length;n++)isNaN(t[n])||(e+=t[n],i++);return 0===i?NaN:e/i},sum:function(t){for(var e=0,i=0;i<t.length;i++)e+=t[i]||0;return e},max:function(t){for(var e=-(1/0),i=0;i<t.length;i++)t[i]>e&&(e=t[i]);return e},min:function(t){for(var e=1/0,i=0;i<t.length;i++)t[i]<e&&(e=t[i]);return e},nearest:function(t){return t[0]}},n=function(t,e){return Math.round(t.length/2)};t.exports=function(t,e,o){e.eachSeriesByType(t,function(t){var e=t.getData(),o=t.get("sampling"),a=t.coordinateSystem;if("cartesian2d"===a.type&&o){var r=a.getBaseAxis(),s=a.getOtherAxis(r),l=r.getExtent(),u=l[1]-l[0],c=Math.round(e.count()/u);if(c>1){var h;"string"==typeof o?h=i[o]:"function"==typeof o&&(h=o),h&&(e=e.downSample(s.dim,1/c,h,n),t.setData(e))}}},this)}},function(t,e,i){function n(t,e){return h(t,c(e))}var o=i(1),a=i(34),r=i(4),s=i(43),l=a.prototype,u=s.prototype,c=r.getPrecisionSafe,h=r.round,d=Math.floor,f=Math.ceil,p=Math.pow,g=Math.log,m=a.extend({type:"log",base:10,$constructor:function(){a.apply(this,arguments),this._originalScale=new s},getTicks:function(){var t=this._originalScale,e=this._extent,i=t.getExtent();return o.map(u.getTicks.call(this),function(o){var a=r.round(p(this.base,o));return a=o===e[0]&&t.__fixMin?n(a,i[0]):a,a=o===e[1]&&t.__fixMax?n(a,i[1]):a},this)},getLabel:u.getLabel,scale:function(t){return t=l.scale.call(this,t),p(this.base,t)},setExtent:function(t,e){var i=this.base;t=g(t)/g(i),e=g(e)/g(i),u.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=l.getExtent.call(this);e[0]=p(t,e[0]),e[1]=p(t,e[1]);var i=this._originalScale,o=i.getExtent();return i.__fixMin&&(e[0]=n(e[0],o[0])),i.__fixMax&&(e[1]=n(e[1],o[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=g(t[0])/g(e),t[1]=g(t[1])/g(e),l.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0];if(!(i===1/0||i<=0)){var n=r.quantity(i),o=t/i*n;for(o<=.5&&(n*=10);!isNaN(n)&&Math.abs(n)<1&&Math.abs(n)>0;)n*=10;var a=[r.round(f(e[0]/n)*n),r.round(d(e[1]/n)*n)];this._interval=n,this._niceExtent=a}},niceExtent:function(t,e,i){u.niceExtent.call(this,t,e,i);var n=this._originalScale;n.__fixMin=e,n.__fixMax=i}});o.each(["contain","normalize"],function(t){m.prototype[t]=function(e){return e=g(e)/g(this.base),l[t].call(this,e)}}),m.create=function(){return new m},t.exports=m},function(t,e,i){var n=i(1),o=i(34),a=o.prototype,r=o.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?n.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),a.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return a.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(a.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!1))},niceTicks:n.noop,niceExtent:n.noop});r.create=function(){return new r},t.exports=r},function(t,e,i){var n=i(1),o=i(4),a=i(7),r=i(63),s=i(43),l=s.prototype,u=Math.ceil,c=Math.floor,h=1e3,d=60*h,f=60*d,p=24*f,g=function(t,e,i,n){for(;i<n;){var o=i+n>>>1;t[o][2]<e?i=o+1:n=o}return i},m=s.extend({type:"time",getLabel:function(t){var e=this._stepLvl,i=new Date(t);return a.formatTime(e[0],i,this.getSetting("useUTC"))},niceExtent:function(t,e,i){var n=this._extent;if(n[0]===n[1]&&(n[0]-=p,n[1]+=p),n[1]===-(1/0)&&n[0]===1/0){var a=new Date;n[1]=new Date(a.getFullYear(),a.getMonth(),a.getDate()),n[0]=n[1]-p}this.niceTicks(t);var r=this._interval;e||(n[0]=o.round(c(n[0]/r)*r)),i||(n[1]=o.round(u(n[1]/r)*r))},niceTicks:function(t){var e=this.getSetting("useUTC")?0:60*o.getTimezoneOffset()*1e3;t=t||10;var i=this._extent,n=i[1]-i[0],a=n/t,s=v.length,l=g(v,a,0,s),h=v[Math.min(l,s-1)],d=h[2];if("year"===h[0]){var f=n/d,p=o.nice(f/t,!0);d*=p}var m=[Math.round(u((i[0]-e)/d)*d+e),Math.round(c((i[1]-e)/d)*d+e)];r.fixExtent(m,i),this._stepLvl=h,this._interval=d,this._niceExtent=m},parse:function(t){return+o.parseDate(t)}});n.each(["contain","normalize"],function(t){m.prototype[t]=function(e){return l[t].call(this,this.parse(e))}});var v=[["hh:mm:ss",1,h],["hh:mm:ss",5,5*h],["hh:mm:ss",10,10*h],["hh:mm:ss",15,15*h],["hh:mm:ss",30,30*h],["hh:mm\nMM-dd",1,d],["hh:mm\nMM-dd",5,5*d],["hh:mm\nMM-dd",10,10*d],["hh:mm\nMM-dd",15,15*d],["hh:mm\nMM-dd",30,30*d],["hh:mm\nMM-dd",1,f],["hh:mm\nMM-dd",2,2*f],["hh:mm\nMM-dd",6,6*f],["hh:mm\nMM-dd",12,12*f],["MM-dd\nyyyy",1,p],["week",7,7*p],["month",1,31*p],["quarter",3,380*p/4],["half-year",6,380*p/2],["year",1,380*p]];m.create=function(t){return new m({useUTC:t.ecModel.get("useUTC")})},t.exports=m},function(t,e,i){var n=i(39);t.exports=function(t){function e(e){var i=(e.visualColorAccessPath||"itemStyle.normal.color").split("."),o=e.getData(),a=e.get(i)||e.getColorFromPalette(e.get("name"));o.setVisual("color",a),t.isSeriesFiltered(e)||("function"!=typeof a||a instanceof n||o.each(function(t){o.setItemVisual(t,"color",a(e.getDataParams(t)))}),o.each(function(t){var e=o.getItemModel(t),n=e.get(i,!0);null!=n&&o.setItemVisual(t,"color",n)}))}t.eachRawSeries(e)}},function(t,e,i){"use strict";function n(t,e,i){return{type:t,event:i,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:i.zrX,offsetY:i.zrY,gestureEvent:i.gestureEvent,pinchX:i.pinchX,pinchY:i.pinchY,pinchScale:i.pinchScale,wheelDelta:i.zrDelta,zrByTouch:i.zrByTouch}}function o(){}function a(t,e,i){if(t[t.rectHover?"rectContain":"contain"](e,i)){for(var n,o=t;o;){if(o.clipPath&&!o.clipPath.contain(e,i))return!1;o.silent&&(n=!0),o=o.parent}return!n||u}return!1}var r=i(1),s=i(179),l=i(23),u="silent";o.prototype.dispose=function(){};var c=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],h=function(t,e,i,n){l.call(this),this.storage=t,this.painter=e,this.painterRoot=n,i=i||new o,this.proxy=i,i.handler=this,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,s.call(this),r.each(c,function(t){i.on&&i.on(t,this[t],this)},this)};h.prototype={constructor:h,mousemove:function(t){var e=t.zrX,i=t.zrY,n=this._hovered,o=this._hovered=this.findHover(e,i),a=o.target,r=n.target,s=this.proxy;s.setCursor&&s.setCursor(a?a.cursor:"default"),r&&a!==r&&r.__zr&&this.dispatchToElement(n,"mouseout",t),this.dispatchToElement(o,"mousemove",t),a&&a!==r&&this.dispatchToElement(o,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,i=t.toElement||t.relatedTarget;do i=i&&i.parentNode;while(i&&9!=i.nodeType&&!(e=i===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var i=this[t];i&&i.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,i){t=t||{};for(var o="on"+e,a=n(e,t,i),r=t.target;r&&(r[o]&&(a.cancelBubble=r[o].call(r,a)),r.trigger(e,a),r=r.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[o]&&t[o].call(t,a),t.trigger&&t.trigger(e,a)}))},findHover:function(t,e,i){for(var n=this.storage.getDisplayList(),o={},r=n.length-1;r>=0;r--){var s;if(n[r]!==i&&!n[r].ignore&&(s=a(n[r],t,e))&&(!o.topTarget&&(o.topTarget=n[r]),s!==u)){o.target=n[r];break}}return o}},r.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){h.prototype[t]=function(e){var i=this.findHover(e.zrX,e.zrY),n=i.target;if("mousedown"===t)this._downel=n,this._upel=n;else if("mosueup"===t)this._upel=n;else if("click"===t&&this._downel!==this._upel)return;this.dispatchToElement(i,t,e)}}),r.mixin(h,l),r.mixin(h,s),t.exports=h},function(t,e,i){function n(){return!1}function o(t,e,i,n){var o=document.createElement(e),a=i.getWidth(),r=i.getHeight(),s=o.style;return s.position="absolute",s.left=0,s.top=0,s.width=a+"px",s.height=r+"px",o.width=a*n,o.height=r*n,o.setAttribute("data-zr-dom-id",t),o}var a=i(1),r=i(35),s=i(72),l=i(71),u=function(t,e,i){var s;i=i||r.devicePixelRatio,"string"==typeof t?s=o(t,"canvas",e,i):a.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=n,l["-webkit-user-select"]="none",l["user-select"]="none",l["-webkit-touch-callout"]="none",l["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",l.padding=0,l.margin=0,l["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=i};u.prototype={constructor:u,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=o("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var i=this.dpr,n=this.dom,o=n.style,a=this.domBack;o.width=t+"px",o.height=e+"px",n.width=t*i,n.height=e*i,a&&(a.width=t*i,a.height=e*i,1!=i&&this.ctxBack.scale(i,i))},clear:function(t){var e=this.dom,i=this.ctx,n=e.width,o=e.height,a=this.clearColor,r=this.motionBlur&&!t,u=this.lastFrameAlpha,c=this.dpr;if(r&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,n/c,o/c)),i.clearRect(0,0,n,o),a){var h;a.colorStops?(h=a.__canvasGradient||s.getGradient(i,a,{x:0,y:0,width:n,height:o}),a.__canvasGradient=h):a.image&&(h=l.prototype.getCanvasPattern.call(a,i)),i.save(),i.fillStyle=h||a,i.fillRect(0,0,n,o),i.restore()}if(r){var d=this.domBack;i.save(),i.globalAlpha=u,i.drawImage(d,0,0,n,o),i.restore()}}},t.exports=u},function(t,e,i){"use strict";function n(t){return parseInt(t,10)}function o(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function a(t){t.__unusedCount++}function r(t){1==t.__unusedCount&&t.clear()}function s(t,e,i){return x.copy(t.getBoundingRect()),t.transform&&x.applyTransform(t.transform),_.width=e,_.height=i,!x.intersect(_)}function l(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var i=0;i<t.length;i++)if(t[i]!==e[i])return!0}function u(t,e){for(var i=0;i<t.length;i++){var n=t[i];n.setTransform(e),e.beginPath(),n.buildPath(e,n.shape),e.clip(),n.restoreTransform(e)}}function c(t,e){var i=document.createElement("div");return i.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",i}var h=i(35),d=i(1),f=i(52),p=i(11),g=i(51),m=i(153),v=i(67),y=5,x=new p(0,0,0,0),_=new p(0,0,0,0),b=function(t,e,i){var n=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=i=d.extend({},i||{}),this.dpr=i.devicePixelRatio||h.devicePixelRatio,this._singleCanvas=n,this.root=t;var o=t.style;o&&(o["-webkit-tap-highlight-color"]="transparent",o["-webkit-user-select"]=o["user-select"]=o["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var a=this._zlevelList=[],r=this._layers={};if(this._layerConfig={},n){null!=i.width&&(t.width=i.width),null!=i.height&&(t.height=i.height);var s=t.width,l=t.height;this._width=s,this._height=l;var u=new m(t,this,1);u.initContext(),r[0]=u,a.push(0),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var f=this._domRoot=c(this._width,this._height);t.appendChild(f)}this._progressiveLayers=[],this._hoverlayer,this._hoverElements=[]};b.prototype={constructor:b,isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},refresh:function(t){var e=this.storage.getDisplayList(!0),i=this._zlevelList;this._paintList(e,t);for(var n=0;n<i.length;n++){var o=i[n],a=this._layers[o];!a.__builtin__&&a.refresh&&a.refresh()}return this.refreshHover(),this._progressiveLayers.length&&this._startProgessive(),this},addHover:function(t,e){if(!t.__hoverMir){var i=new t.constructor({style:t.style,shape:t.shape});i.__from=t,t.__hoverMir=i,i.setStyle(e),this._hoverElements.push(i)}},removeHover:function(t){var e=t.__hoverMir,i=this._hoverElements,n=d.indexOf(i,e);n>=0&&i.splice(n,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,i=0;i<e.length;i++){var n=e[i].__from;n&&(n.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,i=this._hoverlayer;if(i&&i.clear(),e){g(t,this.storage.displayableSortFunc),i||(i=this._hoverlayer=this.getLayer(1e5));var n={};i.ctx.save();for(var o=0;o<e;){var a=t[o],r=a.__from;r&&r.__zr?(o++,r.invisible||(a.transform=r.transform,a.invTransform=r.invTransform,a.__clipPaths=r.__clipPaths,this._doPaintEl(a,i,!0,n))):(t.splice(o,1),r.__hoverMir=null,e--)}i.ctx.restore()}},_startProgessive:function(){function t(){i===e._progressiveToken&&e.storage&&(e._doPaintList(e.storage.getDisplayList()),e._furtherProgressive?(e._progress++,v(t)):e._progressiveToken=-1)}var e=this;if(e._furtherProgressive){var i=e._progressiveToken=+new Date;e._progress++,v(t)}},_clearProgressive:function(){this._progressiveToken=-1,this._progress=0,d.each(this._progressiveLayers,function(t){t.__dirty&&t.clear()})},_paintList:function(t,e){null==e&&(e=!1),this._updateLayerStatus(t),this._clearProgressive(),this.eachBuiltinLayer(a),this._doPaintList(t,e),this.eachBuiltinLayer(r)},_doPaintList:function(t,e){function i(t){var e=a.dpr||1;a.save(),a.globalAlpha=1,a.shadowBlur=0,n.__dirty=!0,a.setTransform(1,0,0,1,0,0),a.drawImage(t.dom,0,0,c*e,h*e),a.restore()}for(var n,o,a,r,s,l,u=0,c=this._width,h=this._height,p=this._progress,g=0,m=t.length;g<m;g++){var v=t[g],x=this._singleCanvas?0:v.zlevel,_=v.__frame;if(_<0&&s&&(i(s),s=null),o!==x&&(a&&a.restore(),r={},o=x,n=this.getLayer(o),n.__builtin__||f("ZLevel "+o+" has been used by unkown layer "+n.id),a=n.ctx,a.save(),n.__unusedCount=0,(n.__dirty||e)&&n.clear()),n.__dirty||e){if(_>=0){if(!s){if(s=this._progressiveLayers[Math.min(u++,y-1)],s.ctx.save(),s.renderScope={},s&&s.__progress>s.__maxProgress){g=s.__nextIdxNotProg-1;continue}l=s.__progress,s.__dirty||(p=l),s.__progress=p+1}_===p&&this._doPaintEl(v,s,!0,s.renderScope)}else this._doPaintEl(v,n,e,r);v.__dirty=!1}}s&&i(s),a&&a.restore(),this._furtherProgressive=!1,d.each(this._progressiveLayers,function(t){t.__maxProgress>=t.__progress&&(this._furtherProgressive=!0)},this)},_doPaintEl:function(t,e,i,n){var o=e.ctx,a=t.transform;if((e.__dirty||i)&&!t.invisible&&0!==t.style.opacity&&(!a||a[0]||a[3])&&(!t.culling||!s(t,this._width,this._height))){var r=t.__clipPaths;(n.prevClipLayer!==e||l(r,n.prevElClipPaths))&&(n.prevElClipPaths&&(n.prevClipLayer.ctx.restore(),n.prevClipLayer=n.prevElClipPaths=null,n.prevEl=null),r&&(o.save(),u(r,o),n.prevClipLayer=e,n.prevElClipPaths=r)),t.beforeBrush&&t.beforeBrush(o),t.brush(o,n.prevEl||null),n.prevEl=t,t.afterBrush&&t.afterBrush(o)}},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new m("zr_"+t,this,this.dpr),e.__builtin__=!0,this._layerConfig[t]&&d.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var i=this._layers,n=this._zlevelList,a=n.length,r=null,s=-1,l=this._domRoot;if(i[t])return void f("ZLevel "+t+" has been used already");if(!o(e))return void f("Layer of zlevel "+t+" is not valid");if(a>0&&t>n[0]){for(s=0;s<a-1&&!(n[s]<t&&n[s+1]>t);s++);r=i[n[s]]}if(n.splice(s+1,0,t),i[t]=e,!e.virtual)if(r){var u=r.dom;u.nextSibling?l.insertBefore(e.dom,u.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom)},eachLayer:function(t,e){var i,n,o=this._zlevelList;for(n=0;n<o.length;n++)i=o[n],t.call(e,this._layers[i],i)},eachBuiltinLayer:function(t,e){var i,n,o,a=this._zlevelList;for(o=0;o<a.length;o++)n=a[o],i=this._layers[n],i.__builtin__&&t.call(e,i,n)},eachOtherLayer:function(t,e){var i,n,o,a=this._zlevelList;for(o=0;o<a.length;o++)n=a[o],i=this._layers[n],i.__builtin__||t.call(e,i,n)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){var e=this._layers,i=this._progressiveLayers,n={},o={};this.eachBuiltinLayer(function(t,e){n[e]=t.elCount,t.elCount=0,t.__dirty=!1}),d.each(i,function(t,e){o[e]=t.elCount,t.elCount=0,t.__dirty=!1});for(var a,r,s=0,l=0,u=0,c=t.length;u<c;u++){var h=t[u],f=this._singleCanvas?0:h.zlevel,p=e[f],g=h.progressive;if(p&&(p.elCount++,p.__dirty=p.__dirty||h.__dirty),g>=0){r!==g&&(r=g,l++);var v=h.__frame=l-1;if(!a){var x=Math.min(s,y-1);a=i[x],a||(a=i[x]=new m("progressive",this,this.dpr),a.initContext()),a.__maxProgress=0}a.__dirty=a.__dirty||h.__dirty,a.elCount++,a.__maxProgress=Math.max(a.__maxProgress,v),a.__maxProgress>=a.__progress&&(p.__dirty=!0)}else h.__frame=-1,a&&(a.__nextIdxNotProg=u,s++,a=null)}a&&(s++,a.__nextIdxNotProg=u),this.eachBuiltinLayer(function(t,e){n[e]!==t.elCount&&(t.__dirty=!0)}),i.length=Math.min(s,y),d.each(i,function(t,e){o[e]!==t.elCount&&(h.__dirty=!0),t.__dirty&&(t.__progress=0)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var i=this._layerConfig;i[t]?d.merge(i[t],e,!0):i[t]=e;var n=this._layers[t];n&&d.merge(n,i[t],!0)}},delLayer:function(t){var e=this._layers,i=this._zlevelList,n=e[t];n&&(n.dom.parentNode.removeChild(n.dom),delete e[t],i.splice(d.indexOf(i,t),1))},resize:function(t,e){var i=this._domRoot;i.style.display="none";var n=this._opts;if(null!=t&&(n.width=t),null!=e&&(n.height=e),t=this._getSize(0),e=this._getSize(1),i.style.display="",this._width!=t||e!=this._height){i.style.width=t+"px",i.style.height=e+"px";for(var o in this._layers)this._layers.hasOwnProperty(o)&&this._layers[o].resize(t,e);d.each(this._progressiveLayers,function(i){i.resize(t,e)}),this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas)return this._layers[0].dom;var e=new m("image",this,t.pixelRatio||this.dpr);e.initContext(),e.clearColor=t.backgroundColor,e.clear();for(var i=this.storage.getDisplayList(!0),n={},o=0;o<i.length;o++){var a=i[o];this._doPaintEl(a,e,!0,n)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,i=["width","height"][t],o=["clientWidth","clientHeight"][t],a=["paddingLeft","paddingTop"][t],r=["paddingRight","paddingBottom"][t];if(null!=e[i]&&"auto"!==e[i])return parseFloat(e[i]);var s=this.root,l=document.defaultView.getComputedStyle(s);return(s[o]||n(l[i])||n(s.style[i]))-(n(l[a])||0)-(n(l[r])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var n=document.createElement("canvas"),o=n.getContext("2d"),a=t.getBoundingRect(),r=t.style,s=r.shadowBlur,l=r.shadowOffsetX,u=r.shadowOffsetY,c=r.hasStroke()?r.lineWidth:0,h=Math.max(c/2,-l+s),d=Math.max(c/2,l+s),f=Math.max(c/2,-u+s),p=Math.max(c/2,u+s),g=a.width+h+d,m=a.height+f+p;n.width=g*e,n.height=m*e,o.scale(e,e),o.clearRect(0,0,g,m),o.dpr=e;var v={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[h-a.x,f-a.y],
-t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(o);var y=i(53),x=new y({style:{x:0,y:0,image:n}});return null!=v.position&&(x.position=t.position=v.position),null!=v.rotation&&(x.rotation=t.rotation=v.rotation),null!=v.scale&&(x.scale=t.scale=v.scale),x}},t.exports=b},function(t,e,i){"use strict";function n(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var o=i(1),a=i(9),r=i(36),s=i(51),l=function(){this._roots=[],this._displayList=[],this._displayListLen=0};l.prototype={constructor:l,traverse:function(t,e){for(var i=0;i<this._roots.length;i++)this._roots[i].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,i=this._displayList,o=0,r=e.length;o<r;o++)this._updateAndAddDisplayable(e[o],null,t);i.length=this._displayListLen,a.canvasSupported&&s(i,n)},_updateAndAddDisplayable:function(t,e,i){if(!t.ignore||i){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var n=t.clipPath;if(n){e=e?e.slice():[];for(var o=n,a=t;o;)o.parent=a,o.updateTransform(),e.push(o),a=o,o=o.clipPath}if(t.isGroup){for(var r=t._children,s=0;s<r.length;s++){var l=r[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,i)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof r&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var i=this._roots[e];i instanceof r&&i.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var e=0,n=t.length;e<n;e++)this.delRoot(t[e]);else{var a=o.indexOf(this._roots,t);a>=0&&(this.delFromStorage(t),this._roots.splice(a,1),t instanceof r&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t.__storage=this,t.dirty(!1),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:n},t.exports=l},function(t,e,i){"use strict";var n=i(1),o=i(21).Dispatcher,a=i(67),r=i(66),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,o.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),i=0;i<e.length;i++)this.addClip(e[i])},removeClip:function(t){var e=n.indexOf(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),i=0;i<e.length;i++)this.removeClip(e[i]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,i=this._clips,n=i.length,o=[],a=[],r=0;r<n;r++){var s=i[r],l=s.step(t,e);l&&(o.push(l),a.push(s))}for(var r=0;r<n;)i[r]._needsRemove?(i[r]=i[n-1],i.pop(),n--):r++;n=o.length;for(var r=0;r<n;r++)a[r].fire(o[r]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(a(t),!e._paused&&e._update())}var e=this;this._running=!0,a(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var i=new r(t,e.loop,e.getter,e.setter);return this.addAnimator(i),i}},n.mixin(s,o),t.exports=s},function(t,e,i){function n(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}var o=i(158);n.prototype={constructor:n,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)return void(this._pausedTime+=e);var i=(t-this._startTime-this._pausedTime)/this._life;if(!(i<0)){i=Math.min(i,1);var n=this.easing,a="string"==typeof n?o[n]:n,r="function"==typeof a?a(i):i;return this.fire("frame",r),1==i?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}},t.exports=n},function(t,e){var i={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)))},elasticOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},elasticInOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),(t*=2)<1?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)):i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-i.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*i.bounceIn(2*t):.5*i.bounceOut(2*t-1)+.5}};t.exports=i},function(t,e,i){var n=i(68).normalizeRadian,o=2*Math.PI;t.exports={containStroke:function(t,e,i,a,r,s,l,u,c){if(0===l)return!1;var h=l;u-=t,c-=e;var d=Math.sqrt(u*u+c*c);if(d-h>i||d+h<i)return!1;if(Math.abs(a-r)%o<1e-4)return!0;if(s){var f=a;a=n(r),r=n(f)}else a=n(a),r=n(r);a>r&&(r+=o);var p=Math.atan2(c,u);return p<0&&(p+=o),p>=a&&p<=r||p+o>=a&&p+o<=r}}},function(t,e,i){var n=i(20);t.exports={containStroke:function(t,e,i,o,a,r,s,l,u,c,h){if(0===u)return!1;var d=u;if(h>e+d&&h>o+d&&h>r+d&&h>l+d||h<e-d&&h<o-d&&h<r-d&&h<l-d||c>t+d&&c>i+d&&c>a+d&&c>s+d||c<t-d&&c<i-d&&c<a-d&&c<s-d)return!1;var f=n.cubicProjectPoint(t,e,i,o,a,r,s,l,c,h,null);return f<=d/2}}},function(t,e,i){"use strict";function n(t,e){return Math.abs(t-e)<x}function o(){var t=b[0];b[0]=b[1],b[1]=t}function a(t,e,i,n,a,r,s,l,u,c){if(c>e&&c>n&&c>r&&c>l||c<e&&c<n&&c<r&&c<l)return 0;var h=g.cubicRootAt(e,n,r,l,c,_);if(0===h)return 0;for(var d,f,p=0,m=-1,v=0;v<h;v++){var y=_[v],x=0===y||1===y?.5:1,w=g.cubicAt(t,i,a,s,y);w<u||(m<0&&(m=g.cubicExtrema(e,n,r,l,b),b[1]<b[0]&&m>1&&o(),d=g.cubicAt(e,n,r,l,b[0]),m>1&&(f=g.cubicAt(e,n,r,l,b[1]))),p+=2==m?y<b[0]?d<e?x:-x:y<b[1]?f<d?x:-x:l<f?x:-x:y<b[0]?d<e?x:-x:l<d?x:-x)}return p}function r(t,e,i,n,o,a,r,s){if(s>e&&s>n&&s>a||s<e&&s<n&&s<a)return 0;var l=g.quadraticRootAt(e,n,a,s,_);if(0===l)return 0;var u=g.quadraticExtremum(e,n,a);if(u>=0&&u<=1){for(var c=0,h=g.quadraticAt(e,n,a,u),d=0;d<l;d++){var f=0===_[d]||1===_[d]?.5:1,p=g.quadraticAt(t,i,o,_[d]);p<r||(c+=_[d]<u?h<e?f:-f:a<h?f:-f)}return c}var f=0===_[0]||1===_[0]?.5:1,p=g.quadraticAt(t,i,o,_[0]);return p<r?0:a<e?f:-f}function s(t,e,i,n,o,a,r,s){if(s-=e,s>i||s<-i)return 0;var l=Math.sqrt(i*i-s*s);_[0]=-l,_[1]=l;var u=Math.abs(n-o);if(u<1e-4)return 0;if(u%y<1e-4){n=0,o=y;var c=a?1:-1;return r>=_[0]+t&&r<=_[1]+t?c:0}if(a){var l=n;n=p(o),o=p(l)}else n=p(n),o=p(o);n>o&&(o+=y);for(var h=0,d=0;d<2;d++){var f=_[d];if(f+t>r){var g=Math.atan2(s,f),c=a?1:-1;g<0&&(g=y+g),(g>=n&&g<=o||g+y>=n&&g+y<=o)&&(g>Math.PI/2&&g<1.5*Math.PI&&(c=-c),h+=c)}}return h}function l(t,e,i,o,l){for(var c=0,p=0,g=0,y=0,x=0,_=0;_<t.length;){var b=t[_++];switch(b===u.M&&_>1&&(i||(c+=m(p,g,y,x,o,l))),1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case u.M:y=t[_++],x=t[_++],p=y,g=x;break;case u.L:if(i){if(v(p,g,t[_],t[_+1],e,o,l))return!0}else c+=m(p,g,t[_],t[_+1],o,l)||0;p=t[_++],g=t[_++];break;case u.C:if(i){if(h.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,o,l))return!0}else c+=a(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],o,l)||0;p=t[_++],g=t[_++];break;case u.Q:if(i){if(d.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,o,l))return!0}else c+=r(p,g,t[_++],t[_++],t[_],t[_+1],o,l)||0;p=t[_++],g=t[_++];break;case u.A:var w=t[_++],S=t[_++],M=t[_++],I=t[_++],T=t[_++],A=t[_++],C=(t[_++],1-t[_++]),L=Math.cos(T)*M+w,D=Math.sin(T)*I+S;_>1?c+=m(p,g,L,D,o,l):(y=L,x=D);var P=(o-w)*I/M+w;if(i){if(f.containStroke(w,S,I,T,T+A,C,e,P,l))return!0}else c+=s(w,S,I,T,T+A,C,P,l);p=Math.cos(T+A)*M+w,g=Math.sin(T+A)*I+S;break;case u.R:y=p=t[_++],x=g=t[_++];var k=t[_++],O=t[_++],L=y+k,D=x+O;if(i){if(v(y,x,L,x,e,o,l)||v(L,x,L,D,e,o,l)||v(L,D,y,D,e,o,l)||v(y,D,y,x,e,o,l))return!0}else c+=m(L,x,L,D,o,l),c+=m(y,D,y,x,o,l);break;case u.Z:if(i){if(v(p,g,y,x,e,o,l))return!0}else c+=m(p,g,y,x,o,l);p=y,g=x}}return i||n(g,x)||(c+=m(p,g,y,x,o,l)||0),0!==c}var u=i(27).CMD,c=i(96),h=i(160),d=i(97),f=i(159),p=i(68).normalizeRadian,g=i(20),m=i(98),v=c.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,i){return l(t,0,!1,e,i)},containStroke:function(t,e,i,n){return l(t,e,!0,i,n)}}},function(t,e,i){"use strict";function n(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}function o(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var a=i(21),r=function(){this._track=[]};r.prototype={constructor:r,recognize:function(t,e,i){return this._doTrack(t,e,i),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,i){var n=t.touches;if(n){for(var o={points:[],touches:[],target:e,event:t},r=0,s=n.length;r<s;r++){var l=n[r],u=a.clientToLocal(i,l,{});o.points.push([u.zrX,u.zrY]),o.touches.push(l)}this._track.push(o)}},_recognize:function(t){for(var e in s)if(s.hasOwnProperty(e)){var i=s[e](this._track,t);if(i)return i}}};var s={pinch:function(t,e){var i=t.length;if(i){var a=(t[i-1]||{}).points,r=(t[i-2]||{}).points||a;if(r&&r.length>1&&a&&a.length>1){var s=n(a)/n(r);!isFinite(s)&&(s=1),e.pinchScale=s;var l=o(a);return e.pinchX=l[0],e.pinchY=l[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=r},function(t,e,i){function n(t){return"mousewheel"===t&&d.browser.firefox?"DOMMouseScroll":t}function o(t,e,i){var n=t._gestureMgr;"start"===i&&n.clear();var o=n.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===i&&n.clear(),o){var a=o.type;e.gestureEvent=a,t.handler.dispatchToElement({target:o.target},a,o.event)}}function a(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function r(t){var e=t.pointerType;return"pen"===e||"touch"===e}function s(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}c.each(x,function(e){t._handlers[e]=c.bind(w[e],t)}),c.each(b,function(e){t._handlers[e]=c.bind(w[e],t)}),c.each(y,function(i){t._handlers[i]=e(w[i],t)})}function l(t){function e(e,i){c.each(e,function(e){p(t,n(e),i._handlers[e])},i)}h.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new f,this._handlers={},s(this),d.pointerEventsSupported?e(b,this):(d.touchEventsSupported&&e(x,this),e(y,this))}var u=i(21),c=i(1),h=i(23),d=i(9),f=i(162),p=u.addEventListener,g=u.removeEventListener,m=u.normalizeEvent,v=300,y=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],x=["touchstart","touchend","touchmove"],_={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},b=c.map(y,function(t){var e=t.replace("mouse","pointer");return _[e]?e:t}),w={mousemove:function(t){t=m(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){t=m(this.dom,t);var e=t.toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){t=m(this.dom,t),t.zrByTouch=!0,this._lastTouchMoment=new Date,o(this,t,"start"),w.mousemove.call(this,t),w.mousedown.call(this,t),a(this)},touchmove:function(t){t=m(this.dom,t),t.zrByTouch=!0,o(this,t,"change"),w.mousemove.call(this,t),a(this)},touchend:function(t){t=m(this.dom,t),t.zrByTouch=!0,o(this,t,"end"),w.mouseup.call(this,t),+new Date-this._lastTouchMoment<v&&w.click.call(this,t),a(this)},pointerdown:function(t){w.mousedown.call(this,t)},pointermove:function(t){r(t)||w.mousemove.call(this,t)},pointerup:function(t){w.mouseup.call(this,t)},pointerout:function(t){r(t)||w.mouseout.call(this,t)}};c.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){w[t]=function(e){e=m(this.dom,e),this.trigger(t,e)}});var S=l.prototype;S.dispose=function(){for(var t=y.concat(x),e=0;e<t.length;e++){var i=t[e];g(this.dom,n(i),this._handlers[i])}},S.setCursor=function(t){this.dom.style.cursor=t||"default"},c.mixin(l,h),t.exports=l},function(t,e,i){var n=i(8);t.exports=n.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,i=0;i<e.length;i++)t=t||e[i].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),i=0;i<t.length;i++)t[i].path||t[i].createPathProxy(),t[i].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var i=e.paths||[],n=0;n<i.length;n++)i[n].buildPath(t,i[n].shape,!0)},afterBrush:function(){for(var t=this.shape.paths,e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),n.prototype.getBoundingRect.call(this)}})},function(t,e,i){"use strict";var n=i(1),o=i(39),a=function(t,e,i,n,a){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==i?.5:i,this.type="radial",this.global=a||!1,o.call(this,n)};a.prototype={constructor:a},n.inherits(a,o),t.exports=a},function(t,e){t.exports={buildPath:function(t,e){var i,n,o,a,r=e.x,s=e.y,l=e.width,u=e.height,c=e.r;l<0&&(r+=l,l=-l),u<0&&(s+=u,u=-u),"number"==typeof c?i=n=o=a=c:c instanceof Array?1===c.length?i=n=o=a=c[0]:2===c.length?(i=o=c[0],n=a=c[1]):3===c.length?(i=c[0],n=a=c[1],o=c[2]):(i=c[0],n=c[1],o=c[2],a=c[3]):i=n=o=a=0;var h;i+n>l&&(h=i+n,i*=l/h,n*=l/h),o+a>l&&(h=o+a,o*=l/h,a*=l/h),n+o>u&&(h=n+o,n*=u/h,o*=u/h),i+a>u&&(h=i+a,i*=u/h,a*=u/h),t.moveTo(r+i,s),t.lineTo(r+l-n,s),0!==n&&t.quadraticCurveTo(r+l,s,r+l,s+n),t.lineTo(r+l,s+u-o),0!==o&&t.quadraticCurveTo(r+l,s+u,r+l-o,s+u),t.lineTo(r+a,s+u),0!==a&&t.quadraticCurveTo(r,s+u,r,s+u-a),t.lineTo(r,s+i),0!==i&&t.quadraticCurveTo(r,s,r+i,s)}}},function(t,e,i){var n=i(5),o=n.min,a=n.max,r=n.scale,s=n.distance,l=n.add;t.exports=function(t,e,i,u){var c,h,d,f,p=[],g=[],m=[],v=[];if(u){d=[1/0,1/0],f=[-(1/0),-(1/0)];for(var y=0,x=t.length;y<x;y++)o(d,d,t[y]),a(f,f,t[y]);o(d,d,u[0]),a(f,f,u[1])}for(var y=0,x=t.length;y<x;y++){var _=t[y];if(i)c=t[y?y-1:x-1],h=t[(y+1)%x];else{if(0===y||y===x-1){p.push(n.clone(t[y]));continue}c=t[y-1],h=t[y+1]}n.sub(g,h,c),r(g,g,e);var b=s(_,c),w=s(_,h),S=b+w;0!==S&&(b/=S,w/=S),r(m,g,-b),r(v,g,w);var M=l([],_,m),I=l([],_,v);u&&(a(M,M,d),o(M,M,f),a(I,I,d),o(I,I,f)),p.push(M),p.push(I)}return i&&p.push(p.shift()),p}},function(t,e,i){function n(t,e,i,n,o,a,r){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*r+(-3*(e-i)-2*s-l)*a+s*o+e}var o=i(5);t.exports=function(t,e){for(var i=t.length,a=[],r=0,s=1;s<i;s++)r+=o.distance(t[s-1],t[s]);var l=r/2;l=l<i?i:l;for(var s=0;s<l;s++){var u,c,h,d=s/(l-1)*(e?i:i-1),f=Math.floor(d),p=d-f,g=t[f%i];e?(u=t[(f-1+i)%i],c=t[(f+1)%i],h=t[(f+2)%i]):(u=t[0===f?f:f-1],c=t[f>i-2?i-1:f+1],h=t[f>i-3?i-1:f+2]);var m=p*p,v=p*m;a.push([n(u[0],g[0],c[0],h[0],p,m,v),n(u[1],g[1],c[1],h[1],p,m,v)])}return a}},function(t,e,i){t.exports=i(8).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.cx,n=e.cy,o=Math.max(e.r,0),a=e.startAngle,r=e.endAngle,s=e.clockwise,l=Math.cos(a),u=Math.sin(a);t.moveTo(l*o+i,u*o+n),t.arc(i,n,o,a,r,!s)}})},function(t,e,i){"use strict";function n(t,e,i){var n=t.cpx2,o=t.cpy2;return null===n||null===o?[(i?h:u)(t.x1,t.cpx1,t.cpx2,t.x2,e),(i?h:u)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(i?c:l)(t.x1,t.cpx1,t.x2,e),(i?c:l)(t.y1,t.cpy1,t.y2,e)]}var o=i(20),a=i(5),r=o.quadraticSubdivide,s=o.cubicSubdivide,l=o.quadraticAt,u=o.cubicAt,c=o.quadraticDerivativeAt,h=o.cubicDerivativeAt,d=[];t.exports=i(8).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,o=e.x2,a=e.y2,l=e.cpx1,u=e.cpy1,c=e.cpx2,h=e.cpy2,f=e.percent;0!==f&&(t.moveTo(i,n),null==c||null==h?(f<1&&(r(i,l,o,f,d),l=d[1],o=d[2],r(n,u,a,f,d),u=d[1],a=d[2]),t.quadraticCurveTo(l,u,o,a)):(f<1&&(s(i,l,c,o,f,d),l=d[1],c=d[2],o=d[3],s(n,u,h,a,f,d),u=d[1],h=d[2],a=d[3]),t.bezierCurveTo(l,u,c,h,o,a)))},pointAt:function(t){return n(this.shape,t,!1)},tangentAt:function(t){var e=n(this.shape,t,!0);return a.normalize(e,e)}})},function(t,e,i){"use strict";t.exports=i(8).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,i){i&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,i){t.exports=i(8).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,o=e.x2,a=e.y2,r=e.percent;0!==r&&(t.moveTo(i,n),r<1&&(o=i*(1-r)+o*r,a=n*(1-r)+a*r),t.lineTo(o,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,i){var n=i(73);t.exports=i(8).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){n.buildPath(t,e,!0)}})},function(t,e,i){var n=i(73);t.exports=i(8).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){n.buildPath(t,e,!1)}})},function(t,e,i){var n=i(166);t.exports=i(8).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,o=e.y,a=e.width,r=e.height;e.r?n.buildPath(t,e):t.rect(i,o,a,r),t.closePath()}})},function(t,e,i){t.exports=i(8).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var i=e.cx,n=e.cy,o=2*Math.PI;t.moveTo(i+e.r,n),t.arc(i,n,e.r,0,o,!1),t.moveTo(i+e.r0,n),t.arc(i,n,e.r0,0,o,!0)}})},function(t,e,i){var n=i(9),o=i(8),a=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]];t.exports=o.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:n.browser.ie&&n.browser.version>=11?function(){var t,e=this.__clipPaths,i=this.style;if(e)for(var n=0;n<e.length;n++){var r=e[n]&&e[n].shape;if(r&&r.startAngle===r.endAngle){for(var s=0;s<a.length;s++)a[s][2]=i[a[s][0]],i[a[s][0]]=a[s][1];t=!0;break}}if(o.prototype.brush.apply(this,arguments),t)for(var s=0;s<a.length;s++)i[a[s][0]]=a[s][2]}:o.prototype.brush,buildPath:function(t,e){var i=e.cx,n=e.cy,o=Math.max(e.r0||0,0),a=Math.max(e.r,0),r=e.startAngle,s=e.endAngle,l=e.clockwise,u=Math.cos(r),c=Math.sin(r);t.moveTo(u*o+i,c*o+n),t.lineTo(u*a+i,c*a+n),t.arc(i,n,a,r,s,!l),t.lineTo(Math.cos(s)*o+i,Math.sin(s)*o+n),0!==o&&t.arc(i,n,o,s,r,l),t.closePath()}})},function(t,e,i){"use strict";var n=i(66),o=i(1),a=o.isString,r=o.isFunction,s=o.isObject,l=i(52),u=function(){this.animators=[]};u.prototype={constructor:u,animate:function(t,e){var i,a=!1,r=this,s=this.__zr;if(t){var u=t.split("."),c=r;a="shape"===u[0];for(var h=0,d=u.length;h<d;h++)c&&(c=c[u[h]]);c&&(i=c)}else i=r;if(!i)return void l('Property "'+t+'" is not existed in element '+r.id);var f=r.animators,p=new n(i,e);return p.during(function(t){r.dirty(a)}).done(function(){f.splice(o.indexOf(f,p),1)}),f.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,i=e.length,n=0;n<i;n++)e[n].stop(t);return e.length=0,this},animateTo:function(t,e,i,n,o){function s(){u--,u||o&&o()}a(i)?(o=n,n=i,i=0):r(n)?(o=n,n="linear",i=0):r(i)?(o=i,i=0):r(e)?(o=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,i,n,o);var l=this.animators.slice(),u=l.length;u||o&&o();for(var c=0;c<l.length;c++)l[c].done(s).start(n)},_animateToShallow:function(t,e,i,n,a){var r={},l=0;for(var u in i)if(i.hasOwnProperty(u))if(null!=e[u])s(i[u])&&!o.isArrayLike(i[u])?this._animateToShallow(t?t+"."+u:u,e[u],i[u],n,a):(r[u]=i[u],l++);else if(null!=i[u])if(t){var c={};c[t]={},c[t][u]=i[u],this.attr(c)}else this.attr(u,i[u]);return l>0&&this.animate(t,!1).when(null==n?500:n,r).delay(a||0),this}},t.exports=u},function(t,e){function i(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function n(t,e){return{target:t,topTarget:e&&e.topTarget}}i.prototype={constructor:i,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(n(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var i=t.offsetX,o=t.offsetY,a=i-this._x,r=o-this._y;this._x=i,this._y=o,e.drift(a,r,t),this.dispatchToElement(n(e,t),"drag",t.event);var s=this.findHover(i,o,e).target,l=this._dropTarget;this._dropTarget=s,e!==s&&(l&&s!==l&&this.dispatchToElement(n(l,t),"dragleave",t.event),s&&s!==l&&this.dispatchToElement(n(s,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(n(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(n(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=i},function(t,e,i){function n(t,e,i,n,o,a,r,s,l,u,p){var v=l*(f/180),y=d(v)*(t-i)/2+h(v)*(e-n)/2,x=-1*h(v)*(t-i)/2+d(v)*(e-n)/2,_=y*y/(r*r)+x*x/(s*s);_>1&&(r*=c(_),s*=c(_));var b=(o===a?-1:1)*c((r*r*(s*s)-r*r*(x*x)-s*s*(y*y))/(r*r*(x*x)+s*s*(y*y)))||0,w=b*r*x/s,S=b*-s*y/r,M=(t+i)/2+d(v)*w-h(v)*S,I=(e+n)/2+h(v)*w+d(v)*S,T=m([1,0],[(y-w)/r,(x-S)/s]),A=[(y-w)/r,(x-S)/s],C=[(-1*y-w)/r,(-1*x-S)/s],L=m(A,C);g(A,C)<=-1&&(L=f),g(A,C)>=1&&(L=0),0===a&&L>0&&(L-=2*f),1===a&&L<0&&(L+=2*f),p.addData(u,M,I,r,s,T,L,v,a)}function o(t){if(!t)return[];var e,i=t.replace(/-/g," -").replace(/  /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e<u.length;e++)i=i.replace(new RegExp(u[e],"g"),"|"+u[e]);var o,a=i.split("|"),r=0,l=0,c=new s,h=s.CMD;for(e=1;e<a.length;e++){var d,f=a[e],p=f.charAt(0),g=0,m=f.slice(1).replace(/e,-/g,"e-").split(",");m.length>0&&""===m[0]&&m.shift();for(var v=0;v<m.length;v++)m[v]=parseFloat(m[v]);for(;g<m.length&&!isNaN(m[g])&&!isNaN(m[0]);){var y,x,_,b,w,S,M,I=r,T=l;switch(p){case"l":r+=m[g++],l+=m[g++],d=h.L,c.addData(d,r,l);break;case"L":r=m[g++],l=m[g++],d=h.L,c.addData(d,r,l);break;case"m":r+=m[g++],l+=m[g++],d=h.M,c.addData(d,r,l),p="l";break;case"M":r=m[g++],l=m[g++],d=h.M,c.addData(d,r,l),p="L";break;case"h":r+=m[g++],d=h.L,c.addData(d,r,l);break;case"H":r=m[g++],d=h.L,c.addData(d,r,l);break;case"v":l+=m[g++],d=h.L,c.addData(d,r,l);break;case"V":l=m[g++],d=h.L,c.addData(d,r,l);break;case"C":d=h.C,c.addData(d,m[g++],m[g++],m[g++],m[g++],m[g++],m[g++]),r=m[g-2],l=m[g-1];break;case"c":d=h.C,c.addData(d,m[g++]+r,m[g++]+l,m[g++]+r,m[g++]+l,m[g++]+r,m[g++]+l),r+=m[g-2],l+=m[g-1];break;case"S":y=r,x=l;var A=c.len(),C=c.data;o===h.C&&(y+=r-C[A-4],x+=l-C[A-3]),d=h.C,I=m[g++],T=m[g++],r=m[g++],l=m[g++],c.addData(d,y,x,I,T,r,l);break;case"s":y=r,x=l;var A=c.len(),C=c.data;o===h.C&&(y+=r-C[A-4],x+=l-C[A-3]),d=h.C,I=r+m[g++],T=l+m[g++],r+=m[g++],l+=m[g++],c.addData(d,y,x,I,T,r,l);break;case"Q":I=m[g++],T=m[g++],r=m[g++],l=m[g++],d=h.Q,c.addData(d,I,T,r,l);break;case"q":I=m[g++]+r,T=m[g++]+l,r+=m[g++],l+=m[g++],d=h.Q,c.addData(d,I,T,r,l);break;case"T":y=r,x=l;var A=c.len(),C=c.data;o===h.Q&&(y+=r-C[A-4],x+=l-C[A-3]),r=m[g++],l=m[g++],d=h.Q,c.addData(d,y,x,r,l);break;case"t":y=r,x=l;var A=c.len(),C=c.data;o===h.Q&&(y+=r-C[A-4],x+=l-C[A-3]),r+=m[g++],l+=m[g++],d=h.Q,c.addData(d,y,x,r,l);break;case"A":_=m[g++],b=m[g++],w=m[g++],S=m[g++],M=m[g++],I=r,T=l,r=m[g++],l=m[g++],d=h.A,n(I,T,r,l,S,M,_,b,w,d,c);break;case"a":_=m[g++],b=m[g++],w=m[g++],S=m[g++],M=m[g++],I=r,T=l,r+=m[g++],l+=m[g++],d=h.A,n(I,T,r,l,S,M,_,b,w,d,c)}}"z"!==p&&"Z"!==p||(d=h.Z,c.addData(d)),o=d}return c.toStatic(),c}function a(t,e){var i=o(t);return e=e||{},e.buildPath=function(t){if(t.setData){t.setData(i.data);var e=t.getContext();e&&t.rebuildPath(e)}else{var e=t;i.rebuildPath(e)}},e.applyTransform=function(t){l(i,t),this.dirty(!0)},e}var r=i(8),s=i(27),l=i(181),u=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],c=Math.sqrt,h=Math.sin,d=Math.cos,f=Math.PI,p=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},g=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(p(t)*p(e))},m=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(g(t,e))};t.exports={createFromString:function(t,e){return new r(a(t,e))},extendFromString:function(t,e){return r.extend(a(t,e))},mergePath:function(t,e){for(var i=[],n=t.length,o=0;o<n;o++){var a=t[o];a.path||a.createPathProxy(),a.__dirtyPath&&a.buildPath(a.path,a.shape,!0),i.push(a.path)}var s=new r(e);return s.createPathProxy(),s.buildPath=function(t){t.appendPath(i);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,i){function n(t,e){var i,n,a,c,h,d,f=t.data,p=o.M,g=o.C,m=o.L,v=o.R,y=o.A,x=o.Q;for(a=0,c=0;a<f.length;){switch(i=f[a++],c=a,n=0,i){case p:n=1;break;case m:n=1;break;case g:n=3;break;case x:n=2;break;case y:var _=e[4],b=e[5],w=l(e[0]*e[0]+e[1]*e[1]),S=l(e[2]*e[2]+e[3]*e[3]),M=u(-e[1]/S,e[0]/w);f[a]*=w,f[a++]+=_,f[a]*=S,f[a++]+=b,f[a++]*=w,f[a++]*=S,f[a++]+=M,f[a++]+=M,a+=2,c=a;break;case v:d[0]=f[a++],d[1]=f[a++],r(d,d,e),f[c++]=d[0],f[c++]=d[1],d[0]+=f[a++],d[1]+=f[a++],r(d,d,e),f[c++]=d[0],f[c++]=d[1]}for(h=0;h<n;h++){var d=s[h];d[0]=f[a++],d[1]=f[a++],r(d,d,e),f[c++]=d[0],f[c++]=d[1]}}}var o=i(27).CMD,a=i(5),r=a.applyTransform,s=[[],[],[]],l=Math.sqrt,u=Math.atan2;t.exports=n},function(t,e,i){if(!i(9).canvasSupported){var n,o="urn:schemas-microsoft-com:vml",a=window,r=a.document,s=!1;try{!r.namespaces.zrvml&&r.namespaces.add("zrvml",o),n=function(t){return r.createElement("<zrvml:"+t+' class="zrvml">')}}catch(l){n=function(t){return r.createElement("<"+t+' xmlns="'+o+'" class="zrvml">')}}var u=function(){if(!s){s=!0;var t=r.styleSheets;t.length<31?r.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}};t.exports={doc:r,initVML:u,createNode:n}}},function(t,e,i){"use strict";function n(t){return null==t.value?t:t.value}var o=i(14),a=i(25),r=i(312),s=i(1),l={_baseAxisDim:null,getInitialData:function(t,e){var i,r,s=e.getComponent("xAxis",this.get("xAxisIndex")),l=e.getComponent("yAxis",this.get("yAxisIndex")),u=s.get("type"),c=l.get("type");"category"===u?(t.layout="horizontal",i=s.getCategories(),r=!0):"category"===c?(t.layout="vertical",i=l.getCategories(),r=!0):t.layout=t.layout||"horizontal",this._baseAxisDim="horizontal"===t.layout?"x":"y";var h=t.data,d=this.dimensions=["base"].concat(this.valueDimensions);a(d,h);var f=new o(d,this);return f.initData(h,i?i.slice():null,function(t,e,i,o){var a=n(t);return r?"base"===e?i:a[o-1]:a[o]}),f},coordDimToDataDim:function(t){var e=this.valueDimensions.slice(),i=["base"],n={horizontal:{x:i,y:e},vertical:{x:e,y:i}};return n[this.get("layout")][t]},dataDimToCoordDim:function(t){var e;return s.each(["x","y"],function(i,n){var o=this.coordDimToDataDim(i);s.indexOf(o,t)>=0&&(e=i)},this),e},getBaseAxis:function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis}},u={init:function(){var t=this._whiskerBoxDraw=new r(this.getStyleUpdater());this.group.add(t.group)},render:function(t,e,i){this._whiskerBoxDraw.updateData(t.getData())},remove:function(t){this._whiskerBoxDraw.remove()}};t.exports={seriesModelMixin:l,viewMixin:u}},function(t,e,i){function n(t,e,i){var n=this._targetInfoList=[],o={},r=a(e,t);p(_,function(t,e){(!i||!i.include||g(i.include,e)>=0)&&t(r,n,o)})}function o(t){return t[0]>t[1]&&t.reverse(),t}function a(t,e){return d.parseFinder(t,e,{includeMainTypes:y})}function r(t,e,i,n){var a=i.getAxis(["x","y"][t]),r=o(c.map([0,1],function(t){return e?a.coordToData(a.toLocalCoord(n[t])):a.toGlobalCoord(a.dataToCoord(n[t]))})),s=[];return s[t]=r,s[1-t]=[NaN,NaN],{values:r,xyMinMax:s}}function s(t,e,i,n){return[e[0]-n[t]*i[0],e[1]-n[t]*i[1]]}function l(t,e){var i=u(t),n=u(e),o=[i[0]/n[0],i[1]/n[1]];return isNaN(o[0])&&(o[0]=1),isNaN(o[1])&&(o[1]=1),o}function u(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var c=i(1),h=i(3),d=i(6),f=i(185),p=c.each,g=c.indexOf,m=c.curry,v=["dataToPoint","pointToData"],y=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],x=n.prototype;x.setOutputRanges=function(t,e){this.matchOutputRanges(t,e,function(t,e,i){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var n=S[t.brushType](0,i,e);t.__rangeOffset={offset:M[t.brushType](n.values,t.range,[1,1]),xyMinMax:n.xyMinMax}}})},x.matchOutputRanges=function(t,e,i){p(t,function(t){var n=this.findTargetInfo(t,e);n&&n!==!0&&c.each(n.coordSyses,function(n){var o=S[t.brushType](1,n,t.range);i(t,o.values,n,e)})},this)},x.setInputRanges=function(t,e){p(t,function(t){var i=this.findTargetInfo(t,e);if(t.range=t.range||[],i&&i!==!0){t.panelId=i.panelId;var n=S[t.brushType](0,i.coordSys,t.coordRange),o=t.__rangeOffset;t.range=o?M[t.brushType](n.values,o.offset,l(n.xyMinMax,o.xyMinMax)):n.values}},this)},x.makePanelOpts=function(t,e){return c.map(this._targetInfoList,function(i){var n=i.getPanelRect();return{panelId:i.panelId,defaultBrushType:e&&e(i),clipPath:f.makeRectPanelClipPath(n),isTargetByCursor:f.makeRectIsTargetByCursor(n,t,i.coordSysModel),getLinearBrushOtherExtent:f.makeLinearBrushOtherExtent(n)}})},x.controlSeries=function(t,e,i){var n=this.findTargetInfo(t,i);return n===!0||n&&g(n.coordSyses,e.coordinateSystem)>=0},x.findTargetInfo=function(t,e){for(var i=this._targetInfoList,n=a(e,t),o=0;o<i.length;o++){var r=i[o],s=t.panelId;if(s){if(r.panelId===s)return r}else for(var o=0;o<b.length;o++)if(b[o](n,r))return r}return!0};var _={grid:function(t,e){var i=t.xAxisModels,n=t.yAxisModels,o=t.gridModels,a={},r={},s={};(i||n||o)&&(p(i,function(t){var e=t.axis.grid.model;a[e.id]=e,r[e.id]=!0}),p(n,function(t){var e=t.axis.grid.model;a[e.id]=e,s[e.id]=!0}),p(o,function(t){a[t.id]=t,r[t.id]=!0,s[t.id]=!0}),p(a,function(t){var o=t.coordinateSystem,a=[];p(o.getCartesians(),function(t,e){(g(i,t.getAxis("x").model)>=0||g(n,t.getAxis("y").model)>=0)&&a.push(t);
-}),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:a[0],coordSyses:a,getPanelRect:w.grid,xAxisDeclared:r[t.id],yAxisDeclared:s[t.id]})}))},geo:function(t,e){p(t.geoModels,function(t){var i=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:i,coordSyses:[i],getPanelRect:w.geo})})}},b=[function(t,e){var i=t.xAxisModel,n=t.yAxisModel,o=t.gridModel;return!o&&i&&(o=i.axis.grid.model),!o&&n&&(o=n.axis.grid.model),o&&o===e.gridModel},function(t,e){var i=t.geoModel;return i&&i===e.geoModel}],w={grid:function(){return this.coordSys.grid.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(h.getTransform(t)),e}},S={lineX:m(r,0),lineY:m(r,1),rect:function(t,e,i){var n=e[v[t]]([i[0][0],i[1][0]]),a=e[v[t]]([i[0][1],i[1][1]]),r=[o([n[0],a[0]]),o([n[1],a[1]])];return{values:r,xyMinMax:r}},polygon:function(t,e,i){var n=[[1/0,-(1/0)],[1/0,-(1/0)]],o=c.map(i,function(i){var o=e[v[t]](i);return n[0][0]=Math.min(n[0][0],o[0]),n[1][0]=Math.min(n[1][0],o[1]),n[0][1]=Math.max(n[0][1],o[0]),n[1][1]=Math.max(n[1][1],o[1]),o});return{values:o,xyMinMax:n}}},M={lineX:m(s,0),lineY:m(s,1),rect:function(t,e,i){return[[t[0][0]-i[0]*e[0][0],t[0][1]-i[0]*e[0][1]],[t[1][0]-i[1]*e[1][0],t[1][1]-i[1]*e[1][1]]]},polygon:function(t,e,i){return c.map(t,function(t,n){return[t[0]-i[0]*e[n][0],t[1]-i[1]*e[n][1]]})}};t.exports=n},function(t,e,i){function n(t){return r.create(t)}var o=i(1),a=i(127),r=i(11),s=Math.max,l=Math.min,u={};u.makeRectPanelClipPath=function(t){return t=n(t),function(e,i){return o.map(e,function(e){var i=e[0];i=s(i,t.x),i=l(i,t.x+t.width);var n=e[1];return n=s(n,t.y),n=l(n,t.y+t.height),[i,n]})}},u.makeLinearBrushOtherExtent=function(t,e){return t=n(t),function(i){var n=null!=e?e:i,o=n?t.width:t.height,a=n?t.x:t.y;return[a,a+(o||0)]}},u.makeRectIsTargetByCursor=function(t,e,i){return t=n(t),function(n,o,r){return t.contain(o[0],o[1])&&!a.onIrrelevantElement(n,e,i)}},t.exports=u},function(t,e,i){function n(t,e){var i=t.get("boundingCoords");if(null!=i){var n=i[0],o=i[1];isNaN(n[0])||isNaN(n[1])||isNaN(o[0])||isNaN(o[1])||this.setBoundingRect(n[0],n[1],o[0]-n[0],o[1]-n[1])}var a,s=this.getBoundingRect(),u=t.get("layoutCenter"),c=t.get("layoutSize"),h=e.getWidth(),d=e.getHeight(),f=t.get("aspectScale")||.75,p=s.width/s.height*f,g=!1;u&&c&&(u=[l.parsePercent(u[0],h),l.parsePercent(u[1],d)],c=l.parsePercent(c,Math.min(h,d)),isNaN(u[0])||isNaN(u[1])||isNaN(c)||(g=!0));var m;if(g){var m={};p>1?(m.width=c,m.height=c/p):(m.height=c,m.width=c*p),m.y=u[1]-m.height/2,m.x=u[0]-m.width/2}else a=t.getBoxLayoutParams(),a.aspect=p,m=r.getLayoutRect(a,{width:h,height:d});this.setViewRect(m.x,m.y,m.width,m.height),this.setCenter(t.get("center")),this.setZoom(t.get("zoom"))}function o(t,e){s.each(e.get("geoCoord"),function(e,i){t.addGeoCoord(i,e)})}var a=i(395),r=i(12),s=i(1),l=i(4),u={},c={dimensions:a.prototype.dimensions,create:function(t,e){var i=[];t.eachComponent("geo",function(t,r){var s=t.get("map"),l=u[s],c=new a(s+r,s,l&&l.geoJson,l&&l.specialAreas,t.get("nameMap"));c.zoomLimit=t.get("scaleLimit"),i.push(c),o(c,t),t.coordinateSystem=c,c.model=t,c.resize=n,c.resize(t,e)}),t.eachSeries(function(t){var e=t.get("coordinateSystem");if("geo"===e){var n=t.get("geoIndex")||0;t.coordinateSystem=i[n]}});var r={};return t.eachSeriesByType("map",function(t){if(!t.getHostGeoModel()){var e=t.getMapType();r[e]=r[e]||[],r[e].push(t)}}),s.each(r,function(t,r){var l=u[r],c=s.map(t,function(t){return t.get("nameMap")}),h=new a(r,r,l&&l.geoJson,l&&l.specialAreas,s.mergeAll(c));h.zoomLimit=s.retrieve.apply(null,s.map(t,function(t){return t.get("scaleLimit")})),i.push(h),h.resize=n,h.resize(t[0],e),s.each(t,function(t){t.coordinateSystem=h,o(h,t)})}),i},registerMap:function(t,e,i){e.geoJson&&!e.features&&(i=e.specialAreas,e=e.geoJson),"string"==typeof e&&(e="undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")()),u[t]={geoJson:e,specialAreas:i}},getMap:function(t){return u[t]},getFilledRegions:function(t,e){var i=(t||[]).slice(),n=c.getMap(e),o=n&&n.geoJson;if(!o)return t;for(var a={},r=o.features,s=0;s<i.length;s++)a[i[s].name]=i[s];for(var s=0;s<r.length;s++){var l=r[s].properties.name;a[l]||i.push({name:l})}return i}},h=i(2);h.registerMap=c.registerMap,h.getMap=c.getMap,h.parseGeoJSON=i(262),h.loadMap=function(){},h.registerCoordinateSystem("geo",c),t.exports=c},function(t,e,i){function n(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}var o=i(1),a=i(82),r=o.each,s={createVisualMappings:function(t,e,i){function n(){var t=function(){};t.prototype.__hidden=t.prototype;var e=new t;return e}var s={};return r(e,function(e){var l=s[e]=n();r(t[e],function(t,n){if(a.isValidType(n)){var r={type:n,visual:t};i&&i(r,e),l[n]=new a(r),"opacity"===n&&(r=o.clone(r),r.type="colorAlpha",l.__hidden.__alphaForOpacity=new a(r))}})}),s},replaceVisualOption:function(t,e,i){var a;o.each(i,function(t){e.hasOwnProperty(t)&&n(e[t])&&(a=!0)}),a&&o.each(i,function(i){e.hasOwnProperty(i)&&n(e[i])?t[i]=o.clone(e[i]):delete t[i]})},applyVisual:function(t,e,i,n,r,s){function l(t){return i.getItemVisual(d,t)}function u(t,e){i.setItemVisual(d,t,e)}function c(t,o){d=null==s?t:o;var a=i.getRawDataItem(d);if(!a||a.visualMap!==!1)for(var c=n.call(r,t),f=e[c],p=h[c],g=0,m=p.length;g<m;g++){var v=p[g];f[v]&&f[v].applyVisual(t,l,u)}}var h={};o.each(t,function(t){var i=a.prepareVisualTypes(e[t]);h[t]=i});var d;null==s?i.each(c,!0):i.each([s],c,!0)}};t.exports=s},function(t,e){function i(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function o(t){if(c===setTimeout)return setTimeout(t,0);if((c===i||!c)&&setTimeout)return c=setTimeout,setTimeout(t,0);try{return c(t,0)}catch(e){try{return c.call(null,t,0)}catch(e){return c.call(this,t,0)}}}function a(t){if(h===clearTimeout)return clearTimeout(t);if((h===n||!h)&&clearTimeout)return h=clearTimeout,clearTimeout(t);try{return h(t)}catch(e){try{return h.call(null,t)}catch(e){return h.call(this,t)}}}function r(){g&&f&&(g=!1,f.length?p=f.concat(p):m=-1,p.length&&s())}function s(){if(!g){var t=o(r);g=!0;for(var e=p.length;e;){for(f=p,p=[];++m<e;)f&&f[m].run();m=-1,e=p.length}f=null,g=!1,a(t)}}function l(t,e){this.fun=t,this.array=e}function u(){}var c,h,d=t.exports={};!function(){try{c="function"==typeof setTimeout?setTimeout:i}catch(t){c=i}try{h="function"==typeof clearTimeout?clearTimeout:n}catch(t){h=n}}();var f,p=[],g=!1,m=-1;d.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)e[i-1]=arguments[i];p.push(new l(t,e)),1!==p.length||g||o(s)},l.prototype.run=function(){this.fun.apply(null,this.array)},d.title="browser",d.browser=!0,d.env={},d.argv=[],d.version="",d.versions={},d.on=u,d.addListener=u,d.once=u,d.off=u,d.removeListener=u,d.removeAllListeners=u,d.emit=u,d.binding=function(t){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(t){throw new Error("process.chdir is not supported")},d.umask=function(){return 0}},function(t,e,i){function n(){this.group=new o.Group,this._symbolEl=new r({})}var o=i(3),a=i(24),r=o.extendShape({shape:{points:null,sizes:null},symbolProxy:null,buildPath:function(t,e){for(var i=e.points,n=e.sizes,o=this.symbolProxy,a=o.shape,r=0;r<i.length;r++){var s=i[r],l=n[r];l[0]<4?t.rect(s[0]-l[0]/2,s[1]-l[1]/2,l[0],l[1]):(a.x=s[0]-l[0]/2,a.y=s[1]-l[1]/2,a.width=l[0],a.height=l[1],o.buildPath(t,a,!0))}},findDataIndex:function(t,e){for(var i=this.shape,n=i.points,o=i.sizes,a=n.length-1;a>=0;a--){var r=n[a],s=o[a],l=r[0]-s[0]/2,u=r[1]-s[1]/2;if(t>=l&&e>=u&&t<=l+s[0]&&e<=u+s[1])return a}return-1}}),s=n.prototype;s.updateData=function(t){this.group.removeAll();var e=this._symbolEl,i=t.hostModel;e.setShape({points:t.mapArray(t.getItemLayout),sizes:t.mapArray(function(e){var i=t.getItemVisual(e,"symbolSize");return i instanceof Array||(i=[i,i]),i})}),e.symbolProxy=a.createSymbol(t.getVisual("symbol"),0,0,0,0),e.setColor=e.symbolProxy.setColor,e.useStyle(i.getModel("itemStyle.normal").getItemStyle(["color"]));var n=t.getVisual("color");n&&e.setColor(n),e.seriesIndex=i.seriesIndex,e.on("mousemove",function(t){e.dataIndex=null;var i=e.findDataIndex(t.offsetX,t.offsetY);i>0&&(e.dataIndex=i)}),this.group.add(e)},s.updateLayout=function(t){var e=t.getData();this._symbolEl.setShape({points:e.mapArray(e.getItemLayout)})},s.remove=function(){this.group.removeAll()},t.exports=n},function(t,e,i){function n(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var o=i(3),a=i(5),r=o.Line.prototype,s=o.BezierCurve.prototype;t.exports=o.extendShape({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(n(e)?r:s).buildPath(t,e)},pointAt:function(t){return n(this.shape)?r.pointAt.call(this,t):s.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,i=n(e)?[e.x2-e.x1,e.y2-e.y1]:s.tangentAt.call(this,t);return a.normalize(i,i)}})},function(t,e,i){var n=i(1),o=i(2);i(192),i(193),o.registerVisual(n.curry(i(50),"scatter","circle",null)),o.registerLayout(n.curry(i(60),"scatter")),i(32)},function(t,e,i){"use strict";var n=i(28),o=i(18);t.exports=o.extend({type:"series.scatter",dependencies:["grid","polar","geo","singleAxis"],getInitialData:function(t,e){var i=n(t.data,this,e);return i},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{normal:{opacity:.8}}}})},function(t,e,i){var n=i(44),o=i(189);i(2).extendChartView({type:"scatter",init:function(){this._normalSymbolDraw=new n,this._largeSymbolDraw=new o},render:function(t,e,i){var n=t.getData(),o=this._largeSymbolDraw,a=this._normalSymbolDraw,r=this.group,s=t.get("large")&&n.count()>t.get("largeThreshold")?o:a;this._symbolDraw=s,s.updateData(n),r.add(s.group),r.remove(s===o?a.group:o.group)},updateLayout:function(t){this._symbolDraw.updateLayout(t)},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e,!0)},dispose:function(){}})},function(t,e,i){var n=i(2),o=n.extendComponentModel({type:"axisPointer",coordSysAxesInfo:null,defaultOption:{show:"auto",triggerOn:null,zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#aaa",width:1,type:"solid"},shadowStyle:{color:"rgba(150,150,150,0.3)"},label:{show:!0,formatter:null,precision:"auto",margin:3,textStyle:{color:"#fff"},padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,shadowBlur:3,shadowColor:"#aaa"},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}}});t.exports=o},function(t,e,i){var n=i(121),o=i(2).extendComponentView({type:"axisPointer",render:function(t,e,i){var o=e.getComponent("tooltip"),a=t.get("triggerOn")||o&&o.get("triggerOn")||"mousemove|click";n.register("axisPointer",i,function(t,e,i){"none"!==a&&("leave"===t||a.indexOf(t)>=0)&&i({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})})},remove:function(t,e){n.disopse(e.getZr(),"axisPointer"),o.superApply(this._model,"remove",arguments)},dispose:function(t,e){n.unregister("axisPointer",e),o.superApply(this._model,"dispose",arguments)}})},function(t,e,i){function n(t,e,i,n,a,g,m,v,b){n=n||{},i&&null!=i[0]&&null!=i[1]||(i=y({seriesIndex:n.seriesIndex,dataIndex:n.dataIndex},g).point);var w=t.axesInfo,S="leave"===e||p(i),M={},I={},T={list:[],map:{}},A=[],C={showPointer:_(r,I),showTooltip:_(s,T),highlight:_(l,A)};x(t.coordSysMap,function(e,a){var r=e.containPoint(i);x(t.coordSysAxesInfo[a],function(t,e){var a=t.axis;S||!r||d(n,a)||o(t,a.pointToData(i),C,!1,M)})});var L={};return x(w,function(t,e){var i=t.linkGroup;i&&!I[e]&&x(i.axesInfo,function(e,n){var o=I[n];if(e!==t&&o){var a=o.value;i.mapper&&(a=t.axis.scale.parse(i.mapper(a,f(e),f(t)))),L[t.key]=a}})}),x(L,function(t,e){o(w[e],t,C,!0,M)}),u(I,w),c(T,i,v,a),h(A,a,m,b),M}function o(t,e,i,n,o){var r=t.axis;if(!r.scale.isBlank()&&r.containData(e)){if(!t.involveSeries)return void i.showPointer(t,e);var s=a(e,t),l=s.payloadBatch,u=s.snapToValue;l[0]&&null==o.seriesIndex&&g.extend(o,l[0]),!n&&t.snap&&r.containData(u)&&null!=u&&(e=u),i.highlight("highlight",l),i.showPointer(t,e,l),i.showTooltip(t,s,u)}}function a(t,e){var i=e.axis,n=i.dim,o=t,a=[],r=Number.MAX_VALUE,s=-1;return x(e.seriesModels,function(e,l){var u,c,h=e.coordDimToDataDim(n);if(e.getAxisTooltipData){var d=e.getAxisTooltipData(h,t,i);c=d.dataIndices,u=d.nestestValue}else{if(c=e.getData().indicesOfNearest(h[0],t,!1,"category"===i.type?.5:null),!c.length)return;u=e.getData().get(h[0],c[0])}if(null!=u&&isFinite(u)){var f=t-u,p=Math.abs(f);p<=r&&((p<r||f>=0&&s<0)&&(r=p,s=f,o=u,a.length=0),x(c,function(t){a.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})}))}}),{payloadBatch:a,snapToValue:o}}function r(t,e,i,n){t[e.key]={value:i,payloadBatch:n}}function s(t,e,i,n){var o=i.payloadBatch,a=e.axis,r=a.model,s=e.axisPointerModel;if(e.triggerTooltip&&o.length){var l=e.coordSys.model,u=v.makeKey(l),c=t.map[u];c||(c=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(c)),c.dataByAxis.push({axisDim:a.dim,axisIndex:r.componentIndex,axisType:r.type,axisId:r.id,value:n,valueLabelOpt:{precision:s.get("label.precision"),formatter:s.get("label.formatter")},seriesDataIndices:o.slice()})}}function l(t,e,i){t.push.apply(t,i)}function u(t,e){x(e,function(e,i){var n=e.axisPointerModel.option,o=t[i];o?(!e.useHandle&&(n.status="show"),n.value=o.value,n.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(n.status="hide")})}function c(t,e,i,n){if(p(e)||!t.list.length)return void n({type:"hideTip"});var o=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};n({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:i,dataIndexInside:o.dataIndexInside,dataIndex:o.dataIndex,seriesIndex:o.seriesIndex,dataByCoordSys:t.list})}function h(t,e,i,n){var o=i.getZr();n="lastHighlights"+(n||"");var a=b(o)[n]||{},r=b(o)[n]={};g.each(t,function(t){var e=t.seriesIndex+" | "+t.dataIndex;r[e]=t});var s=[],l=[];g.each(a,function(t,e){!r[e]&&l.push(t)}),g.each(r,function(t,e){!a[e]&&s.push(t)}),l.length&&i.dispatchAction({type:"downplay",escapeConnect:!0,batch:l}),s.length&&i.dispatchAction({type:"highlight",escapeConnect:!0,batch:s})}function d(t,e){var i=1;return x(t,function(t,e){i&=!/^.+(AxisId|AxisName|AxisIndex)$/.test(e)}),!i&&x([["AxisId","id"],["AxisIndex","componentIndex"],["AxisName","name"]],function(n){var o=m.normalizeToArray(t[e.dim+n[0]]);i|=g.indexOf(o,e.model[n[1]])>=0}),!i}function f(t){var e=t.axis.model,i={},n=i.axisDim=t.axis.dim;return i.axisIndex=i[n+"AxisIndex"]=e.componentIndex,i.axisName=i[n+"AxisName"]=e.name,i.axisId=i[n+"AxisId"]=e.id,i}function p(t){return null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}var g=i(1),m=i(6),v=i(45),y=i(120),x=g.each,_=g.curry,b=m.makeGetter();t.exports=n},function(t,e,i){i(125),i(46),i(47),i(203),i(204),i(199),i(200),i(123),i(122)},function(t,e,i){function n(t,e,i){var n=[1/0,-(1/0)];return u(i,function(t){var i=t.getData();i&&u(t.coordDimToDataDim(e),function(t){var e=i.getDataExtent(t);e[0]<n[0]&&(n[0]=e[0]),e[1]>n[1]&&(n[1]=e[1])})}),n[1]<n[0]&&(n=[NaN,NaN]),o(t,n),n}function o(t,e){var i=t.getAxisModel(),n=i.getMin(!0),o="category"===i.get("type"),a=o&&(i.get("data")||[]).length;null!=n&&"dataMin"!==n?e[0]=n:o&&(e[0]=a>0?0:NaN);var r=i.getMax(!0);return null!=r&&"dataMax"!==r?e[1]=r:o&&(e[1]=a>0?a-1:NaN),i.get("scale",!0)||(e[0]>0&&(e[0]=0),e[1]<0&&(e[1]=0)),e}function a(t,e){var i=t.getAxisModel(),n=t._percentWindow,o=t._valueWindow;if(n){var a=s.getPixelPrecision(o,[0,500]),r=e||0===n[0]&&100===n[1];i.setRange(r?null:+o[0].toFixed(a),r?null:+o[1].toFixed(a))}}var r=i(1),s=i(4),l=i(76),u=r.each,c=s.asc,h=function(t,e,i,n){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this.ecModel=n,this._dataZoomModel=i};h.prototype={constructor:h,hostedBy:function(t){return this._dataZoomModel===t},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[],e=this.ecModel;return e.eachSeries(function(i){if(l.isCoordSupported(i.get("coordinateSystem"))){var n=this._dimName,o=e.queryComponents({mainType:n+"Axis",index:i.get(n+"AxisIndex"),id:i.get(n+"AxisId")})[0];this._axisIndex===(o&&o.componentIndex)&&t.push(i)}},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,i=this._dimName,n=this.ecModel,o=this.getAxisModel(),a="x"===i||"y"===i;a?(e="gridIndex",t="x"===i?"y":"x"):(e="polarIndex",t="angle"===i?"radius":"angle");var r;return n.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(o.get(e)||0)&&(r=t)}),r},calculateDataWindow:function(t){var e=this._dataExtent,i=this.getAxisModel(),n=i.axis.scale,o=this._dataZoomModel.getRangePropMode(),a=[0,100],r=[t.start,t.end],l=[];return u(["startValue","endValue"],function(e){l.push(null!=t[e]?n.parse(t[e]):null)}),u([0,1],function(t){var i=l[t],u=r[t];"percent"===o[t]?(null==u&&(u=a[t]),i=n.parse(s.linearMap(u,a,e,!0))):u=s.linearMap(i,e,a,!0),l[t]=i,r[t]=u}),{valueWindow:c(l),percentWindow:c(r)}},reset:function(t){if(t===this._dataZoomModel){this._dataExtent=n(this,this._dimName,this.getTargetSeriesModels());var e=this.calculateDataWindow(t.option);this._valueWindow=e.valueWindow,this._percentWindow=e.percentWindow,a(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,a(this,!0))},filterData:function(t){function e(t){return t>=a[0]&&t<=a[1]}if(t===this._dataZoomModel){var i=this._dimName,n=this.getTargetSeriesModels(),o=t.get("filterMode"),a=this._valueWindow,r=this.getOtherAxisModel();t.get("$fromToolbox")&&r&&"category"===r.get("type")&&(o="empty"),u(n,function(t){var n=t.getData();n&&u(t.coordDimToDataDim(i),function(i){"empty"===o?t.setData(n.map(i,function(t){return e(t)?t:NaN})):n.filterSelf(i,e)})})}}},t.exports=h},function(t,e,i){t.exports=i(46).extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1}})},function(t,e,i){function n(t){var e=[0,100];return!(t[0]<=e[1])&&(t[0]=e[1]),!(t[1]<=e[1])&&(t[1]=e[1]),!(t[0]>=e[0])&&(t[0]=e[0]),!(t[1]>=e[0])&&(t[1]=e[0]),t}var o=i(47),a=i(1),r=i(78),s=i(205),l=a.bind,u=o.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,i,n){u.superApply(this,"render",arguments),s.shouldRecordRange(n,t.id)&&(this._range=t.getPercentRange()),a.each(this.getTargetCoordInfo(),function(e,n){var o=a.map(e,function(t){return s.generateCoordId(t.model)});a.each(e,function(e){var a=e.model;s.register(i,{coordId:s.generateCoordId(a),allCoordIds:o,containsPoint:function(t,e,i){return a.coordinateSystem.containPoint([e,i])},dataZoomId:t.id,throttleRate:t.get("throttle",!0),panGetRange:l(this._onPan,this,e,n),zoomGetRange:l(this._onZoom,this,e,n)})},this)},this)},dispose:function(){s.unregister(this.api,this.dataZoomModel.id),u.superApply(this,"dispose",arguments),this._range=null},_onPan:function(t,e,i,n,o,a,s,l,u){if(this.dataZoomModel.option.disabled)return this._range;var h=this._range.slice(),d=t.axisModels[0];if(d){var f=c[e]([a,s],[l,u],d,i,t),p=f.signal*(h[1]-h[0])*f.pixel/f.pixelLength;return r(p,h,[0,100],"rigid"),this._range=h}},_onZoom:function(t,e,i,o,a,r){var s=this.dataZoomModel.option;if(s.disabled||s.zoomLock)return this._range;var l=this._range.slice(),u=t.axisModels[0];if(u){var h=c[e](null,[a,r],u,i,t),d=(h.pixel-h.pixelStart)/h.pixelLength*(l[1]-l[0])+l[0];return o=Math.max(1/o,0),l[0]=(l[0]-d)*o+d,l[1]=(l[1]-d)*o+d,this._range=n(l)}}}),c={grid:function(t,e,i,n,o){var a=i.axis,r={},s=o.model.coordinateSystem.getRect();return t=t||[0,0],"x"===a.dim?(r.pixel=e[0]-t[0],r.pixelLength=s.width,r.pixelStart=s.x,r.signal=a.inverse?1:-1):(r.pixel=e[1]-t[1],r.pixelLength=s.height,r.pixelStart=s.y,r.signal=a.inverse?-1:1),r},polar:function(t,e,i,n,o){var a=i.axis,r={},s=o.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===i.mainType?(r.pixel=e[0]-t[0],r.pixelLength=l[1]-l[0],r.pixelStart=l[0],r.signal=a.inverse?1:-1):(r.pixel=e[1]-t[1],r.pixelLength=u[1]-u[0],r.pixelStart=u[0],r.signal=a.inverse?-1:1),r},singleAxis:function(t,e,i,n,o){var a=i.axis,r=o.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===a.orient?(s.pixel=e[0]-t[0],s.pixelLength=r.width,s.pixelStart=r.x,s.signal=a.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=r.height,s.pixelStart=r.y,s.signal=a.inverse?-1:1),s}};t.exports=u},function(t,e,i){var n=i(46);t.exports=n.extend({type:"dataZoom.select"})},function(t,e,i){t.exports=i(47).extend({type:"dataZoom.select"})},function(t,e,i){var n=i(46),o=n.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}});t.exports=o},function(t,e,i){function n(t){var e={x:"y",y:"x",radius:"angle",angle:"radius"};return e[t]}var o=i(1),a=i(3),r=i(37),s=i(47),l=a.Rect,u=i(4),c=u.linearMap,h=i(12),d=i(78),f=i(21),p=u.asc,g=o.bind,m=o.each,v=7,y=1,x=30,_="horizontal",b="vertical",w=5,S=["line","bar","candlestick","scatter"],M=s.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){return M.superApply(this,"render",arguments),r.createOrUpdate(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),this.dataZoomModel.get("show")===!1?void this.group.removeAll():(n&&"dataZoom"===n.type&&n.from===this.uid||this._buildView(),void this._updateView())},remove:function(){M.superApply(this,"remove",arguments),r.clear(this,"_dispatchZoomAction")},dispose:function(){M.superApply(this,"dispose",arguments),r.clear(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new a.Group;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},a=this._orient===_?{right:n.width-i.x-i.width,top:n.height-x-v,width:i.width,height:x}:{right:v,top:i.y,width:x,height:i.height},r=h.getLayoutParams(t.option);o.each(["right","top","width","height"],function(t){"ph"===r[t]&&(r[t]=a[t])});var s=h.getLayoutRect(r,n,t.padding);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===b&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),o=n&&n.get("inverse"),a=this._displayables.barGroup,r=(this._dataShadowInfo||{}).otherAxisInverse;a.attr(i!==_||o?i===_&&o?{scale:r?[-1,1]:[-1,-1]}:i!==b||o?{scale:r?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:r?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:r?[1,1]:[1,-1]});var s=t.getBoundingRect([a]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size;this._displayables.barGroup.add(new l({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),r=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=r){var s=n.getDataExtent(r),l=.3*(s[1]-s[0]);s=[s[0]-l,s[1]+l];var u,h=[0,e[1]],d=[0,e[0]],f=[[e[0],0],[0,0]],p=[],g=d[1]/(n.count()-1),m=0,v=Math.round(n.count()/e[0]);n.each([r],function(t,e){if(v>0&&e%v)return void(m+=g);var i=null==t||isNaN(t)||""===t,n=i?0:c(t,s,h,!0);i&&!u&&e?(f.push([f[f.length-1][0],0]),p.push([p[p.length-1][0],0])):!i&&u&&(f.push([m,0]),p.push([m,0])),f.push([m,n]),p.push([m,n]),m+=g,u=i});var y=this.dataZoomModel;this._displayables.barGroup.add(new a.Polygon({shape:{points:f},style:o.defaults({fill:y.get("dataBackgroundColor")},y.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new a.Polyline({shape:{points:p},style:y.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(e!==!1){var i,a=this.ecModel;return t.eachTargetAxis(function(r,s){var l=t.getAxisProxy(r.name,s).getTargetSeriesModels();o.each(l,function(t){if(!(i||e!==!0&&o.indexOf(S,t.get("type"))<0)){var l,u=a.getComponent(r.axis,s).axis,c=n(r.name),h=t.coordinateSystem;null!=c&&h.getOtherAxis&&(l=h.getOtherAxis(u).inverse),i={thisAxis:u,series:t,thisDim:r.name,otherDim:c,otherAxisInverse:l}}},this)},this),i}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],i=t.handleLabels=[],n=this._displayables.barGroup,o=this._size,r=this.dataZoomModel;n.add(t.filler=new l({draggable:!0,cursor:"move",drift:g(this._onDragMove,this,"all"),onmousemove:function(t){f.stop(t.event)},ondragstart:g(this._showDataInfo,this,!0),ondragend:g(this._onDragEnd,this),onmouseover:g(this._showDataInfo,this,!0),onmouseout:g(this._showDataInfo,this,!1),style:{fill:r.get("fillerColor"),textPosition:"inside"}})),n.add(new l(a.subPixelOptimizeRect({silent:!0,shape:{x:0,y:0,width:o[0],height:o[1]},style:{stroke:r.get("dataBackgroundColor")||r.get("borderColor"),lineWidth:y,fill:"rgba(0,0,0,0)"}})));var s=r.get("handleIcon");m([0,1],function(t){var o=a.makePath(s,{style:{strokeNoScale:!0},rectHover:!0,cursor:"vertical"===this._orient?"ns-resize":"ew-resize",draggable:!0,drift:g(this._onDragMove,this,t),onmousemove:function(t){f.stop(t.event)},ondragend:g(this._onDragEnd,this),onmouseover:g(this._showDataInfo,this,!0),onmouseout:g(this._showDataInfo,this,!1)},{x:-.5,y:0,width:1,height:1},"center"),l=o.getBoundingRect();this._handleHeight=u.parsePercent(r.get("handleSize"),this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,o.setStyle(r.getModel("handleStyle").getItemStyle());var c=r.get("handleColor");null!=c&&(o.style.fill=c),n.add(e[t]=o);var h=r.textStyleModel;this.group.add(i[t]=new a.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",fill:h.getTextColor(),textFont:h.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[c(t[0],[0,100],e,!0),c(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var i=this._handleEnds,n=this._getViewExtent();d(e,i,n,"all"===t||this.dataZoomModel.get("zoomLock")?"rigid":"cross",t),this._range=p([c(i[0],n,[0,100],!0),c(i[1],n,[0,100],!0)])},_updateView:function(t){var e=this._displayables,i=this._handleEnds,n=p(i.slice()),o=this._size;m([0,1],function(t){var n=e.handles[t],a=this._handleHeight;n.attr({scale:[a,a],position:[i[t],o[1]/2-a/2]})},this),e.filler.setShape({x:n[0],y:0,width:n[1]-n[0],height:o[1]}),this._updateDataInfo(t)},_updateDataInfo:function(t){function e(t){var e=a.getTransform(n.handles[t].parent,this.group),i=a.transformDirection(0===t?"right":"left",e),l=this._handleWidth/2+w,u=a.applyTransform([d[t]+(0===t?-l:l),this._size[1]/2],e);o[t].setStyle({x:u[0],y:u[1],textVerticalAlign:r===_?"middle":i,textAlign:r===_?i:"center",text:s[t]})}var i=this.dataZoomModel,n=this._displayables,o=n.handleLabels,r=this._orient,s=["",""];if(i.get("showDetail")){var l=i.findRepresentativeAxisProxy();if(l){var u=l.getAxisModel().axis,c=this._range,h=t?l.calculateDataWindow({start:c[0],end:c[1]}).valueWindow:l.getDataValueWindow();s=[this._formatLabel(h[0],u),this._formatLabel(h[1],u)]}}var d=p(this._handleEnds.slice());e.call(this,0),e.call(this,1)},_formatLabel:function(t,e){var i=this.dataZoomModel,n=i.get("labelFormatter"),a=i.get("labelPrecision");null!=a&&"auto"!==a||(a=e.getPixelPrecision());var r=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(a,20));return o.isFunction(n)?n(t,r):o.isString(n)?n.replace("{value}",r):r},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,i){this._dragging=!0;var n=this._applyBarTransform([e,i],!0);this._updateInterval(t,n[0]);var o=this.dataZoomModel.get("realtime");this._updateView(!o),o&&o&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),this._dispatchZoomAction()},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_applyBarTransform:function(t,e){var i=this._displayables.barGroup.getLocalTransform();return a.applyTransform(t,i,e)},_findCoordRect:function(){var t;if(m(this.getTargetCoordInfo(),function(e){if(!t&&e.length){var i=e[0].model.coordinateSystem;t=i.getRect&&i.getRect()}}),!t){var e=this.api.getWidth(),i=this.api.getHeight();t={x:.2*e,y:.2*i,width:.6*e,height:.6*i}}return t}});t.exports=M},function(t,e,i){function n(t){var e=t.getZr();return e[p]||(e[p]={})}function o(t,e,i){var n=new h(t.getZr());return n.enable(),n.on("pan",f(r,i)),n.on("zoom",f(s,i)),n}function a(t){c.each(t,function(e,i){e.count||(e.controller.dispose(),delete t[i])})}function r(t,e,i,n,o,a,r){l(t,function(s){return s.panGetRange(t.controller,e,i,n,o,a,r)})}function s(t,e,i,n){l(t,function(o){return o.zoomGetRange(t.controller,e,i,n)})}function l(t,e){var i=[];c.each(t.dataZoomInfos,function(t){var n=e(t);n&&i.push({dataZoomId:t.dataZoomId,start:n[0],end:n[1]})}),t.dispatchAction(i)}function u(t,e){t.dispatchAction({type:"dataZoom",batch:e})}var c=i(1),h=i(93),d=i(37),f=c.curry,p="\0_ec_dataZoom_roams",g={register:function(t,e){var i=n(t),r=e.dataZoomId,s=e.coordId;c.each(i,function(t,i){var n=t.dataZoomInfos;n[r]&&c.indexOf(e.allCoordIds,s)<0&&(delete n[r],t.count--)}),a(i);var l=i[s];l||(l=i[s]={coordId:s,dataZoomInfos:{},count:0},l.controller=o(t,e,l),l.dispatchAction=c.curry(u,t)),l.controller.setPointerChecker(e.containsPoint),d.createOrUpdate(l,"dispatchAction",e.throttleRate,"fixRate"),!l.dataZoomInfos[r]&&l.count++,l.dataZoomInfos[r]=e},unregister:function(t,e){var i=n(t);c.each(i,function(t){t.controller.dispose();var i=t.dataZoomInfos;i[e]&&(delete i[e],t.count--)}),a(i)},shouldRecordRange:function(t,e){if(t&&"dataZoom"===t.type&&t.batch)for(var i=0,n=t.batch.length;i<n;i++)if(t.batch[i].dataZoomId===e)return!1;return!0},generateCoordId:function(t){return t.type+"\0_"+t.id}};t.exports=g},function(t,e,i){i(125),i(46),i(47),i(201),i(202),i(123),i(122)},function(t,e,i){function n(t,e,i,n){var o=i.type,a=f[o.charAt(0).toUpperCase()+o.slice(1)],r=new a(i);e.add(r),n[t]=r,r.__ecGraphicId=t}function o(t,e){var i=t&&t.parent;i&&("group"===t.type&&t.traverse(function(t){o(t,e)}),
-delete e[t.__ecGraphicId],i.remove(t))}function a(t){return t=h.extend({},t),h.each(["id","parentId","$action","hv","bounding"].concat(p.LOCATION_PARAMS),function(e){delete t[e]}),t}function r(t,e){var i;return h.each(e,function(e){null!=t[e]&&"auto"!==t[e]&&(i=!0)}),i}function s(t,e){var i=t.exist;if(e.id=t.keyInfo.id,!e.type&&i&&(e.type=i.type),null==e.parentId){var n=e.parentOption;n?e.parentId=n.id:i&&(e.parentId=i.parentId)}e.parentOption=null}function l(t,e,i){var n=h.extend({},i),o=t[e],a=i.$action||"merge";if("merge"===a)if(o){h.merge(o,n,!0),p.mergeLayoutParam(o,n,{ignoreSize:!0}),p.copyLayoutParams(i,o)}else t[e]=n;else"replace"===a?t[e]=n:"remove"===a&&o&&(t[e]=null)}function u(t,e){t&&(t.hv=e.hv=[r(e,["left","right"]),r(e,["top","bottom"])],"group"===t.type&&(null==t.width&&(t.width=e.width=0),null==t.height&&(t.height=e.height=0)))}var c=i(2),h=i(1),d=i(6),f=i(3),p=i(12);c.registerPreprocessor(function(t){var e=t.graphic;h.isArray(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])});var g=c.extendComponentModel({type:"graphic",defaultOption:{elements:[],parentId:null},_elOptionsToUpdate:null,mergeOption:function(t){var e=this.option.elements;this.option.elements=null,g.superApply(this,"mergeOption",arguments),this.option.elements=e},optionUpdated:function(t,e){var i=this.option,n=(e?i:t).elements,o=i.elements=e?[]:i.elements,a=[];this._flatten(n,a);var r=d.mappingToExists(o,a);d.makeIdAndName(r);var c=this._elOptionsToUpdate=[];h.each(r,function(t,e){var i=t.option;i&&(c.push(i),s(t,i),l(o,e,i),u(o[e],i))},this);for(var f=o.length-1;f>=0;f--)null==o[f]?o.splice(f,1):delete o[f].$action},_flatten:function(t,e,i){h.each(t,function(t){if(t){i&&(t.parentOption=i),e.push(t);var n=t.children;"group"===t.type&&n&&this._flatten(n,e,t),delete t.children}},this)},useElOptionsToUpdate:function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t}});c.extendComponentView({type:"graphic",init:function(t,e){this._elMap={},this._lastGraphicModel},render:function(t,e,i){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t,i),this._relocate(t,i)},_updateElements:function(t,e){var i=t.useElOptionsToUpdate();if(i){var r=this._elMap,s=this.group;h.each(i,function(t){var e=t.$action,i=t.id,l=r[i],u=t.parentId,c=null!=u?r[u]:s;t.hv&&t.hv[1]&&"text"===t.type&&(t.style=h.defaults({textBaseline:"middle"},t.style),t.style.textVerticalAlign=null);var d=a(t);e&&"merge"!==e?"replace"===e?(o(l,r),n(i,c,d,r)):"remove"===e&&o(l,r):l?l.attr(d):n(i,c,d,r),r[i]&&(r[i].__ecGraphicWidth=t.width,r[i].__ecGraphicHeight=t.height)})}},_relocate:function(t,e){for(var i=t.option.elements,n=this.group,o=this._elMap,a=i.length-1;a>=0;a--){var r=i[a],s=o[r.id];if(s){var l=s.parent,u=l===n?{width:e.getWidth(),height:e.getHeight()}:{width:l.__ecGraphicWidth||0,height:l.__ecGraphicHeight||0};p.positionElement(s,r,u,null,{hv:r.hv,boundingMode:r.bounding})}}},_clear:function(){var t=this._elMap;h.each(t,function(e){o(e,t)}),this._elMap={}},dispose:function(){this._clear()}})},function(t,e,i){i(32),i(119),i(55)},function(t,e,i){i(210),i(212),i(211);var n=i(2);n.registerProcessor(i(213))},function(t,e,i){"use strict";var n=i(1),o=i(10),a=i(2).extendComponentModel({type:"legend",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,i){this.mergeDefaultAndTheme(t,i),t.selected=t.selected||{}},mergeOption:function(t){a.superCall(this,"mergeOption",t)},optionUpdated:function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,i=0;i<t.length;i++){var n=t[i].get("name");if(this.isSelected(n)){this.select(n),e=!0;break}}!e&&this.select(t[0].get("name"))}},_updateData:function(t){var e=n.map(this.get("data")||[],function(t){return"string"!=typeof t&&"number"!=typeof t||(t={name:t}),new o(t,this,this.ecModel)},this);this._data=e;var i=n.map(t.getSeries(),function(t){return t.name});t.eachSeries(function(t){if(t.legendDataProvider){var e=t.legendDataProvider();i=i.concat(e.mapArray(e.getName))}}),this._availableNames=i},getData:function(){return this._data},select:function(t){var e=this.option.selected,i=this.get("selectedMode");if("single"===i){var o=this._data;n.each(o,function(t){e[t.get("name")]=!1})}e[t]=!0},unSelect:function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},isSelected:function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&n.indexOf(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:"top",align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,tooltip:{show:!1}}});t.exports=a},function(t,e,i){function n(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function o(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get("legendHoverLink")&&i.dispatchAction({type:"highlight",seriesName:t.name,name:e})}function a(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get("legendHoverLink")&&i.dispatchAction({type:"downplay",seriesName:t.name,name:e})}var r=i(1),s=i(24),l=i(3),u=i(129),c=r.curry;t.exports=i(2).extendComponentView({type:"legend",init:function(){this._symbolTypeStore={}},render:function(t,e,i){var s=this.group;if(s.removeAll(),t.get("show")){var h=t.get("selectedMode"),d=t.get("align");"auto"===d&&(d="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left");var f={};r.each(t.getData(),function(r){var u=r.get("name");if(""===u||"\n"===u)return void s.add(new l.Group({newline:!0}));var p=e.getSeriesByName(u)[0];if(!f[u])if(p){var g=p.getData(),m=g.getVisual("color");"function"==typeof m&&(m=m(p.getDataParams(0)));var v=g.getVisual("legendSymbol")||"roundRect",y=g.getVisual("symbol"),x=this._createItem(u,r,t,v,y,d,m,h);x.on("click",c(n,u,i)).on("mouseover",c(o,p,null,i)).on("mouseout",c(a,p,null,i)),f[u]=!0}else e.eachRawSeries(function(e){if(!f[u]&&e.legendDataProvider){var s=e.legendDataProvider(),l=s.indexOfName(u);if(l<0)return;var p=s.getItemVisual(l,"color"),g="roundRect",m=this._createItem(u,r,t,g,null,d,p,h);m.on("click",c(n,u,i)).on("mouseover",c(o,e,u,i)).on("mouseout",c(a,e,u,i)),f[u]=!0}},this)},this),u.layout(s,t,i),u.addBackground(s,t)}},_createItem:function(t,e,i,n,o,a,u,c){var h=i.get("itemWidth"),d=i.get("itemHeight"),f=i.get("inactiveColor"),p=i.isSelected(t),g=new l.Group,m=e.getModel("textStyle"),v=e.get("icon"),y=e.getModel("tooltip"),x=y.parentModel;if(n=v||n,g.add(s.createSymbol(n,0,0,h,d,p?u:f)),!v&&o&&(o!==n||"none"==o)){var _=.8*d;"none"===o&&(o="circle"),g.add(s.createSymbol(o,(h-_)/2,(d-_)/2,_,_,p?u:f))}var b="left"===a?h+5:-5,w=a,S=i.get("formatter"),M=t;"string"==typeof S&&S?M=S.replace("{name}",null!=t?t:""):"function"==typeof S&&(M=S(t));var I=new l.Text({style:{text:M,x:b,y:d/2,fill:p?m.getTextColor():f,textFont:m.getFont(),textAlign:w,textVerticalAlign:"middle"}});g.add(I);var T=new l.Rect({shape:g.getBoundingRect(),invisible:!0,tooltip:y.get("show")?r.extend({content:t,formatter:x.get("formatter",!0)||function(){return t},formatterParams:{componentType:"legend",legendIndex:i.componentIndex,name:t,$vars:["name"]}},y.option):null});return g.add(T),g.eachChild(function(t){t.silent=!0}),T.silent=!c,this.group.add(g),l.setHoverStyle(g),g}})},function(t,e,i){function n(t,e,i){var n,o={},r="toggleSelected"===t;return i.eachComponent("legend",function(i){r&&null!=n?i[n?"select":"unSelect"](e.name):(i[t](e.name),n=i.isSelected(e.name));var s=i.getData();a.each(s,function(t){var e=t.get("name");if("\n"!==e&&""!==e){var n=i.isSelected(e);e in o?o[e]=o[e]&&n:o[e]=n}})}),{name:e.name,selected:o}}var o=i(2),a=i(1);o.registerAction("legendToggleSelect","legendselectchanged",a.curry(n,"toggleSelected")),o.registerAction("legendSelect","legendselected",a.curry(n,"select")),o.registerAction("legendUnSelect","legendunselected",a.curry(n,"unSelect"))},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var i=0;i<e.length;i++)if(!e[i].isSelected(t.name))return!1;return!0})}},function(t,e,i){i(217),i(218),i(2).registerPreprocessor(function(t){t.markArea=t.markArea||{}})},function(t,e,i){i(219),i(220),i(2).registerPreprocessor(function(t){t.markLine=t.markLine||{}})},function(t,e,i){i(221),i(222),i(2).registerPreprocessor(function(t){t.markPoint=t.markPoint||{}})},function(t,e,i){t.exports=i(79).extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{normal:{show:!0,position:"top"},emphasis:{show:!0,position:"top"}},itemStyle:{normal:{borderWidth:0}}}})},function(t,e,i){function n(t){return!isNaN(t)&&!isFinite(t)}function o(t,e,i,o){var a=1-t;return n(e[a])&&n(i[a])}function a(t,e){var i=e.coord[0],n=e.coord[1];return!("cartesian2d"!==t.type||!i||!n||!o(1,i,n,t)&&!o(0,i,n,t))||(f.dataFilter(t,{coord:i,x:e.x0,y:e.y0})||f.dataFilter(t,{coord:n,x:e.x1,y:e.y1}))}function r(t,e,i,o,a){var r,s=o.coordinateSystem,l=t.getItemModel(e),u=c.parsePercent(l.get(i[0]),a.getWidth()),h=c.parsePercent(l.get(i[1]),a.getHeight());if(isNaN(u)||isNaN(h)){if(o.getMarkerPosition)r=o.getMarkerPosition(t.getValues(i,e));else{var d=t.get(i[0],e),f=t.get(i[1],e);r=s.dataToPoint([d,f],!0)}if("cartesian2d"===s.type){var p=s.getAxis("x"),g=s.getAxis("y"),d=t.get(i[0],e),f=t.get(i[1],e);n(d)?r[0]=p.toGlobalCoord(p.getExtent()["x0"===i[0]?0:1]):n(f)&&(r[1]=g.toGlobalCoord(g.getExtent()["y0"===i[1]?0:1]))}isNaN(u)||(r[0]=u),isNaN(h)||(r[1]=h)}else r=[u,h];return r}function s(t,e,i){var n,o,r=["x0","y0","x1","y1"];t?(n=l.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}),o=new u(l.map(r,function(t,e){return{name:t,type:n[e%2].type}}),i)):(n=[{name:"value",type:"float"}],o=new u(n,i));var s=l.map(i.get("data"),l.curry(p,e,t,i));t&&(s=l.filter(s,l.curry(a,t)));var c=t?function(t,e,i,n){return t.coord[Math.floor(n/2)][n%2]}:function(t){return t.value};return o.initData(s,null,c),o.hasItemOption=!0,o}var l=i(1),u=i(14),c=i(4),h=i(3),d=i(22),f=i(81),p=function(t,e,i,n){var o=f.dataTransform(t,n[0]),a=f.dataTransform(t,n[1]),r=l.retrieve,s=o.coord,u=a.coord;s[0]=r(s[0],-(1/0)),s[1]=r(s[1],-(1/0)),u[0]=r(u[0],1/0),u[1]=r(u[1],1/0);var c=l.mergeAll([{},o,a]);return c.coord=[o.coord,a.coord],c.x0=o.x,c.y0=o.y,c.x1=a.x,c.y1=a.y,c},g=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];i(80).extend({type:"markArea",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var n=e.getData();n.each(function(e){var o=l.map(g,function(o){return r(n,e,o,t,i)});n.setItemLayout(e,o);var a=n.getItemGraphicEl(e);a.setShape("points",o)})}},this)},renderSeries:function(t,e,i,n){var o=t.coordinateSystem,a=t.name,u=t.getData(),c=this.markerGroupMap,f=c[a];f||(f=c[a]={group:new h.Group}),this.group.add(f.group),f.__keep=!0;var p=s(o,t,e);e.setData(p),p.each(function(e){p.setItemLayout(e,l.map(g,function(i){return r(p,e,i,t,n)})),p.setItemVisual(e,{color:u.getVisual("color")})}),p.diff(f.__data).add(function(t){var e=new h.Polygon({shape:{points:p.getItemLayout(t)}});p.setItemGraphicEl(t,e),f.group.add(e)}).update(function(t,i){var n=f.__data.getItemGraphicEl(i);h.updateProps(n,{shape:{points:p.getItemLayout(t)}},e,t),f.group.add(n),p.setItemGraphicEl(t,n)}).remove(function(t){var e=f.__data.getItemGraphicEl(t);f.group.remove(e)}).execute(),p.eachItemGraphicEl(function(t,i){var n=p.getItemModel(i),o=n.getModel("label.normal"),a=n.getModel("label.emphasis"),r=p.getItemVisual(i,"color");t.useStyle(l.defaults(n.getModel("itemStyle.normal").getItemStyle(),{fill:d.modifyAlpha(r,.4),stroke:r})),t.hoverStyle=n.getModel("itemStyle.normal").getItemStyle();var s=p.getName(i)||"",u=r||t.style.fill;o.getShallow("show")?(h.setText(t.style,o,u),t.style.text=l.retrieve(e.getFormattedLabel(i,"normal"),s)):t.style.text="",a.getShallow("show")?(h.setText(t.hoverStyle,a,u),t.hoverStyle.text=l.retrieve(e.getFormattedLabel(i,"emphasis"),s)):t.hoverStyle.text="",h.setHoverStyle(t,{}),t.dataModel=e}),f.__data=p,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,i){t.exports=i(79).extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"end"},emphasis:{show:!0}},lineStyle:{normal:{type:"dashed"},emphasis:{width:3}},animationEasing:"linear"}})},function(t,e,i){function n(t){return!isNaN(t)&&!isFinite(t)}function o(t,e,i,o){var a=1-t,r=o.dimensions[t];return n(e[a])&&n(i[a])&&e[t]===i[t]&&o.getAxis(r).containData(e[t])}function a(t,e){if("cartesian2d"===t.type){var i=e[0].coord,n=e[1].coord;if(i&&n&&(o(1,i,n,t)||o(0,i,n,t)))return!0}return h.dataFilter(t,e[0])&&h.dataFilter(t,e[1])}function r(t,e,i,o,a){var r,s=o.coordinateSystem,l=t.getItemModel(e),u=c.parsePercent(l.get("x"),a.getWidth()),h=c.parsePercent(l.get("y"),a.getHeight());if(isNaN(u)||isNaN(h)){if(o.getMarkerPosition)r=o.getMarkerPosition(t.getValues(t.dimensions,e));else{var d=s.dimensions,f=t.get(d[0],e),p=t.get(d[1],e);r=s.dataToPoint([f,p])}if("cartesian2d"===s.type){var g=s.getAxis("x"),m=s.getAxis("y"),d=s.dimensions;n(t.get(d[0],e))?r[0]=g.toGlobalCoord(g.getExtent()[i?0:1]):n(t.get(d[1],e))&&(r[1]=m.toGlobalCoord(m.getExtent()[i?0:1]))}isNaN(u)||(r[0]=u),isNaN(h)||(r[1]=h)}else r=[u,h];t.setItemLayout(e,r)}function s(t,e,i){var n;n=t?l.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:"value",type:"float"}];var o=new u(n,i),r=new u(n,i),s=new u([],i),c=l.map(i.get("data"),l.curry(f,e,t,i));t&&(c=l.filter(c,l.curry(a,t)));var d=t?h.dimValueGetter:function(t){return t.value};return o.initData(l.map(c,function(t){return t[0]}),null,d),r.initData(l.map(c,function(t){return t[1]}),null,d),s.initData(l.map(c,function(t){return t[2]})),s.hasItemOption=!0,{from:o,to:r,line:s}}var l=i(1),u=i(14),c=i(4),h=i(81),d=i(106),f=function(t,e,i,n){var o=t.getData(),a=n.type;if(!l.isArray(n)&&("min"===a||"max"===a||"average"===a||null!=n.xAxis||null!=n.yAxis)){var r,s,u;if(null!=n.yAxis||null!=n.xAxis)s=null!=n.yAxis?"y":"x",r=e.getAxis(s),u=l.retrieve(n.yAxis,n.xAxis);else{var c=h.getAxisInfo(n,o,e,t);s=c.valueDataDim,r=c.valueAxis,u=h.numCalculate(o,s,a)}var d="x"===s?0:1,f=1-d,p=l.clone(n),g={};p.type=null,p.coord=[],g.coord=[],p.coord[f]=-(1/0),g.coord[f]=1/0;var m=i.get("precision");m>=0&&"number"==typeof u&&(u=+u.toFixed(m)),p.coord[d]=g.coord[d]=u,n=[p,g,{type:a,valueIndex:n.valueIndex,value:u}]}return n=[h.dataTransform(t,n[0]),h.dataTransform(t,n[1]),l.extend({},n[2])],n[2].type=n[2].type||"",l.merge(n[2],n[0]),l.merge(n[2],n[1]),n};i(80).extend({type:"markLine",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markLineModel;if(e){var n=e.getData(),o=e.__from,a=e.__to;o.each(function(e){r(o,e,!0,t,i),r(a,e,!1,t,i)}),n.each(function(t){n.setItemLayout(t,[o.getItemLayout(t),a.getItemLayout(t)])}),this.markerGroupMap[t.name].updateLayout()}},this)},renderSeries:function(t,e,i,n){function o(e,i,o){var a=e.getItemModel(i);r(e,i,o,t,n),e.setItemVisual(i,{symbolSize:a.get("symbolSize")||x[o?0:1],symbol:a.get("symbol",!0)||y[o?0:1],color:a.get("itemStyle.normal.color")||c.getVisual("color")})}var a=t.coordinateSystem,u=t.name,c=t.getData(),h=this.markerGroupMap,f=h[u];f||(f=h[u]=new d),this.group.add(f.group);var p=s(a,t,e),g=p.from,m=p.to,v=p.line;e.__from=g,e.__to=m,e.setData(v);var y=e.get("symbol"),x=e.get("symbolSize");l.isArray(y)||(y=[y,y]),"number"==typeof x&&(x=[x,x]),p.from.each(function(t){o(g,t,!0),o(m,t,!1)}),v.each(function(t){var e=v.getItemModel(t).get("lineStyle.normal.color");v.setItemVisual(t,{color:e||g.getItemVisual(t,"color")}),v.setItemLayout(t,[g.getItemLayout(t),m.getItemLayout(t)]),v.setItemVisual(t,{fromSymbolSize:g.getItemVisual(t,"symbolSize"),fromSymbol:g.getItemVisual(t,"symbol"),toSymbolSize:m.getItemVisual(t,"symbolSize"),toSymbol:m.getItemVisual(t,"symbol")})}),f.updateData(v),p.line.eachItemGraphicEl(function(t,i){t.traverse(function(t){t.dataModel=e})}),f.__keep=!0,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,i){t.exports=i(79).extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"inside"},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:2}}}})},function(t,e,i){function n(t,e,i){var n=e.coordinateSystem;t.each(function(o){var a,r=t.getItemModel(o),l=s.parsePercent(r.get("x"),i.getWidth()),u=s.parsePercent(r.get("y"),i.getHeight());if(isNaN(l)||isNaN(u)){if(e.getMarkerPosition)a=e.getMarkerPosition(t.getValues(t.dimensions,o));else if(n){var c=t.get(n.dimensions[0],o),h=t.get(n.dimensions[1],o);a=n.dataToPoint([c,h])}}else a=[l,u];isNaN(l)||(a[0]=l),isNaN(u)||(a[1]=u),t.setItemLayout(o,a)})}function o(t,e,i){var n;n=t?r.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:"value",type:"float"}];var o=new l(n,i),a=r.map(i.get("data"),r.curry(u.dataTransform,e));return t&&(a=r.filter(a,r.curry(u.dataFilter,t))),o.initData(a,null,t?u.dimValueGetter:function(t){return t.value}),o}var a=i(44),r=i(1),s=i(4),l=i(14),u=i(81);i(80).extend({type:"markPoint",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markPointModel;e&&(n(e.getData(),t,i),this.markerGroupMap[t.name].updateLayout(e))},this)},renderSeries:function(t,e,i,r){var s=t.coordinateSystem,l=t.name,u=t.getData(),c=this.markerGroupMap,h=c[l];h||(h=c[l]=new a);var d=o(s,t,e);e.setData(d),n(e.getData(),t,r),d.each(function(t){var i=d.getItemModel(t),n=i.getShallow("symbolSize");"function"==typeof n&&(n=n(e.getRawValue(t),e.getDataParams(t))),d.setItemVisual(t,{symbolSize:n,color:i.get("itemStyle.normal.color")||u.getVisual("color"),symbol:i.getShallow("symbol")})}),h.updateData(d),this.group.add(h.group),d.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),h.__keep=!0,h.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,i){"use strict";var n=i(2),o=i(3),a=i(12);n.extendComponentModel({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),n.extendComponentView({type:"title",render:function(t,e,i){if(this.group.removeAll(),t.get("show")){var n=this.group,r=t.getModel("textStyle"),s=t.getModel("subtextStyle"),l=t.get("textAlign"),u=t.get("textBaseline"),c=new o.Text({style:{text:t.get("text"),textFont:r.getFont(),fill:r.getTextColor()},z2:10}),h=c.getBoundingRect(),d=t.get("subtext"),f=new o.Text({style:{text:d,textFont:s.getFont(),fill:s.getTextColor(),y:h.height+t.get("itemGap"),textBaseline:"top"},z2:10}),p=t.get("link"),g=t.get("sublink");c.silent=!p,f.silent=!g,p&&c.on("click",function(){window.open(p,"_"+t.get("target"))}),g&&f.on("click",function(){window.open(g,"_"+t.get("subtarget"))}),n.add(c),d&&n.add(f);var m=n.getBoundingRect(),v=t.getBoxLayoutParams();v.width=m.width,v.height=m.height;var y=a.getLayoutRect(v,{width:i.getWidth(),height:i.getHeight()},t.get("padding"));l||(l=t.get("left")||t.get("right"),"middle"===l&&(l="center"),"right"===l?y.x+=y.width:"center"===l&&(y.x+=y.width/2)),u||(u=t.get("top")||t.get("bottom"),"center"===u&&(u="middle"),"bottom"===u?y.y+=y.height:"middle"===u&&(y.y+=y.height/2),u=u||"top"),n.attr("position",[y.x,y.y]);var x={textAlign:l,textVerticalAlign:u};c.setStyle(x),f.setStyle(x),m=n.getBoundingRect();var _=y.margin,b=t.getItemStyle(["color","opacity"]);b.fill=t.get("backgroundColor");var w=new o.Rect({shape:{x:m.x-_[3],y:m.y-_[0],width:m.width+_[1]+_[3],height:m.height+_[0]+_[2]},style:b,silent:!0});o.subPixelOptimizeRect(w),n.add(w)}}})},function(t,e,i){i(225),i(226),i(231),i(229),i(227),i(228),i(230)},function(t,e,i){var n=i(29),o=i(1),a=i(2).extendComponentModel({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(t){a.superApply(this,"mergeDefaultAndTheme",arguments),o.each(this.option.feature,function(t,e){var i=n.get(e);i&&o.merge(t,i.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{normal:{borderColor:"#666",color:"none"},emphasis:{borderColor:"#3E98C5"}}}});t.exports=a},function(t,e,i){(function(e){function n(t){return 0===t.indexOf("my")}var o=i(29),a=i(1),r=i(3),s=i(10),l=i(48),u=i(129),c=i(16);t.exports=i(2).extendComponentView({type:"toolbox",render:function(t,e,i,h){function d(a,r){var l,u=y[a],c=y[r],d=m[u],p=new s(d,t,t.ecModel);if(u&&!c){if(n(u))l={model:p,onclick:p.option.onclick,featureName:u};else{var g=o.get(u);if(!g)return;l=new g(p,e,i)}v[u]=l}else{if(l=v[c],!l)return;l.model=p,l.ecModel=e,l.api=i}return!u&&c?void(l.dispose&&l.dispose(e,i)):!p.get("show")||l.unusable?void(l.remove&&l.remove(e,i)):(f(p,l,u),p.setIconStatus=function(t,e){var i=this.option,n=this.iconPaths;i.iconStatus=i.iconStatus||{},i.iconStatus[t]=e,n[t]&&n[t].trigger(e)},void(l.render&&l.render(p,e,i,h)))}function f(n,o,s){var l=n.getModel("iconStyle"),u=o.getIcons?o.getIcons():n.get("icon"),c=n.get("title")||{};if("string"==typeof u){var h=u,d=c;u={},c={},u[s]=h,c[s]=d}var f=n.iconPaths={};a.each(u,function(s,u){var h=l.getModel("normal").getItemStyle(),d=l.getModel("emphasis").getItemStyle(),m={x:-g/2,y:-g/2,width:g,height:g},v=0===s.indexOf("image://")?(m.image=s.slice(8),new r.Image({style:m})):r.makePath(s.replace("path://",""),{style:h,hoverStyle:d,rectHover:!0},m,"center");r.setHoverStyle(v),t.get("showTitle")&&(v.__title=c[u],v.on("mouseover",function(){var t=l.getModel("emphasis").getItemStyle();v.setStyle({text:c[u],textPosition:t.textPosition||"bottom",textFill:t.fill||t.stroke||"#000",textAlign:t.textAlign||"center"})}).on("mouseout",function(){v.setStyle({textFill:null})})),v.trigger(n.get("iconStatus."+u)||"normal"),p.add(v),v.on("click",a.bind(o.onclick,o,e,i,u)),f[u]=v})}var p=this.group;if(p.removeAll(),t.get("show")){var g=+t.get("itemSize"),m=t.get("feature")||{},v=this._features||(this._features={}),y=[];a.each(m,function(t,e){y.push(e)}),new l(this._featureNames||[],y).add(d).update(d).remove(a.curry(d,null)).execute(),this._featureNames=y,u.layout(p,t,i),u.addBackground(p,t),p.eachChild(function(t){var e=t.__title,n=t.hoverStyle;if(n&&e){var o=c.getBoundingRect(e,n.font),a=t.position[0]+p.position[0],r=t.position[1]+p.position[1]+g,s=!1;r+o.height>i.getHeight()&&(n.textPosition="top",s=!0);var l=s?-5-o.height:g+8;a+o.width/2>i.getWidth()?(n.textPosition=["100%",l],n.textAlign="right"):a-o.width/2<0&&(n.textPosition=[0,l],n.textAlign="left")}})}},updateView:function(t,e,i,n){a.each(this._features,function(t){t.updateView&&t.updateView(t.model,e,i,n)})},updateLayout:function(t,e,i,n){a.each(this._features,function(t){t.updateLayout&&t.updateLayout(t.model,e,i,n)})},remove:function(t,e){a.each(this._features,function(i){i.remove&&i.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){a.each(this._features,function(i){i.dispose&&i.dispose(t,e)})}})}).call(e,i(188))},function(t,e,i){function n(t){var e={},i=[],n=[];return t.eachRawSeries(function(t){var o=t.coordinateSystem;if(!o||"cartesian2d"!==o.type&&"polar"!==o.type)i.push(t);else{var a=o.getBaseAxis();if("category"===a.type){var r=a.dim+"_"+a.index;e[r]||(e[r]={categoryAxis:a,valueAxis:o.getOtherAxis(a),series:[]},n.push({axisDim:a.dim,axisIndex:a.index})),e[r].series.push(t)}else i.push(t)}}),{seriesGroupByCategoryAxis:e,other:i,meta:n}}function o(t){var e=[];return p.each(t,function(t,i){var n=t.categoryAxis,o=t.valueAxis,a=o.dim,r=[" "].concat(p.map(t.series,function(t){return t.name})),s=[n.model.getCategories()];p.each(t.series,function(t){s.push(t.getRawData().mapArray(a,function(t){return t}))});for(var l=[r.join(v)],u=0;u<s[0].length;u++){for(var c=[],h=0;h<s.length;h++)c.push(s[h][u]);l.push(c.join(v))}e.push(l.join("\n"))}),e.join("\n\n"+m+"\n\n")}function a(t){return p.map(t,function(t){var e=t.getRawData(),i=[t.name],n=[];return e.each(e.dimensions,function(){for(var t=arguments.length,o=arguments[t-1],a=e.getName(o),r=0;r<t-1;r++)n[r]=arguments[r];i.push((a?a+v:"")+n.join(v))}),i.join("\n")}).join("\n\n"+m+"\n\n")}function r(t){var e=n(t);return{value:p.filter([o(e.seriesGroupByCategoryAxis),a(e.other)],function(t){return t.replace(/[\n\t\s]/g,"")}).join("\n\n"+m+"\n\n"),meta:e.meta}}function s(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function l(t){var e=t.slice(0,t.indexOf("\n"));if(e.indexOf(v)>=0)return!0}function u(t){for(var e=t.split(/\n+/g),i=s(e.shift()).split(y),n=[],o=p.map(i,function(t){return{name:t,data:[]}}),a=0;a<e.length;a++){var r=s(e[a]).split(y);n.push(r.shift());for(var l=0;l<r.length;l++)o[l]&&(o[l].data[a]=r[l])}return{series:o,categories:n}}function c(t){for(var e=t.split(/\n+/g),i=s(e.shift()),n=[],o=0;o<e.length;o++){var a,r=s(e[o]).split(y),l="",u=!1;isNaN(r[0])?(u=!0,l=r[0],r=r.slice(1),n[o]={name:l,value:[]},a=n[o].value):a=n[o]=[];for(var c=0;c<r.length;c++)a.push(+r[c]);1===a.length&&(u?n[o].value=a[0]:n[o]=a[0])}return{name:i,data:n}}function h(t,e){var i=t.split(new RegExp("\n*"+m+"\n*","g")),n={series:[]};return p.each(i,function(t,i){if(l(t)){var o=u(t),a=e[i],r=a.axisDim+"Axis";a&&(n[r]=n[r]||[],n[r][a.axisIndex]={data:o.categories},n.series=n.series.concat(o.series))}else{var o=c(t);n.series.push(o)}}),n}function d(t){this._dom=null,this.model=t}function f(t,e){return p.map(t,function(t,i){var n=e&&e[i];return p.isObject(n)&&!p.isArray(n)?(p.isObject(t)&&!p.isArray(t)&&(t=t.value),p.defaults({value:t},n)):t})}var p=i(1),g=i(21),m=new Array(60).join("-"),v="\t",y=new RegExp("["+v+"]+","g");d.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:"数据视图",lang:["数据视图","关闭","刷新"],backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"},d.prototype.onclick=function(t,e){function i(){n.removeChild(a),M._dom=null}var n=e.getDom(),o=this.model;this._dom&&n.removeChild(this._dom);var a=document.createElement("div");a.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",a.style.backgroundColor=o.get("backgroundColor")||"#fff";var s=document.createElement("h4"),l=o.get("lang")||[];s.innerHTML=l[0]||o.get("title"),s.style.cssText="margin: 10px 20px;",s.style.color=o.get("textColor");var u=document.createElement("div"),c=document.createElement("textarea");u.style.cssText="display:block;width:100%;overflow:auto;";var d=o.get("optionToContent"),f=o.get("contentToOption"),m=r(t);if("function"==typeof d){var y=d(e.getOption());"string"==typeof y?u.innerHTML=y:p.isDom(y)&&u.appendChild(y)}else u.appendChild(c),c.readOnly=o.get("readOnly"),c.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",c.style.color=o.get("textColor"),c.style.borderColor=o.get("textareaBorderColor"),c.style.backgroundColor=o.get("textareaColor"),c.value=m.value;var x=m.meta,_=document.createElement("div");_.style.cssText="position:absolute;bottom:0;left:0;right:0;";var b="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",w=document.createElement("div"),S=document.createElement("div");b+=";background-color:"+o.get("buttonColor"),b+=";color:"+o.get("buttonTextColor");var M=this;g.addEventListener(w,"click",i),g.addEventListener(S,"click",function(){var t;try{t="function"==typeof f?f(u,e.getOption()):h(c.value,x)}catch(n){throw i(),new Error("Data view format error "+n)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),i()}),w.innerHTML=l[1],S.innerHTML=l[2],S.style.cssText=b,w.style.cssText=b,!o.get("readOnly")&&_.appendChild(S),_.appendChild(w),g.addEventListener(c,"keydown",function(t){if(9===(t.keyCode||t.which)){var e=this.value,i=this.selectionStart,n=this.selectionEnd;this.value=e.substring(0,i)+v+e.substring(n),this.selectionStart=this.selectionEnd=i+1,g.stop(t)}}),a.appendChild(s),a.appendChild(u),a.appendChild(_),u.style.height=n.clientHeight-80+"px",n.appendChild(a),this._dom=a},d.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},d.prototype.dispose=function(t,e){this.remove(t,e)},i(29).register("dataView",d),i(2).registerAction({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(t,e){var i=[];p.each(t.newOption.series,function(t){var n=e.getSeriesByName(t.name)[0];if(n){var o=n.get("data");i.push({name:t.name,data:f(t.data,o)})}else i.push(p.extend({type:"scatter"},t))}),e.mergeOption(p.defaults({series:i},t.newOption))}),t.exports=d},function(t,e,i){"use strict";function n(t,e,i){(this._brushController=new l(i.getZr())).on("brush",s.bind(this._onBrush,this)).mount(),this._isZoomActive}function o(t){var e={};return s.each(["xAxisIndex","yAxisIndex"],function(i){e[i]=t[i],null==e[i]&&(e[i]="all"),(e[i]===!1||"none"===e[i])&&(e[i]=[])}),e}function a(t,e){t.setIconStatus("back",c.count(e)>1?"emphasis":"normal")}function r(t,e,i,n,a){var r=i._isZoomActive;n&&"takeGlobalCursor"===n.type&&(r="dataZoomSelect"===n.key&&n.dataZoomSelectActive),i._isZoomActive=r,t.setIconStatus("zoom",r?"emphasis":"normal");var s=new u(o(t.option),e,{include:["grid"]});i._brushController.setPanels(s.makePanelOpts(a,function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"})).enableBrush(!!r&&{brushType:"auto",brushStyle:{lineWidth:0,fill:"rgba(0,0,0,0.2)"}})}var s=i(1),l=i(126),u=i(184),c=i(124),h=s.each;i(206);var d="\0_ec_\0toolbox-dataZoom_";n.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:{zoom:"区域缩放",back:"区域缩放还原"}};var f=n.prototype;f.render=function(t,e,i,n){this.model=t,this.ecModel=e,this.api=i,r(t,e,this,n,i),a(t,e)},f.onclick=function(t,e,i){p[i].call(this)},f.remove=function(t,e){this._brushController.unmount()},f.dispose=function(t,e){this._brushController.dispose()};var p={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(c.pop(this.ecModel))}};f._onBrush=function(t,e){function i(t,e,i){var o=n(t,e.getAxis(t).model,r);o&&(a[o.id]={dataZoomId:o.id,startValue:i[0],endValue:i[1]})}function n(t,e,i){var n;return i.eachComponent({mainType:"dataZoom",subType:"select"},function(i){var o=i.getAxisModel(t,e.componentIndex);o&&(n=i)}),n}if(e.isEnd&&t.length){var a={},r=this.ecModel;this._brushController.updateCovers([]);var s=new u(o(this.model.option),r,{include:["grid"]});s.matchOutputRanges(t,r,function(t,e,n){if("cartesian2d"===n.type){var o=t.brushType;"rect"===o?(i("x",n,e[0]),i("y",n,e[1])):i({lineX:"x",lineY:"y"}[o],n,e)}}),c.push(r,a),this._dispatchZoomAction(a)}},f._dispatchZoomAction=function(t){var e=[];h(t,function(t,i){e.push(s.clone(t))}),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},i(29).register("dataZoom",n),i(2).registerPreprocessor(function(t){function e(t,e){if(e){var o=t+"Index",a=e[o];null==a||"all"==a||s.isArray(a)||(a=a===!1||"none"===a?[]:[a]),i(t,function(e,i){if(null==a||"all"==a||s.indexOf(a,i)!==-1){var r={type:"select",$fromToolbox:!0,id:d+t+i};r[o]=i,n.push(r)}})}}function i(e,i){var n=t[e];s.isArray(n)||(n=n?[n]:[]),
-h(n,i)}if(t){var n=t.dataZoom||(t.dataZoom=[]);s.isArray(n)||(t.dataZoom=n=[n]);var o=t.toolbox;if(o&&(s.isArray(o)&&(o=o[0]),o&&o.feature)){var a=o.feature.dataZoom;e("xAxis",a),e("yAxis",a)}}}),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var o=i(1);n.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"},option:{},seriesIndex:{}};var a=n.prototype;a.getIcons=function(){var t=this.model,e=t.get("icon"),i={};return o.each(t.get("type"),function(t){e[t]&&(i[t]=e[t])}),i};var r={line:function(t,e,i,n){if("bar"===t)return o.merge({id:e,type:"line",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.line")||{},!0)},bar:function(t,e,i,n){if("line"===t)return o.merge({id:e,type:"bar",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.bar")||{},!0)},stack:function(t,e,i,n){if("line"===t||"bar"===t)return o.merge({id:e,stack:"__ec_magicType_stack__"},n.get("option.stack")||{},!0)},tiled:function(t,e,i,n){if("line"===t||"bar"===t)return o.merge({id:e,stack:""},n.get("option.tiled")||{},!0)}},s=[["line","bar"],["stack","tiled"]];a.onclick=function(t,e,i){var n=this.model,a=n.get("seriesIndex."+i);if(r[i]){var l={series:[]},u=function(e){var a=e.subType,s=e.id,u=r[i](a,s,e,n);u&&(o.defaults(u,e.option),l.series.push(u));var c=e.coordinateSystem;if(c&&"cartesian2d"===c.type&&("line"===i||"bar"===i)){var h=c.getAxesByScale("ordinal")[0];if(h){var d=h.dim,f=d+"Axis",p=t.queryComponents({mainType:f,index:e.get(name+"Index"),id:e.get(name+"Id")})[0],g=p.componentIndex;l[f]=l[f]||[];for(var m=0;m<=g;m++)l[f][g]=l[f][g]||{};l[f][g].boundaryGap="bar"===i}}};o.each(s,function(t){o.indexOf(t,i)>=0&&o.each(t,function(t){n.setIconStatus(t,"normal")})}),n.setIconStatus(i,"emphasis"),t.eachComponent({mainType:"series",query:null==a?null:{seriesIndex:a}},u),e.dispatchAction({type:"changeMagicType",currentType:i,newOption:l})}};var l=i(2);l.registerAction({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),i(29).register("magicType",n),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var o=i(124);n.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:"还原"};var a=n.prototype;a.onclick=function(t,e,i){o.clear(t),e.dispatchAction({type:"restore",from:this.uid})},i(29).register("restore",n),i(2).registerAction({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")}),t.exports=n},function(t,e,i){function n(t){this.model=t}var o=i(9);n.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:"保存为图片",type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:["右键另存为图片"]},n.prototype.unusable=!o.canvasSupported;var a=n.prototype;a.onclick=function(t,e){var i=this.model,n=i.get("name")||t.get("title.0.text")||"echarts",a=document.createElement("a"),r=i.get("type",!0)||"png";a.download=n+"."+r,a.target="_blank";var s=e.getConnectedDataURL({type:r,backgroundColor:i.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:i.get("excludeComponents"),pixelRatio:i.get("pixelRatio")});if(a.href=s,"function"!=typeof MouseEvent||o.browser.ie||o.browser.edge){var l=i.get("lang"),u='<body style="margin:0;"><img src="'+s+'" style="max-width:100%;" title="'+(l&&l[0]||"")+'" /></body>',c=window.open();c.document.write(u)}else{var h=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});a.dispatchEvent(h)}},i(29).register("saveAsImage",n),t.exports=n},function(t,e,i){i(55),i(234),i(235),i(2).registerAction({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),i(2).registerAction({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){})},function(t,e,i){function n(t){var e="cubic-bezier(0.23, 1, 0.32, 1)",i="left "+t+"s "+e+",top "+t+"s "+e;return s.map(p,function(t){return t+"transition:"+i}).join(";")}function o(t){var e=[],i=t.get("fontSize"),n=t.getTextColor();return n&&e.push("color:"+n),e.push("font:"+t.getFont()),i&&e.push("line-height:"+Math.round(3*i/2)+"px"),h(["decoration","align"],function(i){var n=t.get(i);n&&e.push("text-"+i+":"+n)}),e.join(";")}function a(t){var e=[],i=t.get("transitionDuration"),a=t.get("backgroundColor"),r=t.getModel("textStyle"),s=t.get("padding");return i&&e.push(n(i)),a&&(f.canvasSupported?e.push("background-Color:"+a):(e.push("background-Color:#"+l.toHex(a)),e.push("filter:alpha(opacity=70)"))),h(["width","color","radius"],function(i){var n="border-"+i,o=d(n),a=t.get(o);null!=a&&e.push(n+":"+a+("color"===i?"":"px"))}),e.push(o(r)),null!=s&&e.push("padding:"+c.normalizeCssArray(s).join("px ")+"px"),e.join(";")+";"}function r(t,e){var i=document.createElement("div"),n=this._zr=e.getZr();this.el=i,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(i),this._container=t,this._show=!1,this._hideTimeout;var o=this;i.onmouseenter=function(){o._enterable&&(clearTimeout(o._hideTimeout),o._show=!0),o._inContent=!0},i.onmousemove=function(e){if(e=e||window.event,!o._enterable){var i=n.handler;u.normalizeEvent(t,e,!0),i.dispatch("mousemove",e)}},i.onmouseleave=function(){o._enterable&&o._show&&o.hideLater(o._hideDelay),o._inContent=!1}}var s=i(1),l=i(22),u=i(21),c=i(7),h=s.each,d=c.toCamelCase,f=i(9),p=["","-webkit-","-moz-","-o-"],g="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;";r.prototype={constructor:r,_enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),i=t.style;"absolute"!==i.position&&"absolute"!==e.position&&(i.position="relative")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText=g+a(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),e.style.display=e.innerHTML?"block":"none",this._show=!0},setContent:function(t){this.el.innerHTML=null==t?"":t},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el;return[t.clientWidth,t.clientHeight]},moveTo:function(t,e){var i,n=this._zr;n&&n.painter&&(i=n.painter.getViewportRoot())&&(t+=i.offsetLeft||0,e+=i.offsetTop||0);var o=this.el.style;o.left=t+"px",o.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(s.bind(this.hide,this),t)):this.hide())},isShow:function(){return this._show}},t.exports=r},function(t,e,i){i(2).extendComponentModel({type:"tooltip",dependencies:["axisPointer"],defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#fff",fontSize:14}}})},function(t,e,i){function n(t){for(var e=t.pop();t.length;){var i=t.pop();i&&(i instanceof v&&(i=i.get("tooltip",!0)),"string"==typeof i&&(i={formatter:i}),e=new v(i,e,e.ecModel))}return e}function o(t,e){return t.dispatchAction||c.bind(e.dispatchAction,e)}function a(t,e,i,n,o,a,r){var s=i.clientWidth,l=i.clientHeight;return null!=a&&(t+s+a>n?t-=s+a:t+=a),null!=r&&(e+l+r>o?e-=l+r:e+=r),[t,e]}function r(t,e,i,n,o){var a=i.clientWidth,r=i.clientHeight;return t=Math.min(t+a,n)-a,e=Math.min(e+r,o)-r,t=Math.max(t,0),e=Math.max(e,0),[t,e]}function s(t,e,i){var n=i[0],o=i[1],a=5,r=0,s=0,l=e.width,u=e.height;switch(t){case"inside":r=e.x+l/2-n/2,s=e.y+u/2-o/2;break;case"top":r=e.x+l/2-n/2,s=e.y-o-a;break;case"bottom":r=e.x+l/2-n/2,s=e.y+u+a;break;case"left":r=e.x-n-a,s=e.y+u/2-o/2;break;case"right":r=e.x+l+a,s=e.y+u/2-o/2}return[r,s]}function l(t){return"center"===t||"middle"===t}var u=i(233),c=i(1),h=i(7),d=i(4),f=i(3),p=i(120),g=i(12),m=i(9),v=i(10),y=i(121),x=i(17),_=i(75),b=c.bind,w=c.each,S=d.parsePercent,M=new f.Rect({shape:{x:-1,y:-1,width:2,height:2}});i(2).extendComponentView({type:"tooltip",init:function(t,e){if(!m.node){var i=new u(e.getDom(),e);this._tooltipContent=i}},render:function(t,e,i){if(!m.node){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=i,this._lastDataByCoordSys=null,this._alwaysShowContent=t.get("alwaysShowContent");var n=this._tooltipContent;n.update(),n.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow()}},_initGlobalListener:function(){var t=this._tooltipModel,e=t.get("triggerOn");y.register("itemTooltip",this._api,b(function(t,i,n){"none"!==e&&(e.indexOf(t)>=0?this._tryShow(i,n):"leave"===t&&this._hide(n))},this))},_keepShow:function(){var t=this._tooltipModel,e=this._ecModel,i=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var n=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){n.manuallyShowTip(t,e,i,{x:n._lastX,y:n._lastY})})}},manuallyShowTip:function(t,e,i,n){if(n.from!==this.uid&&!m.node){var a=o(n,i);this._ticket="";var r=n.dataByCoordSys;if(n.tooltip&&null!=n.x&&null!=n.y){var s=M;s.position=[n.x,n.y],s.update(),s.tooltip=n.tooltip,this._tryShow({offsetX:n.x,offsetY:n.y,target:s},a)}else if(r)this._tryShow({offsetX:n.x,offsetY:n.y,position:n.position,event:{},dataByCoordSys:n.dataByCoordSys,tooltipOption:n.tooltipOption},a);else if(null!=n.seriesIndex){if(this._manuallyAxisShowTip(t,e,i,n))return;var l=p(n,e),u=l.point[0],c=l.point[1];null!=u&&null!=c&&this._tryShow({offsetX:u,offsetY:c,position:n.position,target:l.el,event:{}},a)}else null!=n.x&&null!=n.y&&(i.dispatchAction({type:"updateAxisPointer",x:n.x,y:n.y}),this._tryShow({offsetX:n.x,offsetY:n.y,position:n.position,target:i.getZr().findHover(n.x,n.y).target,event:{}},a))}},manuallyHideTip:function(t,e,i,n){var a=this._tooltipContent;this._alwaysShowContent||a.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=null,n.from!==this.uid&&this._hide(o(n,i))},_manuallyAxisShowTip:function(t,e,i,o){var a=o.seriesIndex,r=o.dataIndex,s=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=a&&null!=r&&null!=s){var l=e.getSeriesByIndex(a);if(l){var u=l.getData(),t=n([u.getItemModel(r),l,(l.coordinateSystem||{}).model,t]);if("axis"===t.get("trigger"))return i.dispatchAction({type:"updateAxisPointer",seriesIndex:a,dataIndex:r}),!0}}},_tryShow:function(t,e){var i=t.target,n=this._tooltipModel;if(n){this._lastX=t.offsetX,this._lastY=t.offsetY;var o=t.dataByCoordSys;o&&o.length?this._showAxisTooltip(o,t):i&&null!=i.dataIndex?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(t,i,e)):i&&i.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(t,i,e)):(this._lastDataByCoordSys=null,this._hide(e))}},_showOrMove:function(t,e){var i=t.get("showDelay");e=c.bind(e,this),clearTimeout(this._showTimout),i>0?this._showTimout=setTimeout(e,i):e()},_showAxisTooltip:function(t,e){var i=this._ecModel,o=this._tooltipModel,a=[e.offsetX,e.offsetY],r=[],s=[],l=n([e.tooltipOption,o]);w(t,function(t){w(t.dataByAxis,function(t){var e=i.getComponent(t.axisDim+"Axis",t.axisIndex),n=t.value,o=[];if(e&&null!=n){var a=_.getValueLabel(n,e.axis,i,t.seriesDataIndices,t.valueLabelOpt);c.each(t.seriesDataIndices,function(r){var l=i.getSeriesByIndex(r.seriesIndex),u=r.dataIndexInside,c=l&&l.getDataParams(u);c.axisDim=t.axisDim,c.axisIndex=t.axisIndex,c.axisType=t.axisType,c.axisId=t.axisId,c.axisValue=x.getAxisRawValue(e.axis,n),c.axisValueLabel=a,c&&(s.push(c),o.push(l.formatTooltip(u,!0)))});var l=a;r.push((l?h.encodeHTML(l)+"<br />":"")+o.join("<br />"))}})},this),r.reverse(),r=r.join("<br /><br />");var u=e.position;this._showOrMove(l,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(l,u,a[0],a[1],this._tooltipContent,s):this._showTooltipContent(l,r,s,Math.random(),a[0],a[1],u)})},_showSeriesItemTooltip:function(t,e,i){var o=this._ecModel,a=e.seriesIndex,r=o.getSeriesByIndex(a),s=e.dataModel||r,l=e.dataIndex,u=e.dataType,c=s.getData(),h=n([c.getItemModel(l),s,r&&(r.coordinateSystem||{}).model,this._tooltipModel]),d=h.get("trigger");if(null==d||"item"===d){var f=s.getDataParams(l,u),p=s.formatTooltip(l,!1,u),g="item_"+s.name+"_"+l;this._showOrMove(h,function(){this._showTooltipContent(h,p,f,g,t.offsetX,t.offsetY,t.position,t.target)}),i({type:"showTip",dataIndexInside:l,dataIndex:c.getRawIndex(l),seriesIndex:a,from:this.uid})}},_showComponentItemTooltip:function(t,e,i){var n=e.tooltip;if("string"==typeof n){var o=n;n={content:o,formatter:o}}var a=new v(n,this._tooltipModel,this._ecModel),r=a.get("content"),s=Math.random();this._showOrMove(a,function(){this._showTooltipContent(a,r,a.get("formatterParams")||{},s,t.offsetX,t.offsetY,t.position,e)}),i({type:"showTip",from:this.uid})},_showTooltipContent:function(t,e,i,n,o,a,r,s){if(this._ticket="",t.get("showContent")&&t.get("show")){var l=this._tooltipContent,u=t.get("formatter");r=r||t.get("position");var c=e;if(u&&"string"==typeof u)c=h.formatTpl(u,i,!0);else if("function"==typeof u){var d=b(function(e,n){e===this._ticket&&(l.setContent(n),this._updatePosition(t,r,o,a,l,i,s))},this);this._ticket=n,c=u(i,n,d)}l.setContent(c),l.show(t),this._updatePosition(t,r,o,a,l,i,s)}},_updatePosition:function(t,e,i,n,o,u,h){var d=this._api.getWidth(),f=this._api.getHeight();e=e||t.get("position");var p=o.getSize(),m=t.get("align"),v=t.get("verticalAlign"),y=h&&h.getBoundingRect().clone();if(h&&y.applyTransform(h.transform),"function"==typeof e&&(e=e([i,n],u,o.el,y,{viewSize:[d,f],contentSize:p.slice()})),c.isArray(e))i=S(e[0],d),n=S(e[1],f);else if(c.isObject(e)){e.width=p[0],e.height=p[1];var x=g.getLayoutRect(e,{width:d,height:f});i=x.x,n=x.y,m=null,v=null}else if("string"==typeof e&&h){var _=s(e,y,p);i=_[0],n=_[1]}else{var _=a(i,n,o.el,d,f,m?null:20,v?null:20);i=_[0],n=_[1]}if(m&&(i-=l(m)?p[0]/2:"right"===m?p[0]:0),v&&(n-=l(v)?p[1]/2:"bottom"===v?p[1]:0),t.get("confine")){var _=r(i,n,o.el,d,f);i=_[0],n=_[1]}o.moveTo(i,n)},_updateContentNotChangedOnAxis:function(t){var e=this._lastDataByCoordSys,i=!!e&&e.length===t.length;return w(e,function(e,n){var o=e.dataByAxis||{},a=t[n]||{},r=a.dataByAxis||[];i&=o.length===r.length,w(o,function(t,e){var n=r[e]||{},o=t.seriesDataIndices||[],a=n.seriesDataIndices||[];i&=t.value===n.value&&t.axisType===n.axisType&&t.axisId===n.axisId&&o.length===a.length,w(o,function(t,e){var n=a[e];i&=t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})})}),this._lastDataByCoordSys=t,!!i},_hide:function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},dispose:function(t,e){m.node||(this._tooltipContent.hide(),y.unregister("itemTooltip",e))}})},function(t,e,i){function n(t,e){var i=t.get("center"),n=t.get("radius"),o=e.getWidth(),a=e.getHeight(),r=s.parsePercent;this.cx=r(i[0],o),this.cy=r(i[1],a);var l=this.getRadiusAxis(),u=Math.min(o,a)/2;l.setExtent(0,r(n,u))}function o(t,e){var i=this,n=i.getAngleAxis(),o=i.getRadiusAxis();if(n.scale.setExtent(1/0,-(1/0)),o.scale.setExtent(1/0,-(1/0)),t.eachSeries(function(t){if(t.coordinateSystem===i){var e=t.getData();o.scale.unionExtentFromData(e,"radius"),n.scale.unionExtentFromData(e,"angle")}}),u(n.scale,n.model),u(o.scale,o.model),"category"===n.type&&!n.onBand){var a=n.getExtent(),r=360/n.scale.count();n.inverse?a[1]+=r:a[1]-=r,n.setExtent(a[0],a[1])}}function a(t,e){if(t.type=e.get("type"),t.scale=l.createScaleByModel(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,"angleAxis"===e.mainType){var i=e.get("startAngle");t.inverse=e.get("inverse")^e.get("clockwise"),t.setExtent(i,i+(t.inverse?-360:360))}e.axis=t,t.model=e}var r=i(407),s=i(4),l=(i(1),i(17)),u=l.niceScaleExtent;i(408);var c={dimensions:r.prototype.dimensions,create:function(t,e){var i=[];return t.eachComponent("polar",function(t,s){var l=new r(s);l.resize=n,l.update=o;var u=l.getRadiusAxis(),c=l.getAngleAxis(),h=t.findAxisModel("radiusAxis"),d=t.findAxisModel("angleAxis");a(u,h),a(c,d),l.resize(t,e),i.push(l),t.coordinateSystem=l,l.model=t}),t.eachSeries(function(e){if("polar"===e.get("coordinateSystem")){var i=t.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0];e.coordinateSystem=i.coordinateSystem}}),i}};i(26).register("polar",c)},function(t,e,i){function n(t){return parseInt(t,10)}function o(t,e){s.initVML(),this.root=t,this.storage=e;var i=document.createElement("div"),n=document.createElement("div");i.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",n.style.cssText="position:absolute;left:0;top:0;",t.appendChild(i),this._vmlRoot=n,this._vmlViewport=i,this.resize();var o=e.delFromStorage,a=e.addToStorage;e.delFromStorage=function(t){o.call(e,t),t&&t.onRemove&&t.onRemove(n)},e.addToStorage=function(t){t.onAdd&&t.onAdd(n),a.call(e,t)},this._firstPaint=!0}function a(t){return function(){r('In IE8.0 VML mode painter not support method "'+t+'"')}}var r=i(52),s=i(182);o.prototype={constructor:o,getViewportRoot:function(){return this._vmlViewport},refresh:function(){var t=this.storage.getDisplayList(!0,!0);this._paintList(t)},_paintList:function(t){for(var e=this._vmlRoot,i=0;i<t.length;i++){var n=t[i];n.invisible||n.ignore?(n.__alreadyNotVisible||n.onRemove(e),n.__alreadyNotVisible=!0):(n.__alreadyNotVisible&&n.onAdd(e),n.__alreadyNotVisible=!1,n.__dirty&&(n.beforeBrush&&n.beforeBrush(),(n.brushVML||n.brush).call(n,e),n.afterBrush&&n.afterBrush())),n.__dirty=!1}this._firstPaint&&(this._vmlViewport.appendChild(e),this._firstPaint=!1)},resize:function(t,e){var t=null==t?this._getWidth():t,e=null==e?this._getHeight():e;if(this._width!=t||this._height!=e){this._width=t,this._height=e;var i=this._vmlViewport.style;i.width=t+"px",i.height=e+"px"}},dispose:function(){this.root.innerHTML="",this._vmlRoot=this._vmlViewport=this.storage=null},getWidth:function(){return this._width},getHeight:function(){return this._height},clear:function(){this._vmlViewport&&this.root.removeChild(this._vmlViewport)},_getWidth:function(){var t=this.root,e=t.currentStyle;return(t.clientWidth||n(e.width))-n(e.paddingLeft)-n(e.paddingRight)|0},_getHeight:function(){var t=this.root,e=t.currentStyle;return(t.clientHeight||n(e.height))-n(e.paddingTop)-n(e.paddingBottom)|0}};for(var l=["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],u=0;u<l.length;u++){var c=l[u];o.prototype[c]=a(c)}t.exports=o},function(t,e,i){if(!i(9).canvasSupported){var n=i(5),o=i(11),a=i(27).CMD,r=i(22),s=i(16),l=i(86),u=i(38),c=i(53),h=i(85),d=i(8),f=i(27),p=i(39),g=i(182),m=Math.round,v=Math.sqrt,y=Math.abs,x=Math.cos,_=Math.sin,b=Math.max,w=n.applyTransform,S=",",M="progid:DXImageTransform.Microsoft",I=21600,T=I/2,A=1e5,C=1e3,L=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=I+","+I,t.coordorigin="0,0"},D=function(t){return String(t).replace(/&/g,"&amp;").replace(/"/g,"&quot;")},P=function(t,e,i){return"rgb("+[t,e,i].join(",")+")"},k=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},O=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},E=function(t,e,i){return(parseFloat(t)||0)*A+(parseFloat(e)||0)*C+i},z=function(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t},R=function(t,e,i){var n=r.parse(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=P(n[0],n[1],n[2]),t.opacity=i*n[3])},N=function(t){var e=r.parse(t);return[P(e[0],e[1],e[2]),e[3]]},V=function(t,e,i){var n=e.fill;if(null!=n)if(n instanceof p){var o,a=0,r=[0,0],s=0,l=1,u=i.getBoundingRect(),c=u.width,h=u.height;if("linear"===n.type){o="gradient";var d=i.transform,f=[n.x*c,n.y*h],g=[n.x2*c,n.y2*h];d&&(w(f,f,d),w(g,g,d));var m=g[0]-f[0],v=g[1]-f[1];a=180*Math.atan2(m,v)/Math.PI,a<0&&(a+=360),a<1e-6&&(a=0)}else{o="gradientradial";var f=[n.x*c,n.y*h],d=i.transform,y=i.scale,x=c,_=h;r=[(f[0]-u.x)/x,(f[1]-u.y)/_],d&&w(f,f,d),x/=y[0]*I,_/=y[1]*I;var S=b(x,_);s=0/S,l=2*n.r/S-s}var M=n.colorStops.slice();M.sort(function(t,e){return t.offset-e.offset});for(var T=M.length,A=[],C=[],L=0;L<T;L++){var D=M[L],P=N(D.color);C.push(D.offset*l+s+" "+P[0]),0!==L&&L!==T-1||A.push(P)}if(T>=2){var k=A[0][0],O=A[1][0],E=A[0][1]*e.opacity,z=A[1][1]*e.opacity;t.type=o,t.method="none",t.focus="100%",t.angle=a,t.color=k,t.color2=O,t.colors=C.join(","),t.opacity=z,t.opacity2=E}"radial"===o&&(t.focusposition=r.join(","))}else R(t,n,e.opacity)},B=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof p||R(t,e.stroke,e.opacity)},G=function(t,e,i,n){var o="fill"==e,a=t.getElementsByTagName(e)[0];null!=i[e]&&"none"!==i[e]&&(o||!o&&i.lineWidth)?(t[o?"filled":"stroked"]="true",i[e]instanceof p&&O(t,a),a||(a=g.createNode(e)),o?V(a,i,n):B(a,i),k(t,a)):(t[o?"filled":"stroked"]="false",O(t,a))},F=[[],[],[]],H=function(t,e){var i,n,o,r,s,l,u=a.M,c=a.C,h=a.L,d=a.A,f=a.Q,p=[];for(r=0;r<t.length;){switch(o=t[r++],n="",i=0,o){case u:n=" m ",i=1,s=t[r++],l=t[r++],F[0][0]=s,F[0][1]=l;break;case h:n=" l ",i=1,s=t[r++],l=t[r++],F[0][0]=s,F[0][1]=l;break;case f:case c:n=" c ",i=3;var g,y,b=t[r++],M=t[r++],A=t[r++],C=t[r++];o===f?(g=A,y=C,A=(A+2*b)/3,C=(C+2*M)/3,b=(s+2*b)/3,M=(l+2*M)/3):(g=t[r++],y=t[r++]),F[0][0]=b,F[0][1]=M,F[1][0]=A,F[1][1]=C,F[2][0]=g,F[2][1]=y,s=g,l=y;break;case d:var L=0,D=0,P=1,k=1,O=0;e&&(L=e[4],D=e[5],P=v(e[0]*e[0]+e[1]*e[1]),k=v(e[2]*e[2]+e[3]*e[3]),O=Math.atan2(-e[1]/k,e[0]/P));var E=t[r++],z=t[r++],R=t[r++],N=t[r++],V=t[r++]+O,B=t[r++]+V+O;r++;var G=t[r++],H=E+x(V)*R,W=z+_(V)*N,b=E+x(B)*R,M=z+_(B)*N,Z=G?" wa ":" at ";Math.abs(H-b)<1e-4&&(Math.abs(B-V)>.01?G&&(H+=270/I):Math.abs(W-z)<1e-4?G&&H<E||!G&&H>E?M-=270/I:M+=270/I:G&&W<z||!G&&W>z?b+=270/I:b-=270/I),p.push(Z,m(((E-R)*P+L)*I-T),S,m(((z-N)*k+D)*I-T),S,m(((E+R)*P+L)*I-T),S,m(((z+N)*k+D)*I-T),S,m((H*P+L)*I-T),S,m((W*k+D)*I-T),S,m((b*P+L)*I-T),S,m((M*k+D)*I-T)),s=b,l=M;break;case a.R:var q=F[0],j=F[1];q[0]=t[r++],q[1]=t[r++],j[0]=q[0]+t[r++],j[1]=q[1]+t[r++],e&&(w(q,q,e),w(j,j,e)),q[0]=m(q[0]*I-T),j[0]=m(j[0]*I-T),q[1]=m(q[1]*I-T),j[1]=m(j[1]*I-T),p.push(" m ",q[0],S,q[1]," l ",j[0],S,q[1]," l ",j[0],S,j[1]," l ",q[0],S,j[1]);break;case a.Z:p.push(" x ")}if(i>0){p.push(n);for(var U=0;U<i;U++){var X=F[U];e&&w(X,X,e),p.push(m(X[0]*I-T),S,m(X[1]*I-T),U<i-1?S:"")}}}return p.join("")};d.prototype.brushVML=function(t){var e=this.style,i=this._vmlEl;i||(i=g.createNode("shape"),L(i),this._vmlEl=i),G(i,"fill",e,this),G(i,"stroke",e,this);var n=this.transform,o=null!=n,a=i.getElementsByTagName("stroke")[0];if(a){var r=e.lineWidth;if(o&&!e.strokeNoScale){var s=n[0]*n[3]-n[1]*n[2];r*=v(y(s))}a.weight=r+"px"}var l=this.path||(this.path=new f);this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),l.toStatic(),this.__dirtyPath=!1),i.path=H(l.data,this.transform),i.style.zIndex=E(this.zlevel,this.z,this.z2),k(t,i),null!=e.text?this.drawRectText(t,this.getBoundingRect()):this.removeRectText(t)},d.prototype.onRemove=function(t){O(t,this._vmlEl),this.removeRectText(t)},d.prototype.onAdd=function(t){k(t,this._vmlEl),this.appendRectText(t)};var W=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};c.prototype.brushVML=function(t){var e,i,n=this.style,o=n.image;if(W(o)){var a=o.src;if(a===this._imageSrc)e=this._imageWidth,i=this._imageHeight;else{var r=o.runtimeStyle,s=r.width,l=r.height;r.width="auto",r.height="auto",e=o.width,i=o.height,r.width=s,r.height=l,this._imageSrc=a,this._imageWidth=e,this._imageHeight=i}o=a}else o===this._imageSrc&&(e=this._imageWidth,i=this._imageHeight);if(o){var u=n.x||0,c=n.y||0,h=n.width,d=n.height,f=n.sWidth,p=n.sHeight,y=n.sx||0,x=n.sy||0,_=f&&p,I=this._vmlEl;I||(I=g.doc.createElement("div"),L(I),this._vmlEl=I);var T,A=I.style,C=!1,D=1,P=1;if(this.transform&&(T=this.transform,D=v(T[0]*T[0]+T[1]*T[1]),P=v(T[2]*T[2]+T[3]*T[3]),C=T[1]||T[2]),C){var O=[u,c],z=[u+h,c],R=[u,c+d],N=[u+h,c+d];w(O,O,T),w(z,z,T),w(R,R,T),w(N,N,T);var V=b(O[0],z[0],R[0],N[0]),B=b(O[1],z[1],R[1],N[1]),G=[];G.push("M11=",T[0]/D,S,"M12=",T[2]/P,S,"M21=",T[1]/D,S,"M22=",T[3]/P,S,"Dx=",m(u*D+T[4]),S,"Dy=",m(c*P+T[5])),A.padding="0 "+m(V)+"px "+m(B)+"px 0",A.filter=M+".Matrix("+G.join("")+", SizingMethod=clip)"}else T&&(u=u*D+T[4],c=c*P+T[5]),A.filter="",A.left=m(u)+"px",A.top=m(c)+"px";var F=this._imageEl,H=this._cropEl;F||(F=g.doc.createElement("div"),this._imageEl=F);var Z=F.style;if(_){if(e&&i)Z.width=m(D*e*h/f)+"px",Z.height=m(P*i*d/p)+"px";else{var q=new Image,j=this;q.onload=function(){q.onload=null,e=q.width,i=q.height,Z.width=m(D*e*h/f)+"px",Z.height=m(P*i*d/p)+"px",j._imageWidth=e,j._imageHeight=i,j._imageSrc=o},q.src=o}H||(H=g.doc.createElement("div"),H.style.overflow="hidden",this._cropEl=H);var U=H.style;U.width=m((h+y*h/f)*D),U.height=m((d+x*d/p)*P),U.filter=M+".Matrix(Dx="+-y*h/f*D+",Dy="+-x*d/p*P+")",H.parentNode||I.appendChild(H),F.parentNode!=H&&H.appendChild(F)}else Z.width=m(D*h)+"px",Z.height=m(P*d)+"px",I.appendChild(F),H&&H.parentNode&&(I.removeChild(H),this._cropEl=null);var X="",Y=n.opacity;Y<1&&(X+=".Alpha(opacity="+m(100*Y)+") "),X+=M+".AlphaImageLoader(src="+o+", SizingMethod=scale)",Z.filter=X,I.style.zIndex=E(this.zlevel,this.z,this.z2),k(t,I),null!=n.text&&this.drawRectText(t,this.getBoundingRect())}},c.prototype.onRemove=function(t){O(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},c.prototype.onAdd=function(t){k(t,this._vmlEl),this.appendRectText(t)};var Z,q="normal",j={},U=0,X=100,Y=document.createElement("div"),$=function(t){var e=j[t];if(!e){U>X&&(U=0,j={});var i,n=Y.style;try{n.font=t,i=n.fontFamily.split(",")[0]}catch(o){}e={style:n.fontStyle||q,variant:n.fontVariant||q,weight:n.fontWeight||q,size:0|parseFloat(n.fontSize||12),family:i||"Microsoft YaHei"},j[t]=e,U++}return e};s.measureText=function(t,e){var i=g.doc;Z||(Z=i.createElement("div"),Z.style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",g.doc.body.appendChild(Z));try{Z.style.font=e}catch(n){}return Z.innerHTML="",Z.appendChild(i.createTextNode(t)),{width:Z.offsetWidth}};for(var K=new o,J=function(t,e,i,n){var o=this.style,a=o.text;if(null!=a&&(a+=""),a){var r,l,u=o.textAlign,c=$(o.textFont),h=c.style+" "+c.variant+" "+c.weight+" "+c.size+'px "'+c.family+'"',d=o.textBaseline,f=o.textVerticalAlign;i=i||s.getBoundingRect(a,h,u,d);var p=this.transform;if(p&&!n&&(K.copy(e),K.applyTransform(p),e=K),n)r=e.x,l=e.y;else{var v=o.textPosition,y=o.textDistance;if(v instanceof Array)r=e.x+z(v[0],e.width),l=e.y+z(v[1],e.height),u=u||"left",d=d||"top";else{var x=s.adjustTextPositionOnRect(v,e,i,y);r=x.x,l=x.y,u=u||x.textAlign,d=d||x.textBaseline}}if(f){switch(f){case"middle":l-=i.height/2;break;case"bottom":l-=i.height}d="top"}var _=c.size;switch(d){case"hanging":case"top":l+=_/1.75;break;case"middle":break;default:l-=_/2.25}switch(u){case"left":break;case"center":r-=i.width/2;break;case"right":r-=i.width}var b,M,I,T=g.createNode,A=this._textVmlEl;A?(I=A.firstChild,b=I.nextSibling,M=b.nextSibling):(A=T("line"),b=T("path"),M=T("textpath"),I=T("skew"),M.style["v-text-align"]="left",L(A),b.textpathok=!0,M.on=!0,A.from="0 0",A.to="1000 0.05",k(A,I),k(A,b),k(A,M),this._textVmlEl=A);var C=[r,l],P=A.style;p&&n?(w(C,C,p),I.on=!0,I.matrix=p[0].toFixed(3)+S+p[2].toFixed(3)+S+p[1].toFixed(3)+S+p[3].toFixed(3)+",0,0",I.offset=(m(C[0])||0)+","+(m(C[1])||0),I.origin="0 0",P.left="0px",P.top="0px"):(I.on=!1,P.left=m(r)+"px",P.top=m(l)+"px"),M.string=D(a);try{M.style.font=h}catch(O){}G(A,"fill",{fill:n?o.fill:o.textFill,opacity:o.opacity},this),G(A,"stroke",{stroke:n?o.stroke:o.textStroke,opacity:o.opacity,lineDash:o.lineDash},this),A.style.zIndex=E(this.zlevel,this.z,this.z2),k(t,A)}},Q=function(t){O(t,this._textVmlEl),this._textVmlEl=null},tt=function(t){k(t,this._textVmlEl)},et=[l,u,c,d,h],it=0;it<et.length;it++){var nt=et[it].prototype;nt.drawRectText=J,nt.removeRectText=Q,nt.appendRectText=tt}h.prototype.brushVML=function(t){var e=this.style;null!=e.text?this.drawRectText(t,{x:e.x||0,y:e.y||0,width:0,height:0},this.getBoundingRect(),!0):this.removeRectText(t)},h.prototype.onRemove=function(t){this.removeRectText(t)},h.prototype.onAdd=function(t){this.appendRectText(t)}}},function(t,e,i){i(238),i(87).registerPainter("vml",i(237))},function(t,e,i){var n=i(1),o=i(241),a=i(2);a.registerAction({type:"geoRoam",event:"geoRoam",update:"updateLayout"},function(t,e){var i=t.componentType||"series";e.eachComponent({mainType:i,query:t},function(e){var a=e.coordinateSystem;if("geo"===a.type){var r=o.updateCenterAndZoom(a,t,e.get("scaleLimit"));e.setCenter&&e.setCenter(r.center),e.setZoom&&e.setZoom(r.zoom),"series"===i&&n.each(e.seriesGroup,function(t){t.setCenter(r.center),t.setZoom(r.zoom)})}})})},function(t,e){var i={};i.updateCenterAndZoom=function(t,e,i){var n=t.getZoom(),o=t.getCenter(),a=e.zoom,r=t.dataToPoint(o);if(null!=e.dx&&null!=e.dy){r[0]-=e.dx,r[1]-=e.dy;var o=t.pointToData(r);t.setCenter(o)}if(null!=a){if(i){var s=i.min||0,l=i.max||1/0;a=Math.max(Math.min(n*a,l),s)/n}t.scale[0]*=a,t.scale[1]*=a;var u=t.position,c=(e.originX-u[0])*(a-1),h=(e.originY-u[1])*(a-1);u[0]-=c,u[1]-=h,t.updateTransform();var o=t.pointToData(r);t.setCenter(o),t.setZoom(a*n)}return{center:t.getCenter(),zoom:t.getZoom()}},t.exports=i},function(t,e,i){var n=i(5);t.exports=function(t){var e=t.coordinateSystem;if(!e||"view"===e.type){var i=e.getBoundingRect(),o=t.getData(),a=o.graph,r=0,s=o.getSum("value"),l=2*Math.PI/(s||o.count()),u=i.width/2+i.x,c=i.height/2+i.y,h=Math.min(i.width,i.height)/2;a.eachNode(function(t){var e=t.getValue("value");r+=l*(s?e:1)/2,t.setLayout([h*Math.cos(r)+u,h*Math.sin(r)+c]),r+=l*(s?e:1)/2}),o.setLayout({cx:u,cy:c}),a.eachEdge(function(t){var e,i=t.getModel().get("lineStyle.normal.curveness")||0,o=n.clone(t.node1.getLayout()),a=n.clone(t.node2.getLayout()),r=(o[0]+a[0])/2,s=(o[1]+a[1])/2;+i&&(i*=3,e=[u*i+r*(1-i),c*i+s*(1-i)]),t.setLayout([o,a,e])})}}},function(t,e,i){var n=i(5);t.exports=function(t){t.eachEdge(function(t){var e=t.getModel().get("lineStyle.normal.curveness")||0,i=n.clone(t.node1.getLayout()),o=n.clone(t.node2.getLayout()),a=[i,o];+e&&a.push([(i[0]+o[0])/2-(i[1]-o[1])*e,(i[1]+o[1])/2-(o[0]-i[0])*e]),t.setLayout(a)})}},function(t,e,i){var n=i(243);t.exports=function(t){var e=t.coordinateSystem;if(!e||"view"===e.type){var i=t.getGraph();i.eachNode(function(t){var e=t.getModel();t.setLayout([+e.get("x"),+e.get("y")])}),n(i)}}},function(t,e,i){function n(t,e,i){o.Group.call(this),this.add(this.createLine(t,e,i)),this._updateEffectSymbol(t,e)}var o=i(3),a=i(105),r=i(1),s=i(24),l=i(5),u=i(20),c=n.prototype;c.createLine=function(t,e,i){return new a(t,e,i)},c._updateEffectSymbol=function(t,e){var i=t.getItemModel(e),n=i.getModel("effect"),o=n.get("symbolSize"),a=n.get("symbol");r.isArray(o)||(o=[o,o]);var l=n.get("color")||t.getItemVisual(e,"color"),u=this.childAt(1);this._symbolType!==a&&(this.remove(u),
-u=s.createSymbol(a,-.5,-.5,1,1,l),u.z2=100,u.culling=!0,this.add(u)),u&&(u.setStyle("shadowColor",l),u.setStyle(n.getItemStyle(["color"])),u.attr("scale",o),u.setColor(l),u.attr("scale",o),this._symbolType=a,this._updateEffectAnimation(t,n,e))},c._updateEffectAnimation=function(t,e,i){var n=this.childAt(1);if(n){var o=this,a=t.getItemLayout(i),s=1e3*e.get("period"),l=e.get("loop"),u=e.get("constantSpeed"),c=r.retrieve(e.get("delay"),function(e){return e/t.count()*s/3}),h="function"==typeof c;if(n.ignore=!0,this.updateAnimationPoints(n,a),u>0&&(s=this.getLineLength(n)/u*1e3),s!==this._period||l!==this._loop){n.stopAnimation();var d=c;h&&(d=c(i)),n.__t>0&&(d=-s*n.__t),n.__t=0;var f=n.animate("",l).when(s,{__t:1}).delay(d).during(function(){o.updateSymbolPosition(n)});l||f.done(function(){o.remove(n)}),f.start()}this._period=s,this._loop=l}},c.getLineLength=function(t){return l.dist(t.__p1,t.__cp1)+l.dist(t.__cp1,t.__p2)},c.updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},c.updateData=function(t,e,i){this.childAt(0).updateData(t,e,i),this._updateEffectSymbol(t,e)},c.updateSymbolPosition=function(t){var e=t.__p1,i=t.__p2,n=t.__cp1,o=t.__t,a=t.position,r=u.quadraticAt,s=u.quadraticDerivativeAt;a[0]=r(e[0],n[0],i[0],o),a[1]=r(e[1],n[1],i[1],o);var l=s(e[0],n[0],i[0],o),c=s(e[1],n[1],i[1],o);t.rotation=-Math.atan2(c,l)-Math.PI/2,t.ignore=!1},c.updateLayout=function(t,e){this.childAt(0).updateLayout(t,e);var i=t.getItemModel(e).getModel("effect");this._updateEffectAnimation(t,i,e)},r.inherits(n,o.Group),t.exports=n},function(t,e,i){function n(t,e,i){o.Group.call(this),this._createPolyline(t,e,i)}var o=i(3),a=i(1),r=n.prototype;r._createPolyline=function(t,e,i){var n=t.getItemLayout(e),a=new o.Polyline({shape:{points:n}});this.add(a),this._updateCommonStl(t,e,i)},r.updateData=function(t,e,i){var n=t.hostModel,a=this.childAt(0),r={shape:{points:t.getItemLayout(e)}};o.updateProps(a,r,n,e),this._updateCommonStl(t,e,i)},r._updateCommonStl=function(t,e,i){var n=this.childAt(0),r=t.getItemModel(e),s=t.getItemVisual(e,"color"),l=i&&i.lineStyle,u=i&&i.hoverLineStyle;i&&!t.hasItemOption||(l=r.getModel("lineStyle.normal").getLineStyle(),u=r.getModel("lineStyle.emphasis").getLineStyle()),n.useStyle(a.defaults({strokeNoScale:!0,fill:"none",stroke:s},l)),n.hoverStyle=u,o.setHoverStyle(this)},r.updateLayout=function(t,e){var i=this.childAt(0);i.setShape("points",t.getItemLayout(e))},a.inherits(n,o.Group),t.exports=n},function(t,e,i){var n=i(14),o=i(417),a=i(264),r=i(25),s=i(26),l=i(1),u=i(28);t.exports=function(t,e,i,c,h){for(var d=new o(c),f=0;f<t.length;f++)d.addNode(l.retrieve(t[f].id,t[f].name,f),f);for(var p=[],g=[],m=0,f=0;f<e.length;f++){var v=e[f],y=v.source,x=v.target;d.addEdge(y,x,m)&&(g.push(v),p.push(l.retrieve(v.id,y+" > "+x)),m++)}var _,b=i.get("coordinateSystem");if("cartesian2d"===b||"polar"===b)_=u(t,i,i.ecModel);else{var w=s.get(b),S=r((w&&"view"!==w.type?w.dimensions||[]:[]).concat(["value"]),t);_=new n(S,i),_.initData(t)}var M=new n(["value"],i);return M.initData(g,p),h&&h(_,M),a({mainData:_,struct:d,structAttr:"graph",datas:{node:_,edge:M},datasAttr:{node:"data",edge:"edgeData"}}),d.update(),d}},function(t,e,i){var n=i(1),o={};o.layout=function(t,e){e=e||{};var i=t.coordinateSystem,o=t.axis,a={},r=o.position,s=o.orient,l=i.getRect(),u=[l.x,l.x+l.width,l.y,l.y+l.height],c={horizontal:{top:u[2],bottom:u[3]},vertical:{left:u[0],right:u[1]}};a.position=["vertical"===s?c.vertical[r]:u[0],"horizontal"===s?c.horizontal[r]:u[3]];var h={horizontal:0,vertical:1};a.rotation=Math.PI/2*h[s];var d={top:-1,bottom:1,right:1,left:-1};a.labelDirection=a.tickDirection=a.nameDirection=d[r],t.get("axisTick.inside")&&(a.tickDirection=-a.tickDirection),n.retrieve(e.labelInside,t.get("axisLabel.inside"))&&(a.labelDirection=-a.labelDirection);var f=e.rotate;return null==f&&(f=t.get("axisLabel.rotate")),a.labelRotation="top"===r?-f:f,a.labelInterval=o.getLabelInterval(),a.z2=1,a},t.exports=o},function(t,e,i){function n(t,e){var i=t.getItemStyle(),n=t.get("areaColor");return null!=n&&(i.fill=n),i}function o(t,e,i,n,o){i.off("click"),i.off("mousedown"),e.get("selectedMode")&&(i.on("mousedown",function(){t._mouseDownFlag=!0}),i.on("click",function(r){if(t._mouseDownFlag){t._mouseDownFlag=!1;for(var s=r.target;!s.__regions;)s=s.parent;if(s){var l={type:("geo"===e.mainType?"geo":"map")+"ToggleSelect",batch:h.map(s.__regions,function(t){return{name:t.name,from:o.uid}})};l[e.mainType+"Id"]=e.id,n.dispatchAction(l),a(e,i)}}}))}function a(t,e){e.eachChild(function(e){h.each(e.__regions,function(i){e.trigger(t.isSelected(i.name)?"emphasis":"normal")})})}function r(t,e){var i=new c.Group;this._controller=new s(t.getZr()),this._controllerHost={target:e?i:null},this.group=i,this._updateGroup=e,this._mouseDownFlag}var s=i(93),l=i(250),u=i(127),c=i(3),h=i(1);r.prototype={constructor:r,draw:function(t,e,i,r,s){var l="geo"===t.mainType,u=t.getData&&t.getData();l&&e.eachComponent({mainType:"series",subType:"map"},function(e){u||e.getHostGeoModel()!==t||(u=e.getData())});var d=t.coordinateSystem,f=this.group,p=d.scale,g={position:d.position,scale:p};!f.childAt(0)||s?f.attr(g):c.updateProps(f,g,t),f.removeAll();var m=["itemStyle","normal"],v=["itemStyle","emphasis"],y=["label","normal"],x=["label","emphasis"],_={};h.each(d.regions,function(e){var i=_[e.name]||(_[e.name]=new c.Group),o=new c.CompoundPath({shape:{paths:[]}});i.add(o);var a,r=t.getRegionModel(e.name)||t,s=r.getModel(m),d=r.getModel(v),g=n(s,p),b=n(d,p),w=r.getModel(y),S=r.getModel(x);if(u){a=u.indexOfName(e.name);var M=u.getItemVisual(a,"color",!0);M&&(g.fill=M)}var I=w.getModel("textStyle"),T=S.getModel("textStyle");h.each(e.geometries,function(t){if("polygon"===t.type){o.shape.paths.push(new c.Polygon({shape:{points:t.exterior}}));for(var e=0;e<(t.interiors?t.interiors.length:0);e++)o.shape.paths.push(new c.Polygon({shape:{points:t.interiors[e]}}))}}),o.setStyle(g),o.style.strokeNoScale=!0,o.culling=!0;var A=w.get("show"),C=S.get("show"),L=u&&isNaN(u.get("value",a)),D=u&&u.getItemLayout(a);if(l||L&&(A||C)||D&&D.showLabel){var P=u?a:e.name,k=t.getFormattedLabel(P,"normal"),O=t.getFormattedLabel(P,"emphasis"),E=new c.Text({style:{text:A?k||e.name:"",fill:I.getTextColor(),textFont:I.getFont(),textAlign:"center",textVerticalAlign:"middle"},hoverStyle:{text:C?O||e.name:"",fill:T.getTextColor(),textFont:T.getFont()},position:e.center.slice(),scale:[1/p[0],1/p[1]],z2:10,silent:!0});i.add(E)}if(u)u.setItemGraphicEl(a,i);else{var r=t.getRegionModel(e.name);o.eventData={componentType:"geo",geoIndex:t.componentIndex,name:e.name,region:r&&r.option||{}}}var z=i.__regions||(i.__regions=[]);z.push(e),c.setHoverStyle(i,b,{hoverSilentOnTouch:!!t.get("selectedMode")}),f.add(i)}),this._updateController(t,e,i),o(this,t,f,i,r),a(t,f)},remove:function(){this.group.removeAll(),this._controller.dispose(),this._controllerHost={}},_updateController:function(t,e,i){function n(){var e={type:"geoRoam",componentType:s};return e[s+"Id"]=t.id,e}var o=t.coordinateSystem,a=this._controller,r=this._controllerHost;r.zoomLimit=t.get("scaleLimit"),r.zoom=o.getZoom(),a.enable(t.get("roam")||!1);var s=t.mainType;a.off("pan").on("pan",function(t,e){this._mouseDownFlag=!1,l.updateViewOnPan(r,t,e),i.dispatchAction(h.extend(n(),{dx:t,dy:e}))},this),a.off("zoom").on("zoom",function(t,e,o){if(this._mouseDownFlag=!1,l.updateViewOnZoom(r,t,e,o),i.dispatchAction(h.extend(n(),{zoom:t,originX:e,originY:o})),this._updateGroup){var a=this.group,s=a.scale;a.traverse(function(t){"text"===t.type&&t.attr("scale",[1/s[0],1/s[1]])})}},this),a.setPointerChecker(function(e,n,a){return o.getViewRectAfterRoam().contain(n,a)&&!u.onIrrelevantElement(e,i,t)})}},t.exports=r},function(t,e){var i={};i.updateViewOnPan=function(t,e,i){var n=t.target,o=n.position;o[0]+=e,o[1]+=i,n.dirty()},i.updateViewOnZoom=function(t,e,i,n){var o=t.target,a=t.zoomLimit,r=o.position,s=o.scale,l=t.zoom=t.zoom||1;if(l*=e,a){var u=a.min||0,c=a.max||1/0;l=Math.max(Math.min(c,l),u)}var h=l/t.zoom;t.zoom=l,r[0]-=(i-r[0])*(h-1),r[1]-=(n-r[1])*(h-1),s[0]*=h,s[1]*=h,o.dirty()},t.exports=i},function(t,e,i){function n(t,e){var i=t._model;return i.get("axisExpandable")&&i.get("axisExpandTriggerOn")===e}i(263),i(403),i(371);var o=i(2),a=i(1),r=i(37),s=5;o.extendComponentView({type:"parallel",render:function(t,e,i){this._model=t,this._api=i,this._handlers||(this._handlers={},a.each(l,function(t,e){i.getZr().on(e,this._handlers[e]=a.bind(t,this))},this)),r.createOrUpdate(this,"_throttledDispatchExpand",t.get("axisExpandRate"),"fixRate")},dispose:function(t,e){a.each(this._handlers,function(t,i){e.getZr().off(i,t)}),this._handlers=null},_throttledDispatchExpand:function(t){this._dispatchExpand(t)},_dispatchExpand:function(t){t&&this._api.dispatchAction(a.extend({type:"parallelAxisExpand"},t))}});var l={mousedown:function(t){n(this,"click")&&(this._mouseDownPoint=[t.offsetX,t.offsetY])},mouseup:function(t){var e=this._mouseDownPoint;if(n(this,"click")&&e){var i=[t.offsetX,t.offsetY],o=Math.pow(e[0]-i[0],2)+Math.pow(e[1]-i[1],2);if(o>s)return;var a=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==a.behavior&&this._dispatchExpand({axisExpandWindow:a.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&n(this,"mousemove")){var e=this._model,i=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),o=i.behavior;"jump"===o&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===o?null:{axisExpandWindow:i.axisExpandWindow,animation:"jump"===o&&null})}}};o.registerPreprocessor(i(404))},function(t,e,i){i(416),i(356),i(413),i(55),i(359);var n=i(2);n.extendComponentView({type:"single"})},function(t,e,i){var n=i(2),o=i(1),a=i(9),r=i(266),s=i(82),l=i(187),u=s.mapVisual,c=i(6),h=s.eachVisual,d=i(4),f=o.isArray,p=o.each,g=d.asc,m=d.linearMap,v=o.noop,y=["#f6efa6","#d88273","#bf444c"],x=n.extendComponentModel({type:"visualMap",dependencies:["series"],stateList:["inRange","outOfRange"],replacableOptionKeys:["inRange","outOfRange","target","controller","color"],dataBound:[-(1/0),1/0],layoutMode:{type:"box",ignoreSize:!0},defaultOption:{show:!0,zlevel:0,z:4,seriesIndex:null,min:0,max:200,dimension:null,inRange:null,outOfRange:null,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,color:null,formatter:null,text:null,textStyle:{color:"#333"}},init:function(t,e,i){this._dataExtent,this.targetVisuals={},this.controllerVisuals={},this.textStyleModel,this.itemSize,this.mergeDefaultAndTheme(t,i)},optionUpdated:function(t,e){var i=this.option;a.canvasSupported||(i.realtime=!1),!e&&l.replaceVisualOption(i,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},resetVisual:function(t){var e=this.stateList;t=o.bind(t,this),this.controllerVisuals=l.createVisualMappings(this.option.controller,e,t),this.targetVisuals=l.createVisualMappings(this.option.target,e,t)},resetTargetSeries:function(){var t=this.option,e=null==t.seriesIndex;t.seriesIndex=e?[]:c.normalizeToArray(t.seriesIndex),e&&this.ecModel.eachSeries(function(e,i){t.seriesIndex.push(i)})},eachTargetSeries:function(t,e){o.each(this.option.seriesIndex,function(i){t.call(e,this.ecModel.getSeriesByIndex(i))},this)},isTargetSeries:function(t){var e=!1;return this.eachTargetSeries(function(i){i===t&&(e=!0)}),e},formatValueText:function(t,e,i){function n(t){return t===u[0]?"min":t===u[1]?"max":(+t).toFixed(l)}var a,r,s=this.option,l=s.precision,u=this.dataBound,c=s.formatter;return i=i||["<",">"],o.isArray(t)&&(t=t.slice(),a=!0),r=e?t:a?[n(t[0]),n(t[1])]:n(t),o.isString(c)?c.replace("{value}",a?r[0]:r).replace("{value2}",a?r[1]:r):o.isFunction(c)?a?c(t[0],t[1]):c(t):a?t[0]===u[0]?i[0]+" "+r[1]:t[1]===u[1]?i[1]+" "+r[0]:r[0]+" - "+r[1]:r},resetExtent:function(){var t=this.option,e=g([t.min,t.max]);this._dataExtent=e},getDataDimension:function(t){var e=this.option.dimension;return null!=e?e:t.dimensions.length-1},getExtent:function(){return this._dataExtent.slice()},completeVisualOption:function(){function t(t){f(n.color)&&!t.inRange&&(t.inRange={color:n.color.slice().reverse()}),t.inRange=t.inRange||{color:y},p(this.stateList,function(e){var i=t[e];if(o.isString(i)){var n=r.get(i,"active",d);n?(t[e]={},t[e][i]=n):delete t[e]}},this)}function e(t,e,i){var n=t[e],o=t[i];n&&!o&&(o=t[i]={},p(n,function(t,e){if(s.isValidType(e)){var i=r.get(e,"inactive",d);null!=i&&(o[e]=i,"color"!==e||o.hasOwnProperty("opacity")||o.hasOwnProperty("colorAlpha")||(o.opacity=[0,0]))}}))}function i(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,i=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,n=this.get("inactiveColor");p(this.stateList,function(a){var r=this.itemSize,s=t[a];s||(s=t[a]={color:d?n:[n]}),null==s.symbol&&(s.symbol=e&&o.clone(e)||(d?"roundRect":["roundRect"])),null==s.symbolSize&&(s.symbolSize=i&&o.clone(i)||(d?r[0]:[r[0],r[0]])),s.symbol=u(s.symbol,function(t){return"none"===t||"square"===t?"roundRect":t});var l=s.symbolSize;if(null!=l){var c=-(1/0);h(l,function(t){t>c&&(c=t)}),s.symbolSize=u(l,function(t){return m(t,[0,c],[0,r[0]],!0)})}},this)}var n=this.option,a={inRange:n.inRange,outOfRange:n.outOfRange},l=n.target||(n.target={}),c=n.controller||(n.controller={});o.merge(l,a),o.merge(c,a);var d=this.isCategory();t.call(this,l),t.call(this,c),e.call(this,l,"inRange","outOfRange"),i.call(this,c)},resetItemSize:function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},isCategory:function(){return!!this.option.categories},setSelected:v,getValueState:v,getVisualMeta:v});t.exports=x},function(t,e,i){var n=i(1),o=i(3),a=i(7),r=i(12),s=i(2),l=i(82);t.exports=s.extendComponentView({type:"visualMap",autoPositionValues:{left:1,right:1,top:1,bottom:1},init:function(t,e){this.ecModel=t,this.api=e,this.visualMapModel},render:function(t,e,i,n){return this.visualMapModel=t,t.get("show")===!1?void this.group.removeAll():void this.doRender.apply(this,arguments)},renderBackground:function(t){var e=this.visualMapModel,i=a.normalizeCssArray(e.get("padding")||0),n=t.getBoundingRect();t.add(new o.Rect({z2:-1,silent:!0,shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[3]+i[1],height:n.height+i[0]+i[2]},style:{fill:e.get("backgroundColor"),stroke:e.get("borderColor"),lineWidth:e.get("borderWidth")}}))},getControllerVisual:function(t,e,i){function o(t){return u[t]}function a(t,e){u[t]=e}i=i||{};var r=i.forceState,s=this.visualMapModel,u={};if("symbol"===e&&(u.symbol=s.get("itemSymbol")),"color"===e){var c=s.get("contentColor");u.color=c}var h=s.controllerVisuals[r||s.getValueState(t)],d=l.prepareVisualTypes(h);return n.each(d,function(n){var r=h[n];i.convertOpacityToAlpha&&"opacity"===n&&(n="colorAlpha",r=h.__alphaForOpacity),l.dependsOn(n,e)&&r&&r.applyVisual(t,o,a)}),u[e]},positionGroup:function(t){var e=this.visualMapModel,i=this.api;r.positionElement(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()})},doRender:n.noop})},function(t,e,i){var n=i(1),o=i(12),a={getItemAlign:function(t,e,i){var n=t.option,a=n.align;if(null!=a&&"auto"!==a)return a;for(var r={width:e.getWidth(),height:e.getHeight()},s="horizontal"===n.orient?1:0,l=[["left","right","width"],["top","bottom","height"]],u=l[s],c=[0,null,10],h={},d=0;d<3;d++)h[l[1-s][d]]=c[d],h[u[d]]=2===d?i[0]:n[u[d]];var f=[["x","width",3],["y","height",0]][s],p=o.getLayoutRect(h,r,n.padding);return u[(p.margin[f[2]]||0)+p[f[0]]+.5*p[f[1]]<.5*r[f[1]]?0:1]},convertDataIndex:function(t){return n.each(t||[],function(e){null!=t.dataIndex&&(t.dataIndexInside=t.dataIndex,t.dataIndex=null)}),t}};t.exports=a},function(t,e,i){function n(t,e){return t&&t.hasOwnProperty&&t.hasOwnProperty(e)}var o=i(1),a=o.each;t.exports=function(t){var e=t&&t.visualMap;o.isArray(e)||(e=e?[e]:[]),a(e,function(t){if(t){n(t,"splitList")&&!n(t,"pieces")&&(t.pieces=t.splitList,delete t.splitList);var e=t.pieces;e&&o.isArray(e)&&a(e,function(t){o.isObject(t)&&(n(t,"start")&&!n(t,"min")&&(t.min=t.start),n(t,"end")&&!n(t,"max")&&(t.max=t.end))})}})}},function(t,e,i){i(13).registerSubTypeDefaulter("visualMap",function(t){return t.categories||(t.pieces?t.pieces.length>0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})},function(t,e,i){function n(t,e){t.eachTargetSeries(function(e){var i=e.getData();s.applyVisual(t.stateList,t.targetVisuals,i,t.getValueState,t,t.getDataDimension(i))})}function o(t){t.eachSeries(function(e){var i=e.getData(),n=[];t.eachComponent("visualMap",function(t){if(t.isTargetSeries(e)){var o=t.getVisualMeta(u.bind(a,null,e,t))||{stops:[],outerColors:[]};o.dimension=t.getDataDimension(i),n.push(o)}}),e.getData().setVisual("visualMeta",n)})}function a(t,e,i,n){function o(t){return u[t]}function a(t,e){u[t]=e}for(var r=e.targetVisuals[n],s=l.prepareVisualTypes(r),u={color:t.getData().getVisual("color")},c=0,h=s.length;c<h;c++){var d=s[c],f=r["opacity"===d?"__alphaForOpacity":d];f&&f.applyVisual(i,o,a)}return u.color}var r=i(2),s=i(187),l=i(82),u=i(1);r.registerVisual(r.PRIORITY.VISUAL.COMPONENT,function(t){t.eachComponent("visualMap",function(e){n(e,t)}),o(t)})},function(t,e,i){var n=i(2),o={type:"selectDataRange",event:"dataRangeSelected",update:"update"};n.registerAction(o,function(t,e){e.eachComponent({mainType:"visualMap",query:t},function(e){e.setSelected(t.selected)})})},function(t,e,i){function n(){l.call(this)}function o(t){this.name=t,this.zoomLimit,l.call(this),this._roamTransform=new n,this._viewTransform=new n,this._center,this._zoom}function a(t,e,i,n){var o=i.seriesModel,a=o?o.coordinateSystem:null;return a===this?a[t](n):null}var r=i(5),s=i(19),l=i(57),u=i(1),c=i(11),h=r.applyTransform;u.mixin(n,l),o.prototype={constructor:o,type:"view",dimensions:["x","y"],setBoundingRect:function(t,e,i,n){return this._rect=new c(t,e,i,n),this._rect},getBoundingRect:function(){return this._rect},setViewRect:function(t,e,i,n){this.transformTo(t,e,i,n),this._viewRect=new c(t,e,i,n)},transformTo:function(t,e,i,n){var o=this.getBoundingRect(),a=this._viewTransform;a.transform=o.calculateTransform(new c(t,e,i,n)),a.decomposeTransform(),this._updateTransform()},setCenter:function(t){t&&(this._center=t,this._updateCenterAndZoom())},setZoom:function(t){t=t||1;var e=this.zoomLimit;e&&(null!=e.max&&(t=Math.min(e.max,t)),null!=e.min&&(t=Math.max(e.min,t))),this._zoom=t,this._updateCenterAndZoom()},getDefaultCenter:function(){var t=this.getBoundingRect(),e=t.x+t.width/2,i=t.y+t.height/2;return[e,i]},getCenter:function(){return this._center||this.getDefaultCenter()},getZoom:function(){return this._zoom||1},getRoamTransform:function(){return this._roamTransform},_updateCenterAndZoom:function(){var t=this._viewTransform.getLocalTransform(),e=this._roamTransform,i=this.getDefaultCenter(),n=this.getCenter(),o=this.getZoom();n=r.applyTransform([],n,t),i=r.applyTransform([],i,t),e.origin=n,e.position=[i[0]-n[0],i[1]-n[1]],e.scale=[o,o],this._updateTransform()},_updateTransform:function(){var t=this._roamTransform,e=this._viewTransform;e.parent=t,t.updateTransform(),e.updateTransform(),e.transform&&s.copy(this.transform||(this.transform=[]),e.transform),this.transform?(this.invTransform=this.invTransform||[],s.invert(this.invTransform,this.transform)):this.invTransform=null,this.decomposeTransform()},getViewRect:function(){return this._viewRect},getViewRectAfterRoam:function(){var t=this.getBoundingRect().clone();return t.applyTransform(this.transform),t},dataToPoint:function(t){var e=this.transform;return e?h([],t,e):[t[0],t[1]]},pointToData:function(t){var e=this.invTransform;return e?h([],t,e):[t[0],t[1]]},convertToPixel:u.curry(a,"dataToPoint"),convertFromPixel:u.curry(a,"pointToData"),containPoint:function(t){return this.getViewRectAfterRoam().contain(t[0],t[1])}},u.mixin(o,l),t.exports=o},function(t,e,i){function n(t,e,i){if(this.name=t,this.geometries=e,i)i=[i[0],i[1]];else{var n=this.getBoundingRect();i=[n.x+n.width/2,n.y+n.height/2]}this.center=i}var o=i(267),a=i(11),r=i(84),s=i(5);n.prototype={constructor:n,properties:null,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,i=[e,e],n=[-e,-e],o=[],l=[],u=this.geometries,c=0;c<u.length;c++)if("polygon"===u[c].type){var h=u[c].exterior;r.fromPoints(h,o,l),s.min(i,i,o),s.max(n,n,l)}return 0===c&&(i[0]=i[1]=n[0]=n[1]=0),this._rect=new a(i[0],i[1],n[0]-i[0],n[1]-i[1])},contain:function(t){var e=this.getBoundingRect(),i=this.geometries;if(!e.contain(t[0],t[1]))return!1;t:for(var n=0,a=i.length;n<a;n++)if("polygon"===i[n].type){var r=i[n].exterior,s=i[n].interiors;if(o.contain(r,t[0],t[1])){for(var l=0;l<(s?s.length:0);l++)if(o.contain(s[l]))continue t;return!0}}return!1},transformTo:function(t,e,i,n){var o=this.getBoundingRect(),r=o.width/o.height;i?n||(n=i/r):i=r*n;for(var l=new a(t,e,i,n),u=o.calculateTransform(l),c=this.geometries,h=0;h<c.length;h++)if("polygon"===c[h].type){for(var d=c[h].exterior,f=c[h].interiors,p=0;p<d.length;p++)s.applyTransform(d[p],d[p],u);for(var g=0;g<(f?f.length:0);g++)for(var p=0;p<f[g].length;p++)s.applyTransform(f[g][p],f[g][p],u)}o=this._rect,o.copy(l),this.center=[o.x+o.width/2,o.y+o.height/2]}},t.exports=n},function(t,e,i){function n(t){if(!t.UTF8Encoding)return t;var e=t.UTF8Scale;null==e&&(e=1024);for(var i=t.features,n=0;n<i.length;n++)for(var a=i[n],r=a.geometry,s=r.coordinates,l=r.encodeOffsets,u=0;u<s.length;u++){var c=s[u];if("Polygon"===r.type)s[u]=o(c,l[u],e);else if("MultiPolygon"===r.type)for(var h=0;h<c.length;h++){var d=c[h];c[h]=o(d,l[u][h],e)}}return t.UTF8Encoding=!1,t}function o(t,e,i){for(var n=[],o=e[0],a=e[1],r=0;r<t.length;r+=2){var s=t.charCodeAt(r)-64,l=t.charCodeAt(r+1)-64;s=s>>1^-(1&s),l=l>>1^-(1&l),s+=o,l+=a,o=s,a=l,n.push([s/i,l/i])}return n}var a=i(1),r=i(261);t.exports=function(t){return n(t),a.map(a.filter(t.features,function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0}),function(t){var e=t.properties,i=t.geometry,n=i.coordinates,o=[];"Polygon"===i.type&&o.push({type:"polygon",exterior:n[0],interiors:n.slice(1)}),"MultiPolygon"===i.type&&a.each(n,function(t){t[0]&&o.push({type:"polygon",exterior:t[0],interiors:t.slice(1)})});var s=new r(e.name,o,e.cp);return s.properties=e,s})}},function(t,e,i){function n(t,e){var i=[];return t.eachComponent("parallel",function(n,a){var r=new o(n,t,e);r.name="parallel_"+a,r.resize(n,e),n.coordinateSystem=r,r.model=n,i.push(r)}),t.eachSeries(function(e){if("parallel"===e.get("coordinateSystem")){var i=t.queryComponents({mainType:"parallel",index:e.get("parallelIndex"),id:e.get("parallelId")})[0];e.coordinateSystem=i.coordinateSystem}}),i}var o=i(401);i(26).register("parallel",{create:n})},function(t,e,i){function n(t){var e=t.mainData,i=t.datas;i||(i={main:e},t.datasAttr={main:"data"}),t.datas=t.mainData=null,u(e,i,t),d(i,function(i){d(e.TRANSFERABLE_METHODS,function(e){i.wrapMethod(e,h.curry(o,t))})}),e.wrapMethod("cloneShallow",h.curry(r,t)),d(e.CHANGABLE_METHODS,function(i){e.wrapMethod(i,h.curry(a,t))}),h.assert(i[e.dataType]===e)}function o(t,e){if(l(this)){var i=h.extend({},this[f]);i[this.dataType]=e,u(e,i,t)}else c(e,this.dataType,this[p],t);return e}function a(t,e){return t.struct&&t.struct.update(this),e}function r(t,e){return d(e[f],function(i,n){i!==e&&c(i.cloneShallow(),n,e,t)}),e}function s(t){var e=this[p];return null==t||null==e?e:e[f][t]}function l(t){return t[p]===t}function u(t,e,i){t[f]={},d(e,function(e,n){c(e,n,t,i)})}function c(t,e,i,n){i[f][e]=t,t[p]=i,t.dataType=e,n.struct&&(t[n.structAttr]=n.struct,n.struct[n.datasAttr[e]]=t),t.getLinkedData=s}var h=i(1),d=h.each,f="\0__link_datas",p="\0__link_mainData";t.exports=n},function(t,e,i){function n(){function t(e,n){if(n>=i.length)return e;for(var a=-1,r=e.length,s=i[n++],l={},u={};++a<r;){var c=s(e[a]),h=u[c];h?h.push(e[a]):u[c]=[e[a]]}return o.each(u,function(e,i){l[i]=t(e,n)}),l}function e(t,a){if(a>=i.length)return t;var r=[],s=n[a++];return o.each(t,function(t,i){r.push({key:i,values:e(t,a)})}),s?r.sort(function(t,e){return s(t.key,e.key)}):r}var i=[],n=[];return{key:function(t){return i.push(t),this},sortKeys:function(t){return n[i.length-1]=t,this},entries:function(i){return e(t(i,0),0)}}}var o=i(1);t.exports=n},function(t,e,i){var n=i(1),o={get:function(t,e,i){var o=n.clone((a[t]||{})[e]);return i&&n.isArray(o)?o[o.length-1]:o}},a={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}};t.exports=o},function(t,e,i){function n(t,e){return Math.abs(t-e)<r}function o(t,e,i){var o=0,r=t[0];if(!r)return!1;for(var s=1;s<t.length;s++){var l=t[s];o+=a(r[0],r[1],l[0],l[1],e,i),r=l}var u=t[0];return n(r[0],u[0])&&n(r[1],u[1])||(o+=a(r[0],r[1],u[0],u[1],e,i)),0!==o}var a=i(98),r=1e-8;t.exports={contain:o}},function(t,e,i){var n=i(89).extend({type:"series.pictorialBar",dependencies:["grid"],defaultOption:{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,hoverAnimation:!1},getInitialData:function(t){return t.stack=null,n.superApply(this,"getInitialData",arguments)}});t.exports=n},function(t,e,i){function n(t,e,i,n){var l=t.getItemLayout(e),u=i.get("symbolRepeat"),c=i.get("symbolClip"),h=i.get("symbolPosition")||"start",d=i.get("symbolRotate"),f=(d||0)*Math.PI/180||0,p=i.get("symbolPatternSize")||2,g=i.isAnimationEnabled(),m={dataIndex:e,layout:l,itemModel:i,symbolType:t.getItemVisual(e,"symbol")||"circle",color:t.getItemVisual(e,"color"),symbolClip:c,symbolRepeat:u,symbolRepeatDirection:i.get("symbolRepeatDirection"),symbolPatternSize:p,rotation:f,animationModel:g?i:null,hoverAnimation:g&&i.get("hoverAnimation"),z2:i.getShallow("z",!0)||0};o(i,u,l,n,m),a(t,e,l,u,c,m.boundingLength,m.pxSign,p,n,m),r(i,m.symbolScale,f,n,m);var v=m.symbolSize,y=i.get("symbolOffset");return I.isArray(y)&&(y=[D(y[0],v[0]),D(y[1],v[1])]),s(i,v,l,u,c,y,h,m.valueLineWidth,m.boundingLength,m.repeatCutLength,n,m),m}function o(t,e,i,n,o){var a=n.valueDim,r=t.get("symbolBoundingData"),s=n.coordSys.getOtherAxis(n.coordSys.getBaseAxis()),l=s.toGlobalCoord(s.dataToCoord(0)),u=o.boundingLength=null!=r?s.toGlobalCoord(s.dataToCoord(s.scale.parse(r)))-l:e?n.coordSysExtent[a.index][1-+(i[a.wh]<=0)]-l:i[a.wh];e&&(o.repeatCutLength=i[a.wh]),o.pxSign=u>0?1:u<0?-1:0}function a(t,e,i,n,o,a,r,s,l,u){var c=l.valueDim,h=l.categoryDim,d=Math.abs(i[h.wh]),f=t.getItemVisual(e,"symbolSize");I.isArray(f)?f=f.slice():(null==f&&(f="100%"),f=[f,f]),f[h.index]=D(f[h.index],d),f[c.index]=D(f[c.index],n?d:Math.abs(a)),u.symbolSize=f;var p=u.symbolScale=[f[0]/s,f[1]/s];p[c.index]*=(l.isHorizontal?-1:1)*r}function r(t,e,i,n,o){var a=t.get(P)||0;a&&(O.attr({scale:e.slice(),rotation:i}),O.updateTransform(),a/=O.getLineScale(),a*=e[n.valueDim.index]),o.valueLineWidth=a}function s(t,e,i,n,o,a,r,s,l,u,c,h){var d=c.categoryDim,f=c.valueDim,p=h.pxSign,g=Math.max(e[f.index]+s,0),m=g;if(n){var v=Math.abs(l),y=I.retrieve(t.get("symbolMargin"),"15%")+"",x=!1;y.lastIndexOf("!")===y.length-1&&(x=!0,y=y.slice(0,y.length-1)),y=D(y,e[f.index]);var _=Math.max(g+2*y,0),b=x?0:2*y,w=C.isNumeric(n),S=w?n:M((v+b)/_),T=v-S*g;y=T/2/(x?S:S-1),_=g+2*y,b=x?0:2*y,w||"fixed"===n||(S=u?M((Math.abs(u)+b)/_):0),m=S*_-b,h.repeatTimes=S,h.symbolMargin=y}var A=p*(m/2),L=h.pathPosition=[];L[d.index]=i[d.wh]/2,L[f.index]="start"===r?A:"end"===r?l-A:l/2,a&&(L[0]+=a[0],L[1]+=a[1]);var P=h.bundlePosition=[];P[d.index]=i[d.xy],P[f.index]=i[f.xy];var k=h.barRectShape=I.extend({},i);k[f.wh]=p*Math.max(Math.abs(i[f.wh]),Math.abs(L[f.index]+A)),k[d.wh]=i[d.wh];var O=h.clipShape={};O[d.xy]=-i[d.xy],O[d.wh]=c.ecSize[d.wh],O[f.xy]=0,O[f.wh]=i[f.wh]}function l(t){var e=t.symbolPatternSize,i=A.createSymbol(t.symbolType,-e/2,-e/2,e,e,t.color);return i.attr({culling:!0}),"image"!==i.type&&i.setStyle({strokeNoScale:!0}),i}function u(t,e,i,n){function o(t){var e=h.slice(),n=i.pxSign,o=t;return("start"===i.symbolRepeatDirection?n>0:n<0)&&(o=f-1-t),e[d.index]=g*(o-f/2+.5)+h[d.index],{position:e,scale:i.symbolScale.slice(),rotation:i.rotation}}function a(){b(t,function(t){t.trigger("emphasis")})}function r(){b(t,function(t){t.trigger("normal")})}var s=t.__pictorialBundle,u=i.symbolSize,c=i.valueLineWidth,h=i.pathPosition,d=e.valueDim,f=i.repeatTimes||0,p=0,g=u[e.valueDim.index]+c+2*i.symbolMargin;for(b(t,function(t){t.__pictorialAnimationIndex=p,t.__pictorialRepeatTimes=f,p<f?w(t,null,o(p),i,n):w(t,null,{scale:[0,0]},i,n,function(){s.remove(t)}),m(t,i),p++});p<f;p++){var v=l(i);v.__pictorialAnimationIndex=p,v.__pictorialRepeatTimes=f,s.add(v);var y=o(p,!0);w(v,{position:y.position,scale:[0,0]},{scale:y.scale,rotation:y.rotation},i,n),v.on("mouseover",a).on("mouseout",r),m(v,i)}}function c(t,e,i,n){function o(){this.trigger("emphasis")}function a(){this.trigger("normal")}var r=t.__pictorialBundle,s=t.__pictorialMainPath;s?w(s,null,{position:i.pathPosition.slice(),scale:i.symbolScale.slice(),rotation:i.rotation},i,n):(s=t.__pictorialMainPath=l(i),r.add(s),w(s,{position:i.pathPosition.slice(),scale:[0,0],rotation:i.rotation},{scale:i.symbolScale.slice()},i,n),s.on("mouseover",o).on("mouseout",a)),m(s,i)}function h(t,e,i){var n=I.extend({},e.barRectShape),o=t.__pictorialBarRect;o?w(o,null,{shape:n},e,i):(o=t.__pictorialBarRect=new T.Rect({z2:2,shape:n,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}}),t.add(o))}function d(t,e,i,n){if(i.symbolClip){var o=t.__pictorialClipPath,a=I.extend({},i.clipShape),r=e.valueDim,s=i.animationModel,l=i.dataIndex;if(o)T.updateProps(o,{shape:a},s,l);else{a[r.wh]=0,o=new T.Rect({shape:a}),t.__pictorialBundle.setClipPath(o),t.__pictorialClipPath=o;var u={};u[r.wh]=i.clipShape[r.wh],T[n?"updateProps":"initProps"](o,{shape:u},s,l)}}}function f(t,e){var i=t.getItemModel(e);return i.getAnimationDelayParams=p,i.isAnimationEnabled=g,i}function p(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function g(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function m(t,e){t.off("emphasis").off("normal");var i=e.symbolScale.slice();e.hoverAnimation&&t.on("emphasis",function(){this.animateTo({scale:[1.1*i[0],1.1*i[1]]},400,"elasticOut")}).on("normal",function(){this.animateTo({scale:i.slice()},400,"elasticOut")})}function v(t,e,i,n){var o=new T.Group,a=new T.Group;return o.add(a),o.__pictorialBundle=a,a.attr("position",i.bundlePosition.slice()),i.symbolRepeat?u(o,e,i):c(o,e,i),h(o,i,n),d(o,e,i,n),o.__pictorialShapeStr=_(t,i),o.__pictorialSymbolMeta=i,o}function y(t,e,i){var n=i.animationModel,o=i.dataIndex,a=t.__pictorialBundle;T.updateProps(a,{position:i.bundlePosition.slice()},n,o),i.symbolRepeat?u(t,e,i,!0):c(t,e,i,!0),h(t,i,!0),d(t,e,i,!0)}function x(t,e,i,n){var o=n.__pictorialBarRect;o&&(o.style.text="");var a=[];b(n,function(t){a.push(t)}),n.__pictorialMainPath&&a.push(n.__pictorialMainPath),n.__pictorialClipPath&&(i=null),I.each(a,function(t){T.updateProps(t,{scale:[0,0]},i,e,function(){n.parent&&n.parent.remove(n)})}),t.setItemGraphicEl(e,null)}function _(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function b(t,e,i){I.each(t.__pictorialBundle.children(),function(n){n!==t.__pictorialBarRect&&e.call(i,n)})}function w(t,e,i,n,o,a){e&&t.attr(e),n.symbolClip&&!o?i&&t.attr(i):i&&T[o?"updateProps":"initProps"](t,i,n.animationModel,n.dataIndex,a)}function S(t,e,i){var n=i.color,o=i.dataIndex,a=i.itemModel,r=a.getModel("itemStyle.normal").getItemStyle(["color"]),s=a.getModel("itemStyle.emphasis").getItemStyle();
-b(t,function(t){t.setColor(n),t.setStyle(I.defaults({fill:n,opacity:i.opacity},r)),T.setHoverStyle(t,s),t.z2=i.z2});var l={},u=e.valueDim.posDesc[+(i.boundingLength>0)],c=t.__pictorialBarRect;L.setLabel(c.style,l,a,n,e.seriesModel,o,u),T.setHoverStyle(c,l)}function M(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var I=i(1),T=i(3),A=i(24),C=i(4),L=i(90),D=C.parsePercent,P=["itemStyle","normal","borderWidth"],k=[{xy:"x",wh:"width",index:0,posDesc:["left","right"]},{xy:"y",wh:"height",index:1,posDesc:["top","bottom"]}],O=new T.Circle,E=i(2).extendChartView({type:"pictorialBar",render:function(t,e,i){var o=this.group,a=t.getData(),r=this._data,s=t.coordinateSystem,l=s.getBaseAxis(),u=!!l.isHorizontal(),c=s.grid.getRect(),h={ecSize:{width:i.getWidth(),height:i.getHeight()},seriesModel:t,coordSys:s,coordSysExtent:[[c.x,c.x+c.width],[c.y,c.y+c.height]],isHorizontal:u,valueDim:k[+u],categoryDim:k[1-u]};return a.diff(r).add(function(t){if(a.hasValue(t)){var e=f(a,t),i=n(a,t,e,h),r=v(a,h,i);a.setItemGraphicEl(t,r),o.add(r),S(r,h,i)}}).update(function(t,e){var i=r.getItemGraphicEl(e);if(!a.hasValue(t))return void o.remove(i);var s=f(a,t),l=n(a,t,s,h),u=_(a,l);i&&u!==i.__pictorialShapeStr&&(o.remove(i),a.setItemGraphicEl(t,null),i=null),i?y(i,h,l):i=v(a,h,l,!0),a.setItemGraphicEl(t,i),i.__pictorialSymbolMeta=l,o.add(i),S(i,h,l)}).remove(function(t){var e=r.getItemGraphicEl(t);e&&x(r,t,e.__pictorialSymbolMeta.animationModel,e)}).execute(),this._data=a,this.group},dispose:I.noop,remove:function(t,e){var i=this.group,n=this._data;t.get("animation")?n&&n.eachItemGraphicEl(function(e){x(n,e.dataIndex,t,e)}):i.removeAll()}});t.exports=E},function(t,e,i){var n=i(2);i(271),i(272),n.registerVisual(i(274)),n.registerLayout(i(273))},function(t,e,i){"use strict";var n=i(1),o=i(18),a=i(183),r=o.extend({type:"series.boxplot",dependencies:["xAxis","yAxis","grid"],valueDimensions:["min","Q1","median","Q3","max"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,layout:null,boxWidth:[7,50],itemStyle:{normal:{color:"#fff",borderWidth:1},emphasis:{borderWidth:2,shadowBlur:5,shadowOffsetX:2,shadowOffsetY:2,shadowColor:"rgba(0,0,0,0.4)"}},animationEasing:"elasticOut",animationDuration:800}});n.mixin(r,a.seriesModelMixin,!0),t.exports=r},function(t,e,i){"use strict";function n(t,e,i){var n=e.getItemModel(i),o=n.getModel(u),a=e.getItemVisual(i,"color"),s=o.getItemStyle(["borderColor"]),l=t.childAt(t.whiskerIndex);l.style.set(s),l.style.stroke=a,l.dirty();var h=t.childAt(t.bodyIndex);h.style.set(s),h.style.stroke=a,h.dirty();var d=n.getModel(c).getItemStyle();r.setHoverStyle(t,d)}var o=i(1),a=i(30),r=i(3),s=i(183),l=a.extend({type:"boxplot",getStyleUpdater:function(){return n},dispose:o.noop});o.mixin(l,s.viewMixin,!0);var u=["itemStyle","normal"],c=["itemStyle","emphasis"];t.exports=l},function(t,e,i){function n(t){var e=[],i=[];return t.eachSeriesByType("boxplot",function(t){var n=t.getBaseAxis(),o=r.indexOf(i,n);o<0&&(o=i.length,i[o]=n,e[o]={axis:n,seriesModels:[]}),e[o].seriesModels.push(t)}),e}function o(t){var e,i,n=t.axis,o=t.seriesModels,a=o.length,s=t.boxWidthList=[],c=t.boxOffsetList=[],h=[];if("category"===n.type)i=n.getBandWidth();else{var d=0;u(o,function(t){d=Math.max(d,t.getData().count())}),e=n.getExtent(),Math.abs(e[1]-e[0])/d}u(o,function(t){var e=t.get("boxWidth");r.isArray(e)||(e=[e,e]),h.push([l(e[0],i)||0,l(e[1],i)||0])});var f=.8*i-2,p=f/a*.3,g=(f-p*(a-1))/a,m=g/2-f/2;u(o,function(t,e){c.push(m),m+=p+g,s.push(Math.min(Math.max(g,h[e][0]),h[e][1]))})}function a(t,e,i){var n=t.coordinateSystem,o=t.getData(),a=t.dimensions,r=t.get("layout"),s=i/2;o.each(a,function(){function t(t){var i=[];i[f]=h,i[p]=t;var o;return isNaN(h)||isNaN(t)?o=[NaN,NaN]:(o=n.dataToPoint(i),o[f]+=e),o}function i(t,e){var i=t.slice(),n=t.slice();i[f]+=s,n[f]-=s,e?x.push(i,n):x.push(n,i)}function l(t){var e=[t.slice(),t.slice()];e[0][f]-=s,e[1][f]+=s,y.push(e)}var u=arguments,c=a.length,h=u[0],d=u[c],f="horizontal"===r?0:1,p=1-f,g=t(u[3]),m=t(u[1]),v=t(u[5]),y=[[m,t(u[2])],[v,t(u[4])]];l(m),l(v),l(g);var x=[];i(y[0][1],0),i(y[1][1],1),o.setItemLayout(d,{chartLayout:r,initBaseline:g[p],median:g,bodyEnds:x,whiskerEnds:y})})}var r=i(1),s=i(4),l=s.parsePercent,u=r.each;t.exports=function(t){var e=n(t);u(e,function(t){var e=t.seriesModels;e.length&&(o(t),u(e,function(e,i){a(e,t.boxOffsetList[i],t.boxWidthList[i])}))})}},function(t,e){var i=["itemStyle","normal","borderColor"];t.exports=function(t,e){var n=t.get("color");t.eachRawSeriesByType("boxplot",function(e){var o=n[e.seriesIndex%n.length],a=e.getData();a.setVisual({legendSymbol:"roundRect",color:e.get(i)||o}),t.isSeriesFiltered(e)||a.each(function(t){var e=a.getItemModel(t);a.setItemVisual(t,{color:e.get(i,!0)})})})}},function(t,e,i){var n=i(2);i(276),i(277),n.registerPreprocessor(i(280)),n.registerVisual(i(279)),n.registerLayout(i(278))},function(t,e,i){"use strict";var n=i(1),o=i(18),a=i(183),r=i(7),s=r.encodeHTML,l=r.addCommas,u=o.extend({type:"series.candlestick",dependencies:["xAxis","yAxis","grid"],valueDimensions:["open","close","lowest","highest"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,layout:null,itemStyle:{normal:{color:"#c23531",color0:"#314656",borderWidth:1,borderColor:"#c23531",borderColor0:"#314656"},emphasis:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,animationUpdate:!1,animationEasing:"linear",animationDuration:300},getShadowDim:function(){return"open"},formatTooltip:function(t,e){var i=n.map(this.valueDimensions,function(e){return s(e+": "+l(this.getData().get(e,t)))},this).join("<br />"),o=[];return null!=this.name&&o.push(s(this.name)),null!=i&&o.push(i),o.join("<br />")},brushSelector:function(t,e,i){var n=e.getItemLayout(t);return i.rect(n.brushRect)}});n.mixin(u,a.seriesModelMixin,!0),t.exports=u},function(t,e,i){"use strict";function n(t,e,i){var n=e.getItemModel(i),o=n.getModel(u),a=e.getItemVisual(i,"color"),s=e.getItemVisual(i,"borderColor")||a,l=o.getItemStyle(["color","color0","borderColor","borderColor0"]),h=t.childAt(t.whiskerIndex);h.useStyle(l),h.style.stroke=s;var d=t.childAt(t.bodyIndex);d.useStyle(l),d.style.fill=a,d.style.stroke=s;var f=n.getModel(c).getItemStyle();r.setHoverStyle(t,f)}var o=i(1),a=i(30),r=i(3),s=i(183),l=a.extend({type:"candlestick",getStyleUpdater:function(){return n},dispose:o.noop});o.mixin(l,s.viewMixin,!0);var u=["itemStyle","normal"],c=["itemStyle","emphasis"];t.exports=l},function(t,e,i){function n(t,e){var i,n=t.getBaseAxis(),r="category"===n.type?n.getBandWidth():(i=n.getExtent(),Math.abs(i[1]-i[0])/e.count()),s=a(o(t.get("barMaxWidth"),r),r),l=a(o(t.get("barMinWidth"),1),r),u=t.get("barWidth");return null!=u?a(u,r):Math.max(Math.min(r/2,s),l)}var o=i(1).retrieve,a=i(4).parsePercent;t.exports=function(t){t.eachSeriesByType("candlestick",function(t){var e=t.coordinateSystem,i=t.getData(),o=t.dimensions,a=t.get("layout"),r=n(t,i);i.each(o,function(){function t(t){var i=[];return i[d]=c,i[f]=t,isNaN(c)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function n(t,e){var i=t.slice(),n=t.slice();i[d]+=r/2,n[d]-=r/2,e?I.push(i,n):I.push(n,i)}function s(){var e=t(Math.min(p,g,m,v)),i=t(Math.max(p,g,m,v));return e[d]-=r/2,i[d]-=r/2,{x:e[0],y:e[1],width:f?r:i[0]-e[0],height:f?i[1]-e[1]:r}}var l=arguments,u=o.length,c=l[0],h=l[u],d="horizontal"===a?0:1,f=1-d,p=l[1],g=l[2],m=l[3],v=l[4],y=Math.min(p,g),x=Math.max(p,g),_=t(y),b=t(x),w=t(m),S=t(v),M=[[S,b],[w,_]],I=[];n(b,0),n(_,1),i.setItemLayout(h,{chartLayout:a,sign:p>g?-1:p<g?1:0,initBaseline:p>g?b[f]:_[f],bodyEnds:I,whiskerEnds:M,brushRect:s()})},!0)})}},function(t,e){var i=["itemStyle","normal","borderColor"],n=["itemStyle","normal","borderColor0"],o=["itemStyle","normal","color"],a=["itemStyle","normal","color0"];t.exports=function(t,e){t.eachRawSeriesByType("candlestick",function(e){var r=e.getData();r.setVisual({legendSymbol:"roundRect"}),t.isSeriesFiltered(e)||r.each(function(t){var e=r.getItemModel(t),s=r.getItemLayout(t).sign;r.setItemVisual(t,{color:e.get(s>0?o:a),borderColor:e.get(s>0?i:n)})})})}},function(t,e,i){var n=i(1);t.exports=function(t){t&&n.isArray(t.series)&&n.each(t.series,function(t){n.isObject(t)&&"k"===t.type&&(t.type="candlestick")})}},function(t,e,i){var n=i(1),o=i(2);i(282),i(283),o.registerVisual(n.curry(i(50),"effectScatter","circle",null)),o.registerLayout(n.curry(i(60),"effectScatter"))},function(t,e,i){"use strict";var n=i(28),o=i(18);t.exports=o.extend({type:"series.effectScatter",dependencies:["grid","polar"],getInitialData:function(t,e){var i=n(t.data,this,e);return i},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,effectType:"ripple",progressive:0,showEffectOn:"render",rippleEffect:{period:4,scale:2.5,brushType:"fill"},symbolSize:10}})},function(t,e,i){var n=i(44),o=i(310);i(2).extendChartView({type:"effectScatter",init:function(){this._symbolDraw=new n(o)},render:function(t,e,i){var n=t.getData(),o=this._symbolDraw;o.updateData(n),this.group.add(o.group)},updateLayout:function(){this._symbolDraw.updateLayout()},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e)},dispose:function(){}})},function(t,e,i){var n=i(1),o=i(2);i(285),i(286),o.registerVisual(n.curry(i(83),"funnel")),o.registerLayout(i(287)),o.registerProcessor(n.curry(i(62),"funnel"))},function(t,e,i){"use strict";var n=i(14),o=i(6),a=i(25),r=i(2).extendSeriesModel({type:"series.funnel",init:function(t){r.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this._defaultLabelLine(t)},getInitialData:function(t,e){var i=a(["value"],t.data),o=new n(i,this);return o.initData(t.data),o},_defaultLabelLine:function(t){o.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},getDataParams:function(t){var e=this.getData(),i=r.superCall(this,"getDataParams",t),n=e.getSum("value");return i.percent=n?+(e.get("value",t)/n*100).toFixed(2):0,i.$vars.push("percent"),i},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",gap:0,funnelAlign:"center",label:{normal:{show:!0,position:"outer"},emphasis:{show:!0}},labelLine:{normal:{show:!0,length:20,lineStyle:{width:1,type:"solid"}},emphasis:{}},itemStyle:{normal:{borderColor:"#fff",borderWidth:1},emphasis:{}}}});t.exports=r},function(t,e,i){function n(t,e){function i(){r.ignore=r.hoverIgnore,s.ignore=s.hoverIgnore}function n(){r.ignore=r.normalIgnore,s.ignore=s.normalIgnore}a.Group.call(this);var o=new a.Polygon,r=new a.Polyline,s=new a.Text;this.add(o),this.add(r),this.add(s),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function o(t,e,i,n){var o=n.getModel("textStyle"),a=n.get("position"),s="inside"===a||"inner"===a||"center"===a;return{fill:o.getTextColor()||(s?"#fff":t.getItemVisual(e,"color")),textFont:o.getFont(),text:r.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var a=i(3),r=i(1),s=n.prototype,l=["itemStyle","normal","opacity"];s.updateData=function(t,e,i){var n=this.childAt(0),o=t.hostModel,s=t.getItemModel(e),u=t.getItemLayout(e),c=t.getItemModel(e).get(l);c=null==c?1:c,n.useStyle({}),i?(n.setShape({points:u.points}),n.setStyle({opacity:0}),a.initProps(n,{style:{opacity:c}},o,e)):a.updateProps(n,{style:{opacity:c},shape:{points:u.points}},o,e);var h=s.getModel("itemStyle"),d=t.getItemVisual(e,"color");n.setStyle(r.defaults({lineJoin:"round",fill:d},h.getModel("normal").getItemStyle(["opacity"]))),n.hoverStyle=h.getModel("emphasis").getItemStyle(),this._updateLabel(t,e),a.setHoverStyle(this)},s._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),r=t.hostModel,s=t.getItemModel(e),l=t.getItemLayout(e),u=l.label,c=t.getItemVisual(e,"color");a.updateProps(i,{shape:{points:u.linePoints||u.linePoints}},r,e),a.updateProps(n,{style:{x:u.x,y:u.y}},r,e),n.attr({style:{textAlign:u.textAlign,textVerticalAlign:u.verticalAlign,textFont:u.font},rotation:u.rotation,origin:[u.x,u.y],z2:10});var h=s.getModel("label.normal"),d=s.getModel("label.emphasis"),f=s.getModel("labelLine.normal"),p=s.getModel("labelLine.emphasis");n.setStyle(o(t,e,"normal",h)),n.ignore=n.normalIgnore=!h.get("show"),n.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:c}),i.setStyle(f.getModel("lineStyle").getLineStyle()),n.hoverStyle=o(t,e,"emphasis",d),i.hoverStyle=p.getModel("lineStyle").getLineStyle()},r.inherits(n,a.Group);var u=i(30).extend({type:"funnel",render:function(t,e,i){var o=t.getData(),a=this._data,r=this.group;o.diff(a).add(function(t){var e=new n(o,t);o.setItemGraphicEl(t,e),r.add(e)}).update(function(t,e){var i=a.getItemGraphicEl(e);i.updateData(o,t),r.add(i),o.setItemGraphicEl(t,i)}).remove(function(t){var e=a.getItemGraphicEl(t);r.remove(e)}).execute(),this._data=o},remove:function(){this.group.removeAll(),this._data=null},dispose:function(){}});t.exports=u},function(t,e,i){function n(t,e){return r.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function o(t,e){for(var i=t.mapArray("value",function(t){return t}),n=[],o="ascending"===e,a=0,r=t.count();a<r;a++)n[a]=a;return"function"==typeof e?n.sort(e):"none"!==e&&n.sort(function(t,e){return o?i[t]-i[e]:i[e]-i[t]}),n}function a(t){t.each(function(e){var i,n,o,a,r=t.getItemModel(e),s=r.getModel("label.normal"),l=s.get("position"),u=r.getModel("labelLine.normal"),c=t.getItemLayout(e),h=c.points,d="inner"===l||"inside"===l||"center"===l;if(d)n=(h[0][0]+h[1][0]+h[2][0]+h[3][0])/4,o=(h[0][1]+h[1][1]+h[2][1]+h[3][1])/4,i="center",a=[[n,o],[n,o]];else{var f,p,g,m=u.get("length");"left"===l?(f=(h[3][0]+h[0][0])/2,p=(h[3][1]+h[0][1])/2,g=f-m,n=g-5,i="right"):(f=(h[1][0]+h[2][0])/2,p=(h[1][1]+h[2][1])/2,g=f+m,n=g+5,i="left");var v=p;a=[[f,p],[g,v]],o=v}c.label={linePoints:a,x:n,y:o,verticalAlign:"middle",textAlign:i,inside:d}})}var r=i(12),s=i(4),l=s.parsePercent;t.exports=function(t,e,i){t.eachSeriesByType("funnel",function(t){var i=t.getData(),r=t.get("sort"),u=n(t,e),c=o(i,r),h=[l(t.get("minSize"),u.width),l(t.get("maxSize"),u.width)],d=i.getDataExtent("value"),f=t.get("min"),p=t.get("max");null==f&&(f=Math.min(d[0],0)),null==p&&(p=d[1]);var g=t.get("funnelAlign"),m=t.get("gap"),v=(u.height-m*(i.count()-1))/i.count(),y=u.y,x=function(t,e){var n,o=i.get("value",t)||0,a=s.linearMap(o,[f,p],h,!0);switch(g){case"left":n=u.x;break;case"center":n=u.x+(u.width-a)/2;break;case"right":n=u.x+u.width-a}return[[n,e],[n+a,e]]};"ascending"===r&&(v=-v,m=-m,y+=u.height,c=c.reverse());for(var _=0;_<c.length;_++){var b=c[_],w=c[_+1],S=x(b,y),M=x(w,y+v);y+=v+m,i.setItemLayout(b,{points:S.concat(M.slice().reverse())})}a(i)})}},function(t,e,i){i(289),i(290)},function(t,e,i){var n=i(14),o=i(18),a=i(1),r=o.extend({type:"series.gauge",getInitialData:function(t,e){var i=new n(["value"],this),o=t.data||[];return a.isArray(o)||(o=[o]),i.initData(o),i},defaultOption:{zlevel:0,z:2,center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,lineStyle:{color:[[.2,"#91c7ae"],[.8,"#63869e"],[1,"#c23531"]],width:30}},splitLine:{show:!0,length:30,lineStyle:{color:"#eee",width:2,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:8,lineStyle:{color:"#eee",width:1,type:"solid"}},axisLabel:{show:!0,distance:5,textStyle:{color:"auto"}},pointer:{show:!0,length:"80%",width:8},itemStyle:{normal:{color:"auto"}},title:{show:!0,offsetCenter:[0,"-40%"],textStyle:{color:"#333",fontSize:15}},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:40,offsetCenter:[0,"40%"],textStyle:{color:"auto",fontSize:30}}}});t.exports=r},function(t,e,i){function n(t,e){var i=t.get("center"),n=e.getWidth(),o=e.getHeight(),a=Math.min(n,o),r=l(i[0],e.getWidth()),s=l(i[1],e.getHeight()),u=l(t.get("radius"),a/2);return{cx:r,cy:s,r:u}}function o(t,e){return e&&("string"==typeof e?t=e.replace("{value}",null!=t?t:""):"function"==typeof e&&(t=e(t))),t}var a=i(291),r=i(3),s=i(4),l=s.parsePercent,u=2*Math.PI,c=i(30).extend({type:"gauge",render:function(t,e,i){this.group.removeAll();var o=t.get("axisLine.lineStyle.color"),a=n(t,i);this._renderMain(t,e,i,o,a)},dispose:function(){},_renderMain:function(t,e,i,n,o){for(var a=this.group,s=t.getModel("axisLine"),l=s.getModel("lineStyle"),c=t.get("clockwise"),h=-t.get("startAngle")/180*Math.PI,d=-t.get("endAngle")/180*Math.PI,f=(d-h)%u,p=h,g=l.get("width"),m=0;m<n.length;m++){var v=Math.min(Math.max(n[m][0],0),1),d=h+f*v,y=new r.Sector({shape:{startAngle:p,endAngle:d,cx:o.cx,cy:o.cy,clockwise:c,r0:o.r-g,r:o.r},silent:!0});y.setStyle({fill:n[m][1]}),y.setStyle(l.getLineStyle(["color","borderWidth","borderColor"])),a.add(y),p=d}var x=function(t){if(t<=0)return n[0][1];for(var e=0;e<n.length;e++)if(n[e][0]>=t&&(0===e?0:n[e-1][0])<t)return n[e][1];return n[e-1][1]};if(!c){var _=h;h=d,d=_}this._renderTicks(t,e,i,x,o,h,d,c),this._renderPointer(t,e,i,x,o,h,d,c),this._renderTitle(t,e,i,x,o),this._renderDetail(t,e,i,x,o)},_renderTicks:function(t,e,i,n,a,u,c,h){for(var d=this.group,f=a.cx,p=a.cy,g=a.r,m=+t.get("min"),v=+t.get("max"),y=t.getModel("splitLine"),x=t.getModel("axisTick"),_=t.getModel("axisLabel"),b=t.get("splitNumber"),w=x.get("splitNumber"),S=l(y.get("length"),g),M=l(x.get("length"),g),I=u,T=(c-u)/b,A=T/w,C=y.getModel("lineStyle").getLineStyle(),L=x.getModel("lineStyle").getLineStyle(),D=_.getModel("textStyle"),P=0;P<=b;P++){var k=Math.cos(I),O=Math.sin(I);if(y.get("show")){var E=new r.Line({shape:{x1:k*g+f,y1:O*g+p,x2:k*(g-S)+f,y2:O*(g-S)+p},style:C,silent:!0});"auto"===C.stroke&&E.setStyle({stroke:n(P/b)}),d.add(E)}if(_.get("show")){var z=o(s.round(P/b*(v-m)+m),_.get("formatter")),R=_.get("distance"),N=new r.Text({style:{text:z,x:k*(g-S-R)+f,y:O*(g-S-R)+p,fill:D.getTextColor(),textFont:D.getFont(),textVerticalAlign:O<-.4?"top":O>.4?"bottom":"middle",textAlign:k<-.4?"left":k>.4?"right":"center"},silent:!0});"auto"===N.style.fill&&N.setStyle({fill:n(P/b)}),d.add(N)}if(x.get("show")&&P!==b){for(var V=0;V<=w;V++){var k=Math.cos(I),O=Math.sin(I),B=new r.Line({shape:{x1:k*g+f,y1:O*g+p,x2:k*(g-M)+f,y2:O*(g-M)+p},silent:!0,style:L});"auto"===L.stroke&&B.setStyle({stroke:n((P+V/w)/b)}),d.add(B),I+=A}I-=A}else I+=T}},_renderPointer:function(t,e,i,n,o,u,c,h){var d=this.group,f=this._data;if(!t.get("pointer.show"))return void(f&&f.eachItemGraphicEl(function(t){d.remove(t)}));var p=[+t.get("min"),+t.get("max")],g=[u,c],m=t.getData();m.diff(f).add(function(e){var i=new a({shape:{angle:u}});r.initProps(i,{shape:{angle:s.linearMap(m.get("value",e),p,g,!0)}},t),d.add(i),m.setItemGraphicEl(e,i)}).update(function(e,i){var n=f.getItemGraphicEl(i);r.updateProps(n,{shape:{angle:s.linearMap(m.get("value",e),p,g,!0)}},t),d.add(n),m.setItemGraphicEl(e,n)}).remove(function(t){var e=f.getItemGraphicEl(t);d.remove(e)}).execute(),m.eachItemGraphicEl(function(t,e){var i=m.getItemModel(e),a=i.getModel("pointer");t.setShape({x:o.cx,y:o.cy,width:l(a.get("width"),o.r),r:l(a.get("length"),o.r)}),t.useStyle(i.getModel("itemStyle.normal").getItemStyle()),"auto"===t.style.fill&&t.setStyle("fill",n(s.linearMap(m.get("value",e),p,[0,1],!0))),r.setHoverStyle(t,i.getModel("itemStyle.emphasis").getItemStyle())}),this._data=m},_renderTitle:function(t,e,i,n,o){var a=t.getModel("title");if(a.get("show")){var u=a.getModel("textStyle"),c=a.get("offsetCenter"),h=o.cx+l(c[0],o.r),d=o.cy+l(c[1],o.r),f=new r.Text({style:{x:h,y:d,text:t.getData().getName(0),fill:u.getTextColor(),textFont:u.getFont(),textAlign:"center",textVerticalAlign:"middle"}});if("auto"===f.style.fill){var p=+t.get("min"),g=+t.get("max"),m=t.getData().get("value",0);f.setStyle("fill",n(s.linearMap(m,[p,g],[0,1],!0)))}this.group.add(f)}},_renderDetail:function(t,e,i,n,a){var u=t.getModel("detail"),c=+t.get("min"),h=+t.get("max");if(u.get("show")){var d=u.getModel("textStyle"),f=u.get("offsetCenter"),p=a.cx+l(f[0],a.r),g=a.cy+l(f[1],a.r),m=l(u.get("width"),a.r),v=l(u.get("height"),a.r),y=t.getData().get("value",0),x=new r.Rect({shape:{x:p-m/2,y:g-v/2,width:m,height:v},style:{text:o(y,u.get("formatter")),fill:u.get("backgroundColor"),textFill:d.getTextColor(),textFont:d.getFont()}});"auto"===x.style.textFill&&x.setStyle("textFill",n(s.linearMap(y,[c,h],[0,1],!0))),x.setStyle(u.getItemStyle(["color"])),this.group.add(x)}}});t.exports=c},function(t,e,i){t.exports=i(8).extend({type:"echartsGaugePointer",shape:{angle:0,width:10,r:10,x:0,y:0},buildPath:function(t,e){var i=Math.cos,n=Math.sin,o=e.r,a=e.width,r=e.angle,s=e.x-i(r)*a*(a>=o/3?1:2),l=e.y-n(r)*a*(a>=o/3?1:2);r=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+i(r)*a,e.y+n(r)*a),t.lineTo(e.x+i(e.angle)*o,e.y+n(e.angle)*o),t.lineTo(e.x-i(r)*a,e.y-n(r)*a),t.lineTo(s,l)}})},function(t,e,i){var n=i(2),o=i(1);i(293),i(294),i(303),n.registerProcessor(i(296)),n.registerVisual(o.curry(i(50),"graph","circle",null)),n.registerVisual(i(297)),n.registerVisual(i(300)),n.registerLayout(i(304)),n.registerLayout(i(298)),n.registerLayout(i(302)),n.registerCoordinateSystem("graphView",{create:i(299)})},function(t,e,i){"use strict";var n=i(14),o=i(1),a=i(6),r=i(10),s=i(7),l=i(247),u=i(2).extendSeriesModel({type:"series.graph",init:function(t){u.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._categoriesData},this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeOption:function(t){u.superApply(this,"mergeOption",arguments),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeDefaultAndTheme:function(t){u.superApply(this,"mergeDefaultAndTheme",arguments),a.defaultEmphasis(t.edgeLabel,a.LABEL_OPTIONS)},getInitialData:function(t,e){function i(t,i){function n(t){return t=this.parsePath(t),t&&"label"===t[0]?s:this.parentModel}t.wrapMethod("getItemModel",function(t){var e=a._categoriesModels,i=t.getShallow("category"),n=e[i];return n&&(n.parentModel=t.parentModel,t.parentModel=n),t});var o=a.getModel("edgeLabel"),s=new r({label:o.option},o.parentModel,e);i.wrapMethod("getItemModel",function(t){return t.customizeGetParent(n),t})}var n=t.edges||t.links||[],o=t.data||t.nodes||[],a=this;if(o&&n)return l(o,n,this,!0,i).data},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},getCategoriesData:function(){return this._categoriesData},formatTooltip:function(t,e,i){if("edge"===i){var n=this.getData(),o=this.getDataParams(t,i),a=n.graph.getEdgeByIndex(t),r=n.getName(a.node1.dataIndex),l=n.getName(a.node2.dataIndex),c=[];return null!=r&&c.push(r),null!=l&&c.push(l),c=s.encodeHTML(c.join(" > ")),o.value&&(c+=" : "+s.encodeHTML(o.value)),c}return u.superApply(this,"formatTooltip",arguments)},_updateCategoriesData:function(){var t=o.map(this.option.categories||[],function(t){return null!=t.value?t:o.extend({value:0},t)}),e=new n(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray(function(t){return e.getItemModel(t,!0)})},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},isAnimationEnabled:function(){return u.superCall(this,"isAnimationEnabled")&&!("force"===this.get("layout")&&this.get("force.layoutAnimation"))},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",legendHoverLink:!0,hoverAnimation:!0,layout:null,focusNodeAdjacency:!1,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{normal:{position:"middle"},emphasis:{}},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{normal:{show:!1,formatter:"{b}"},emphasis:{show:!0}},itemStyle:{normal:{},emphasis:{}},lineStyle:{normal:{color:"#aaa",width:1,curveness:0,opacity:.5},emphasis:{}}}});t.exports=u},function(t,e,i){function n(t,e){return t.getVisual("opacity")||t.getModel().get(e)}var o=i(44),a=i(106),r=i(93),s=i(250),l=i(127),u=i(3),c=i(295),h=i(1),d=["itemStyle","normal","opacity"],f=["lineStyle","normal","opacity"];i(2).extendChartView({type:"graph",init:function(t,e){var i=new o,n=new a,s=this.group;this._controller=new r(e.getZr()),this._controllerHost={target:s},s.add(i.group),s.add(n.group),this._symbolDraw=i,this._lineDraw=n,this._firstRender=!0},render:function(t,e,i){var n=t.coordinateSystem;this._model=t,this._nodeScaleRatio=t.get("nodeScaleRatio");var o=this._symbolDraw,a=this._lineDraw,r=this.group;if("view"===n.type){var s={position:n.position,scale:n.scale};this._firstRender?r.attr(s):u.updateProps(r,s,t)}c(t.getGraph(),this._getNodeGlobalScale(t));var l=t.getData();o.updateData(l);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,i),clearTimeout(this._layoutTimeout);var d=t.forceLayout,f=t.get("force.layoutAnimation");d&&this._startForceLayoutIteration(d,f),l.eachItemGraphicEl(function(e,n){var o=l.getItemModel(n);e.off("drag").off("dragend");var a=l.getItemModel(n).get("draggable");a&&e.on("drag",function(){d&&(d.warmUp(),!this._layouting&&this._startForceLayoutIteration(d,f),d.setFixed(n),l.setItemLayout(n,e.position))},this).on("dragend",function(){d&&d.setUnfixed(n)},this),e.setDraggable(a&&d),e.off("mouseover",e.__focusNodeAdjacency),e.off("mouseout",e.__unfocusNodeAdjacency),o.get("focusNodeAdjacency")&&(e.on("mouseover",e.__focusNodeAdjacency=function(){i.dispatchAction({type:"focusNodeAdjacency",seriesId:t.id,dataIndex:e.dataIndex})}),e.on("mouseout",e.__unfocusNodeAdjacency=function(){i.dispatchAction({type:"unfocusNodeAdjacency",seriesId:t.id})}))},this);var p="circular"===t.get("layout")&&t.get("circular.rotateLabel"),g=l.getLayout("cx"),m=l.getLayout("cy");l.eachItemGraphicEl(function(t,e){var i=t.getSymbolPath();if(p){var n=l.getItemLayout(e),o=Math.atan2(n[1]-m,n[0]-g);o<0&&(o=2*Math.PI+o);var a=n[0]<g;a&&(o-=Math.PI);var r=a?"left":"right";i.setStyle({textRotation:o,textPosition:r}),i.hoverStyle&&(i.hoverStyle.textPosition=r)}else i.setStyle({textRotation:0})}),this._firstRender=!1},dispose:function(){this._controller&&this._controller.dispose(),this._controllerHost={}},focusNodeAdjacency:function(t,e,i,o){function a(t,e){var i=n(t,e),o=t.getGraphicEl();null==i&&(i=1),o.traverse(function(t){t.trigger("normal"),"group"!==t.type&&t.setStyle("opacity",.1*i)})}function r(t,e){var i=n(t,e),o=t.getGraphicEl();o.traverse(function(t){t.trigger("emphasis"),"group"!==t.type&&t.setStyle("opacity",i)})}var s=this._model.getData(),l=o.dataIndex,u=s.getItemGraphicEl(l);if(u){var c=s.graph,p=u.dataType;if(null!==l&&"edge"!==p){c.eachNode(function(t){a(t,d)}),c.eachEdge(function(t){a(t,f)});var g=c.getNodeByIndex(l);r(g,d),h.each(g.edges,function(t){t.dataIndex<0||(r(t,f),r(t.node1,d),r(t.node2,d))})}}},unfocusNodeAdjacency:function(t,e,i,o){var a=this._model.getData().graph;a.eachNode(function(t){var e=n(t,d);t.getGraphicEl().traverse(function(t){t.trigger("normal"),"group"!==t.type&&t.setStyle("opacity",e)})}),a.eachEdge(function(t){var e=n(t,f);t.getGraphicEl().traverse(function(t){t.trigger("normal"),"group"!==t.type&&t.setStyle("opacity",e)})})},_startForceLayoutIteration:function(t,e){var i=this;!function n(){t.step(function(t){i.updateLayout(i._model),(i._layouting=!t)&&(e?i._layoutTimeout=setTimeout(n,16):n())})}()},_updateController:function(t,e,i){var n=this._controller,o=this._controllerHost,a=this.group;return n.setPointerChecker(function(e,n,o){var r=a.getBoundingRect();return r.applyTransform(a.transform),r.contain(n,o)&&!l.onIrrelevantElement(e,i,t)}),"view"!==t.coordinateSystem.type?void n.disable():(n.enable(t.get("roam")),o.zoomLimit=t.get("scaleLimit"),o.zoom=t.coordinateSystem.getZoom(),void n.off("pan").off("zoom").on("pan",function(e,n){s.updateViewOnPan(o,e,n),i.dispatchAction({seriesId:t.id,type:"graphRoam",dx:e,dy:n})}).on("zoom",function(e,n,a){s.updateViewOnZoom(o,e,n,a),i.dispatchAction({seriesId:t.id,type:"graphRoam",zoom:e,originX:n,originY:a}),this._updateNodeAndLinkScale(),c(t.getGraph(),this._getNodeGlobalScale(t)),this._lineDraw.updateLayout()},this))},_updateNodeAndLinkScale:function(){var t=this._model,e=t.getData(),i=this._getNodeGlobalScale(t),n=[i,i];e.eachItemGraphicEl(function(t,e){t.attr("scale",n)})},_getNodeGlobalScale:function(t){var e=t.coordinateSystem;if("view"!==e.type)return 1;var i=this._nodeScaleRatio,n=e.scale,o=n&&n[0]||1,a=e.getZoom(),r=(a-1)*i+1;return r/o},updateLayout:function(t){c(t.getGraph(),this._getNodeGlobalScale(t)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()}})},function(t,e,i){function n(t,e,i){for(var n,o=t[0],a=t[1],d=t[2],f=1/0,p=i*i,g=.1,m=.1;m<=.9;m+=.1){r[0]=u(o[0],a[0],d[0],m),r[1]=u(o[1],a[1],d[1],m);var v=h(c(r,e)-p);v<f&&(f=v,n=m)}for(var y=0;y<32;y++){var x=n+g;s[0]=u(o[0],a[0],d[0],n),s[1]=u(o[1],a[1],d[1],n),l[0]=u(o[0],a[0],d[0],x),l[1]=u(o[1],a[1],d[1],x);var v=c(s,e)-p;if(h(v)<.01)break;var _=c(l,e)-p;g/=2,v<0?_>=0?n+=g:n-=g:_>=0?n-=g:n+=g}return n}var o=i(20),a=i(5),r=[],s=[],l=[],u=o.quadraticAt,c=a.distSquare,h=Math.abs;t.exports=function(t,e){function i(t){var e=t.getVisual("symbolSize");return e instanceof Array&&(e=(e[0]+e[1])/2),e}var r=[],s=o.quadraticSubdivide,l=[[],[],[]],u=[[],[]],c=[];e/=2,t.eachEdge(function(t,o){var h=t.getLayout(),d=t.getVisual("fromSymbol"),f=t.getVisual("toSymbol");h.__original||(h.__original=[a.clone(h[0]),a.clone(h[1])],h[2]&&h.__original.push(a.clone(h[2])));var p=h.__original;if(null!=h[2]){if(a.copy(l[0],p[0]),a.copy(l[1],p[2]),a.copy(l[2],p[1]),d&&"none"!=d){var g=i(t.node1),m=n(l,p[0],g*e);s(l[0][0],l[1][0],l[2][0],m,r),l[0][0]=r[3],l[1][0]=r[4],s(l[0][1],l[1][1],l[2][1],m,r),l[0][1]=r[3],l[1][1]=r[4]}if(f&&"none"!=f){var g=i(t.node2),m=n(l,p[1],g*e);s(l[0][0],l[1][0],l[2][0],m,r),l[1][0]=r[1],l[2][0]=r[2],s(l[0][1],l[1][1],l[2][1],m,r),l[1][1]=r[1],l[2][1]=r[2]}a.copy(h[0],l[0]),a.copy(h[1],l[2]),a.copy(h[2],l[1])}else{if(a.copy(u[0],p[0]),a.copy(u[1],p[1]),a.sub(c,u[1],u[0]),a.normalize(c,c),d&&"none"!=d){var g=i(t.node1);a.scaleAndAdd(u[0],u[0],c,g*e)}if(f&&"none"!=f){var g=i(t.node2);a.scaleAndAdd(u[1],u[1],c,-g*e)}a.copy(h[0],u[0]),a.copy(h[1],u[1])}})}},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.eachSeriesByType("graph",function(t){var i=t.getCategoriesData(),n=t.getGraph(),o=n.data,a=i.mapArray(i.getName);o.filterSelf(function(t){var i=o.getItemModel(t),n=i.getShallow("category");if(null!=n){"number"==typeof n&&(n=a[n]);for(var r=0;r<e.length;r++)if(!e[r].isSelected(n))return!1}return!0})},this)}},function(t,e){t.exports=function(t){var e={};t.eachSeriesByType("graph",function(t){var i=t.getCategoriesData(),n=t.getData(),o={};i.each(function(n){var a=i.getName(n);o[a]=n;var r=i.getItemModel(n),s=r.get("itemStyle.normal.color")||t.getColorFromPalette(a,e);i.setItemVisual(n,"color",s)}),i.count()&&n.each(function(t){var e=n.getItemModel(t),a=e.getShallow("category");null!=a&&("string"==typeof a&&(a=o[a]),n.getItemVisual(t,"color",!0)||n.setItemVisual(t,"color",i.getItemVisual(a,"color")))})})}},function(t,e,i){var n=i(242);t.exports=function(t){t.eachSeriesByType("graph",function(t){"circular"===t.get("layout")&&n(t)})}},function(t,e,i){function n(t,e,i){var n=t.getBoxLayoutParams();return n.aspect=i,a.getLayoutRect(n,{width:e.getWidth(),height:e.getHeight()})}var o=i(260),a=i(12),r=i(84);t.exports=function(t,e){var i=[];return t.eachSeriesByType("graph",function(t){var a=t.get("coordinateSystem");if(!a||"view"===a){var s=t.getData(),l=s.mapArray(function(t){var e=s.getItemModel(t);return[+e.get("x"),+e.get("y")]}),u=[],c=[];r.fromPoints(l,u,c),c[0]-u[0]===0&&(c[0]+=1,u[0]-=1),c[1]-u[1]===0&&(c[1]+=1,u[1]-=1);var h=(c[0]-u[0])/(c[1]-u[1]),d=n(t,e,h);isNaN(h)&&(u=[d.x,d.y],c=[d.x+d.width,d.y+d.height]);
-var f=c[0]-u[0],p=c[1]-u[1],g=d.width,m=d.height,v=t.coordinateSystem=new o;v.zoomLimit=t.get("scaleLimit"),v.setBoundingRect(u[0],u[1],f,p),v.setViewRect(d.x,d.y,g,m),v.setCenter(t.get("center")),v.setZoom(t.get("zoom")),i.push(v)}}),i}},function(t,e){function i(t){return t instanceof Array||(t=[t,t]),t}t.exports=function(t){t.eachSeriesByType("graph",function(t){var e=t.getGraph(),n=t.getEdgeData(),o=i(t.get("edgeSymbol")),a=i(t.get("edgeSymbolSize")),r="lineStyle.normal.color".split("."),s="lineStyle.normal.opacity".split(".");n.setVisual("fromSymbol",o&&o[0]),n.setVisual("toSymbol",o&&o[1]),n.setVisual("fromSymbolSize",a&&a[0]),n.setVisual("toSymbolSize",a&&a[1]),n.setVisual("color",t.get(r)),n.setVisual("opacity",t.get(s)),n.each(function(t){var o=n.getItemModel(t),a=e.getEdgeByIndex(t),l=i(o.getShallow("symbol",!0)),u=i(o.getShallow("symbolSize",!0)),c=o.get(r),h=o.get(s);switch(c){case"source":c=a.node1.getVisual("color");break;case"target":c=a.node2.getVisual("color")}l[0]&&a.setVisual("fromSymbol",l[0]),l[1]&&a.setVisual("toSymbol",l[1]),u[0]&&a.setVisual("fromSymbolSize",u[0]),u[1]&&a.setVisual("toSymbolSize",u[1]),a.setVisual("color",c),a.setVisual("opacity",h)})})}},function(t,e,i){var n=i(5),o=n.scaleAndAdd;t.exports=function(t,e,i){for(var a=i.rect,r=a.width,s=a.height,l=[a.x+r/2,a.y+s/2],u=null==i.gravity?.1:i.gravity,c=0;c<t.length;c++){var h=t[c];h.p||(h.p=n.create(r*(Math.random()-.5)+l[0],s*(Math.random()-.5)+l[1])),h.pp=n.clone(h.p),h.edges=null}var d=.6;return{warmUp:function(){d=.5},setFixed:function(e){t[e].fixed=!0},setUnfixed:function(e){t[e].fixed=!1},step:function(i){for(var a=[],r=t.length,s=0;s<e.length;s++){var c=e[s],h=c.n1,f=c.n2;n.sub(a,f.p,h.p);var p=n.len(a)-c.d,g=f.w/(h.w+f.w);n.normalize(a,a),!h.fixed&&o(h.p,h.p,a,g*p*d),!f.fixed&&o(f.p,f.p,a,-(1-g)*p*d)}for(var s=0;s<r;s++){var m=t[s];m.fixed||(n.sub(a,l,m.p),n.scaleAndAdd(m.p,m.p,a,u*d))}for(var s=0;s<r;s++)for(var h=t[s],v=s+1;v<r;v++){var f=t[v];n.sub(a,f.p,h.p);var p=n.len(a);0===p&&(n.set(a,Math.random()-.5,Math.random()-.5),p=1);var y=(h.rep+f.rep)/p/p;!h.fixed&&o(h.pp,h.pp,a,y),!f.fixed&&o(f.pp,f.pp,a,-y)}for(var x=[],s=0;s<r;s++){var m=t[s];m.fixed||(n.sub(x,m.p,m.pp),n.scaleAndAdd(m.p,m.p,x,d),n.copy(m.pp,m.p))}d=.992*d,i&&i(t,e,d<.01)}}}},function(t,e,i){var n=i(301),o=i(4),a=i(244),r=i(242),s=i(5),l=i(1);t.exports=function(t){t.eachSeriesByType("graph",function(t){var e=t.coordinateSystem;if(!e||"view"===e.type)if("force"===t.get("layout")){var i=t.preservedPoints||{},u=t.getGraph(),c=u.data,h=u.edgeData,d=t.getModel("force"),f=d.get("initLayout");t.preservedPoints?c.each(function(t){var e=c.getId(t);c.setItemLayout(t,i[e]||[NaN,NaN])}):f&&"none"!==f?"circular"===f&&r(t):a(t);var p=c.getDataExtent("value"),g=h.getDataExtent("value"),m=d.get("repulsion"),v=d.get("edgeLength");l.isArray(m)||(m=[m,m]),l.isArray(v)||(v=[v,v]),v=[v[1],v[0]];var y=c.mapArray("value",function(t,e){var i=c.getItemLayout(e),n=o.linearMap(t,p,m);return isNaN(n)&&(n=(m[0]+m[1])/2),{w:n,rep:n,p:!i||isNaN(i[0])||isNaN(i[1])?null:i}}),x=h.mapArray("value",function(t,e){var i=u.getEdgeByIndex(e),n=o.linearMap(t,g,v);return isNaN(n)&&(n=(v[0]+v[1])/2),{n1:y[i.node1.dataIndex],n2:y[i.node2.dataIndex],d:n,curveness:i.getModel().get("lineStyle.normal.curveness")||0}}),e=t.coordinateSystem,_=e.getBoundingRect(),b=n(y,x,{rect:_,gravity:d.get("gravity")}),w=b.step;b.step=function(t){for(var e=0,n=y.length;e<n;e++)y[e].fixed&&s.copy(y[e].p,u.getNodeByIndex(e).getLayout());w(function(e,n,o){for(var a=0,r=e.length;a<r;a++)e[a].fixed||u.getNodeByIndex(a).setLayout(e[a].p),i[c.getId(a)]=e[a].p;for(var a=0,r=n.length;a<r;a++){var l=n[a],h=u.getEdgeByIndex(a),d=l.n1.p,f=l.n2.p,p=h.getLayout();p=p?p.slice():[],p[0]=p[0]||[],p[1]=p[1]||[],s.copy(p[0],d),s.copy(p[1],f),+l.curveness&&(p[2]=[(d[0]+f[0])/2-(d[1]-f[1])*l.curveness,(d[1]+f[1])/2-(f[0]-d[0])*l.curveness]),h.setLayout(p)}t&&t(o)})},t.forceLayout=b,t.preservedPoints=i,b.step()}else t.forceLayout=null})}},function(t,e,i){var n=i(2),o=i(241),a={type:"graphRoam",event:"graphRoam",update:"none"};n.registerAction(a,function(t,e){e.eachComponent({mainType:"series",query:t},function(e){var i=e.coordinateSystem,n=o.updateCenterAndZoom(i,t);e.setCenter&&e.setCenter(n.center),e.setZoom&&e.setZoom(n.zoom)})}),n.registerAction({type:"focusNodeAdjacency",event:"focusNodeAdjacency",update:"series.graph:focusNodeAdjacency"},function(){}),n.registerAction({type:"unfocusNodeAdjacency",event:"unfocusNodeAdjacency",update:"series.graph:unfocusNodeAdjacency"},function(){})},function(t,e,i){var n=i(244),o=i(243);t.exports=function(t,e){t.eachSeriesByType("graph",function(t){var e=t.get("layout"),i=t.coordinateSystem;if(i&&"view"!==i.type){var a=t.getData(),r=i.dimensions;a.each(r,function(){for(var t,e=arguments,n=[],o=0;o<r.length;o++)isNaN(e[o])||(t=!0),n.push(e[o]);var s=e[e.length-1];t?a.setItemLayout(s,i.dataToPoint(n)):a.setItemLayout(s,[NaN,NaN])}),o(a.graph)}else e&&"none"!==e||n(t)})}},function(t,e,i){i(307),i(308)},function(t,e,i){function n(){var t=a.createCanvas();this.canvas=t,this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={}}var o=256,a=i(1);n.prototype={update:function(t,e,i,n,a,r){var s=this._getBrush(),l=this._getGradient(t,a,"inRange"),u=this._getGradient(t,a,"outOfRange"),c=this.pointSize+this.blurSize,h=this.canvas,d=h.getContext("2d"),f=t.length;h.width=e,h.height=i;for(var p=0;p<f;++p){var g=t[p],m=g[0],v=g[1],y=g[2],x=n(y);d.globalAlpha=x,d.drawImage(s,m-c,v-c)}for(var _=d.getImageData(0,0,h.width,h.height),b=_.data,w=0,S=b.length,M=this.minOpacity,I=this.maxOpacity,T=I-M;w<S;){var x=b[w+3]/256,A=4*Math.floor(x*(o-1));if(x>0){var C=r(x)?l:u;x>0&&(x=x*T+M),b[w++]=C[A],b[w++]=C[A+1],b[w++]=C[A+2],b[w++]=C[A+3]*x*256}else w+=4}return d.putImageData(_,0,0),h},_getBrush:function(){var t=this._brushCanvas||(this._brushCanvas=a.createCanvas()),e=this.pointSize+this.blurSize,i=2*e;t.width=i,t.height=i;var n=t.getContext("2d");return n.clearRect(0,0,i,i),n.shadowOffsetX=i,n.shadowBlur=this.blurSize,n.shadowColor="#000",n.beginPath(),n.arc(-e,e,this.pointSize,0,2*Math.PI,!0),n.closePath(),n.fill(),t},_getGradient:function(t,e,i){for(var n=this._gradientPixels,o=n[i]||(n[i]=new Uint8ClampedArray(1024)),a=[0,0,0,0],r=0,s=0;s<256;s++)e[i](s/255,!0,a),o[r++]=a[0],o[r++]=a[1],o[r++]=a[2],o[r++]=a[3];return o}},t.exports=n},function(t,e,i){var n=i(18),o=i(28);t.exports=n.extend({type:"series.heatmap",getInitialData:function(t,e){return o(t.data,this,e)},defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,geoIndex:0,blurSize:30,pointSize:20,maxOpacity:1,minOpacity:0}})},function(t,e,i){function n(t,e,i){var n=t[1]-t[0];e=l.map(e,function(e){return{interval:[(e.interval[0]-t[0])/n,(e.interval[1]-t[0])/n]}});var o=e.length,a=0;return function(t){for(var n=a;n<o;n++){var r=e[n].interval;if(r[0]<=t&&t<=r[1]){a=n;break}}if(n===o)for(var n=a-1;n>=0;n--){var r=e[n].interval;if(r[0]<=t&&t<=r[1]){a=n;break}}return n>=0&&n<o&&i[n]}}function o(t,e){var i=t[1]-t[0];return e=[(e[0]-t[0])/i,(e[1]-t[0])/i],function(t){return t>=e[0]&&t<=e[1]}}function a(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var r=i(3),s=i(306),l=i(1);t.exports=i(2).extendChartView({type:"heatmap",render:function(t,e,i){var n;e.eachComponent("visualMap",function(e){e.eachTargetSeries(function(i){i===t&&(n=e)})}),this.group.removeAll();var o=t.coordinateSystem;"cartesian2d"===o.type||"calendar"===o.type?this._renderOnCartesianAndCalendar(o,t,i):a(o)&&this._renderOnGeo(o,t,n,i)},dispose:function(){},_renderOnCartesianAndCalendar:function(t,e,i){if("cartesian2d"===t.type)var n=t.getAxis("x"),o=t.getAxis("y"),a=n.getBandWidth(),s=o.getBandWidth();var u=this.group,c=e.getData(),h="itemStyle.normal",d="itemStyle.emphasis",f="label.normal",p="label.emphasis",g=e.getModel(h).getItemStyle(["color"]),m=e.getModel(d).getItemStyle(),v=e.getModel("label.normal"),y=e.getModel("label.emphasis");c.each("cartesian2d"===t.type?["x","y","z"]:["time","value"],function(i,n,o,x){var _;if("cartesian2d"===t.type){if(isNaN(o))return;var b=t.dataToPoint([i,n]);_=new r.Rect({shape:{x:b[0]-a/2,y:b[1]-s/2,width:a,height:s},style:{fill:c.getItemVisual(x,"color"),opacity:c.getItemVisual(x,"opacity")}})}else{if(isNaN(n))return;x=o,_=new r.Rect({z2:1,shape:t.dataToRect([i,n]).contentShape,style:{fill:c.getItemVisual(x,"color"),opacity:c.getItemVisual(x,"opacity")}})}var w=c.getItemModel(x);c.hasItemOption&&(g=w.getModel(h).getItemStyle(["color"]),m=w.getModel(d).getItemStyle(),v=w.getModel(f),y=w.getModel(p));var S=e.getRawValue(x),M="-";S&&null!=S[2]&&(M=S[2]),v.getShallow("show")&&(r.setText(g,v),g.text=e.getFormattedLabel(x,"normal")||M),y.getShallow("show")&&(r.setText(m,y),m.text=e.getFormattedLabel(x,"emphasis")||M),_.setStyle(g),r.setHoverStyle(_,c.hasItemOption?m:l.extend({},m)),u.add(_),c.setItemGraphicEl(x,_)})},_renderOnGeo:function(t,e,i,a){var l=i.targetVisuals.inRange,u=i.targetVisuals.outOfRange,c=e.getData(),h=this._hmLayer||this._hmLayer||new s;h.blurSize=e.get("blurSize"),h.pointSize=e.get("pointSize"),h.minOpacity=e.get("minOpacity"),h.maxOpacity=e.get("maxOpacity");var d=t.getViewRect().clone(),f=t.getRoamTransform().transform;d.applyTransform(f);var p=Math.max(d.x,0),g=Math.max(d.y,0),m=Math.min(d.width+d.x,a.getWidth()),v=Math.min(d.height+d.y,a.getHeight()),y=m-p,x=v-g,_=c.mapArray(["lng","lat","value"],function(e,i,n){var o=t.dataToPoint([e,i]);return o[0]-=p,o[1]-=g,o.push(n),o}),b=i.getExtent(),w="visualMap.continuous"===i.type?o(b,i.option.range):n(b,i.getPieceList(),i.option.selected);h.update(_,y,x,l.color.getNormalizer(),{inRange:l.color.getColorMapper(),outOfRange:u.color.getColorMapper()},w);var S=new r.Image({style:{width:y,height:x,x:p,y:g,image:h.canvas},silent:!0});this.group.add(S)}})},function(t,e,i){function n(t,e,i){r.call(this,t,e,i),this._lastFrame=0,this._lastFramePercent=0}var o=i(246),a=i(1),r=i(245),s=i(5),l=n.prototype;l.createLine=function(t,e,i){return new o(t,e,i)},l.updateAnimationPoints=function(t,e){this._points=e;for(var i=[0],n=0,o=1;o<e.length;o++){var a=e[o-1],r=e[o];n+=s.dist(a,r),i.push(n)}if(0!==n){for(var o=0;o<i.length;o++)i[o]/=n;this._offsets=i,this._length=n}},l.getLineLength=function(t){return this._length},l.updateSymbolPosition=function(t){var e=t.__t,i=this._points,n=this._offsets,o=i.length;if(n){var a,r=this._lastFrame;if(e<this._lastFramePercent){var l=Math.min(r+1,o-1);for(a=l;a>=0&&!(n[a]<=e);a--);a=Math.min(a,o-2)}else{for(var a=r;a<o&&!(n[a]>e);a++);a=Math.min(a-1,o-2)}s.lerp(t.position,i[a],i[a+1],(e-n[a])/(n[a+1]-n[a]));var u=i[a+1][0]-i[a][0],c=i[a+1][1]-i[a][1];t.rotation=-Math.atan2(c,u)-Math.PI/2,this._lastFrame=a,this._lastFramePercent=e,t.ignore=!1}},a.inherits(n,r),t.exports=n},function(t,e,i){function n(t){return r.isArray(t)||(t=[+t,+t]),t}function o(t,e){t.eachChild(function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?e.color:null,fill:"fill"===e.brushType?e.color:null}})})}function a(t,e){h.call(this);var i=new c(t,e),n=new h;this.add(i),this.add(n),n.beforeUpdate=function(){this.attr(i.getScale())},this.updateData(t,e)}var r=i(1),s=i(24),l=i(3),u=i(4),c=i(54),h=l.Group,d=3,f=a.prototype;f.stopEffectAnimation=function(){this.childAt(1).removeAll()},f.startEffectAnimation=function(t){for(var e=t.symbolType,i=t.color,n=this.childAt(1),a=0;a<d;a++){var r=s.createSymbol(e,-1,-1,2,2,i);r.attr({style:{strokeNoScale:!0},z2:99,silent:!0,scale:[.5,.5]});var l=-a/d*t.period+t.effectOffset;r.animate("",!0).when(t.period,{scale:[t.rippleScale/2,t.rippleScale/2]}).delay(l).start(),r.animateStyle(!0).when(t.period,{opacity:0}).delay(l).start(),n.add(r)}o(n,t)},f.updateEffectAnimation=function(t){for(var e=this._effectCfg,i=this.childAt(1),n=["symbolType","period","rippleScale"],a=0;a<n;a++){var r=n[a];if(e[r]!==t[r])return this.stopEffectAnimation(),void this.startEffectAnimation(t)}o(i,t)},f.highlight=function(){this.trigger("emphasis")},f.downplay=function(){this.trigger("normal")},f.updateData=function(t,e){var i=t.hostModel;this.childAt(0).updateData(t,e);var o=this.childAt(1),a=t.getItemModel(e),r=t.getItemVisual(e,"symbol"),s=n(t.getItemVisual(e,"symbolSize")),l=t.getItemVisual(e,"color");o.attr("scale",s),o.traverse(function(t){t.attr({fill:l})});var c=a.getShallow("symbolOffset");if(c){var h=o.position;h[0]=u.parsePercent(c[0],s[0]),h[1]=u.parsePercent(c[1],s[1])}o.rotation=(a.getShallow("symbolRotate")||0)*Math.PI/180||0;var d={};if(d.showEffectOn=i.get("showEffectOn"),d.rippleScale=a.get("rippleEffect.scale"),d.brushType=a.get("rippleEffect.brushType"),d.period=1e3*a.get("rippleEffect.period"),d.effectOffset=e/t.count(),d.z=a.getShallow("z")||0,d.zlevel=a.getShallow("zlevel")||0,d.symbolType=r,d.color=l,this.off("mouseover").off("mouseout").off("emphasis").off("normal"),"render"===d.showEffectOn)this._effectCfg?this.updateEffectAnimation(d):this.startEffectAnimation(d),this._effectCfg=d;else{this._effectCfg=null,this.stopEffectAnimation();var f=this.childAt(0),p=function(){f.trigger("emphasis"),"render"!==d.showEffectOn&&this.startEffectAnimation(d)},g=function(){f.trigger("normal"),"render"!==d.showEffectOn&&this.stopEffectAnimation()};this.on("mouseover",p,this).on("mouseout",g,this).on("emphasis",p,this).on("normal",g,this)}this._effectCfg=d},f.fadeOut=function(t){this.off("mouseover").off("mouseout").off("emphasis").off("normal"),t&&t()},r.inherits(a,h),t.exports=a},function(t,e,i){function n(){this.group=new o.Group,this._lineEl=new s}var o=i(3),a=i(97),r=i(96),s=o.extendShape({shape:{polyline:!1,segs:[]},buildPath:function(t,e){for(var i=e.segs,n=e.polyline,o=0;o<i.length;o++){var a=i[o];if(n){t.moveTo(a[0][0],a[0][1]);for(var r=1;r<a.length;r++)t.lineTo(a[r][0],a[r][1])}else t.moveTo(a[0][0],a[0][1]),a.length>2?t.quadraticCurveTo(a[2][0],a[2][1],a[1][0],a[1][1]):t.lineTo(a[1][0],a[1][1])}},findDataIndex:function(t,e){for(var i=this.shape,n=i.segs,o=i.polyline,s=Math.max(this.style.lineWidth,1),l=0;l<n.length;l++){var u=n[l];if(o){for(var c=1;c<u.length;c++)if(r.containStroke(u[c-1][0],u[c-1][1],u[c][0],u[c][1],s,t,e))return l}else if(u.length>2){if(a.containStroke(u[0][0],u[0][1],u[2][0],u[2][1],u[1][0],u[1][1],s,t,e))return l}else if(r.containStroke(u[0][0],u[0][1],u[1][0],u[1][1],s,t,e))return l}return-1}}),l=n.prototype;l.updateData=function(t){this.group.removeAll();var e=this._lineEl,i=t.hostModel;e.setShape({segs:t.mapArray(t.getItemLayout),polyline:i.get("polyline")}),e.useStyle(i.getModel("lineStyle.normal").getLineStyle());var n=t.getVisual("color");n&&e.setStyle("stroke",n),e.setStyle("fill"),e.seriesIndex=i.seriesIndex,e.on("mousemove",function(t){e.dataIndex=null;var i=e.findDataIndex(t.offsetX,t.offsetY);i>0&&(e.dataIndex=i)}),this.group.add(e)},l.updateLayout=function(t){var e=t.getData();this._lineEl.setShape({segs:e.mapArray(e.getItemLayout)})},l.remove=function(){this.group.removeAll()},t.exports=n},function(t,e,i){function n(t,e,i,n){l.Group.call(this),this.bodyIndex,this.whiskerIndex,this.styleUpdater=i,this._createContent(t,e,n),this.updateData(t,e,n),this._seriesModel}function o(t,e,i){return s.map(t,function(t){return t=t.slice(),t[e]=i.initBaseline,t})}function a(t){var e={};return s.each(t,function(t,i){e["ends"+i]=t}),e}function r(t){this.group=new l.Group,this.styleUpdater=t}var s=i(1),l=i(3),u=i(8),c=u.extend({type:"whiskerInBox",shape:{},buildPath:function(t,e){for(var i in e)if(e.hasOwnProperty(i)&&0===i.indexOf("ends")){var n=e[i];t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1])}}}),h=n.prototype;h._createContent=function(t,e,i){var n=t.getItemLayout(e),r="horizontal"===n.chartLayout?1:0,u=0;this.add(new l.Polygon({shape:{points:i?o(n.bodyEnds,r,n):n.bodyEnds},style:{strokeNoScale:!0},z2:100})),this.bodyIndex=u++;var h=s.map(n.whiskerEnds,function(t){return i?o(t,r,n):t});this.add(new c({shape:a(h),style:{strokeNoScale:!0},z2:100})),this.whiskerIndex=u++},h.updateData=function(t,e,i){var n=this._seriesModel=t.hostModel,o=t.getItemLayout(e),r=l[i?"initProps":"updateProps"];r(this.childAt(this.bodyIndex),{shape:{points:o.bodyEnds}},n,e),r(this.childAt(this.whiskerIndex),{shape:a(o.whiskerEnds)},n,e),this.styleUpdater.call(null,this,t,e)},s.inherits(n,l.Group);var d=r.prototype;d.updateData=function(t){var e=this.group,i=this._data,o=this.styleUpdater;t.diff(i).add(function(i){if(t.hasValue(i)){var a=new n(t,i,o,(!0));t.setItemGraphicEl(i,a),e.add(a)}}).update(function(a,r){var s=i.getItemGraphicEl(r);return t.hasValue(a)?(s?s.updateData(t,a):s=new n(t,a,o),e.add(s),void t.setItemGraphicEl(a,s)):void e.remove(s)}).remove(function(t){var n=i.getItemGraphicEl(t);n&&e.remove(n)}).execute(),this._data=t},d.remove=function(){var t=this.group,e=this._data;this._data=null,e&&e.eachItemGraphicEl(function(e){e&&t.remove(e)})},t.exports=r},function(t,e,i){i(314),i(315);var n=i(2);n.registerLayout(i(316)),n.registerVisual(i(317))},function(t,e,i){"use strict";function n(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=r.map(e,function(t){var e=[t[0].coord,t[1].coord],i={coords:e};return t[0].name&&(i.fromName=t[0].name),t[1].name&&(i.toName=t[1].name),r.mergeAll([i,t[0],t[1]])}))}var o=i(18),a=i(14),r=i(1),s=i(7),l=(i(26),o.extend({type:"series.lines",dependencies:["grid","polar"],visualColorAccessPath:"lineStyle.normal.color",init:function(t){n(t),l.superApply(this,"init",arguments)},mergeOption:function(t){n(t),l.superApply(this,"mergeOption",arguments)},getInitialData:function(t,e){var i=new a(["value"],this);return i.hasItemOption=!1,i.initData(t.data,[],function(t,e,n,o){if(t instanceof Array)return NaN;i.hasItemOption=!0;var a=t.value;return null!=a?a instanceof Array?a[o]:a:void 0}),i},formatTooltip:function(t){var e=this.getData(),i=e.getItemModel(t),n=i.get("name");if(n)return n;var o=i.get("fromName"),a=i.get("toName"),r=[];return null!=o&&r.push(o),null!=a&&r.push(a),s.encodeHTML(r.join(" > "))},defaultOption:{coordinateSystem:"geo",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,label:{normal:{show:!1,position:"end"}},lineStyle:{normal:{opacity:.5}}}}))},function(t,e,i){var n=i(106),o=i(245),a=i(105),r=i(246),s=i(309),l=i(311);i(2).extendChartView({type:"lines",init:function(){},render:function(t,e,i){var u=t.getData(),c=this._lineDraw,h=t.get("effect.show"),d=t.get("polyline"),f=t.get("large")&&u.count()>=t.get("largeThreshold");h===this._hasEffet&&d===this._isPolyline&&f===this._isLarge||(c&&c.remove(),c=this._lineDraw=f?new l:new n(d?h?s:r:h?o:a),this._hasEffet=h,this._isPolyline=d,this._isLarge=f);var p=t.get("zlevel"),g=t.get("effect.trailLength"),m=i.getZr();if(m.painter.getLayer(p).clear(!0),null!=this._lastZlevel&&m.configLayer(this._lastZlevel,{motionBlur:!1}),h&&g){m.configLayer(p,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(g/10+.9,1),0)})}this.group.add(c.group),c.updateData(u),this._lastZlevel=p},updateLayout:function(t,e,i){this._lineDraw.updateLayout(t);var n=i.getZr();n.painter.getLayer(this._lastZlevel).clear(!0)},remove:function(t,e){this._lineDraw&&this._lineDraw.remove(e,!0)},dispose:function(){}})},function(t,e,i){t.exports=function(t){t.eachSeriesByType("lines",function(t){var e=t.coordinateSystem,i=t.getData();i.each(function(n){var o=i.getItemModel(n),a=o.option instanceof Array?o.option:o.get("coords"),r=[];if(t.get("polyline"))for(var s=0;s<a.length;s++)r.push(e.dataToPoint(a[s]));else{r[0]=e.dataToPoint(a[0]),r[1]=e.dataToPoint(a[1]);var l=o.get("lineStyle.normal.curveness");+l&&(r[2]=[(r[0][0]+r[1][0])/2-(r[0][1]-r[1][1])*l,(r[0][1]+r[1][1])/2-(r[1][0]-r[0][0])*l])}i.setItemLayout(n,r)})})}},function(t,e){function i(t){return t instanceof Array||(t=[t,t]),t}t.exports=function(t){t.eachSeriesByType("lines",function(t){var e=t.getData(),n=i(t.get("symbol")),o=i(t.get("symbolSize")),a="lineStyle.normal.opacity".split(".");e.setVisual("fromSymbol",n&&n[0]),e.setVisual("toSymbol",n&&n[1]),e.setVisual("fromSymbolSize",o&&o[0]),e.setVisual("toSymbolSize",o&&o[1]),e.setVisual("opacity",t.get(a)),e.each(function(t){var n=e.getItemModel(t),o=i(n.getShallow("symbol",!0)),r=i(n.getShallow("symbolSize",!0)),s=n.get(a);o[0]&&e.setItemVisual(t,"fromSymbol",o[0]),o[1]&&e.setItemVisual(t,"toSymbol",o[1]),r[0]&&e.setItemVisual(t,"fromSymbolSize",r[0]),r[1]&&e.setItemVisual(t,"toSymbolSize",r[1]),e.setItemVisual(t,"opacity",s)})})}},function(t,e,i){var n=i(2),o=n.PRIORITY;i(319),i(320),i(240),i(186),n.registerLayout(i(323)),n.registerVisual(i(324)),n.registerProcessor(o.PROCESSOR.STATISTIC,i(322)),n.registerPreprocessor(i(321)),i(88)("map",[{type:"mapToggleSelect",event:"mapselectchanged",method:"toggleSelected"},{type:"mapSelect",event:"mapselected",method:"select"},{type:"mapUnSelect",event:"mapunselected",method:"unSelect"}])},function(t,e,i){var n=i(14),o=i(18),a=i(1),r=i(25),s=i(7),l=s.encodeHTML,u=s.addCommas,c=i(77),h=i(186),d=o.extend({type:"series.map",dependencies:["geo"],layoutMode:"box",needsDrawMap:!1,seriesGroup:[],init:function(t){t=this._fillOption(t,this.getMapType()),this.option=t,d.superApply(this,"init",arguments),this.updateSelectedMap(t.data)},getInitialData:function(t){var e=r(["value"],t.data||[]),i=new n(e,this);return i.initData(t.data),i},mergeOption:function(t){t.data&&(t=this._fillOption(t,this.getMapType())),d.superCall(this,"mergeOption",t),this.updateSelectedMap(this.option.data)},getHostGeoModel:function(){var t=this.option.geoIndex;return null!=t?this.dependentModels.geo[t]:null},getMapType:function(){return(this.getHostGeoModel()||this).option.map},_fillOption:function(t,e){return t=a.extend({},t),t.data=h.getFilledRegions(t.data,e),t},getRawValue:function(t){return this.getData().get("value",t)},getRegionModel:function(t){var e=this.getData();return e.getItemModel(e.indexOfName(t))},formatTooltip:function(t){for(var e=this.getData(),i=u(this.getRawValue(t)),n=e.getName(t),o=this.seriesGroup,a=[],r=0;r<o.length;r++){var s=o[r].originalData.indexOfName(n);isNaN(o[r].originalData.get("value",s))||a.push(l(o[r].name))}return a.join(", ")+"<br />"+l(n+" : "+i)},getTooltipPosition:function(t){if(null!=t){var e=this.getData().getName(t),i=this.coordinateSystem,n=i.getRegion(e);return n&&i.dataToPoint(n.center)}},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},defaultOption:{zlevel:0,z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:.75,showLegendSymbol:!0,dataRangeHoverLink:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{normal:{show:!1,textStyle:{color:"#000"}},emphasis:{show:!0,textStyle:{color:"rgb(100,0,0)"}}},itemStyle:{normal:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{areaColor:"rgba(255,215,0,0.8)"}}}});a.mixin(d,c),t.exports=d},function(t,e,i){var n=i(3),o=i(249);i(2).extendChartView({type:"map",render:function(t,e,i,n){if(!n||"mapToggleSelect"!==n.type||n.from!==this.uid){var a=this.group;if(a.removeAll(),!t.getHostGeoModel()){if(n&&"geoRoam"===n.type&&"series"===n.componentType&&n.seriesId===t.id){var r=this._mapDraw;r&&a.add(r.group)}else if(t.needsDrawMap){var r=this._mapDraw||new o(i,(!0));a.add(r.group),r.draw(t,e,i,this,n),this._mapDraw=r}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;t.get("showLegendSymbol")&&e.getComponent("legend")&&this._renderSymbols(t,e,i)}}},remove:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},dispose:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null},_renderSymbols:function(t,e,i){var o=t.originalData,a=this.group;o.each("value",function(e,i){if(!isNaN(e)){var r=o.getItemLayout(i);if(r&&r.point){var s=r.point,l=r.offset,u=new n.Circle({style:{fill:t.getData().getVisual("color")},shape:{cx:s[0]+9*l,cy:s[1],r:3},silent:!0,z2:10});if(!l){var c=t.mainSeries.getData(),h=o.getName(i),d=h,f=c.indexOfName(h),p=o.getItemModel(i),g=p.getModel("label.normal"),m=p.getModel("label.emphasis"),v=g.getModel("textStyle"),y=m.getModel("textStyle"),x=c.getItemGraphicEl(f);u.setStyle({textPosition:"bottom"});var _=function(){u.setStyle({text:m.get("show")?d:"",textFill:y.getTextColor(),textFont:y.getFont()})},b=function(){u.setStyle({text:g.get("show")?d:"",textFill:v.getTextColor(),textFont:v.getFont()})};x.on("mouseover",_).on("mouseout",b).on("emphasis",_).on("normal",b),b()}a.add(u)}}})}})},function(t,e,i){var n=i(1);t.exports=function(t){var e=[];n.each(t.series,function(t){"map"===t.type&&e.push(t)}),n.each(e,function(t){t.map=t.map||t.mapType,n.defaults(t,t.mapLocation)})}},function(t,e,i){function n(t,e){var i={},n=["value"];return o.each(t,function(t){t.each(n,function(e,n){var o=t.getName(n);i[o]=i[o]||[],isNaN(e)||i[o].push(e)})}),t[0].map(n,function(n,o){for(var a=t[0].getName(o),r=0,s=1/0,l=-(1/0),u=i[a].length,c=0;c<u;c++)s=Math.min(s,i[a][c]),l=Math.max(l,i[a][c]),r+=i[a][c];var h;return h="min"===e?s:"max"===e?l:"average"===e?r/u:r,0===u?NaN:h})}var o=i(1);t.exports=function(t){var e={};t.eachSeriesByType("map",function(t){var i=t.getHostGeoModel(),n=i?"o"+i.id:"i"+t.getMapType();(e[n]=e[n]||[]).push(t)}),o.each(e,function(t,e){for(var i=n(o.map(t,function(t){return t.getData()}),t[0].get("mapValueCalculation")),a=0;a<t.length;a++)t[a].originalData=t[a].getData();for(var a=0;a<t.length;a++)t[a].seriesGroup=t,t[a].needsDrawMap=0===a&&!t[a].getHostGeoModel(),t[a].setData(i.cloneShallow()),t[a].mainSeries=t[0]})}},function(t,e,i){var n=i(1);t.exports=function(t){var e={};t.eachSeriesByType("map",function(i){var o=i.getMapType();if(!i.getHostGeoModel()&&!e[o]){var a={};n.each(i.seriesGroup,function(e){var i=e.coordinateSystem,n=e.originalData;e.get("showLegendSymbol")&&t.getComponent("legend")&&n.each("value",function(t,e){var o=n.getName(e),r=i.getRegion(o);if(r&&!isNaN(t)){var s=a[o]||0,l=i.dataToPoint(r.center);a[o]=s+1,n.setItemLayout(e,{point:l,offset:s})}})});var r=i.getData();r.each(function(t){var e=r.getName(t),i=r.getItemLayout(t)||{};i.showLabel=!a[e],r.setItemLayout(t,i)}),e[o]=!0}})}},function(t,e){t.exports=function(t){t.eachSeriesByType("map",function(t){var e=t.get("color"),i=t.getModel("itemStyle.normal"),n=i.get("areaColor"),o=i.get("color")||e[t.seriesIndex%e.length];t.getData().setVisual({areaColor:n,color:o})})}},function(t,e,i){var n=i(2);i(251),i(326),i(327),n.registerVisual(i(328))},function(t,e,i){function n(t,e,i){var n=t.get("data"),a=o(e);n&&n.length&&s.each(i,function(t){if(t){var e=s.indexOf(n,t[a]);t[a]=e>=0?e:NaN}})}function o(t){return+t.replace("dim","")}function a(t,e){var i=0;s.each(t,function(t){var e=o(t);e>i&&(i=e)});var n=e[0];n&&n.length-1>i&&(i=n.length-1);for(var a=[],r=0;r<=i;r++)a.push("dim"+r);return a}var r=i(14),s=i(1),l=i(18),u=i(25);t.exports=l.extend({type:"series.parallel",dependencies:["parallel"],visualColorAccessPath:"lineStyle.normal.color",getInitialData:function(t,e){var i=e.getComponent("parallel",this.get("parallelIndex")),o=i.parallelAxisIndex,l=t.data,c=i.dimensions,h=a(c,l),d=s.map(h,function(t,i){var a=s.indexOf(c,t),r=a>=0&&e.getComponent("parallelAxis",o[a]);return r&&"category"===r.get("type")?(n(r,t,l),{name:t,type:"ordinal"}):a<0&&u.guessOrdinal(l,i)?{name:t,type:"ordinal"}:t}),f=new r(d,this);return f.initData(l),this.option.progressive&&(this.option.animation=!1),f},getRawIndicesByActiveState:function(t){var e=this.coordinateSystem,i=this.getData(),n=[];return e.eachActiveState(i,function(e,o){t===e&&n.push(i.getRawIndex(o))}),n},defaultOption:{zlevel:0,z:2,coordinateSystem:"parallel",parallelIndex:0,label:{normal:{show:!1},emphasis:{show:!1}},inactiveOpacity:.05,activeOpacity:1,lineStyle:{normal:{width:1,opacity:.45,type:"solid"}},progressive:!1,smooth:!1,animationEasing:"linear"}})},function(t,e,i){function n(t,e,i){var n=t.model,o=t.getRect(),a=new l.Rect({shape:{x:o.x,y:o.y,width:o.width,height:o.height}}),r="horizontal"===n.get("layout")?"width":"height";return a.setShape(r,0),l.initProps(a,{shape:{width:o.width,height:o.height}},e,i),a}function o(t,e,i,n){for(var o=[],a=0;a<i.length;a++){var r=i[a],l=t.get(r,e);s(l,n.getAxis(r).type)||o.push(n.dataToPoint(l,r))}return o}function a(t,e,i,n,a){var r=o(t,i,n,a),s=new l.Polyline({shape:{points:r},silent:!0,z2:10});e.add(s),t.setItemGraphicEl(i,s)}function r(t,e){var i=t.hostModel.getModel("lineStyle.normal"),n=i.getLineStyle();t.eachItemGraphicEl(function(o,a){if(t.hasItemOption){var r=t.getItemModel(a),s=r.getModel("lineStyle.normal",i);n=s.getLineStyle(["color","stroke"])}o.useStyle(u.extend(n,{fill:null,stroke:t.getItemVisual(a,"color"),opacity:t.getItemVisual(a,"opacity")})),o.shape.smooth=e})}function s(t,e){return"category"===e?null==t:null==t||isNaN(t)}var l=i(3),u=i(1),c=.3,h=i(30).extend({type:"parallel",init:function(){this._dataGroup=new l.Group,this.group.add(this._dataGroup),this._data},render:function(t,e,i,n){this._renderForNormal(t,n)},dispose:function(){},_renderForNormal:function(t,e){function i(t){a(d,h,t,g,p,null,v)}function s(i,n){var a=f.getItemGraphicEl(n),r=o(d,i,g,p);d.setItemGraphicEl(i,a);var s=e&&e.animation===!1?null:t;l.updateProps(a,{shape:{points:r}},s,i)}function u(t){var e=f.getItemGraphicEl(t);h.remove(e)}var h=this._dataGroup,d=t.getData(),f=this._data,p=t.coordinateSystem,g=p.dimensions,m=t.option,v=m.smooth?c:null;if(d.diff(f).add(i).update(s).remove(u).execute(),r(d,v),!this._data){var y=n(p,t,function(){setTimeout(function(){h.removeClipPath()})});h.setClipPath(y)}this._data=d},remove:function(){this._dataGroup&&this._dataGroup.removeAll(),this._data=null}});t.exports=h},function(t,e){var i=["lineStyle","normal","opacity"];t.exports=function(t){t.eachSeriesByType("parallel",function(e){var n=e.getModel("itemStyle.normal"),o=e.getModel("lineStyle.normal"),a=t.get("color"),r=o.get("color")||n.get("color")||a[e.seriesIndex%a.length],s=e.get("inactiveOpacity"),l=e.get("activeOpacity"),u=e.getModel("lineStyle.normal").getLineStyle(),c=e.coordinateSystem,h=e.getData(),d={normal:u.opacity,active:l,inactive:s};c.eachActiveState(h,function(t,e){var n=h.getItemModel(e),o=d[t];if("normal"===t){var a=n.get(i,!0);null!=a&&(o=a)}h.setItemVisual(e,"opacity",o)}),h.setVisual("color",r)})}},function(t,e,i){var n=i(1);i(56),i(268),i(269);var o=i(95),a=i(2);a.registerLayout(n.curry(o,"pictorialBar")),a.registerVisual(n.curry(i(50),"pictorialBar","roundRect",null)),i(32)},function(t,e,i){var n=i(1),o=i(2);i(373),i(331),i(332),o.registerVisual(n.curry(i(83),"radar")),o.registerVisual(n.curry(i(50),"radar","circle",null)),o.registerLayout(i(334)),o.registerProcessor(n.curry(i(62),"radar")),o.registerPreprocessor(i(333))},function(t,e,i){"use strict";var n=i(18),o=i(14),a=i(25),r=i(1),s=i(7).encodeHTML,l=n.extend({type:"series.radar",dependencies:["radar"],init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()}},getInitialData:function(t,e){var i=t.data||[],n=a([],i,{extraPrefix:"indicator_"}),r=new o(n,this);return r.initData(i),r},formatTooltip:function(t){var e=this.getRawValue(t),i=this.coordinateSystem,n=i.getIndicatorAxes(),o=this.getData().getName(t);return s(""===o?this.name:o)+"<br/>"+r.map(n,function(t,i){return s(t.name+" : "+e[i])}).join("<br />")},defaultOption:{zlevel:0,z:2,coordinateSystem:"radar",legendHoverLink:!0,radarIndex:0,lineStyle:{normal:{width:2,type:"solid"}},label:{normal:{position:"top"}},symbol:"emptyCircle",symbolSize:4}});t.exports=l},function(t,e,i){function n(t){return a.isArray(t)||(t=[+t,+t]),t}var o=i(3),a=i(1),r=i(24);t.exports=i(2).extendChartView({type:"radar",render:function(t,e,i){function s(t,e){var i=t.getItemVisual(e,"symbol")||"circle",o=t.getItemVisual(e,"color");if("none"!==i){var a=r.createSymbol(i,-.5,-.5,1,1,o);return a.attr({style:{strokeNoScale:!0},z2:100,scale:n(t.getItemVisual(e,"symbolSize"))}),a}}function l(e,i,n,a,r,l){n.removeAll();for(var u=0;u<i.length-1;u++){var c=s(a,r);c&&(c.__dimIdx=u,e[u]?(c.attr("position",e[u]),o[l?"initProps":"updateProps"](c,{
-position:i[u]},t,r)):c.attr("position",i[u]),n.add(c))}}function u(t){return a.map(t,function(t){return[c.cx,c.cy]})}var c=t.coordinateSystem,h=this.group,d=t.getData(),f=this._data;d.diff(f).add(function(e){var i=d.getItemLayout(e);if(i){var n=new o.Polygon,a=new o.Polyline,r={shape:{points:i}};n.shape.points=u(i),a.shape.points=u(i),o.initProps(n,r,t,e),o.initProps(a,r,t,e);var s=new o.Group,c=new o.Group;s.add(a),s.add(n),s.add(c),l(a.shape.points,i,c,d,e,!0),d.setItemGraphicEl(e,s)}}).update(function(e,i){var n=f.getItemGraphicEl(i),a=n.childAt(0),r=n.childAt(1),s=n.childAt(2),u={shape:{points:d.getItemLayout(e)}};u.shape.points&&(l(a.shape.points,u.shape.points,s,d,e,!1),o.updateProps(a,u,t),o.updateProps(r,u,t),d.setItemGraphicEl(e,n))}).remove(function(t){h.remove(f.getItemGraphicEl(t))}).execute(),d.eachItemGraphicEl(function(e,i){function n(){u.attr("ignore",v)}function r(){u.attr("ignore",m)}var s=d.getItemModel(i),l=e.childAt(0),u=e.childAt(1),c=e.childAt(2),f=d.getItemVisual(i,"color");h.add(e),l.useStyle(a.defaults(s.getModel("lineStyle.normal").getLineStyle(),{fill:"none",stroke:f})),l.hoverStyle=s.getModel("lineStyle.emphasis").getLineStyle();var p=s.getModel("areaStyle.normal"),g=s.getModel("areaStyle.emphasis"),m=p.isEmpty()&&p.parentModel.isEmpty(),v=g.isEmpty()&&g.parentModel.isEmpty();v=v&&m,u.ignore=m,u.useStyle(a.defaults(p.getAreaStyle(),{fill:f,opacity:.7})),u.hoverStyle=g.getAreaStyle();var y=s.getModel("itemStyle.normal").getItemStyle(["color"]),x=s.getModel("itemStyle.emphasis").getItemStyle(),_=s.getModel("label.normal"),b=s.getModel("label.emphasis");c.eachChild(function(e){e.setStyle(y),e.hoverStyle=a.clone(x);var n=d.get(d.dimensions[e.__dimIdx],i);o.setText(e.style,_,f),e.setStyle({text:_.get("show")?a.retrieve(t.getFormattedLabel(i,"normal",null,e.__dimIdx),n):""}),o.setText(e.hoverStyle,b,f),e.hoverStyle.text=b.get("show")?a.retrieve(t.getFormattedLabel(i,"emphasis",null,e.__dimIdx),n):""}),e.off("mouseover").off("mouseout").off("normal").off("emphasis"),e.on("emphasis",n).on("mouseover",n).on("normal",r).on("mouseout",r),o.setHoverStyle(e)}),this._data=d},remove:function(){this.group.removeAll(),this._data=null},dispose:function(){}})},function(t,e,i){var n=i(1);t.exports=function(t){var e=t.polar;if(e){n.isArray(e)||(e=[e]);var i=[];n.each(e,function(e,o){e.indicator?(e.type&&!e.shape&&(e.shape=e.type),t.radar=t.radar||[],n.isArray(t.radar)||(t.radar=[t.radar]),t.radar.push(e)):i.push(e)}),t.polar=i}n.each(t.series,function(t){"radar"===t.type&&t.polarIndex&&(t.radarIndex=t.polarIndex)})}},function(t,e){t.exports=function(t){t.eachSeriesByType("radar",function(t){function e(t,e){n[e]=n[e]||[],n[e][a]=o.dataToPoint(t,a)}var i=t.getData(),n=[],o=t.coordinateSystem;if(o){for(var a=0;a<o.getIndicatorAxes().length;a++){var r=i.dimensions[a];i.each(r,e)}i.each(function(t){n[t][0]&&n[t].push(n[t][0].slice()),i.setItemLayout(t,n[t])})}})}},function(t,e,i){var n=i(2);i(336),i(337),n.registerLayout(i(338)),n.registerVisual(i(339))},function(t,e,i){var n=i(18),o=i(247),a=i(7).encodeHTML,r=n.extend({type:"series.sankey",layoutInfo:null,getInitialData:function(t){var e=t.edges||t.links,i=t.data||t.nodes;if(i&&e){var n=o(i,e,this,!0);return n.data}},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},formatTooltip:function(t,e,i){if("edge"===i){var n=this.getDataParams(t,i),o=n.data,s=o.source+" -- "+o.target;return n.value&&(s+=" : "+n.value),a(s)}return r.superCall(this,"formatTooltip",t,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",layout:null,left:"5%",top:"5%",right:"20%",bottom:"5%",nodeWidth:20,nodeGap:8,layoutIterations:32,label:{normal:{show:!0,position:"right",textStyle:{color:"#000",fontSize:12}},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:1,borderColor:"#333"}},lineStyle:{normal:{color:"#314656",opacity:.2,curveness:.5},emphasis:{opacity:.6}},animationEasing:"linear",animationDuration:1e3}});t.exports=r},function(t,e,i){function n(t,e,i){var n=new o.Rect({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return o.initProps(n,{shape:{width:t.width+20,height:t.height+20}},e,i),n}var o=i(3),a=i(1),r=o.extendShape({shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,cpx2:0,cpy2:0,extent:0},buildPath:function(t,e){var i=e.extent/2;t.moveTo(e.x1,e.y1-i),t.bezierCurveTo(e.cpx1,e.cpy1-i,e.cpx2,e.cpy2-i,e.x2,e.y2-i),t.lineTo(e.x2,e.y2+i),t.bezierCurveTo(e.cpx2,e.cpy2+i,e.cpx1,e.cpy1+i,e.x1,e.y1+i),t.closePath()}});t.exports=i(2).extendChartView({type:"sankey",_model:null,render:function(t,e,i){var s=t.getGraph(),l=this.group,u=t.layoutInfo,c=t.getData(),h=t.getData("edge");this._model=t,l.removeAll(),l.position=[u.x,u.y],s.eachEdge(function(e){var i=new r;i.dataIndex=e.dataIndex,i.seriesIndex=t.seriesIndex,i.dataType="edge";var n=e.getModel("lineStyle.normal"),a=n.get("curveness"),s=e.node1.getLayout(),u=e.node2.getLayout(),c=e.getLayout();i.shape.extent=Math.max(1,c.dy);var d=s.x+s.dx,f=s.y+c.sy+c.dy/2,p=u.x,g=u.y+c.ty+c.dy/2,m=d*(1-a)+p*a,v=f,y=d*a+p*(1-a),x=g;switch(i.setShape({x1:d,y1:f,x2:p,y2:g,cpx1:m,cpy1:v,cpx2:y,cpy2:x}),i.setStyle(n.getItemStyle()),i.style.fill){case"source":i.style.fill=e.node1.getVisual("color");break;case"target":i.style.fill=e.node2.getVisual("color")}o.setHoverStyle(i,e.getModel("lineStyle.emphasis").getItemStyle()),l.add(i),h.setItemGraphicEl(e.dataIndex,i)}),s.eachNode(function(e){var i=e.getLayout(),n=e.getModel(),r=n.getModel("label.normal"),s=r.getModel("textStyle"),u=n.getModel("label.emphasis"),h=u.getModel("textStyle"),d=new o.Rect({shape:{x:i.x,y:i.y,width:e.getLayout().dx,height:e.getLayout().dy},style:{text:r.get("show")?t.getFormattedLabel(e.dataIndex,"normal")||e.id:"",textFont:s.getFont(),textFill:s.getTextColor(),textPosition:r.get("position")}});d.setStyle(a.defaults({fill:e.getVisual("color")},n.getModel("itemStyle.normal").getItemStyle())),o.setHoverStyle(d,a.extend(e.getModel("itemStyle.emphasis"),{text:u.get("show")?t.getFormattedLabel(e.dataIndex,"emphasis")||e.id:"",textFont:h.getFont(),textFill:h.getTextColor(),textPosition:u.get("position")})),l.add(d),c.setItemGraphicEl(e.dataIndex,d),d.dataType="node"}),!this._data&&t.get("animation")&&l.setClipPath(n(l.getBoundingRect(),t,function(){l.removeClipPath()})),this._data=t.getData()},dispose:function(){}})},function(t,e,i){function n(t,e){return M.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function o(t,e,i,n,o,a,s){r(t,i,o),u(t,e,a,n,s),m(t)}function a(t){T.each(t,function(t){var e=x(t.outEdges,S),i=x(t.inEdges,S),n=Math.max(e,i);t.setLayout({value:n},!0)})}function r(t,e,i){for(var n=t,o=null,a=0,r=0;n.length;){o=[];for(var u=0,c=n.length;u<c;u++){var h=n[u];h.setLayout({x:a},!0),h.setLayout({dx:e},!0);for(var d=0,f=h.outEdges.length;d<f;d++)o.push(h.outEdges[d].node2)}n=o,++a}s(t,a),r=(i-e)/(a-1),l(t,r)}function s(t,e){T.each(t,function(t){t.outEdges.length||t.setLayout({x:e-1},!0)})}function l(t,e){T.each(t,function(t){var i=t.getLayout().x*e;t.setLayout({x:i},!0)})}function u(t,e,i,n,o){var a=I().key(function(t){return t.getLayout().x}).sortKeys(w).entries(t).map(function(t){return t.values});c(t,a,e,i,n),h(a,n,i);for(var r=1;o>0;o--)r*=.99,d(a,r),h(a,n,i),p(a,r),h(a,n,i)}function c(t,e,i,n,o){var a=[];T.each(e,function(t){var e=t.length,i=0;T.each(t,function(t){i+=t.getLayout().value});var r=(n-(e-1)*o)/i;a.push(r)}),a.sort(function(t,e){return t-e});var r=a[0];T.each(e,function(t){T.each(t,function(t,e){t.setLayout({y:e},!0);var i=t.getLayout().value*r;t.setLayout({dy:i},!0)})}),T.each(i,function(t){var e=+t.getValue()*r;t.setLayout({dy:e},!0)})}function h(t,e,i){T.each(t,function(t){var n,o,a,r=0,s=t.length;for(t.sort(b),a=0;a<s;a++){if(n=t[a],o=r-n.getLayout().y,o>0){var l=n.getLayout().y+o;n.setLayout({y:l},!0)}r=n.getLayout().y+n.getLayout().dy+e}if(o=r-e-i,o>0){var l=n.getLayout().y-o;for(n.setLayout({y:l},!0),r=n.getLayout().y,a=s-2;a>=0;--a)n=t[a],o=n.getLayout().y+n.getLayout().dy+e-r,o>0&&(l=n.getLayout().y-o,n.setLayout({y:l},!0)),r=n.getLayout().y}})}function d(t,e){T.each(t.slice().reverse(),function(t){T.each(t,function(t){if(t.outEdges.length){var i=x(t.outEdges,f)/x(t.outEdges,S),n=t.getLayout().y+(i-_(t))*e;t.setLayout({y:n},!0)}})})}function f(t){return _(t.node2)*t.getValue()}function p(t,e){T.each(t,function(t){T.each(t,function(t){if(t.inEdges.length){var i=x(t.inEdges,g)/x(t.inEdges,S),n=t.getLayout().y+(i-_(t))*e;t.setLayout({y:n},!0)}})})}function g(t){return _(t.node1)*t.getValue()}function m(t){T.each(t,function(t){t.outEdges.sort(v),t.inEdges.sort(y)}),T.each(t,function(t){var e=0,i=0;T.each(t.outEdges,function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy}),T.each(t.inEdges,function(t){t.setLayout({ty:i},!0),i+=t.getLayout().dy})})}function v(t,e){return t.node2.getLayout().y-e.node2.getLayout().y}function y(t,e){return t.node1.getLayout().y-e.node1.getLayout().y}function x(t,e){for(var i=0,n=t.length,o=-1;++o<n;){var a=+e.call(t,t[o],o);isNaN(a)||(i+=a)}return i}function _(t){return t.getLayout().y+t.getLayout().dy/2}function b(t,e){return t.getLayout().y-e.getLayout().y}function w(t,e){return t<e?-1:t>e?1:t===e?0:NaN}function S(t){return t.getValue()}var M=i(12),I=i(265),T=i(1);t.exports=function(t,e,i){t.eachSeriesByType("sankey",function(t){var i=t.get("nodeWidth"),r=t.get("nodeGap"),s=n(t,e);t.layoutInfo=s;var l=s.width,u=s.height,c=t.getGraph(),h=c.nodes,d=c.edges;a(h);var f=T.filter(h,function(t){return 0===t.getLayout().value}),p=0!==f.length?0:t.get("layoutIterations");o(h,d,i,r,l,u,p)})}},function(t,e,i){var n=i(82),o=i(1);t.exports=function(t,e){t.eachSeriesByType("sankey",function(t){var e=t.getGraph(),i=e.nodes;i.sort(function(t,e){return t.getLayout().value-e.getLayout().value});var a=i[0].getLayout().value,r=i[i.length-1].getLayout().value;o.each(i,function(e){var i=new n({type:"color",mappingMethod:"linear",dataExtent:[a,r],visual:t.get("color")}),o=i.mapValueToVisual(e.getLayout().value);e.setVisual("color",o);var s=e.getModel(),l=s.get("itemStyle.normal.color");null!=l&&e.setVisual("color",l)})})}},function(t,e,i){var n=i(2),o=i(1);i(252),i(341),i(342),n.registerLayout(i(343)),n.registerVisual(i(344)),n.registerProcessor(o.curry(i(62),"themeRiver"))},function(t,e,i){"use strict";var n=i(25),o=i(18),a=i(14),r=i(1),s=i(7),l=s.encodeHTML,u=i(265),c=2,h=o.extend({type:"series.themeRiver",dependencies:["singleAxis"],nameMap:null,init:function(t){h.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()}},fixData:function(t){for(var e=t.length,i=u().key(function(t){return t[2]}).entries(t),n=r.map(i,function(t){return{name:t.key,dataList:t.values}}),o=n.length,a=-1,s=-1,l=0;l<o;++l){var c=n[l].dataList.length;c>a&&(a=c,s=l)}for(var h=0;h<o;++h)if(h!==s)for(var d=n[h].name,f=0;f<a;++f){for(var p=n[s].dataList[f][0],g=n[h].dataList.length,m=-1,v=0;v<g;++v){var y=n[h].dataList[v][0];if(y===p){m=v;break}}m===-1&&(t[e]=[],t[e][0]=p,t[e][1]=0,t[e][2]=d,e++)}return t},getInitialData:function(t,e){var i=[],o=e.queryComponents({mainType:"singleAxis",index:this.get("singleAxisIndex"),id:this.get("singleAxisId")})[0],s=o.get("type");i=[{name:"time",type:"category"===s?"ordinal":"time"===s?"time":"float"},{name:"value",type:"float"},{name:"name",type:"ordinal"}];for(var l=r.filter(t.data,function(t){return void 0!==t[2]}),u=this.fixData(l||[]),h=[],d=this.nameMap={},f=0,p=0;p<u.length;++p)h.push(u[p][c]),d[u[p][c]]||(d[u[p][c]]=f++);n(i,u);var g=new a(i,this);return g.initData(u,h),g},coordDimToDataDim:function(t){return["time"]},getLayerSeries:function(){function t(t,i){return e.get("time",t)-e.get("time",i)}for(var e=this.getData(),i=e.count(),n=[],o=0;o<i;++o)n[o]=o;for(var a=u().key(function(t){return e.get("name",t)}).entries(n),s=r.map(a,function(t){return{name:t.key,indices:t.values}}),l=0;l<s.length;++l)s[l].indices.sort(t);return s},getAxisTooltipData:function(t,e,i){r.isArray(t)||(t=t?[t]:[]);for(var n,o=this.getData(),a=this.getLayerSeries(),s=[],l=a.length,u=0;u<l;++u){for(var c=Number.MAX_VALUE,h=-1,d=a[u].indices.length,f=0;f<d;++f){var p=o.get(t[0],a[u].indices[f]),g=Math.abs(p-e);g<=c&&(n=p,c=g,h=a[u].indices[f])}s.push(h)}return{dataIndices:s,nestestValue:n}},formatTooltip:function(t){var e=this.getData(),i=e.get("name",t),n=e.get("value",t);return(isNaN(n)||null==n)&&(n="-"),l(i+" : "+n)},defaultOption:{zlevel:0,z:2,coordinateSystem:"singleAxis",boundaryGap:["10%","10%"],singleAxisIndex:0,animationEasing:"linear",label:{normal:{margin:4,textAlign:"right",show:!0,position:"left",textStyle:{color:"#000",fontSize:11}},emphasis:{show:!0}}}});t.exports=h},function(t,e,i){(function(e){function n(t,e,i){var n=new a.Rect({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return a.initProps(n,{shape:{width:t.width+20,height:t.height+20}},e,i),n}var o=i(91),a=i(3),r=i(1),s=i(48);t.exports=i(2).extendChartView({type:"themeRiver",init:function(){this._layers=[]},render:function(t,e,i){function l(t){return t.name}function u(e,i,s){var l=this._layers;if("remove"===e)return void d.remove(l[i]);for(var u,p=[],g=[],m=f[i].indices,v=0;v<m.length;v++){var x=c.getItemLayout(m[v]),_=x.x,b=x.y0,w=x.y;p.push([_,b]),g.push([_,b+w]),u=h.getItemVisual(m[v],"color")}var S,M,I=c.getItemLayout(m[0]),T=c.getItemModel(m[v-1]),A=T.getModel("label.normal"),C=A.get("margin");if("add"===e){var L=y[i]=new a.Group;S=new o.Polygon({shape:{points:p,stackedOnPoints:g,smooth:.4,stackedOnSmooth:.4,smoothConstraint:!1},z2:0}),M=new a.Text({style:{x:I.x-C,y:I.y0+I.y/2}}),L.add(S),L.add(M),d.add(L),S.setClipPath(n(S.getBoundingRect(),t,function(){S.removeClipPath()}))}else{var L=l[s];S=L.childAt(0),M=L.childAt(1),d.add(L),y[i]=L,a.updateProps(S,{shape:{points:p,stackedOnPoints:g}},t),a.updateProps(M,{style:{x:I.x-C,y:I.y0+I.y/2}},t)}var D=T.getModel("itemStyle.emphasis"),P=T.getModel("itemStyle.normal"),k=A.getModel("textStyle");M.setStyle({text:A.get("show")?t.getFormattedLabel(m[v-1],"normal")||c.getName(m[v-1]):"",textFont:k.getFont(),textAlign:A.get("textAlign"),textVerticalAlign:"middle"}),S.setStyle(r.extend({fill:u},P.getItemStyle(["color"]))),a.setHoverStyle(S,D.getItemStyle())}var c=t.getData(),h=t.getRawData();if(c.count()){var d=this.group,f=t.getLayerSeries(),p=c.getLayout("layoutInfo"),g=p.rect,m=p.boundaryGap;d.attr("position",[0,g.y+m[0]]);var v=new s(this._layersSeries||[],f,l,l),y={};v.add(r.bind(r.curry(u,"add"),this)).update(r.bind(r.curry(u,"update"),this)).remove(r.bind(r.curry(u,"remove"),this)).execute(),this._layersSeries=f,this._layers=y}},dispose:function(){}})}).call(e,i(188))},function(t,e,i){function n(t,e,i){if(t.count())for(var n,r=e.coordinateSystem,s=e.getLayerSeries(),l=a.map(s,function(e){return a.map(e.indices,function(e){var i=r.dataToPoint(t.get("time",e));return i[1]=t.get("value",e),i})}),u=o(l),c=u.y0,h=i/u.max,d=s.length,f=s[0].indices.length,p=0;p<f;++p){n=c[p]*h,t.setItemLayout(s[0].indices[p],{layerIndex:0,x:l[0][p][0],y0:n,y:l[0][p][1]*h});for(var g=1;g<d;++g)n+=l[g-1][p][1]*h,t.setItemLayout(s[g].indices[p],{layerIndex:g,x:l[g][p][0],y0:n,y:l[g][p][1]*h})}}function o(t){for(var e,i=t.length,n=t[0].length,o=[],a=[],r=0,s={},l=0;l<n;++l){for(var u=0,e=0;u<i;++u)e+=t[u][l][1];e>r&&(r=e),o.push(e)}for(var c=0;c<n;++c)a[c]=(r-o[c])/2;r=0;for(var h=0;h<n;++h){var d=o[h]+a[h];d>r&&(r=d)}return s.y0=a,s.max=r,s}var a=i(1),r=i(4);t.exports=function(t,e){t.eachSeriesByType("themeRiver",function(t){var e=t.getData(),i=t.coordinateSystem,o={},a=i.getRect();o.rect=a;var s=t.get("boundaryGap"),l=i.getAxis();if(o.boundaryGap=s,"horizontal"===l.orient){s[0]=r.parsePercent(s[0],a.height),s[1]=r.parsePercent(s[1],a.height);var u=a.height-s[0]-s[1];n(e,t,u)}else{s[0]=r.parsePercent(s[0],a.width),s[1]=r.parsePercent(s[1],a.width);var c=a.width-s[0]-s[1];n(e,t,c)}e.setLayout("layoutInfo",o)})}},function(t,e){t.exports=function(t){t.eachSeriesByType("themeRiver",function(t){var e=t.getData(),i=t.getRawData(),n=t.get("color");e.each(function(o){var a=e.getName(o),r=n[(t.nameMap[a]-1)%n.length];i.setItemVisual(o,"color",r)})})}},function(t,e,i){var n=i(2);i(347),i(348),i(349),n.registerVisual(i(351)),n.registerLayout(i(350))},function(t,e,i){function n(t){this.group=new r.Group,t.add(this.group)}function o(t,e,i,n,o,a){var r=[[o?t:t-d,e],[t+i,e],[t+i,e+n],[o?t:t-d,e+n]];return!a&&r.splice(2,0,[t+i+d,e+n/2]),!o&&r.push([t,e+n/2]),r}function a(t,e,i){t.eventData={componentType:"series",componentSubType:"treemap",seriesIndex:e.componentIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:i&&i.dataIndex,name:i&&i.name},treePathInfo:i&&u.wrapTreePathInfo(i,e)}}var r=i(3),s=i(12),l=i(1),u=i(92),c=8,h=8,d=5;n.prototype={constructor:n,render:function(t,e,i,n){var o=t.getModel("breadcrumb"),a=this.group;if(a.removeAll(),o.get("show")&&i){var r=o.getModel("itemStyle.normal"),l=r.getModel("textStyle"),u={pos:{left:o.get("left"),right:o.get("right"),top:o.get("top"),bottom:o.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:o.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(i,u,l),this._renderContent(t,u,r,l,n),s.positionElement(a,u.pos,u.box)}},_prepare:function(t,e,i){for(var n=t;n;n=n.parentNode){var o=n.getModel().get("name"),a=i.getTextRect(o),r=Math.max(a.width+2*c,e.emptyItemWidth);e.totalWidth+=r+h,e.renderList.push({node:n,text:o,width:r})}},_renderContent:function(t,e,i,n,u){for(var c=0,d=e.emptyItemWidth,f=t.get("breadcrumb.height"),p=s.getAvailableSize(e.pos,e.box),g=e.totalWidth,m=e.renderList,v=m.length-1;v>=0;v--){var y=m[v],x=y.node,_=y.width,b=y.text;g>p.width&&(g-=_-d,_=d,b="");var w=new r.Polygon({shape:{points:o(c,0,_,f,v===m.length-1,0===v)},style:l.defaults(i.getItemStyle(),{lineJoin:"bevel",text:b,textFill:n.getTextColor(),textFont:n.getFont()}),z:10,onclick:l.curry(u,x)});this.group.add(w),a(w,t,x),c+=_+h}},remove:function(){this.group.removeAll()}},t.exports=n},function(t,e,i){function n(t){var e=0;s.each(t.children,function(t){n(t);var i=t.value;s.isArray(i)&&(i=i[0]),e+=i});var i=t.value;s.isArray(i)&&(i=i[0]),(null==i||isNaN(i))&&(i=e),i<0&&(i=0),s.isArray(t.value)?t.value[0]=i:t.value=i}function o(t,e){var i=e.get("color");if(i){t=t||[];var n;if(s.each(t,function(t){var e=new l(t),i=e.get("color");(e.get("itemStyle.normal.color")||i&&"none"!==i)&&(n=!0)}),!n){var o=t[0]||(t[0]={});o.color=i.slice()}return t}}var a=i(18),r=i(418),s=i(1),l=i(10),u=i(7),c=i(92),h=u.encodeHTML,d=u.addCommas;t.exports=a.extend({type:"series.treemap",layoutMode:"box",dependencies:["grid","polar"],_viewRoot:null,defaultOption:{progressive:0,hoverLayerThreshold:1/0,left:"center",top:"middle",right:null,bottom:null,width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{normal:{color:"rgba(0,0,0,0.7)",borderColor:"rgba(255,255,255,0.7)",borderWidth:1,shadowColor:"rgba(150,150,150,1)",shadowBlur:3,shadowOffsetX:0,shadowOffsetY:0,textStyle:{color:"#fff"}},emphasis:{textStyle:{}}}},label:{normal:{show:!0,position:"inside",textStyle:{color:"#fff",ellipsis:!0}}},itemStyle:{normal:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},getInitialData:function(t,e){var i=t.name;null==i&&(i=t.name);var a={name:i,children:t.data};n(a);var s=t.levels||[];return s=t.levels=o(s,e),r.createTree(a,this,s).data},optionUpdated:function(){this.resetViewRoot()},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=d(s.isArray(i)?i[0]:i),o=e.getName(t);return h(o+": "+n)},getDataParams:function(t){var e=a.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(t);return e.treePathInfo=c.wrapTreePathInfo(i,this),e},setLayoutInfo:function(t){this.layoutInfo=this.layoutInfo||{},s.extend(this.layoutInfo,t)},mapIdToIndex:function(t){var e=this._idIndexMap;e||(e=this._idIndexMap={},this._idIndexMapCount=0);var i=e[t];return null==i&&(e[t]=i=this._idIndexMapCount++),i},getViewRoot:function(){return this._viewRoot},resetViewRoot:function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)}})},function(t,e,i){function n(){return{nodeGroup:[],background:[],content:[]}}function o(t,e,i,n,o,l,u,c,h,d){function f(e){z.dataIndex=u.dataIndex,z.seriesIndex=t.seriesIndex;var i=T.borderWidth,n=Math.max(A-2*i,0),o=Math.max(C-2*i,0);z.culling=!0,z.setShape({x:i,y:i,width:n,height:o});var a=u.getVisual("color",!0);p(z,function(){var t={fill:a},e=u.getModel("itemStyle.emphasis").getItemStyle();g(t,e,a,n,o),z.setStyle(t),s.setHoverStyle(z,e)}),e.add(z)}function p(t,e){L?!t.invisible&&l.push(t):(e(),t.__tmWillVisible||(t.invisible=!1))}function g(e,i,n,o,a){var r=u.getModel(),s=r.get("name");if(T.isLeafRoot){var l=t.get("drillDownIcon",!0);s=l?l+" "+s:s}y(s,e,r,_,n,o,a),y(s,i,r,b,n,o,a)}function y(t,e,i,n,o,a,r){var l=i.getModel(n),u=l.getModel("textStyle");s.setText(e,l,o),e.textAlign=u.get("align"),e.textVerticalAlign=u.get("baseline");var c=u.getTextRect(t);!l.getShallow("show")||c.height>r?e.text="":c.width>a?e.text=u.get("ellipsis")?u.truncateText(t,a,null,{minChar:2}):"":e.text=t}function x(t,n,r,s){var l=null!=P&&i[t][P],u=o[t];return l?(i[t][P]=null,w(u,l,t)):L||(l=new n({z:a(r,s)}),l.__tmDepth=r,l.__tmStorageName=t,I(u,l,t)),e[t][D]=l}function w(t,e,i){var n=t[D]={};n.old="nodeGroup"===i?e.position.slice():r.extend({},e.shape)}function I(t,e,i){var a=t[D]={},r=u.parentNode;if(r&&(!n||"drillDown"===n.direction)){var s=0,l=0,c=o.background[r.getRawIndex()];!n&&c&&c.old&&(s=c.old.width,l=c.old.height),a.old="nodeGroup"===i?[0,l]:{x:s,y:l,width:0,height:0}}a.fadein="nodeGroup"!==i}if(u){var T=u.getLayout();if(T&&T.isInView){var A=T.width,C=T.height,L=T.invisible,D=u.getRawIndex(),P=c&&c.getRawIndex(),k=x("nodeGroup",m);if(k){if(h.add(k),k.attr("position",[T.x||0,T.y||0]),k.__tmNodeWidth=A,k.__tmNodeHeight=C,T.isAboveViewRoot)return k;var O=x("background",v,d,S);O&&(O.setShape({x:0,y:0,width:A,height:C}),p(O,function(){O.setStyle("fill",u.getVisual("borderColor",!0))}),k.add(O));var E=u.viewChildren;if(!E||!E.length){var z=x("content",v,d,M);z&&f(k)}return k}}}}function a(t,e){var i=t*w+e;return(i-1)/i}var r=i(1),s=i(3),l=i(48),u=i(92),c=i(346),h=i(93),d=i(11),f=i(19),p=i(419),g=r.bind,m=s.Group,v=s.Rect,y=r.each,x=3,_=["label","normal"],b=["label","emphasis"],w=10,S=1,M=2;t.exports=i(2).extendChartView({type:"treemap",init:function(t,e){this._containerGroup,this._storage=n(),this._oldTree,this._breadcrumb,this._controller,this._state="ready",this._mayClick},render:function(t,e,i,n){var o=e.findComponents({mainType:"series",subType:"treemap",query:n});if(!(r.indexOf(o,t)<0)){this.seriesModel=t,this.api=i,this.ecModel=e;var a=u.retrieveTargetInfo(n,t),s=n&&n.type,l=t.layoutInfo,c=!this._oldTree,h=this._storage,d="treemapRootToNode"===s&&a&&h?{rootNodeGroup:h.nodeGroup[a.node.getRawIndex()],direction:n.direction}:null,f=this._giveContainerGroup(l),p=this._doRender(f,t,d);c||s&&"treemapZoomToNode"!==s&&"treemapRootToNode"!==s?p.renderFinally():this._doAnimation(f,p,t,d),this._resetController(i),this._renderBreadcrumb(t,i,a)}},_giveContainerGroup:function(t){var e=this._containerGroup;return e||(e=this._containerGroup=new m,this._initEvents(e),this.group.add(e)),e.attr("position",[t.x,t.y]),e},_doRender:function(t,e,i){function a(t,e,i,n,o){function s(t){return t.getId()}function u(r,s){var l=null!=r?t[r]:null,u=null!=s?e[s]:null,c=m(l,u,i,o);c&&a(l&&l.viewChildren||[],u&&u.viewChildren||[],c,n,o+1)}n?(e=t,y(t,function(t,e){!t.isRemoved()&&u(e,e)})):new l(e,t,s,s).add(u).update(u).remove(r.curry(u,null)).execute()}function s(t){var e=n();return t&&y(t,function(t,i){var n=e[i];y(t,function(t){t&&(n.push(t),t.__tmWillDelete=1)})}),e}function u(){y(v,function(t){y(t,function(t){t.parent&&t.parent.remove(t)})}),y(g,function(t){t.invisible=!0,t.dirty()})}var c=e.getData().tree,h=this._oldTree,d=n(),f=n(),p=this._storage,g=[],m=r.curry(o,e,f,p,i,d,g);a(c.root?[c.root]:[],h&&h.root?[h.root]:[],t,c===h||!h,0);var v=s(p);return this._oldTree=c,this._storage=f,{lastsForAnimation:d,willDeleteEls:v,renderFinally:u}},_doAnimation:function(t,e,i,n){if(i.get("animation")){var o=i.get("animationDurationUpdate"),a=i.get("animationEasing"),s=p.createWrap();y(e.willDeleteEls,function(t,e){y(t,function(t,i){if(!t.invisible){var r,l=t.parent;if(n&&"drillDown"===n.direction)r=l===n.rootNodeGroup?{shape:{x:0,y:0,width:l.__tmNodeWidth,height:l.__tmNodeHeight},style:{opacity:0}}:{style:{opacity:0}};else{var u=0,c=0;l.__tmWillDelete||(u=l.__tmNodeWidth/2,c=l.__tmNodeHeight/2),r="nodeGroup"===e?{position:[u,c],style:{opacity:0}}:{shape:{x:u,y:c,width:0,height:0},style:{opacity:0}}}r&&s.add(t,r,o,a)}})}),y(this._storage,function(t,i){y(t,function(t,n){var l=e.lastsForAnimation[i][n],u={};l&&("nodeGroup"===i?l.old&&(u.position=t.position.slice(),t.attr("position",l.old)):(l.old&&(u.shape=r.extend({},t.shape),t.setShape(l.old)),l.fadein?(t.setStyle("opacity",0),u.style={opacity:1}):1!==t.style.opacity&&(u.style={opacity:1})),s.add(t,u,o,a))})},this),this._state="animating",s.done(g(function(){this._state="ready",e.renderFinally()},this)).start()}},_resetController:function(t){var e=this._controller;e||(e=this._controller=new h(t.getZr()),e.enable(this.seriesModel.get("roam")),e.on("pan",g(this._onPan,this)),e.on("zoom",g(this._onZoom,this)));var i=new d(0,0,t.getWidth(),t.getHeight());e.setPointerChecker(function(t,e,n){return i.contain(e,n)})},_clearController:function(){var t=this._controller;t&&(t.dispose(),t=null)},_onPan:function(t,e){if(this._mayClick=!1,"animating"!==this._state&&(Math.abs(t)>x||Math.abs(e)>x)){var i=this.seriesModel.getData().tree.root;if(!i)return;var n=i.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t,y:n.y+e,width:n.width,height:n.height}})}},_onZoom:function(t,e,i){if(this._mayClick=!1,"animating"!==this._state){var n=this.seriesModel.getData().tree.root;if(!n)return;var o=n.getLayout();if(!o)return;var a=new d(o.x,o.y,o.width,o.height),r=this.seriesModel.layoutInfo;e-=r.x,i-=r.y;var s=f.create();f.translate(s,s,[-e,-i]),f.scale(s,s,[t,t]),f.translate(s,s,[e,i]),a.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:a.x,y:a.y,width:a.width,height:a.height}})}},_initEvents:function(t){function e(t){var e=this.seriesModel.get("nodeClick",!0);if(e){var i=this.findTarget(t.offsetX,t.offsetY);if(i){var n=i.node;if(n.getLayout().isLeafRoot)this._rootToNode(i);else if("zoomToNode"===e)this._zoomToNode(i);else if("link"===e){var o=n.hostTree.data.getItemModel(n.dataIndex),a=o.get("link",!0),r=o.get("target",!0)||"blank";a&&window.open(a,r)}}}}t.on("mousedown",function(t){"ready"===this._state&&(this._mayClick=!0)},this),t.on("mouseup",function(t){this._mayClick&&(this._mayClick=!1,"ready"===this._state&&e.call(this,t))},this)},_renderBreadcrumb:function(t,e,i){function n(e){"animating"!==this._state&&(u.aboveViewRoot(t.getViewRoot(),e)?this._rootToNode({node:e}):this._zoomToNode({node:e}))}i||(i=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2),i||(i={node:t.getData().tree.root})),(this._breadcrumb||(this._breadcrumb=new c(this.group))).render(t,e,i.node,g(n,this))},remove:function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage=n(),this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},dispose:function(){this._clearController()},_zoomToNode:function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},_rootToNode:function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},findTarget:function(t,e){var i,n=this.seriesModel.getViewRoot();return n.eachNode({attr:"viewChildren",order:"preorder"},function(n){var o=this._storage.background[n.getRawIndex()];if(o){var a=o.transformCoordToLocal(t,e),r=o.shape;if(!(r.x<=a[0]&&a[0]<=r.x+r.width&&r.y<=a[1]&&a[1]<=r.y+r.height))return!1;i={node:n,offsetX:a[0],offsetY:a[1]}}},this),i}})},function(t,e,i){for(var n=i(2),o=i(92),a=function(){},r=["treemapZoomToNode","treemapRender","treemapMove"],s=0;s<r.length;s++)n.registerAction({type:r[s],update:"updateView"},a);n.registerAction({type:"treemapRootToNode",update:"updateView"},function(t,e){function i(e,i){var n=o.retrieveTargetInfo(t,e);if(n){var a=e.getViewRoot();a&&(t.direction=o.aboveViewRoot(a,n.node)?"rollUp":"drillDown"),e.resetViewRoot(n.node)}}e.eachComponent({mainType:"series",subType:"treemap",query:t},i)})},function(t,e,i){function n(t,e,i){var n={mainType:"series",subType:"treemap",query:i};t.eachComponent(n,function(t){var n=e.getWidth(),a=e.getHeight(),r=t.option,s=m.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),l=r.size||[],u=b(w(s.width,l[0]),n),c=b(w(s.height,l[1]),a),g=i&&i.type,x=v.retrieveTargetInfo(i,t),_="treemapRender"===g||"treemapMove"===g?i.rootRect:null,M=t.getViewRoot(),I=v.getPathToRoot(M);if("treemapMove"!==g){var T="treemapZoomToNode"===g?h(t,x,M,u,c):_?[_.width,_.height]:[u,c],A=r.sort;A&&"asc"!==A&&"desc"!==A&&(A="desc");var C={squareRatio:r.squareRatio,sort:A,leafDepth:r.leafDepth};M.hostTree.clearLayouts();var L={x:0,y:0,width:T[0],height:T[1],area:T[0]*T[1]};M.setLayout(L),o(M,C,!1,0);var L=M.getLayout();S(I,function(t,e){var i=(I[e+1]||M).getValue();t.setLayout(p.extend({dataExtent:[i,i],borderWidth:0},L))})}var D=t.getData().tree.root;D.setLayout(d(s,_,x),!0),t.setLayoutInfo(s),f(D,new y((-s.x),(-s.y),n,a),I,M,0)})}function o(t,e,i,n){var r,s;if(!t.isRemoved()){var l=t.getLayout();r=l.width,s=l.height;var h=t.getModel("itemStyle.normal"),d=h.get("borderWidth"),f=h.get("gapWidth")/2,p=d-f,g=t.getModel();t.setLayout({borderWidth:d},!0),r=x(r-2*p,0),s=x(s-2*p,0);var m=r*s,v=a(t,g,m,e,i,n);if(v.length){var y={x:p,y:p,width:r,height:s},b=_(r,s),w=1/0,S=[];S.area=0;for(var M=0,I=v.length;M<I;){var T=v[M];S.push(T),S.area+=T.getLayout().area;var A=u(S,b,e.squareRatio);A<=w?(M++,w=A):(S.area-=S.pop().getLayout().area,c(S,b,y,f,!1),b=_(y.width,y.height),S.length=S.area=0,w=1/0)}if(S.length&&c(S,b,y,f,!0),!i){var C=g.get("childrenVisibleMin");null!=C&&m<C&&(i=!0)}for(var M=0,I=v.length;M<I;M++)o(v[M],e,i,n+1)}}}function a(t,e,i,n,o,a){var u=t.children||[],c=n.sort;"asc"!==c&&"desc"!==c&&(c=null);var h=null!=n.leafDepth&&n.leafDepth<=a;if(o&&!h)return t.viewChildren=[];u=p.filter(u,function(t){return!t.isRemoved()}),s(u,c);var d=l(e,u,c);if(0===d.sum)return t.viewChildren=[];if(d.sum=r(e,i,d.sum,c,u),0===d.sum)return t.viewChildren=[];for(var f=0,g=u.length;f<g;f++){var m=u[f].getValue()/d.sum*i;u[f].setLayout({area:m})}return h&&(u.length&&t.setLayout({isLeafRoot:!0},!0),u.length=0),t.viewChildren=u,t.setLayout({dataExtent:d.dataExtent},!0),u}function r(t,e,i,n,o){if(!n)return i;for(var a=t.get("visibleMin"),r=o.length,s=r,l=r-1;l>=0;l--){var u=o["asc"===n?r-l-1:l].getValue();u/i*e<a&&(s=l,i-=u)}return"asc"===n?o.splice(0,r-s):o.splice(s,r-s),i}function s(t,e){return e&&t.sort(function(t,i){var n="asc"===e?t.getValue()-i.getValue():i.getValue()-t.getValue();return 0===n?"asc"===e?t.dataIndex-i.dataIndex:i.dataIndex-t.dataIndex:n}),t}function l(t,e,i){for(var n=0,o=0,a=e.length;o<a;o++)n+=e[o].getValue();var r,s=t.get("visualDimension");if(e&&e.length)if("value"===s&&i)r=[e[e.length-1].getValue(),e[0].getValue()],"asc"===i&&r.reverse();else{var r=[1/0,-(1/0)];S(e,function(t){var e=t.getValue(s);e<r[0]&&(r[0]=e),e>r[1]&&(r[1]=e)});
-}else r=[NaN,NaN];return{sum:n,dataExtent:r}}function u(t,e,i){for(var n,o=0,a=1/0,r=0,s=t.length;r<s;r++)n=t[r].getLayout().area,n&&(n<a&&(a=n),n>o&&(o=n));var l=t.area*t.area,u=e*e*i;return l?x(u*o/l,l/(u*a)):1/0}function c(t,e,i,n,o){var a=e===i.width?0:1,r=1-a,s=["x","y"],l=["width","height"],u=i[s[a]],c=e?t.area/e:0;(o||c>i[l[r]])&&(c=i[l[r]]);for(var h=0,d=t.length;h<d;h++){var f=t[h],p={},g=c?f.getLayout().area/c:0,m=p[l[r]]=x(c-2*n,0),v=i[s[a]]+i[l[a]]-u,y=h===d-1||v<g?v:g,b=p[l[a]]=x(y-2*n,0);p[s[r]]=i[s[r]]+_(n,m/2),p[s[a]]=u+_(n,b/2),u+=y,f.setLayout(p,!0)}i[s[r]]+=c,i[l[r]]-=c}function h(t,e,i,n,o){var a=(e||{}).node,r=[n,o];if(!a||a===i)return r;for(var s,l=n*o,u=l*t.option.zoomToNodeRatio;s=a.parentNode;){for(var c=0,h=s.children,d=0,f=h.length;d<f;d++)c+=h[d].getValue();var p=a.getValue();if(0===p)return r;u*=c/p;var m=s.getModel("itemStyle.normal").get("borderWidth");isFinite(m)&&(u+=4*m*m+4*m*Math.pow(u,.5)),u>g.MAX_SAFE_INTEGER&&(u=g.MAX_SAFE_INTEGER),a=s}u<l&&(u=l);var v=Math.pow(u/l,.5);return[n*v,o*v]}function d(t,e,i){if(e)return{x:e.x,y:e.y};var n={x:0,y:0};if(!i)return n;var o=i.node,a=o.getLayout();if(!a)return n;for(var r=[a.width/2,a.height/2],s=o;s;){var l=s.getLayout();r[0]+=l.x,r[1]+=l.y,s=s.parentNode}return{x:t.width/2-r[0],y:t.height/2-r[1]}}function f(t,e,i,n,o){var a=t.getLayout(),r=i[o],s=r&&r===t;if(!(r&&!s||o===i.length&&t!==n)){t.setLayout({isInView:!0,invisible:!s&&!e.intersect(a),isAboveViewRoot:s},!0);var l=new y(e.x-a.x,e.y-a.y,e.width,e.height);S(t.viewChildren||[],function(t){f(t,l,i,n,o+1)})}}var p=i(1),g=i(4),m=i(12),v=i(92),y=i(11),v=i(92),x=Math.max,_=Math.min,b=g.parsePercent,w=p.retrieve,S=p.each;t.exports=n},function(t,e,i){function n(t,e,i,s,u,h){var d=t.getModel(),p=t.getLayout();if(p&&!p.invisible&&p.isInView){var m,v=t.getModel(g),y=i[t.depth],x=o(v,e,y,s),_=v.get("borderColor"),b=v.get("borderColorSaturation");null!=b&&(m=a(x,t),_=r(b,m)),t.setVisual("borderColor",_);var w=t.viewChildren;if(w&&w.length){var S=l(t,d,p,v,x,w);f.each(w,function(t,e){if(t.depth>=u.length||t===u[t.depth]){var o=c(d,x,t,e,S,h);n(t,o,i,s,u,h)}})}else m=a(x,t),t.setVisual("color",m)}}function o(t,e,i,n){var o=f.extend({},e);return f.each(["color","colorAlpha","colorSaturation"],function(a){var r=t.get(a,!0);null==r&&i&&(r=i[a]),null==r&&(r=e[a]),null==r&&(r=n.get(a)),null!=r&&(o[a]=r)}),o}function a(t){var e=s(t,"color");if(e){var i=s(t,"colorAlpha"),n=s(t,"colorSaturation");return n&&(e=d.modifyHSL(e,null,null,n)),i&&(e=d.modifyAlpha(e,i)),e}}function r(t,e){return null!=e?d.modifyHSL(e,null,null,t):null}function s(t,e){var i=t[e];if(null!=i&&"none"!==i)return i}function l(t,e,i,n,o,a){if(a&&a.length){var r=u(e,"color")||null!=o.color&&"none"!==o.color&&(u(e,"colorAlpha")||u(e,"colorSaturation"));if(r){var s=e.get("visualMin"),l=e.get("visualMax"),c=i.dataExtent.slice();null!=s&&s<c[0]&&(c[0]=s),null!=l&&l>c[1]&&(c[1]=l);var d=e.get("colorMappingBy"),f={type:r.name,dataExtent:c,visual:r.range};"color"!==f.type||"index"!==d&&"id"!==d?f.mappingMethod="linear":(f.mappingMethod="category",f.loop=!0);var p=new h(f);return p.__drColorMappingBy=d,p}}}function u(t,e){var i=t.get(e);return p(i)&&i.length?{name:e,range:i}:null}function c(t,e,i,n,o,a){var r=f.extend({},e);if(o){var s=o.type,l="color"===s&&o.__drColorMappingBy,u="index"===l?n:"id"===l?a.mapIdToIndex(i.getId()):i.getValue(t.get("visualDimension"));r[s]=o.mapValueToVisual(u)}return r}var h=i(82),d=i(22),f=i(1),p=f.isArray,g="itemStyle.normal";t.exports=function(t,e,i){var o={mainType:"series",subType:"treemap",query:i};t.eachComponent(o,function(t){var e=t.getData().tree,i=e.root,o=t.getModel(g);if(!i.isRemoved()){var a=f.map(e.levelModels,function(t){return t?t.get(g):null});n(i,{},a,o,t.getViewRoot().getAncestors(),t)}})}},function(t,e,i){"use strict";i(236),i(353)},function(t,e,i){"use strict";function n(t,e,i,n){var o=t.coordToPoint([e,n]),a=t.coordToPoint([i,n]);return{x1:o[0],y1:o[1],x2:a[0],y2:a[1]}}var o=i(1),a=i(3),r=i(10),s=["axisLine","axisLabel","axisTick","splitLine","splitArea"];i(41).extend({type:"angleAxis",axisPointerClass:"PolarAxisPointer",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=t.axis,n=i.polar,a=n.getRadiusAxis().getExtent(),r=i.getTicksCoords();"category"!==i.type&&r.pop(),o.each(s,function(e){!t.get(e+".show")||i.scale.isBlank()&&"axisLine"!==e||this["_"+e](t,n,r,a)},this)}},_axisLine:function(t,e,i,n){var o=t.getModel("axisLine.lineStyle"),r=new a.Circle({shape:{cx:e.cx,cy:e.cy,r:n[1]},style:o.getLineStyle(),z2:1,silent:!0});r.style.fill=null,this.group.add(r)},_axisTick:function(t,e,i,r){var s=t.getModel("axisTick"),l=(s.get("inside")?-1:1)*s.get("length"),u=o.map(i,function(t){return new a.Line({shape:n(e,r[1],r[1]+l,t)})});this.group.add(a.mergePath(u,{style:o.defaults(s.getModel("lineStyle").getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")})}))},_axisLabel:function(t,e,i,n){for(var o=t.axis,s=t.get("data"),l=t.getModel("axisLabel"),u=l.getModel("textStyle"),c=t.getFormattedLabels(),h=l.get("margin"),d=o.getLabelsCoords(),f=0;f<i.length;f++){var p=n[1],g=e.coordToPoint([p+h,d[f]]),m=e.cx,v=e.cy,y=Math.abs(g[0]-m)/p<.3?"center":g[0]>m?"left":"right",x=Math.abs(g[1]-v)/p<.3?"middle":g[1]>v?"top":"bottom",_=u;s&&s[f]&&s[f].textStyle&&(_=new r(s[f].textStyle,u)),this.group.add(new a.Text({style:{x:g[0],y:g[1],fill:_.getTextColor()||t.get("axisLine.lineStyle.color"),text:c[f],textAlign:y,textVerticalAlign:x,textFont:_.getFont()},silent:!0}))}},_splitLine:function(t,e,i,r){var s=t.getModel("splitLine"),l=s.getModel("lineStyle"),u=l.get("color"),c=0;u=u instanceof Array?u:[u];for(var h=[],d=0;d<i.length;d++){var f=c++%u.length;h[f]=h[f]||[],h[f].push(new a.Line({shape:n(e,r[0],r[1],i[d])}))}for(var d=0;d<h.length;d++)this.group.add(a.mergePath(h[d],{style:o.defaults({stroke:u[d%u.length]},l.getLineStyle()),silent:!0,z:t.get("z")}))},_splitArea:function(t,e,i,n){var r=t.getModel("splitArea"),s=r.getModel("areaStyle"),l=s.get("color"),u=0;l=l instanceof Array?l:[l];for(var c=[],h=Math.PI/180,d=-i[0]*h,f=Math.min(n[0],n[1]),p=Math.max(n[0],n[1]),g=t.get("clockwise"),m=1;m<i.length;m++){var v=u++%l.length;c[v]=c[v]||[],c[v].push(new a.Sector({shape:{cx:e.cx,cy:e.cy,r0:f,r:p,startAngle:d,endAngle:-i[m]*h,clockwise:g},silent:!0})),d=-i[m]*h}for(var m=0;m<c.length;m++)this.group.add(a.mergePath(c[m],{style:o.defaults({fill:l[m%l.length]},s.getAreaStyle()),silent:!0}))}})},function(t,e,i){function n(t,e,i){return i&&"axisAreaSelect"===i.type&&e.findComponents({mainType:"parallelAxis",query:i})[0]===t}function o(t){var e=t.axis;return r.map(t.activeIntervals,function(t){return{brushType:"lineX",panelId:"pl",range:[e.dataToCoord(t[0],!0),e.dataToCoord(t[1],!0)]}})}function a(t,e){return e.getComponent("parallel",t.get("parallelIndex"))}var r=i(1),s=i(40),l=i(126),u=i(185),c=i(3),h=["axisLine","axisLabel","axisTick","axisName"],d=i(2).extendComponentView({type:"parallelAxis",init:function(t,e){d.superApply(this,"init",arguments),(this._brushController=new l(e.getZr())).on("brush",r.bind(this._onBrush,this))},render:function(t,e,i,o){if(!n(t,e,o)){this.axisModel=t,this.api=i,this.group.removeAll();var l=this._axisGroup;if(this._axisGroup=new c.Group,this.group.add(this._axisGroup),t.get("show")){var u=a(t,e),d=u.coordinateSystem,f=t.getAreaSelectStyle(),p=f.width,g=t.axis.dim,m=d.getAxisLayout(g),v=r.extend({strokeContainThreshold:p},m),y=new s(t,v);r.each(h,y.add,y),this._axisGroup.add(y.getGroup()),this._refreshBrushController(v,f,t,u,p,i);var x=o&&o.animation===!1?null:t;c.groupTransition(l,this._axisGroup,x)}}},updateVisual:function(t,e,i,n){this._brushController&&this._brushController.updateCovers(o(t))},_refreshBrushController:function(t,e,i,n,a,r){var s=i.axis.getExtent(),l=s[1]-s[0],h=Math.min(30,.1*Math.abs(l)),d=c.BoundingRect.create({x:s[0],y:-a/2,width:l,height:a});d.x-=h,d.width+=2*h,this._brushController.mount({enableGlobalPan:!0,rotation:t.rotation,position:t.position}).setPanels([{panelId:"pl",clipPath:u.makeRectPanelClipPath(d),isTargetByCursor:u.makeRectIsTargetByCursor(d,r,n),getLinearBrushOtherExtent:u.makeLinearBrushOtherExtent(d,0)}]).enableBrush({brushType:"lineX",brushStyle:e,removeOnClick:!0}).updateCovers(o(i))},_onBrush:function(t,e){var i=this.axisModel,n=i.axis,o=r.map(t,function(t){return[n.coordToData(t.range[0],!0),n.coordToData(t.range[1],!0)]});(!i.option.realtime===e.isEnd||e.removeOnClick)&&this.api.dispatchAction({type:"axisAreaSelect",parallelAxisId:i.id,intervals:o})},dispose:function(){this._brushController.dispose()}});t.exports=d},function(t,e,i){"use strict";function n(t,e,i){return{position:[t.cx,t.cy],rotation:i/180*Math.PI,labelDirection:-1,tickDirection:-1,nameDirection:1,labelRotate:e.getModel("axisLabel").get("rotate"),z2:1}}var o=i(1),a=i(3),r=i(40),s=["axisLine","axisLabel","axisTick","axisName"],l=["splitLine","splitArea"];i(41).extend({type:"radiusAxis",axisPointerClass:"PolarAxisPointer",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=t.axis,a=i.polar,u=a.getAngleAxis(),c=i.getTicksCoords(),h=u.getExtent()[0],d=i.getExtent(),f=n(a,t,h),p=new r(t,f);o.each(s,p.add,p),this.group.add(p.getGroup()),o.each(l,function(e){t.get(e+".show")&&!i.scale.isBlank()&&this["_"+e](t,a,h,d,c)},this)}},_splitLine:function(t,e,i,n,r){var s=t.getModel("splitLine"),l=s.getModel("lineStyle"),u=l.get("color"),c=0;u=u instanceof Array?u:[u];for(var h=[],d=0;d<r.length;d++){var f=c++%u.length;h[f]=h[f]||[],h[f].push(new a.Circle({shape:{cx:e.cx,cy:e.cy,r:r[d]},silent:!0}))}for(var d=0;d<h.length;d++)this.group.add(a.mergePath(h[d],{style:o.defaults({stroke:u[d%u.length],fill:null},l.getLineStyle()),silent:!0}))},_splitArea:function(t,e,i,n,r){var s=t.getModel("splitArea"),l=s.getModel("areaStyle"),u=l.get("color"),c=0;u=u instanceof Array?u:[u];for(var h=[],d=r[0],f=1;f<r.length;f++){var p=c++%u.length;h[p]=h[p]||[],h[p].push(new a.Sector({shape:{cx:e.cx,cy:e.cy,r0:d,r:r[f],startAngle:0,endAngle:2*Math.PI},silent:!0})),d=r[f]}for(var f=0;f<h.length;f++)this.group.add(a.mergePath(h[f],{style:o.defaults({fill:u[f%u.length]},l.getAreaStyle()),silent:!0}))}})},function(t,e,i){var n=i(40),o=i(1),a=i(3),r=i(248),s=n.getInterval,l=n.ifIgnoreOnTick,u=["axisLine","axisLabel","axisTick","axisName"],c="splitLine",h=i(41).extend({type:"singleAxis",axisPointerClass:"SingleAxisPointer",render:function(t,e,i,a){var s=this.group;s.removeAll();var l=r.layout(t),d=new n(t,l);o.each(u,d.add,d),s.add(d.getGroup()),t.get(c+".show")&&this["_"+c](t,l.labelInterval),h.superCall(this,"render",t,e,i,a)},_splitLine:function(t,e){var i=t.axis;if(!i.scale.isBlank()){var n=t.getModel("splitLine"),o=n.getModel("lineStyle"),r=o.get("width"),u=o.get("color"),c=s(n,e);u=u instanceof Array?u:[u];for(var h=t.coordinateSystem.getRect(),d=i.isHorizontal(),f=[],p=0,g=i.getTicksCoords(),m=[],v=[],y=0;y<g.length;++y)if(!l(i,y,c)){var x=i.toGlobalCoord(g[y]);d?(m[0]=x,m[1]=h.y,v[0]=x,v[1]=h.y+h.height):(m[0]=h.x,m[1]=x,v[0]=h.x+h.width,v[1]=x);var _=p++%u.length;f[_]=f[_]||[],f[_].push(new a.Line(a.subPixelOptimizeLine({shape:{x1:m[0],y1:m[1],x2:v[0],y2:v[1]},style:{lineWidth:r},silent:!0})))}for(var y=0;y<f.length;++y)this.group.add(a.mergePath(f[y],{style:{stroke:u[y%u.length],lineDash:o.getLineDash(r),lineWidth:r},silent:!0}))}}});t.exports=h},function(t,e,i){var n=i(2),o={type:"axisAreaSelect",event:"axisAreaSelected",update:"updateVisual"};n.registerAction(o,function(t,e){e.eachComponent({mainType:"parallelAxis",query:t},function(e){e.axis.model.setActiveIntervals(t.intervals)})}),n.registerAction("parallelAxisExpand",function(t,e){e.eachComponent({mainType:"parallel",query:t},function(e){e.setAxisExpand(t)})})},function(t,e,i){"use strict";function n(t,e,i,n,o){var a=e.axis,s=a.dataToCoord(t),c=n.getAngleAxis().getExtent()[0];c=c/180*Math.PI;var h,d,f,p=n.getRadiusAxis().getExtent();if("radius"===a.dim){var g=l.create();l.rotate(g,g,c),l.translate(g,g,[n.cx,n.cy]),h=r.applyTransform([s,-o],g);var m=e.getModel("axisLabel").get("rotate")||0,v=u.innerTextLayout(c,m*Math.PI/180,-1);d=v.textAlign,f=v.textVerticalAlign}else{var y=p[1];h=n.coordToPoint([y+o,s]);var x=n.cx,_=n.cy;d=Math.abs(h[0]-x)/y<.3?"center":h[0]>x?"left":"right",f=Math.abs(h[1]-_)/y<.3?"middle":h[1]>_?"top":"bottom"}return{position:h,align:d,verticalAlign:f}}var o=i(7),a=i(118),r=i(3),s=i(75),l=i(19),u=i(40),c=i(41),h=a.extend({makeElOption:function(t,e,i,a,r){var l=i.axis;"angle"===l.dim&&(this.animationThreshold=Math.PI/18);var u,c=l.polar,h=c.getOtherAxis(l),f=h.getExtent();u=l["dataTo"+o.capitalFirst(l.dim)](e);var p=a.get("type");if(p&&"none"!==p){var g=s.buildElStyle(a),m=d[p](l,c,u,f,g);m.style=g,t.graphicKey=m.type,t.pointer=m}var v=a.get("label.margin"),y=n(e,i,a,c,v);s.buildLabelElOption(t,i,a,r,y)}}),d={line:function(t,e,i,n,o){return"angle"===t.dim?{type:"Line",shape:s.makeLineShape(e.coordToPoint([n[0],i]),e.coordToPoint([n[1],i]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:i}}},shadow:function(t,e,i,n,o){var a=t.getBandWidth(),r=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:s.makeSectorShape(e.cx,e.cy,n[0],n[1],(-i-a/2)*r,(-i+a/2)*r)}:{type:"Sector",shape:s.makeSectorShape(e.cx,e.cy,i-a/2,i+a/2,0,2*Math.PI)}}};c.registerAxisPointerClass("PolarAxisPointer",h),t.exports=h},function(t,e,i){"use strict";function n(t){return t.isHorizontal()?0:1}function o(t,e){var i=t.getRect();return[i[c[e]],i[c[e]]+i[h[e]]]}var a=i(3),r=i(118),s=i(75),l=i(248),u=i(41),c=["x","y"],h=["width","height"],d=r.extend({makeElOption:function(t,e,i,a,r){var u=i.axis,c=u.coordinateSystem,h=o(c,1-n(u)),d=c.dataToPoint(e)[0],p=a.get("type");if(p&&"none"!==p){var g=s.buildElStyle(a),m=f[p](u,d,h,g);m.style=g,t.graphicKey=m.type,t.pointer=m}var v=l.layout(i);s.buildCartesianSingleLabelElOption(e,t,v,i,a,r)},getHandleTransform:function(t,e,i){var n=l.layout(e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:s.getTransformedPosition(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,a){var r=i.axis,s=r.coordinateSystem,l=n(r),u=o(s,l),c=t.position;c[l]+=e[l],c[l]=Math.min(u[1],c[l]),c[l]=Math.max(u[0],c[l]);var h=o(s,1-l),d=(h[1]+h[0])/2,f=[d,d];return f[l]=c[l],{position:c,rotation:t.rotation,cursorPoint:f,tooltipOption:{verticalAlign:"middle"}}}}),f={line:function(t,e,i,o){var r=s.makeLineShape([e,i[0]],[e,i[1]],n(t));return a.subPixelOptimizeLine({shape:r,style:o}),{type:"Line",shape:r}},shadow:function(t,e,i,o){var a=t.getBandWidth(),r=i[1]-i[0];return{type:"Rect",shape:s.makeRectShape([e-a/2,i[0]],[a,r],n(t))}}};u.registerAxisPointerClass("SingleAxisPointer",d),t.exports=d},function(t,e,i){i(2).registerPreprocessor(i(364)),i(366),i(361),i(362),i(363),i(385)},function(t,e,i){function n(t,e){return a.merge({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new s(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var o=i(2),a=i(1),r=i(187),s=i(10),l=["#ddd"],u=o.extendComponentModel({type:"brush",dependencies:["geo","grid","xAxis","yAxis","parallel","series"],defaultOption:{toolbox:null,brushLink:null,seriesIndex:"all",geoIndex:null,xAxisIndex:null,yAxisIndex:null,brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(120,140,180,0.3)",borderColor:"rgba(120,140,180,0.8)"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},areas:[],brushType:null,brushOption:{},coordInfoList:[],optionUpdated:function(t,e){var i=this.option;!e&&r.replaceVisualOption(i,t,["inBrush","outOfBrush"]),i.inBrush=i.inBrush||{},i.outOfBrush=i.outOfBrush||{color:l}},setAreas:function(t){t&&(this.areas=a.map(t,function(t){return n(this.option,t)},this))},setBrushOption:function(t){this.brushOption=n(this.option,t),this.brushType=this.brushOption.brushType}});t.exports=u},function(t,e,i){function n(t,e,i,n){(!n||n.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(i)).enableBrush(t.brushOption).updateCovers(t.areas.slice())}var o=i(1),a=i(126),r=i(2);t.exports=r.extendComponentView({type:"brush",init:function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new a(e.getZr())).on("brush",o.bind(this._onBrush,this)).mount()},render:function(t){return this.model=t,n.apply(this,arguments)},updateView:n,updateLayout:n,updateVisual:n,dispose:function(){this._brushController.dispose()},_onBrush:function(t,e){var i=this.model.id;this.model.brushTargetManager.setOutputRanges(t,this.ecModel),(!e.isEnd||e.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:i,areas:o.clone(t),$from:i})}})},function(t,e,i){var n=i(2);n.registerAction({type:"brush",event:"brush",update:"updateView"},function(t,e){e.eachComponent({mainType:"brush",query:t},function(e){e.setAreas(t.areas)})}),n.registerAction({type:"brushSelect",event:"brushSelected",update:"none"},function(){})},function(t,e,i){function n(t){var e={};o.each(t,function(t){e[t]=1}),t.length=0,o.each(e,function(e,i){t.push(i)})}var o=i(1),a=["rect","polygon","keep","clear"];t.exports=function(t,e){var i=t&&t.brush;if(o.isArray(i)||(i=i?[i]:[]),i.length){var r=[];o.each(i,function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(r=r.concat(e))});var s=t&&t.toolbox;o.isArray(s)&&(s=s[0]),s||(s={feature:{}},t.toolbox=[s]);var l=s.feature||(s.feature={}),u=l.brush||(l.brush={}),c=u.type||(u.type=[]);c.push.apply(c,r),n(c),e&&!c.length&&c.push.apply(c,a)}}},function(t,e,i){function n(t){var e=["x","y"],i=["width","height"];return{point:function(e,i,n){var a=n.range,r=e[t];return o(r,a)},rect:function(n,a,r){var s=r.range,l=[n[e[t]],n[e[t]]+n[i[t]]];return l[1]<l[0]&&l.reverse(),o(l[0],s)||o(l[1],s)||o(s[0],l)||o(s[1],l)}}}function o(t,e){return e[0]<=t&&t<=e[1]}function a(t,e,i,n,o){for(var a=0,s=o[o.length-1];a<o.length;a++){var l=o[a];if(r(t,e,i,n,l[0],l[1],s[0],s[1]))return!0;s=l}}function r(t,e,i,n,o,a,r,u){var c=l(i-t,o-r,n-e,a-u);if(s(c))return!1;var h=l(o-t,o-r,a-e,a-u)/c;if(h<0||h>1)return!1;var d=l(i-t,o-t,n-e,a-e)/c;return!(d<0||d>1)}function s(t){return t<=1e-6&&t>=-1e-6}function l(t,e,i,n){return t*n-e*i}var u=i(267).contain,c=i(11),h={lineX:n(0),lineY:n(1),rect:{point:function(t,e,i){return i.boundingRect.contain(t[0],t[1])},rect:function(t,e,i){return i.boundingRect.intersect(t)}},polygon:{point:function(t,e,i){return i.boundingRect.contain(t[0],t[1])&&u(i.range,t[0],t[1])},rect:function(t,e,i){var n=i.range;if(n.length<=1)return!1;var o=t.x,r=t.y,s=t.width,l=t.height,h=n[0];return!!(u(n,o,r)||u(n,o+s,r)||u(n,o,r+l)||u(n,o+s,r+l)||c.create(t).contain(h[0],h[1])||a(o,r,o+s,r,n)||a(o,r,o,r+l,n)||a(o+s,r,o+s,r+l,n)||a(o,r+l,o+s,r+l,n))||void 0}}};t.exports=h},function(t,e,i){function n(t,e,i,n,a){if(a){var r=t.getZr();if(!r[x]){r[y]||(r[y]=o);var s=g.createOrUpdate(r,y,i,e);s(t,n)}}}function o(t,e){if(!t.isDisposed()){var i=t.getZr();i[x]=!0,t.dispatchAction({type:"brushSelect",batch:e}),i[x]=!1}}function a(t,e,i,n){for(var o=0,a=e.length;o<a;o++){var r=e[o];if(t[r.brushType](n,i,r.selectors,r))return!0}}function r(t){var e=t.brushSelector;if(d.isString(e)){var i=[];return d.each(p,function(t,n){i[n]=function(i,n,o,a){var r=n.getItemLayout(i);return t[e](r,o,a)}}),i}if(d.isFunction(e)){var n={};return d.each(p,function(t,i){n[i]=e}),n}return e}function s(t,e){var i=t.option.seriesIndex;return null!=i&&"all"!==i&&(d.isArray(i)?d.indexOf(i,e)<0:e!==i)}function l(t){var e=t.selectors={};return d.each(p[t.brushType],function(i,n){e[n]=function(n){return i(n,e,t)}}),t}function u(t){return new f(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var c=i(2),h=i(187),d=i(1),f=i(11),p=i(365),g=i(37),m=i(184),v=["inBrush","outOfBrush"],y="__ecBrushSelect",x="__ecInBrushSelectEvent",_=c.PRIORITY.VISUAL.BRUSH;c.registerLayout(_,function(t,e,i){t.eachComponent({mainType:"brush"},function(e){i&&"takeGlobalCursor"===i.type&&e.setBrushOption("brush"===i.key?i.brushOption:{brushType:!1});var n=e.brushTargetManager=new m(e.option,t);n.setInputRanges(e.areas,t)})}),c.registerVisual(_,function(t,e,i){var o,u,c=[];t.eachComponent({mainType:"brush"},function(e,i){function n(t){return"all"===x||_[t]}function f(t){return!!t.length}function p(t,e){var i=t.coordinateSystem;M|=i.hasAxisBrushed(),n(e)&&i.eachActiveState(t.getData(),function(t,e){"active"===t&&(w[e]=1)})}function g(i,o,l){var u=r(i);if(u&&!s(e,o)&&(d.each(I,function(n){u[n.brushType]&&e.brushTargetManager.controlSeries(n,i,t)&&l.push(n),M|=f(l)}),n(o)&&f(l))){var c=i.getData();c.each(function(t){a(u,l,c,t)&&(w[t]=1)})}}var m={brushId:e.id,brushIndex:i,brushName:e.name,areas:d.clone(e.areas),selected:[]};c.push(m);var y=e.option,x=y.brushLink,_=[],w=[],S=[],M=0;i||(o=y.throttleType,u=y.throttleDelay);var I=d.map(e.areas,function(t){return l(d.defaults({boundingRect:b[t.brushType](t)},t))}),T=h.createVisualMappings(e.option,v,function(t){t.mappingMethod="fixed"});d.isArray(x)&&d.each(x,function(t){_[t]=1}),t.eachSeries(function(t,e){var i=S[e]=[];"parallel"===t.subType?p(t,e,i):g(t,e,i)}),t.eachSeries(function(t,e){var i={seriesId:t.id,seriesIndex:e,seriesName:t.name,dataIndex:[]};m.selected.push(i);var o=r(t),s=S[e],l=t.getData(),u=n(e)?function(t){return w[t]?(i.dataIndex.push(l.getRawIndex(t)),"inBrush"):"outOfBrush"}:function(t){return a(o,s,l,t)?(i.dataIndex.push(l.getRawIndex(t)),"inBrush"):"outOfBrush"};(n(e)?M:f(s))&&h.applyVisual(v,T,l,u)})}),n(e,o,u,c,i)});var b={lineX:d.noop,lineY:d.noop,rect:function(t){return u(t.range)},polygon:function(t){for(var e,i=t.range,n=0,o=i.length;n<o;n++){e=e||[[1/0,-(1/0)],[1/0,-(1/0)]];var a=i[n];a[0]<e[0][0]&&(e[0][0]=a[0]),a[0]>e[0][1]&&(e[0][1]=a[0]),a[1]<e[1][0]&&(e[1][0]=a[1]),a[1]>e[1][1]&&(e[1][1]=a[1])}return e&&u(e)}}},function(t,e,i){"use strict";i(393),i(394),i(368)},function(t,e,i){"use strict";var n=i(1),o=i(3),a=i(7),r=i(4),s={EN:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],CN:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},l={EN:["S","M","T","W","T","F","S"],CN:["日","一","二","三","四","五","六"]};t.exports=i(2).extendComponentView({type:"calendar",_tlpoints:null,_blpoints:null,_firstDayOfMonth:null,_firstDayPoints:null,render:function(t,e,i){var n=this.group;n.removeAll();var o=t.coordinateSystem,a=o.getHandledRangeInfo(),r=o.getOrient();this._renderDayRect(t,a,n),this._renderLines(t,a,r,n),this._renderYearText(t,a,r,n),this._renderMonthText(t,r,n),this._renderWeekText(t,a,r,n)},_renderDayRect:function(t,e,i){for(var n=t.coordinateSystem,a=t.getModel("itemStyle.normal").getItemStyle(),r=n.getCellWidth(),s=n.getCellHeight(),l=e.start.time;l<=e.end.time;l=n.getNextNDay(l,1).time){var u=n.dataToRect([l],!0).tl,c=new o.Rect({shape:{x:u[0],y:u[1],width:r,height:s},style:a});i.add(c)}},_renderLines:function(t,e,i,n){function o(e){a._firstDayOfMonth.push(r.getDateInfo(e)),a._firstDayPoints.push(r.dataToRect([e],!0).tl);var o=a._getLinePointsOfOneWeek(t,e,i);a._tlpoints.push(o[0]),a._blpoints.push(o[o.length-1]),l&&a._drawSplitline(o,s,n)}var a=this,r=t.coordinateSystem,s=t.getModel("splitLine.lineStyle").getLineStyle(),l=t.get("splitLine.show"),u=s.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var c=e.start,h=0;c.time<=e.end.time;h++){o(c.formatedDate),0===h&&(c=r.getDateInfo(e.start.y+"-"+e.start.m));var d=c.date;d.setMonth(d.getMonth()+1),c=r.getDateInfo(d)}o(r.getNextNDay(e.end.time,1).formatedDate),l&&this._drawSplitline(a._getEdgesPoints(a._tlpoints,u,i),s,n),l&&this._drawSplitline(a._getEdgesPoints(a._blpoints,u,i),s,n)},_getEdgesPoints:function(t,e,i){var n=[t[0].slice(),t[t.length-1].slice()],o="horizontal"===i?0:1;return n[0][o]=n[0][o]-e/2,n[1][o]=n[1][o]+e/2,n},_drawSplitline:function(t,e,i){var n=new o.Polyline({z2:20,shape:{points:t},style:e});i.add(n)},_getLinePointsOfOneWeek:function(t,e,i){var n=t.coordinateSystem;e=n.getDateInfo(e);for(var o=[],a=0;a<7;a++){var r=n.getNextNDay(e.time,a),s=n.dataToRect([r.time],!0);o[2*r.day]=s.tl,o[2*r.day+1]=s["horizontal"===i?"bl":"tr"]}return o},_formatterLabel:function(t,e){return"string"==typeof t&&t?a.formatTplSimple(t,e):"function"==typeof t?t(e):e.nameMap},_yearTextPositionControl:function(t,e,i,n){t=t.slice();var o=["center","bottom"];"top"===i&&(t[1]-=n),"bottom"===i&&(t[1]+=n,o=["center","top"]),"left"===i&&(t[0]-=n),"right"===i&&(t[0]+=n,o=["center","top"]);var a=0;return"left"!==i&&"right"!==i||(a=Math.PI/2),{rotation:a,origin:t,style:{x:t[0],y:t[1],textAlign:o[0],textVerticalAlign:o[1]}}},_renderYearText:function(t,e,i,a){var r=t.getModel("yearLabel");if(r.get("show")){var s=t.getModel("yearLabel.textStyle"),l=r.get("margin"),u=r.get("position");u||(u="horizontal"!==i?"top":"left");var c=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],h=(c[0][0]+c[1][0])/2,d=(c[0][1]+c[1][1])/2,f="horizontal"===i?0:1,p={top:[h,c[f][1]],bottom:[h,c[1-f][1]],left:[c[1-f][0],d],right:[c[f][0],d]},g=e.start.y;+e.end.y>+e.start.y&&(g=g+"-"+e.end.y);var m=r.get("formatter"),v={start:e.start.y,end:e.end.y,nameMap:g},y=this._formatterLabel(m,v),x=new o.Text(n.merge({z2:30,style:{text:y,font:s.getFont(),fill:s.getTextColor()}},this._yearTextPositionControl(p[u],i,u,l)));a.add(x)}},_monthTextPositionControl:function(t,e,i,n,o){var a="left",r="top",s=t[0],l=t[1];return"horizontal"===i?(l+=o,e&&(a="center"),"start"===n&&(r="bottom")):(s+=o,e&&(r="middle"),"start"===n&&(a="right")),{x:s,y:l,textAlign:a,textVerticalAlign:r}},_renderMonthText:function(t,e,i){var a=t.getModel("monthLabel");if(a.get("show")){var r=t.getModel("monthLabel.textStyle"),l=a.get("nameMap"),u=a.get("margin"),c=a.get("position"),h=a.get("align"),d=[this._tlpoints,this._blpoints];n.isString(l)&&(l=s[l.toUpperCase()]||[]);var f="start"===c?0:1,p="horizontal"===e?0:1;u="start"===c?-u:u;for(var g="center"===h,m=0;m<d[f].length-1;m++){var v=d[f][m].slice(),y=this._firstDayOfMonth[m];if(g){var x=this._firstDayPoints[m];v[p]=(x[p]+d[0][m+1][p])/2}var _=a.get("formatter"),b=l[+y.m-1],w={yyyy:y.y,yy:(y.y+"").slice(2),MM:y.m,M:+y.m,nameMap:b},S=this._formatterLabel(_,w),M=new o.Text({z2:30,style:n.extend({text:S,font:r.getFont(),fill:r.getTextColor()},this._monthTextPositionControl(v,g,e,c,u))});i.add(M)}}},_weekTextPositionControl:function(t,e,i,n,o){var a="center",r="middle",s=t[0],l=t[1],u="start"===i;return"horizontal"===e?(s=s+n+(u?1:-1)*o[0]/2,a=u?"right":"left"):(l=l+n+(u?1:-1)*o[1]/2,r=u?"bottom":"top"),{x:s,y:l,textAlign:a,textVerticalAlign:r}},_renderWeekText:function(t,e,i,a){var s=t.getModel("dayLabel");if(s.get("show")){var u=t.coordinateSystem,c=t.getModel("dayLabel.textStyle"),h=s.get("position"),d=s.get("nameMap"),f=s.get("margin"),p=u.getFirstDayOfWeek();n.isString(d)&&(d=l[d.toUpperCase()]||[]);var g=u.getNextNDay(e.end.time,7-e.lweek).time,m=[u.getCellWidth(),u.getCellHeight()];f=r.parsePercent(f,m["horizontal"===i?0:1]),"start"===h&&(g=u.getNextNDay(e.start.time,-(7+e.fweek)).time,f=-f);for(var v=0;v<7;v++){var y=u.getNextNDay(g,v),x=u.dataToRect([y.time],!0).center,_=v;_=Math.abs((v+p)%7);var b=new o.Text({z2:30,style:n.extend({text:d[_],font:c.getFont(),fill:c.getTextColor()},this._weekTextPositionControl(x,i,h,f,m))});a.add(b)}}}})},function(t,e,i){function n(t,e){e.update="updateView",o.registerAction(e,function(e,i){var n={};return i.eachComponent({mainType:"geo",query:e},function(i){i[t](e.name);var o=i.coordinateSystem;a.each(o.regions,function(t){n[t.name]=i.isSelected(t.name)||!1})}),{selected:n,name:e.name}})}i(396),i(186),i(370),i(240);var o=i(2),a=i(1);n("toggleSelected",{type:"geoToggleSelect",event:"geoselectchanged"}),n("select",{type:"geoSelect",event:"geoselected"}),n("unSelect",{type:"geoUnSelect",event:"geounselected"})},function(t,e,i){"use strict";var n=i(249);t.exports=i(2).extendComponentView({type:"geo",init:function(t,e){var i=new n(e,(!0));this._mapDraw=i,this.group.add(i.group)},render:function(t,e,i,n){if(!n||"geoToggleSelect"!==n.type||n.from!==this.uid){var o=this._mapDraw;t.get("show")?o.draw(t,e,i,this,n):this._mapDraw.group.removeAll(),this.group.silent=t.get("silent")}},dispose:function(){this._mapDraw&&this._mapDraw.remove()}})},function(t,e,i){i(263),i(357),i(354)},function(t,e,i){"use strict";i(236),i(352),i(375),i(55),i(358),i(2).extendComponentView({type:"polar"})},function(t,e,i){i(411),i(412),i(374)},function(t,e,i){var n=i(40),o=i(1),a=i(3),r=["axisLine","axisLabel","axisTick","axisName"];t.exports=i(2).extendComponentView({type:"radar",render:function(t,e,i){var n=this.group;n.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},_buildAxes:function(t){var e=t.coordinateSystem,i=e.getIndicatorAxes(),a=o.map(i,function(t){var i=new n(t.model,{position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1});return i});o.each(a,function(t){o.each(r,t.add,t),this.group.add(t.getGroup())},this)},_buildSplitLineAndArea:function(t){function e(t,e,i){var n=i%e.length;return t[n]=t[n]||[],n}var i=t.coordinateSystem,n=i.getIndicatorAxes();if(n.length){var r=t.get("shape"),s=t.getModel("splitLine"),l=t.getModel("splitArea"),u=s.getModel("lineStyle"),c=l.getModel("areaStyle"),h=s.get("show"),d=l.get("show"),f=u.get("color"),p=c.get("color");f=o.isArray(f)?f:[f],p=o.isArray(p)?p:[p];var g=[],m=[];if("circle"===r)for(var v=n[0].getTicksCoords(),y=i.cx,x=i.cy,_=0;_<v.length;_++){if(h){var b=e(g,f,_);g[b].push(new a.Circle({shape:{cx:y,cy:x,r:v[_]}}))}if(d&&_<v.length-1){var b=e(m,p,_);m[b].push(new a.Ring({shape:{cx:y,cy:x,r0:v[_],r:v[_+1]}}))}}else for(var w=-1,S=o.map(n,function(t,e){var n=t.getTicksCoords();return w=Math.max(n.length-1,w),o.map(n,function(t){return i.coordToPoint(t,e)})}),M=[],_=0;_<=w;_++){for(var I=[],T=0;T<n.length;T++)I.push(S[T][_]);if(I[0]&&I.push(I[0].slice()),h){var b=e(g,f,_);g[b].push(new a.Polyline({shape:{points:I}}))}if(d&&M){var b=e(m,p,_-1);m[b].push(new a.Polygon({shape:{points:I.concat(M)}}))}M=I.slice().reverse()}var A=u.getLineStyle(),C=c.getAreaStyle();o.each(m,function(t,e){this.group.add(a.mergePath(t,{style:o.defaults({stroke:"none",fill:p[e%p.length]},C),silent:!0}))},this),o.each(g,function(t,e){this.group.add(a.mergePath(t,{style:o.defaults({fill:"none",stroke:f[e%f.length]},A),silent:!0}))},this)}}})},function(t,e,i){i(236),i(355)},function(t,e,i){var n=i(2);n.registerPreprocessor(i(382)),i(384),i(383),i(377),i(378)},function(t,e,i){var n=i(380),o=i(1),a=i(6),r=n.extend({type:"timeline.slider",defaultOption:{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"emptyCircle",symbolSize:10,lineStyle:{show:!0,width:2,color:"#304654"},label:{position:"auto",normal:{show:!0,interval:"auto",rotate:0,textStyle:{color:"#304654"}},emphasis:{show:!0,textStyle:{color:"#c23531"}}},itemStyle:{normal:{color:"#304654",borderWidth:1},emphasis:{color:"#c23531"}},checkpointStyle:{symbol:"circle",symbolSize:13,color:"#c23531",borderWidth:5,borderColor:"rgba(194,53,49, 0.5)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:22,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z",
-prevIcon:"path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z",normal:{color:"#304654",borderColor:"#304654",borderWidth:1},emphasis:{color:"#c23531",borderColor:"#c23531",borderWidth:2}},data:[]}});o.mixin(r,a.dataFormatMixin),t.exports=r},function(t,e,i){function n(t,e){return u.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}function o(t,e,i,n){var o=l.makePath(t.get(e).replace(/^path:\/\//,""),s.clone(n||{}),new p(i[0],i[1],i[2],i[3]),"center");return o}function a(t,e,i,n,o,a){var r=e.get("color");if(o)o.setColor(r),i.add(o),a&&a.onUpdate(o);else{var l=t.get("symbol");o=d.createSymbol(l,-1,-1,2,2,r),o.setStyle("strokeNoScale",!0),i.add(o),a&&a.onCreate(o)}var u=e.getItemStyle(["color","symbol","symbolSize"]);o.setStyle(u),n=s.merge({rectHover:!0,z2:100},n,!0);var c=t.get("symbolSize");c=c instanceof Array?c.slice():[+c,+c],c[0]/=2,c[1]/=2,n.scale=c;var h=t.get("symbolOffset");if(h){var f=n.position=n.position||[0,0];f[0]+=m.parsePercent(h[0],c[0]),f[1]+=m.parsePercent(h[1],c[1])}var p=t.get("symbolRotate");return n.rotation=(p||0)*Math.PI/180||0,o.attr(n),o.updateTransform(),o}function r(t,e,i,n,o){if(!t.dragging){var a=n.getModel("checkpointStyle"),r=i.dataToCoord(n.getData().get(["value"],e));o||!a.get("animation",!0)?t.attr({position:[r,0]}):(t.stopAnimation(!0),t.animateTo({position:[r,0]},a.get("animationDuration",!0),a.get("animationEasing",!0)))}}var s=i(1),l=i(3),u=i(12),c=i(381),h=i(379),d=i(24),f=i(17),p=i(11),g=i(19),m=i(4),v=i(7),y=v.encodeHTML,x=s.bind,_=s.each,b=Math.PI;t.exports=c.extend({type:"timeline.slider",init:function(t,e){this.api=e,this._axis,this._viewRect,this._timer,this._currentPointer,this._mainGroup,this._labelGroup},render:function(t,e,i,n){if(this.model=t,this.api=i,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var o=this._layout(t,i),a=this._createGroup("mainGroup"),r=this._createGroup("labelGroup"),s=this._axis=this._createAxis(o,t);t.formatTooltip=function(t){return y(s.scale.getLabel(t))},_(["AxisLine","AxisTick","Control","CurrentPointer"],function(e){this["_render"+e](o,a,s,t)},this),this._renderAxisLabel(o,r,s,t),this._position(o,t)}this._doPlayStop()},remove:function(){this._clearTimer(),this.group.removeAll()},dispose:function(){this._clearTimer()},_layout:function(t,e){var i=t.get("label.normal.position"),o=t.get("orient"),a=n(t,e);null==i||"auto"===i?i="horizontal"===o?a.y+a.height/2<e.getHeight()/2?"-":"+":a.x+a.width/2<e.getWidth()/2?"+":"-":isNaN(i)&&(i={horizontal:{top:"-",bottom:"+"},vertical:{left:"-",right:"+"}}[o][i]);var r={horizontal:"center",vertical:i>=0||"+"===i?"left":"right"},s={horizontal:i>=0||"+"===i?"top":"bottom",vertical:"middle"},l={horizontal:0,vertical:b/2},u="vertical"===o?a.height:a.width,c=t.getModel("controlStyle"),h=c.get("show"),d=h?c.get("itemSize"):0,f=h?c.get("itemGap"):0,p=d+f,g=t.get("label.normal.rotate")||0;g=g*b/180;var m,v,y,x,_=c.get("position",!0),h=c.get("show",!0),w=h&&c.get("showPlayBtn",!0),S=h&&c.get("showPrevBtn",!0),M=h&&c.get("showNextBtn",!0),I=0,T=u;return"left"===_||"bottom"===_?(w&&(m=[0,0],I+=p),S&&(v=[I,0],I+=p),M&&(y=[T-d,0],T-=p)):(w&&(m=[T-d,0],T-=p),S&&(v=[0,0],I+=p),M&&(y=[T-d,0],T-=p)),x=[I,T],t.get("inverse")&&x.reverse(),{viewRect:a,mainLength:u,orient:o,rotation:l[o],labelRotation:g,labelPosOpt:i,labelAlign:r[o],labelBaseline:s[o],playPosition:m,prevBtnPosition:v,nextBtnPosition:y,axisExtent:x,controlSize:d,controlGap:f}},_position:function(t,e){function i(t){var e=t.position;t.origin=[h[0][0]-e[0],h[1][0]-e[1]]}function n(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function o(t,e,i,n,o){t[n]+=i[n][o]-e[n][o]}var a=this._mainGroup,r=this._labelGroup,s=t.viewRect;if("vertical"===t.orient){var l=g.create(),u=s.x,c=s.y+s.height;g.translate(l,l,[-u,-c]),g.rotate(l,l,-b/2),g.translate(l,l,[u,c]),s=s.clone(),s.applyTransform(l)}var h=n(s),d=n(a.getBoundingRect()),f=n(r.getBoundingRect()),p=a.position,m=r.position;m[0]=p[0]=h[0][0];var v=t.labelPosOpt;if(isNaN(v)){var y="+"===v?0:1;o(p,d,h,1,y),o(m,f,h,1,1-y)}else{var y=v>=0?0:1;o(p,d,h,1,y),m[1]=p[1]+v}a.attr("position",p),r.attr("position",m),a.rotation=r.rotation=t.rotation,i(a),i(r)},_createAxis:function(t,e){var i=e.getData(),n=e.get("axisType"),o=f.createScaleByModel(e,n),a=i.getDataExtent("value");o.setExtent(a[0],a[1]),this._customizeScale(o,i),o.niceTicks();var r=new h("value",o,t.axisExtent,n);return r.model=e,r},_customizeScale:function(t,e){t.getTicks=function(){return e.mapArray(["value"],function(t){return t})},t.getTicksLabels=function(){return s.map(this.getTicks(),t.getLabel,t)}},_createGroup:function(t){var e=this["_"+t]=new l.Group;return this.group.add(e),e},_renderAxisLine:function(t,e,i,n){var o=i.getExtent();n.get("lineStyle.show")&&e.add(new l.Line({shape:{x1:o[0],y1:0,x2:o[1],y2:0},style:s.extend({lineCap:"round"},n.getModel("lineStyle").getLineStyle()),silent:!0,z2:1}))},_renderAxisTick:function(t,e,i,n){var o=n.getData(),r=i.scale.getTicks();_(r,function(t,r){var s=i.dataToCoord(t),u=o.getItemModel(r),c=u.getModel("itemStyle.normal"),h=u.getModel("itemStyle.emphasis"),d={position:[s,0],onclick:x(this._changeTimeline,this,r)},f=a(u,c,e,d);l.setHoverStyle(f,h.getItemStyle()),u.get("tooltip")?(f.dataIndex=r,f.dataModel=n):f.dataIndex=f.dataModel=null},this)},_renderAxisLabel:function(t,e,i,n){var o=n.getModel("label.normal");if(o.get("show")){var a=n.getData(),r=i.scale.getTicks(),s=f.getFormattedLabels(i,o.get("formatter")),u=i.getLabelInterval();_(r,function(n,o){if(!i.isLabelIgnored(o,u)){var r=a.getItemModel(o),c=r.getModel("label.normal.textStyle"),h=r.getModel("label.emphasis.textStyle"),d=i.dataToCoord(n),f=new l.Text({style:{text:s[o],textAlign:t.labelAlign,textVerticalAlign:t.labelBaseline,textFont:c.getFont(),fill:c.getTextColor()},position:[d,0],rotation:t.labelRotation-t.rotation,onclick:x(this._changeTimeline,this,o),silent:!1});e.add(f),l.setHoverStyle(f,h.getItemStyle())}},this)}},_renderControl:function(t,e,i,n){function a(t,i,a,d){if(t){var f={position:t,origin:[r/2,0],rotation:d?-s:0,rectHover:!0,style:u,onclick:a},p=o(n,i,h,f);e.add(p),l.setHoverStyle(p,c)}}var r=t.controlSize,s=t.rotation,u=n.getModel("controlStyle.normal").getItemStyle(),c=n.getModel("controlStyle.emphasis").getItemStyle(),h=[0,-r/2,r,r],d=n.getPlayState(),f=n.get("inverse",!0);a(t.nextBtnPosition,"controlStyle.nextIcon",x(this._changeTimeline,this,f?"-":"+")),a(t.prevBtnPosition,"controlStyle.prevIcon",x(this._changeTimeline,this,f?"+":"-")),a(t.playPosition,"controlStyle."+(d?"stopIcon":"playIcon"),x(this._handlePlayClick,this,!d),!0)},_renderCurrentPointer:function(t,e,i,n){var o=n.getData(),s=n.getCurrentIndex(),l=o.getItemModel(s).getModel("checkpointStyle"),u=this,c={onCreate:function(t){t.draggable=!0,t.drift=x(u._handlePointerDrag,u),t.ondragend=x(u._handlePointerDragend,u),r(t,s,i,n,!0)},onUpdate:function(t){r(t,s,i,n)}};this._currentPointer=a(l,l,this._mainGroup,{},this._currentPointer,c)},_handlePlayClick:function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},_handlePointerDrag:function(t,e,i){this._clearTimer(),this._pointerChangeTimeline([i.offsetX,i.offsetY])},_handlePointerDragend:function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},_pointerChangeTimeline:function(t,e){var i=this._toAxisCoord(t)[0],n=this._axis,o=m.asc(n.getExtent().slice());i>o[1]&&(i=o[1]),i<o[0]&&(i=o[0]),this._currentPointer.position[0]=i,this._currentPointer.dirty();var a=this._findNearestTick(i),r=this.model;(e||a!==r.getCurrentIndex()&&r.get("realtime"))&&this._changeTimeline(a)},_doPlayStop:function(){function t(){var t=this.model;this._changeTimeline(t.getCurrentIndex()+(t.get("rewind",!0)?-1:1))}this._clearTimer(),this.model.getPlayState()&&(this._timer=setTimeout(x(t,this),this.model.get("playInterval")))},_toAxisCoord:function(t){var e=this._mainGroup.getLocalTransform();return l.applyTransform(t,e,!0)},_findNearestTick:function(t){var e,i=this.model.getData(),n=1/0,o=this._axis;return i.each(["value"],function(i,a){var r=o.dataToCoord(i),s=Math.abs(r-t);s<n&&(n=s,e=a)}),e},_clearTimer:function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},_changeTimeline:function(t){var e=this.model.getCurrentIndex();"+"===t?t=e+1:"-"===t&&(t=e-1),this.api.dispatchAction({type:"timelineChange",currentIndex:t,from:this.uid})}})},function(t,e,i){var n=i(1),o=i(33),a=i(17),r=function(t,e,i,n){o.call(this,t,e,i),this.type=n||"value",this._autoLabelInterval,this.model=null};r.prototype={constructor:r,getLabelInterval:function(){var t=this.model,e=t.getModel("label.normal"),i=e.get("interval");if(null!=i&&"auto"!=i)return i;var i=this._autoLabelInterval;return i||(i=this._autoLabelInterval=a.getAxisLabelInterval(n.map(this.scale.getTicks(),this.dataToCoord,this),a.getFormattedLabels(this,e.get("formatter")),e.getModel("textStyle").getFont(),"horizontal"===t.get("orient"))),i},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}}},n.inherits(r,o),t.exports=r},function(t,e,i){var n=i(13),o=i(14),a=i(1),r=i(6),s=n.extend({type:"timeline",layoutMode:"box",defaultOption:{zlevel:0,z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{normal:{},emphasis:{}},label:{normal:{textStyle:{color:"#000"}},emphasis:{}},data:[]},init:function(t,e,i){this._data,this._names,this.mergeDefaultAndTheme(t,i),this._initData()},mergeOption:function(t){s.superApply(this,"mergeOption",arguments),this._initData()},setCurrentIndex:function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},getCurrentIndex:function(){return this.option.currentIndex},isIndexMax:function(){return this.getCurrentIndex()>=this._data.count()-1},setPlayState:function(t){this.option.autoPlay=!!t},getPlayState:function(){return!!this.option.autoPlay},_initData:function(){var t=this.option,e=t.data||[],i=t.axisType,n=this._names=[];if("category"===i){var s=[];a.each(e,function(t,e){var i,o=r.getDataItemValue(t);a.isObject(t)?(i=a.clone(t),i.value=e):i=e,s.push(i),a.isString(o)||null!=o&&!isNaN(o)||(o=""),n.push(o+"")}),e=s}var l={category:"ordinal",time:"time"}[i]||"number",u=this._data=new o([{name:"value",type:l}],this);u.initData(e,n)},getData:function(){return this._data},getCategories:function(){if("category"===this.get("axisType"))return this._names.slice()}});t.exports=s},function(t,e,i){var n=i(64);t.exports=n.extend({type:"timeline"})},function(t,e,i){function n(t){var e=t.type,i={number:"value",time:"time"};if(i[e]&&(t.axisType=i[e],delete t.type),o(t),a(t,"controlPosition")){var n=t.controlStyle||(t.controlStyle={});a(n,"position")||(n.position=t.controlPosition),"none"!==n.position||a(n,"show")||(n.show=!1,delete n.position),delete t.controlPosition}r.each(t.data||[],function(t){r.isObject(t)&&!r.isArray(t)&&(!a(t,"value")&&a(t,"name")&&(t.value=t.name),o(t))})}function o(t){var e=t.itemStyle||(t.itemStyle={}),i=e.emphasis||(e.emphasis={}),n=t.label||t.label||{},o=n.normal||(n.normal={}),s={normal:1,emphasis:1};r.each(n,function(t,e){s[e]||a(o,e)||(o[e]=t)}),i.label&&!a(n,"emphasis")&&(n.emphasis=i.label,delete i.label)}function a(t,e){return t.hasOwnProperty(e)}var r=i(1);t.exports=function(t){var e=t&&t.timeline;r.isArray(e)||(e=e?[e]:[]),r.each(e,function(t){t&&n(t)})}},function(t,e,i){var n=i(2),o=i(1);n.registerAction({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},function(t,e){var i=e.getComponent("timeline");return i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get("loop",!0)&&i.isIndexMax()&&i.setPlayState(!1)),e.resetOption("timeline"),o.defaults({currentIndex:i.option.currentIndex},t)}),n.registerAction({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},function(t,e){var i=e.getComponent("timeline");i&&null!=t.playState&&i.setPlayState(t.playState)})},function(t,e,i){i(13).registerSubTypeDefaulter("timeline",function(){return"slider"})},function(t,e,i){"use strict";function n(t,e,i){this.model=t,this.ecModel=e,this.api=i,this._brushType,this._brushMode}var o=i(29),a=i(1);n.defaultOption={show:!0,type:["rect","polygon","lineX","lineY","keep","clear"],icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}};var r=n.prototype;r.render=r.updateView=r.updateLayout=function(t,e,i){var n,o,r;e.eachComponent({mainType:"brush"},function(t){n=t.brushType,o=t.brushOption.brushMode||"single",r|=t.areas.length}),this._brushType=n,this._brushMode=o,a.each(t.get("type",!0),function(e){t.setIconStatus(e,("keep"===e?"multiple"===o:"clear"===e?r:e===n)?"emphasis":"normal")})},r.getIcons=function(){var t=this.model,e=t.get("icon",!0),i={};return a.each(t.get("type",!0),function(t){e[t]&&(i[t]=e[t])}),i},r.onclick=function(t,e,i){var e=this.api,n=this._brushType,o=this._brushMode;"clear"===i?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===i?n:n!==i&&i,brushMode:"keep"===i?"multiple"===o?"single":"multiple":o}})},o.register("brush",n),t.exports=n},function(t,e,i){i(391),i(392)},function(t,e,i){function n(t,e,i){if(i[0]===i[1])return i.slice();for(var n=200,o=(i[1]-i[0])/n,a=i[0],r=[],s=0;s<=n&&a<i[1];s++)r.push(a),a+=o;return r.push(i[1]),r}var o=i(253),a=i(1),r=i(4),s=[20,140],l=o.extend({type:"visualMap.continuous",defaultOption:{align:"auto",calculable:!1,range:null,realtime:!0,itemHeight:null,itemWidth:null,hoverLink:!0,hoverLinkDataSize:null,hoverLinkOnHandle:!0},optionUpdated:function(t,e){l.superApply(this,"optionUpdated",arguments),this.resetTargetSeries(),this.resetExtent(),this.resetVisual(function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()}),this._resetRange()},resetItemSize:function(){l.superApply(this,"resetItemSize",arguments);var t=this.itemSize;"horizontal"===this._orient&&t.reverse(),(null==t[0]||isNaN(t[0]))&&(t[0]=s[0]),(null==t[1]||isNaN(t[1]))&&(t[1]=s[1])},_resetRange:function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):a.isArray(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},completeVisualOption:function(){o.prototype.completeVisualOption.apply(this,arguments),a.each(this.stateList,function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=0)},this)},setSelected:function(t){this.option.range=t.slice(),this._resetRange()},getSelected:function(){var t=this.getExtent(),e=r.asc((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]<t[0]&&(e[0]=t[0]),e[1]<t[0]&&(e[1]=t[0]),e},getValueState:function(t){var e=this.option.range,i=this.getExtent();return(e[0]<=i[0]||e[0]<=t)&&(e[1]>=i[1]||t<=e[1])?"inRange":"outOfRange"},findTargetDataIndices:function(t){var e=[];return this.eachTargetSeries(function(i){var n=[],o=i.getData();o.each(this.getDataDimension(o),function(e,i){t[0]<=e&&e<=t[1]&&n.push(i)},!0,this),e.push({seriesId:i.id,dataIndex:n})},this),e},getVisualMeta:function(t){function e(e,i){a.push({value:e,color:t(e,i)})}for(var i=n(this,"outOfRange",this.getExtent()),o=n(this,"inRange",this.option.range.slice()),a=[],r=0,s=0,l=o.length,u=i.length;s<u&&(!o.length||i[s]<=o[0]);s++)i[s]<o[r]&&e(i[s],"outOfRange");for(var c=1;r<l;r++,c=0)c&&a.length&&e(o[r],"outOfRange"),e(o[r],"inRange");for(var c=1;s<u;s++)(!o.length||o[o.length-1]<i[s])&&(c&&(a.length&&e(a[a.length-1].value,"outOfRange"),c=0),e(i[s],"outOfRange"));var h=a.length;return{stops:a,outerColors:[h?a[0].color:"transparent",h?a[h-1].color:"transparent"]}}});t.exports=l},function(t,e,i){function n(t,e,i,n){return new u.Polygon({shape:{points:t},draggable:!!i,cursor:e,drift:i,onmousemove:function(t){m.stop(t.event)},ondragend:n})}function o(t,e){return 0===t?[[0,0],[e,0],[e,-e]]:[[0,0],[e,0],[e,e]]}function a(t,e,i,n){return t?[[0,-x(e,_(i,0))],[w,0],[0,x(e,_(n-i,0))]]:[[0,0],[5,-5],[5,5]]}function r(t,e,i){var n=b/2,o=t.get("hoverLinkDataSize");return o&&(n=v(o,e,i,!0)/2),n}function s(t){return!t.get("realtime")&&t.get("hoverLinkOnHandle")}var l=i(254),u=i(3),c=i(1),h=i(4),d=i(78),f=i(99),p=i(255),g=i(6),m=i(21),v=h.linearMap,y=c.each,x=Math.min,_=Math.max,b=12,w=6,S=l.extend({type:"visualMap.continuous",init:function(){S.superApply(this,"init",arguments),this._shapes={},this._dataInterval=[],this._handleEnds=[],this._orient,this._useHandle,this._hoverLinkDataIndices=[],this._dragging,this._hovering},doRender:function(t,e,i,n){n&&"selectDataRange"===n.type&&n.from===this.uid||this._buildView()},_buildView:function(){this.group.removeAll();var t=this.visualMapModel,e=this.group;this._orient=t.get("orient"),this._useHandle=t.get("calculable"),this._resetInterval(),this._renderBar(e);var i=t.get("text");this._renderEndsText(e,i,0),this._renderEndsText(e,i,1),this._updateView(!0),this.renderBackground(e),this._updateView(),this._enableHoverLinkToSeries(),this._enableHoverLinkFromSeries(),this.positionGroup(e)},_renderEndsText:function(t,e,i){if(e){var n=e[1-i];n=null!=n?n+"":"";var o=this.visualMapModel,a=o.get("textGap"),r=o.itemSize,s=this._shapes.barGroup,l=this._applyTransform([r[0]/2,0===i?-a:r[1]+a],s),c=this._applyTransform(0===i?"bottom":"top",s),h=this._orient,d=this.visualMapModel.textStyleModel;this.group.add(new u.Text({style:{x:l[0],y:l[1],textVerticalAlign:"horizontal"===h?"middle":c,textAlign:"horizontal"===h?c:"center",text:n,textFont:d.getFont(),fill:d.getTextColor()}}))}},_renderBar:function(t){var e=this.visualMapModel,i=this._shapes,o=e.itemSize,a=this._orient,r=this._useHandle,s=p.getItemAlign(e,this.api,o),l=i.barGroup=this._createBarGroup(s);l.add(i.outOfRange=n()),l.add(i.inRange=n(null,r?"move":null,c.bind(this._dragHandle,this,"all",!1),c.bind(this._dragHandle,this,"all",!0)));var u=e.textStyleModel.getTextRect("国"),h=_(u.width,u.height);r&&(i.handleThumbs=[],i.handleLabels=[],i.handleLabelPoints=[],this._createHandle(l,0,o,h,a,s),this._createHandle(l,1,o,h,a,s)),this._createIndicator(l,o,h,a),t.add(l)},_createHandle:function(t,e,i,a,r){var s=c.bind(this._dragHandle,this,e,!1),l=c.bind(this._dragHandle,this,e,!0),h=n(o(e,a),"move",s,l);h.position[0]=i[0],t.add(h);var d=this.visualMapModel.textStyleModel,f=new u.Text({draggable:!0,drift:s,onmousemove:function(t){m.stop(t.event)},ondragend:l,style:{x:0,y:0,text:"",textFont:d.getFont(),fill:d.getTextColor()}});this.group.add(f);var p=["horizontal"===r?a/2:1.5*a,"horizontal"===r?0===e?-(1.5*a):1.5*a:0===e?-a/2:a/2],g=this._shapes;g.handleThumbs[e]=h,g.handleLabelPoints[e]=p,g.handleLabels[e]=f},_createIndicator:function(t,e,i,o){var a=n([[0,0]],"move");a.position[0]=e[0],a.attr({invisible:!0,silent:!0}),t.add(a);var r=this.visualMapModel.textStyleModel,s=new u.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textFont:r.getFont(),fill:r.getTextColor()}});this.group.add(s);var l=["horizontal"===o?i/2:w+3,0],c=this._shapes;c.indicator=a,c.indicatorLabel=s,c.indicatorLabelPoint=l},_dragHandle:function(t,e,i,n){if(this._useHandle){if(this._dragging=!e,!e){var o=this._applyTransform([i,n],this._shapes.barGroup,!0);this._updateInterval(t,o[1]),this._updateView()}e===!this.visualMapModel.get("realtime")&&this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:this._dataInterval.slice()}),e?!this._hovering&&this._clearHoverLinkToSeries():s(this.visualMapModel)&&this._doHoverLinkToSeries(this._handleEnds[t],!1)}},_resetInterval:function(){var t=this.visualMapModel,e=this._dataInterval=t.getSelected(),i=t.getExtent(),n=[0,t.itemSize[1]];this._handleEnds=[v(e[0],i,n,!0),v(e[1],i,n,!0)]},_updateInterval:function(t,e){e=e||0;var i=this.visualMapModel,n=this._handleEnds;d(e,n,[0,i.itemSize[1]],"all"===t?"rigid":"push",t);var o=i.getExtent(),a=[0,i.itemSize[1]];this._dataInterval=[v(n[0],a,o,!0),v(n[1],a,o,!0)]},_updateView:function(t){var e=this.visualMapModel,i=e.getExtent(),n=this._shapes,o=[0,e.itemSize[1]],a=t?o:this._handleEnds,r=this._createBarVisual(this._dataInterval,i,a,"inRange"),s=this._createBarVisual(i,i,o,"outOfRange");n.inRange.setStyle({fill:r.barColor,opacity:r.opacity}).setShape("points",r.barPoints),n.outOfRange.setStyle({fill:s.barColor,opacity:s.opacity}).setShape("points",s.barPoints),this._updateHandle(a,r)},_createBarVisual:function(t,e,i,n){var o={forceState:n,convertOpacityToAlpha:!0},a=this._makeColorGradient(t,o),r=[this.getControllerVisual(t[0],"symbolSize",o),this.getControllerVisual(t[1],"symbolSize",o)],s=this._createBarPoints(i,r);return{barColor:new f(0,0,0,1,a),barPoints:s,handlesColor:[a[0].color,a[a.length-1].color]}},_makeColorGradient:function(t,e){var i=100,n=[],o=(t[1]-t[0])/i;n.push({color:this.getControllerVisual(t[0],"color",e),offset:0});for(var a=1;a<i;a++){var r=t[0]+o*a;if(r>t[1])break;n.push({color:this.getControllerVisual(r,"color",e),offset:a/i})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},_createBarPoints:function(t,e){var i=this.visualMapModel.itemSize;return[[i[0]-e[0],t[0]],[i[0],t[0]],[i[0],t[1]],[i[0]-e[1],t[1]]]},_createBarGroup:function(t){var e=this._orient,i=this.visualMapModel.get("inverse");return new u.Group("horizontal"!==e||i?"horizontal"===e&&i?{scale:"bottom"===t?[-1,1]:[1,1],rotation:-Math.PI/2}:"vertical"!==e||i?{scale:"left"===t?[1,1]:[-1,1]}:{scale:"left"===t?[1,-1]:[-1,-1]}:{scale:"bottom"===t?[1,1]:[-1,1],rotation:Math.PI/2})},_updateHandle:function(t,e){if(this._useHandle){var i=this._shapes,n=this.visualMapModel,o=i.handleThumbs,a=i.handleLabels;y([0,1],function(r){var s=o[r];s.setStyle("fill",e.handlesColor[r]),s.position[1]=t[r];var l=u.applyTransform(i.handleLabelPoints[r],u.getTransform(s,this.group));a[r].setStyle({x:l[0],y:l[1],text:n.formatValueText(this._dataInterval[r]),textVerticalAlign:"middle",textAlign:this._applyTransform("horizontal"===this._orient?0===r?"bottom":"top":"left",i.barGroup)})},this)}},_showIndicator:function(t,e,i,n){var o=this.visualMapModel,r=o.getExtent(),s=o.itemSize,l=[0,s[1]],c=v(t,r,l,!0),h=this._shapes,d=h.indicator;if(d){d.position[1]=c,d.attr("invisible",!1),d.setShape("points",a(!!i,n,c,s[1]));var f={convertOpacityToAlpha:!0},p=this.getControllerVisual(t,"color",f);d.setStyle("fill",p);var g=u.applyTransform(h.indicatorLabelPoint,u.getTransform(d,this.group)),m=h.indicatorLabel;m.attr("invisible",!1);var y=this._applyTransform("left",h.barGroup),x=this._orient;m.setStyle({text:(i?i:"")+o.formatValueText(e),textVerticalAlign:"horizontal"===x?y:"middle",textAlign:"horizontal"===x?"center":y,x:g[0],y:g[1]})}},_enableHoverLinkToSeries:function(){var t=this;this._shapes.barGroup.on("mousemove",function(e){if(t._hovering=!0,!t._dragging){var i=t.visualMapModel.itemSize,n=t._applyTransform([e.offsetX,e.offsetY],t._shapes.barGroup,!0,!0);n[1]=x(_(0,n[1]),i[1]),t._doHoverLinkToSeries(n[1],0<=n[0]&&n[0]<=i[0])}}).on("mouseout",function(){t._hovering=!1,!t._dragging&&t._clearHoverLinkToSeries()})},_enableHoverLinkFromSeries:function(){var t=this.api.getZr();this.visualMapModel.option.hoverLink?(t.on("mouseover",this._hoverLinkFromSeriesMouseOver,this),t.on("mouseout",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},_doHoverLinkToSeries:function(t,e){var i=this.visualMapModel,n=i.itemSize;if(i.option.hoverLink){var o=[0,n[1]],a=i.getExtent();t=x(_(o[0],t),o[1]);var l=r(i,a,o),u=[t-l,t+l],c=v(t,o,a,!0),h=[v(u[0],o,a,!0),v(u[1],o,a,!0)];u[0]<o[0]&&(h[0]=-(1/0)),u[1]>o[1]&&(h[1]=1/0),e&&(h[0]===-(1/0)?this._showIndicator(c,h[1],"< ",l):h[1]===1/0?this._showIndicator(c,h[0],"> ",l):this._showIndicator(c,c,"≈ ",l));var d=this._hoverLinkDataIndices,f=[];(e||s(i))&&(f=this._hoverLinkDataIndices=i.findTargetDataIndices(h));var m=g.compressBatches(d,f);this._dispatchHighDown("downplay",p.convertDataIndex(m[0])),this._dispatchHighDown("highlight",p.convertDataIndex(m[1]))}},_hoverLinkFromSeriesMouseOver:function(t){var e=t.target,i=this.visualMapModel;if(e&&null!=e.dataIndex){var n=this.ecModel.getSeriesByIndex(e.seriesIndex);if(i.isTargetSeries(n)){var o=n.getData(e.dataType),a=o.getDimension(i.getDataDimension(o)),r=o.get(a,e.dataIndex,!0);isNaN(r)||this._showIndicator(r,r)}}},_hideIndicator:function(){var t=this._shapes;t.indicator&&t.indicator.attr("invisible",!0),t.indicatorLabel&&t.indicatorLabel.attr("invisible",!0)},_clearHoverLinkToSeries:function(){this._hideIndicator();var t=this._hoverLinkDataIndices;this._dispatchHighDown("downplay",p.convertDataIndex(t)),t.length=0},_clearHoverLinkFromSeries:function(){this._hideIndicator();var t=this.api.getZr();t.off("mouseover",this._hoverLinkFromSeriesMouseOver),t.off("mouseout",this._hideIndicator)},_applyTransform:function(t,e,i,n){var o=u.getTransform(e,n?null:this.group);return u[c.isArray(t)?"applyTransform":"transformDirection"](t,o,i)},_dispatchHighDown:function(t,e){e&&e.length&&this.api.dispatchAction({type:t,batch:e})},dispose:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},remove:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()}});t.exports=S},function(t,e,i){function n(t,e){var i=t.inverse;("vertical"===t.orient?!i:i)&&e.reverse()}var o=i(253),a=i(1),r=i(82),s=i(266),l=i(4).reformIntervals,u=o.extend({type:"visualMap.piecewise",defaultOption:{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieceList:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0,showLabel:null},optionUpdated:function(t,e){u.superApply(this,"optionUpdated",arguments),this._pieceList=[],this.resetTargetSeries(),this.resetExtent();var i=this._mode=this._determineMode();c[this._mode].call(this),this._resetSelected(t,e);var n=this.option.categories;this.resetVisual(function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=a.clone(n)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=a.map(this._pieceList,function(t){var t=a.clone(t);return"inRange"!==e&&(t.visual=null),t}))})},completeVisualOption:function(){function t(t,e,i){return t&&t[e]&&(a.isObject(t[e])?t[e].hasOwnProperty(i):t[e]===i)}var e=this.option,i={},n=r.listVisualTypes(),l=this.isCategory();a.each(e.pieces,function(t){a.each(n,function(e){t.hasOwnProperty(e)&&(i[e]=1)})}),a.each(i,function(i,n){var o=0;a.each(this.stateList,function(i){o|=t(e,i,n)||t(e.target,i,n)},this),!o&&a.each(this.stateList,function(t){(e[t]||(e[t]={}))[n]=s.get(n,"inRange"===t?"active":"inactive",l)})},this),o.prototype.completeVisualOption.apply(this,arguments)},_resetSelected:function(t,e){var i=this.option,n=this._pieceList,o=(e?i:t).selected||{};if(i.selected=o,a.each(n,function(t,e){var i=this.getSelectedMapKey(t);o.hasOwnProperty(i)||(o[i]=!0)},this),"single"===i.selectedMode){var r=!1;a.each(n,function(t,e){var i=this.getSelectedMapKey(t);o[i]&&(r?o[i]=!1:r=!0)},this)}},getSelectedMapKey:function(t){return"categories"===this._mode?t.value+"":t.index+""},getPieceList:function(){return this._pieceList},_determineMode:function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},setSelected:function(t){this.option.selected=a.clone(t)},getValueState:function(t){var e=r.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},findTargetDataIndices:function(t){var e=[];return this.eachTargetSeries(function(i){var n=[],o=i.getData();o.each(this.getDataDimension(o),function(e,i){var o=r.findPieceIndex(e,this._pieceList);o===t&&n.push(i)},!0,this),e.push({seriesId:i.id,dataIndex:n})},this),e},getRepresentValue:function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var i=t.interval||[];e=i[0]===-(1/0)&&i[1]===1/0?0:(i[0]+i[1])/2}return e},getVisualMeta:function(t){function e(e,a){var r=o.getRepresentValue({interval:e});a||(a=o.getValueState(r));var s=t(r,a);e[0]===-(1/0)?n[0]=s:e[1]===1/0?n[1]=s:i.push({value:e[0],color:s},{value:e[1],color:s})}if(!this.isCategory()){var i=[],n=[],o=this,r=this._pieceList.slice();if(r.length){var s=r[0].interval[0];s!==-(1/0)&&r.unshift({interval:[-(1/0),s]}),s=r[r.length-1].interval[1],s!==1/0&&r.push({interval:[s,1/0]})}else r.push({interval:[-(1/0),1/0]});var l=-(1/0);return a.each(r,function(t){var i=t.interval;i&&(i[0]>l&&e([l,i[0]],"outOfRange"),e(i.slice()),l=i[1])},this),{stops:i,outerColors:n}}}}),c={splitNumber:function(){var t=this.option,e=this._pieceList,i=t.precision,n=this.getExtent(),o=t.splitNumber;o=Math.max(parseInt(o,10),1),t.splitNumber=o;for(var r=(n[1]-n[0])/o;+r.toFixed(i)!==r&&i<5;)i++;t.precision=i,r=+r.toFixed(i);var s=0;t.minOpen&&e.push({index:s++,interval:[-(1/0),n[0]],close:[0,0]});for(var u=n[0],c=s+o;s<c;u+=r){var h=s===o-1?n[1]:u+r;e.push({index:s++,interval:[u,h],close:[1,1]})}t.maxOpen&&e.push({index:s++,interval:[n[1],1/0],close:[0,0]}),l(e),a.each(e,function(t){t.text=this.formatValueText(t.interval)},this)},categories:function(){var t=this.option;a.each(t.categories,function(t){this._pieceList.push({text:this.formatValueText(t,!0),value:t})},this),n(t,this._pieceList)},pieces:function(){var t=this.option,e=this._pieceList;a.each(t.pieces,function(t,i){a.isObject(t)||(t={value:t});var n={text:"",index:i};if(null!=t.label&&(n.text=t.label),t.hasOwnProperty("value")){var o=n.value=t.value;n.interval=[o,o],n.close=[1,1]}else{for(var s=n.interval=[],l=n.close=[0,0],u=[1,0,1],c=[-(1/0),1/0],h=[],d=0;d<2;d++){for(var f=[["gte","gt","min"],["lte","lt","max"]][d],p=0;p<3&&null==s[d];p++)s[d]=t[f[p]],l[d]=u[p],h[d]=2===p;null==s[d]&&(s[d]=c[d])}h[0]&&s[1]===1/0&&(l[0]=0),h[1]&&s[0]===-(1/0)&&(l[1]=0),s[0]===s[1]&&l[0]&&l[1]&&(n.value=s[0])}n.visual=r.retrieveVisuals(t),e.push(n)},this),n(t,e),l(e),a.each(e,function(t){var e=t.close,i=[["<","≤"][e[1]],[">","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,i)},this)}};t.exports=u},function(t,e,i){var n=i(254),o=i(1),a=i(3),r=i(24),s=i(12),l=i(255),u=n.extend({
-type:"visualMap.piecewise",doRender:function(){function t(t){var r=t.piece,s=new a.Group;s.onclick=o.bind(this._onItemClick,this,r),this._enableHoverLink(s,t.indexInModelPieceList);var d=i.getRepresentValue(r);if(this._createItemSymbol(s,d,[0,0,h[0],h[1]]),p){var f=this.visualMapModel.getValueState(d);s.add(new a.Text({style:{x:"right"===c?-n:h[0]+n,y:h[1]/2,text:r.text,textVerticalAlign:"middle",textAlign:c,textFont:l,fill:u,opacity:"outOfRange"===f?.5:1}}))}e.add(s)}var e=this.group;e.removeAll();var i=this.visualMapModel,n=i.get("textGap"),r=i.textStyleModel,l=r.getFont(),u=r.getTextColor(),c=this._getItemAlign(),h=i.itemSize,d=this._getViewData(),f=d.endsText,p=o.retrieve(i.get("showLabel",!0),!f);f&&this._renderEndsText(e,f[0],h,p,c),o.each(d.viewPieceList,t,this),f&&this._renderEndsText(e,f[1],h,p,c),s.box(i.get("orient"),e,i.get("itemGap")),this.renderBackground(e),this.positionGroup(e)},_enableHoverLink:function(t,e){function i(t){var i=this.visualMapModel;i.option.hoverLink&&this.api.dispatchAction({type:t,batch:l.convertDataIndex(i.findTargetDataIndices(e))})}t.on("mouseover",o.bind(i,this,"highlight")).on("mouseout",o.bind(i,this,"downplay"))},_getItemAlign:function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return l.getItemAlign(t,this.api,t.itemSize);var i=e.align;return i&&"auto"!==i||(i="left"),i},_renderEndsText:function(t,e,i,n,o){if(e){var r=new a.Group,s=this.visualMapModel.textStyleModel;r.add(new a.Text({style:{x:n?"right"===o?i[0]:0:i[0]/2,y:i[1]/2,textVerticalAlign:"middle",textAlign:n?o:"center",text:e,textFont:s.getFont(),fill:s.getTextColor()}})),t.add(r)}},_getViewData:function(){var t=this.visualMapModel,e=o.map(t.getPieceList(),function(t,e){return{piece:t,indexInModelPieceList:e}}),i=t.get("text"),n=t.get("orient"),a=t.get("inverse");return("horizontal"===n?a:!a)?e.reverse():i&&(i=i.slice().reverse()),{viewPieceList:e,endsText:i}},_createItemSymbol:function(t,e,i){t.add(r.createSymbol(this.getControllerVisual(e,"symbol"),i[0],i[1],i[2],i[3],this.getControllerVisual(e,"color")))},_onItemClick:function(t){var e=this.visualMapModel,i=e.option,n=o.clone(i.selected),a=e.getSelectedMapKey(t);"single"===i.selectedMode?(n[a]=!0,o.each(n,function(t,e){n[e]=e===a})):n[a]=!n[a],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:n})}});t.exports=u},function(t,e,i){i(2).registerPreprocessor(i(256)),i(257),i(258),i(387),i(388),i(259)},function(t,e,i){i(2).registerPreprocessor(i(256)),i(257),i(258),i(389),i(390),i(259)},function(t,e,i){"use strict";function n(t,e,i){this._model=t}function o(t,e,i,n){var o=i.calendarModel,a=i.seriesModel,r=o?o.coordinateSystem:a?a.coordinateSystem:null;return r===this?r[t](n):null}var a=i(12),r=i(4),s=i(1),l=864e5;n.prototype={constructor:n,type:"calendar",dimensions:["time","value"],getDimensionsInfo:function(){return[{name:"time",type:"time"}]},getHandledRangeInfo:function(){return this._rangeInfo},getModel:function(){return this._model},getRect:function(){return this._rect},getCellWidth:function(){return this._sw},getCellHeight:function(){return this._sh},getOrient:function(){return this._orient},getFirstDayOfWeek:function(){return this._firstDayOfWeek},getDateInfo:function(t){t=r.parseDate(t);var e=t.getFullYear(),i=t.getMonth()+1;i=i<10?"0"+i:i;var n=t.getDate();n=n<10?"0"+n:n;var o=t.getDay();return o=Math.abs((o+7-this.getFirstDayOfWeek())%7),{y:e,m:i,d:n,day:o,time:t.getTime(),formatedDate:e+"-"+i+"-"+n,date:t}},getNextNDay:function(t,e){if(e=e||0,0===e)return this.getDateInfo(t);var i=this.getDateInfo(t).time;return this.getDateInfo(i+l*e)},update:function(t,e){function i(t,e){return null!=t[e]&&"auto"!==t[e]}this._firstDayOfWeek=this._model.getModel("dayLabel").get("firstDay"),this._orient=this._model.get("orient"),this._lineWidth=this._model.getModel("itemStyle.normal").getItemStyle().lineWidth||0,this._rangeInfo=this._getRangeInfo(this._initRangeOption());var n=this._rangeInfo.weeks||1,o=["width","height"],r=this._model.get("cellSize").slice(),l=this._model.getBoxLayoutParams(),u="horizontal"===this._orient?[n,7]:[7,n];s.each([0,1],function(t){i(r,t)&&(l[o[t]]=r[t]*u[t])});var c={width:e.getWidth(),height:e.getHeight()},h=this._rect=a.getLayoutRect(l,c);s.each([0,1],function(t){i(r,t)||(r[t]=h[o[t]]/u[t])}),this._sw=r[0],this._sh=r[1]},dataToPoint:function(t,e){var i=this.getDateInfo(t[0]),n=this._rangeInfo,o=i.formatedDate;if(!(e||i.time>=n.start.time&&i.time<=n.end.time))return[NaN,NaN];var a=i.day,r=this._getRangeInfo([n.start.time,o]).weeks;return"vertical"===this._orient?[this._rect.x+a*this._sw+this._sw/2,this._rect.y+(r-1)*this._sh+this._sh/2]:[this._rect.x+(r-1)*this._sw+this._sw/2,this._rect.y+a*this._sh+this._sh/2]},pointToData:function(t){var e=this.pointToDate(t);return e&&e.time},dataToRect:function(t,e){var i=this.dataToPoint(t,e);return{contentShape:{x:i[0]-(this._sw-this._lineWidth)/2,y:i[1]-(this._sh-this._lineWidth)/2,width:this._sw-this._lineWidth,height:this._sh-this._lineWidth},center:i,tl:[i[0]-this._sw/2,i[1]-this._sh/2],tr:[i[0]+this._sw/2,i[1]-this._sh/2],br:[i[0]+this._sw/2,i[1]+this._sh/2],bl:[i[0]-this._sw/2,i[1]+this._sh/2]}},pointToDate:function(t){var e=Math.floor((t[0]-this._rect.x)/this._sw)+1,i=Math.floor((t[1]-this._rect.y)/this._sh)+1,n=this._rangeInfo.range;return"vertical"===this._orient?this._getDateByWeeksAndDay(i,e-1,n):this._getDateByWeeksAndDay(e,i-1,n)},convertToPixel:s.curry(o,"dataToPoint"),convertFromPixel:s.curry(o,"pointToData"),_initRangeOption:function(){var t=this._model.get("range"),e=t;if(s.isArray(e)&&1===e.length&&(e=e[0]),/^\d{4}$/.test(e)&&(t=[e+"-01-01",e+"-12-31"]),/^\d{4}[\/|-]\d{1,2}$/.test(e)){var i=this.getDateInfo(e),n=i.date;n.setMonth(n.getMonth()+1);var o=this.getNextNDay(n,-1);t=[i.formatedDate,o.formatedDate]}/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(e)&&(t=[e,e]);var a=this._getRangeInfo(t);return a.start.time>a.end.time&&t.reverse(),t},_getRangeInfo:function(t){var e=this.getDateInfo(t[0]),i=this.getDateInfo(t[1]),n=Math.floor(i.time/l)-Math.floor(e.time/l)+1,o=Math.floor((n+e.day+6)/7);return{range:[e.formatedDate,i.formatedDate],start:e,end:i,allDay:n,weeks:o,fweek:e.day,lweek:i.day}},_getDateByWeeksAndDay:function(t,e,i){var n=this._getRangeInfo(i);if(t>n.weeks||0===t&&e<n.fweek||t===n.weeks&&e>n.lweek)return!1;var o=7*(t-1)-n.fweek+e,a=n.start.time+o*l;return this.getDateInfo(a)}},n.dimensions=n.prototype.dimensions,n.getDimensionsInfo=n.prototype.getDimensionsInfo,n.create=function(t,e){var i=[];return t.eachComponent("calendar",function(o){var a=new n(o,t,e);i.push(a),o.coordinateSystem=a}),t.eachSeries(function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])}),i},i(26).register("calendar",n),t.exports=n},function(t,e,i){"use strict";function n(t,e){var i=t.cellSize;a.isArray(i)?1===i.length&&(i[1]=i[0]):i=t.cellSize=[i,i];var n=a.map([0,1],function(t){return r.sizeCalculable(e,t)&&(i[t]="auto"),null!=i[t]&&"auto"!==i[t]});r.mergeLayoutParam(t,e,{type:"box",ignoreSize:n})}var o=i(13),a=i(1),r=i(12),s=o.extend({type:"calendar",coordinateSystem:null,defaultOption:{zlevel:0,z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{normal:{color:"#fff",borderWidth:1,borderColor:"#ccc"}},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",nameMap:"en",textStyle:{color:"#000"}},monthLabel:{show:!0,position:"start",margin:5,align:"center",nameMap:"en",formatter:null,textStyle:{color:"#000"}},yearLabel:{show:!0,position:null,margin:30,formatter:null,textStyle:{color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}}},init:function(t,e,i,o){var a=r.getLayoutParams(t);s.superApply(this,"init",arguments),n(t,a)},mergeOption:function(t,e){s.superApply(this,"mergeOption",arguments),n(this.option,t)}});t.exports=s},function(t,e,i){function n(t,e,i,n,o){l.call(this,t),this.map=e,this._nameCoordMap={},this.loadGeoJson(i,n,o)}function o(t,e,i,n){var o=i.geoModel,a=i.seriesModel,r=o?o.coordinateSystem:a?a.coordinateSystem||(a.getReferringComponents("geo")[0]||{}).coordinateSystem:null;return r===this?r[t](n):null}var a=i(262),r=i(1),s=i(11),l=i(260),u=[i(398),i(399),i(397)];n.prototype={constructor:n,type:"geo",dimensions:["lng","lat"],containCoord:function(t){for(var e=this.regions,i=0;i<e.length;i++)if(e[i].contain(t))return!0;return!1},loadGeoJson:function(t,e,i){try{this.regions=t?a(t):[]}catch(n){throw"Invalid geoJson format\n"+n.message}e=e||{},i=i||{};for(var o=this.regions,s={},l=0;l<o.length;l++){var c=o[l].name;c=i[c]||c,o[l].name=c,s[c]=o[l],this.addGeoCoord(c,o[l].center);var h=e[c];h&&o[l].transformTo(h.left,h.top,h.width,h.height)}this._regionsMap=s,this._rect=null,r.each(u,function(t){t(this)},this)},transformTo:function(t,e,i,n){var o=this.getBoundingRect();o=o.clone(),o.y=-o.y-o.height;var a=this._viewTransform;a.transform=o.calculateTransform(new s(t,e,i,n)),a.decomposeTransform();var r=a.scale;r[1]=-r[1],a.updateTransform(),this._updateTransform()},getRegion:function(t){return this._regionsMap[t]},getRegionByCoord:function(t){for(var e=this.regions,i=0;i<e.length;i++)if(e[i].contain(t))return e[i]},addGeoCoord:function(t,e){this._nameCoordMap[t]=e},getGeoCoord:function(t){return this._nameCoordMap[t]},getBoundingRect:function(){if(this._rect)return this._rect;for(var t,e=this.regions,i=0;i<e.length;i++){var n=e[i].getBoundingRect();t=t||n.clone(),t.union(n)}return this._rect=t||new s(0,0,0,0)},dataToPoints:function(t){var e=[];return t.mapArray(["lng","lat"],function(t,i){return e[0]=t,e[1]=i,this.dataToPoint(e)},this)},dataToPoint:function(t){if("string"==typeof t&&(t=this.getGeoCoord(t)),t)return l.prototype.dataToPoint.call(this,t)},convertToPixel:r.curry(o,"dataToPoint"),convertFromPixel:r.curry(o,"pointToData")},r.mixin(n,l),t.exports=n},function(t,e,i){"use strict";var n=i(6),o=i(13),a=i(10),r=i(1),s=i(77),l=i(186),u=o.extend({type:"geo",coordinateSystem:null,layoutMode:"box",init:function(t){o.prototype.init.apply(this,arguments),n.defaultEmphasis(t.label,["position","show","textStyle","distance","formatter"])},optionUpdated:function(){var t=this.option,e=this;t.regions=l.getFilledRegions(t.regions,t.map),this._optionModelMap=r.reduce(t.regions||[],function(t,i){return i.name&&(t[i.name]=new a(i,e)),t},{}),this.updateSelectedMap(t.regions)},defaultOption:{zlevel:0,z:0,show:!0,left:"center",top:"center",aspectScale:.75,silent:!1,map:"",boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{normal:{show:!1,textStyle:{color:"#000"}},emphasis:{show:!0,textStyle:{color:"rgb(100,0,0)"}}},itemStyle:{normal:{borderWidth:.5,borderColor:"#444",color:"#eee"},emphasis:{color:"rgba(255,215,0,0.8)"}},regions:[]},getRegionModel:function(t){return this._optionModelMap[t]||new a(null,this,this.ecModel)},getFormattedLabel:function(t,e){var i=this.getRegionModel(t),n=i.get("label."+e+".formatter"),o={name:t};if("function"==typeof n)return o.status=e,n(o);if("string"==typeof n){var a=o.seriesName;return n.replace("{a}",null!=a?a:"")}},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t}});r.mixin(u,s),t.exports=u},function(t,e,i){var n=i(1),o={Russia:[100,60],"United States":[-99,38],"United States of America":[-99,38]};t.exports=function(t){n.each(t.regions,function(t){var e=o[t.name];if(e){var i=t.center;i[0]=e[0],i[1]=e[1]}})}},function(t,e,i){for(var n=i(261),o=i(1),a=[126,25],r=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],s=0;s<r.length;s++)for(var l=0;l<r[s].length;l++)r[s][l][0]/=10.5,r[s][l][1]/=-14,r[s][l][0]+=a[0],r[s][l][1]+=a[1];t.exports=function(t){"china"===t.map&&t.regions.push(new n("南海诸岛",o.map(r,function(t){return{type:"polygon",exterior:t}}),a))}},function(t,e,i){var n=i(1),o={"南海诸岛":[32,80],"广东":[0,-10],"香港":[10,5],"澳门":[-10,10],"天津":[5,5]};t.exports=function(t){n.each(t.regions,function(t){var e=o[t.name];if(e){var i=t.center;i[0]+=e[0]/10.5,i[1]+=-e[1]/14}})}},function(t,e,i){function n(t,e){return e.type||(e.data?"category":"value")}var o=i(13),a=i(1),r=i(31),s=i(58),l=i(4),u=o.extend({type:"baseParallelAxis",axis:null,activeIntervals:[],getAreaSelectStyle:function(){return r([["fill","color"],["lineWidth","borderWidth"],["stroke","borderColor"],["width","width"],["opacity","opacity"]]).call(this.getModel("areaSelectStyle"))},setActiveIntervals:function(t){var e=this.activeIntervals=a.clone(t);if(e)for(var i=e.length-1;i>=0;i--)l.asc(e[i])},getActiveState:function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t)return"inactive";for(var i=0,n=e.length;i<n;i++)if(e[i][0]<=t&&t<=e[i][1])return"active";return"inactive"}}),c={type:"value",dim:null,areaSelectStyle:{width:20,borderWidth:1,borderColor:"rgba(160,197,232)",color:"rgba(160,197,232)",opacity:.3},realtime:!0,z:10};a.merge(u.prototype,i(42)),s("parallel",u,n,c),t.exports=u},function(t,e,i){function n(t,e,i){this._axesMap={},this._axesLayout={},this.dimensions=t.dimensions,this._rect,this._model=t,this._init(t,e,i)}function o(t,e){return m(v(t,e[0]),e[1])}function a(t,e){var i=e.layoutLength/(e.axisCount-1);return{position:i*t,axisNameAvailableWidth:i,axisLabelShow:!0}}function r(t,e){var i,n,o=e.layoutLength,a=e.axisExpandWidth,r=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,c=!1;return t<l[0]?(i=t*s,n=s):t<=l[1]?(i=e.axisExpandWindow0Pos+t*a-e.axisExpandWindow[0],u=a,c=!0):(i=o-(r-1-t)*s,n=s),{position:i,axisNameAvailableWidth:u,axisLabelShow:c,nameTruncateMaxWidth:n}}var s=i(12),l=i(17),u=i(1),c=i(402),h=i(3),d=i(19),f=i(4),p=i(78),g=u.each,m=Math.min,v=Math.max,y=Math.floor,x=Math.ceil,_=f.round,b=Math.PI;n.prototype={type:"parallel",constructor:n,_init:function(t,e,i){var n=t.dimensions,o=t.parallelAxisIndex;g(n,function(t,i){var n=o[i],a=e.getComponent("parallelAxis",n),r=this._axesMap[t]=new c(t,l.createScaleByModel(a),[0,0],a.get("type"),n),s="category"===r.type;r.onBand=s&&a.get("boundaryGap"),r.inverse=a.get("inverse"),a.axis=r,r.model=a,r.coordinateSystem=a.coordinateSystem=this},this)},update:function(t,e){this._updateAxesFromSeries(this._model,t)},containPoint:function(t){var e=this._makeLayoutInfo(),i=e.axisBase,n=e.layoutBase,o=e.pixelDimIndex,a=t[1-o],r=t[o];return a>=i&&a<=i+e.axisLength&&r>=n&&r<=n+e.layoutLength},_updateAxesFromSeries:function(t,e){e.eachSeries(function(i){if(t.contains(i,e)){var n=i.getData();g(this.dimensions,function(t){var e=this._axesMap[t];e.scale.unionExtentFromData(n,t),l.niceScaleExtent(e.scale,e.model)},this)}},this)},resize:function(t,e){this._rect=s.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},getRect:function(){return this._rect},_makeLayoutInfo:function(){var t,e=this._model,i=this._rect,n=["x","y"],a=["width","height"],r=e.get("layout"),s="horizontal"===r?0:1,l=i[a[s]],u=[0,l],c=this.dimensions.length,h=o(e.get("axisExpandWidth"),u),d=o(e.get("axisExpandCount")||0,[0,c]),f=e.get("axisExpandable")&&c>3&&c>d&&d>1&&h>0&&l>0,p=e.get("axisExpandWindow");if(p)t=o(p[1]-p[0],u),p[1]=p[0]+t;else{t=o(h*(d-1),u);var g=e.get("axisExpandCenter")||y(c/2);p=[h*g-t/2],p[1]=p[0]+t}var m=(l-t)/(c-d);m<3&&(m=0);var v=[y(_(p[0]/h,1))+1,x(_(p[1]/h,1))-1],b=m/h*p[0];return{layout:r,pixelDimIndex:s,layoutBase:i[n[s]],layoutLength:l,axisBase:i[n[1-s]],axisLength:i[a[1-s]],axisExpandable:f,axisExpandWidth:h,axisCollapseWidth:m,axisExpandWindow:p,axisCount:c,winInnerIndices:v,axisExpandWindow0Pos:b}},_layoutAxes:function(){var t=this._rect,e=this._axesMap,i=this.dimensions,n=this._makeLayoutInfo(),o=n.layout;g(e,function(t){var e=[0,n.axisLength],i=t.inverse?1:0;t.setExtent(e[i],e[1-i])}),g(i,function(e,i){var s=(n.axisExpandable?r:a)(i,n),l={horizontal:{x:s.position,y:n.axisLength},vertical:{x:0,y:s.position}},u={horizontal:b/2,vertical:0},c=[l[o].x+t.x,l[o].y+t.y],h=u[o],f=d.create();d.rotate(f,f,h),d.translate(f,f,c),this._axesLayout[e]={position:c,rotation:h,transform:f,axisNameAvailableWidth:s.axisNameAvailableWidth,axisLabelShow:s.axisLabelShow,nameTruncateMaxWidth:s.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}},this)},getAxis:function(t){return this._axesMap[t]},dataToPoint:function(t,e){return this.axisCoordToPoint(this._axesMap[e].dataToCoord(t),e)},eachActiveState:function(t,e,i){for(var n=this.dimensions,o=this._axesMap,a=this.hasAxisBrushed(),r=0,s=t.count();r<s;r++){var l,u=t.getValues(n,r);if(a){l="active";for(var c=0,h=n.length;c<h;c++){var d=n[c],f=o[d].model.getActiveState(u[c],c);if("inactive"===f){l="inactive";break}}}else l="normal";e.call(i,l,r)}},hasAxisBrushed:function(){for(var t=this.dimensions,e=this._axesMap,i=!1,n=0,o=t.length;n<o;n++)"normal"!==e[t[n]].model.getActiveState()&&(i=!0);return i},axisCoordToPoint:function(t,e){var i=this._axesLayout[e];return h.applyTransform([t,0],i.transform)},getAxisLayout:function(t){return u.clone(this._axesLayout[t])},getSlidedAxisExpandWindow:function(t){var e=this._makeLayoutInfo(),i=e.pixelDimIndex,n=e.axisExpandWindow.slice(),o=n[1]-n[0],a=[0,e.axisExpandWidth*(e.axisCount-1)];if(!this.containPoint(t))return{behavior:"none",axisExpandWindow:n};var r,s=t[i]-e.layoutBase-e.axisExpandWindow0Pos,l="slide",u=e.axisCollapseWidth,c=this._model.get("axisExpandSlideTriggerArea"),h=null!=c[0];if(u)h&&u&&s<o*c[0]?(l="jump",r=s-o*c[2]):h&&u&&s>o*(1-c[0])?(l="jump",r=s-o*(1-c[2])):(r=s-o*c[1])>=0&&(r=s-o*(1-c[1]))<=0&&(r=0),r*=e.axisExpandWidth/u,r?p(r,n,a,"rigid"):l="none";else{var o=n[1]-n[0],d=a[1]*s/o;n=[v(0,d-o/2)],n[1]=m(a[1],n[0]+o),n[0]=n[1]-o}return{axisExpandWindow:n,behavior:l}}},t.exports=n},function(t,e,i){var n=i(1),o=i(33),a=function(t,e,i,n,a){o.call(this,t,e,i),this.type=n||"value",this.axisIndex=a};a.prototype={constructor:a,model:null},n.inherits(a,o),t.exports=a},function(t,e,i){var n=i(1),o=i(13);i(400),o.extend({type:"parallel",dependencies:["parallelAxis"],coordinateSystem:null,dimensions:null,parallelAxisIndex:null,layoutMode:"box",defaultOption:{zlevel:0,z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},init:function(){o.prototype.init.apply(this,arguments),this.mergeOption({})},mergeOption:function(t){var e=this.option;t&&n.merge(e,t,!0),this._initDimensions()},contains:function(t,e){var i=t.get("parallelIndex");return null!=i&&e.getComponent("parallel",i)===this},setAxisExpand:function(t){n.each(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])},this)},_initDimensions:function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[],i=n.filter(this.dependentModels.parallelAxis,function(t){return t.get("parallelIndex")===this.componentIndex});n.each(i,function(i){t.push("dim"+i.get("dim")),e.push(i.componentIndex)})}})},function(t,e,i){function n(t){if(!t.parallel){var e=!1;a.each(t.series,function(t){t&&"parallel"===t.type&&(e=!0)}),e&&(t.parallel=[{}])}}function o(t){var e=r.normalizeToArray(t.parallelAxis);a.each(e,function(e){if(a.isObject(e)){var i=e.parallelIndex||0,n=r.normalizeToArray(t.parallel)[i];n&&n.parallelAxisDefault&&a.merge(e,n.parallelAxisDefault,!1)}})}var a=i(1),r=i(6);t.exports=function(t){n(t),o(t)}},function(t,e,i){"use strict";function n(t,e){e=e||[0,360],a.call(this,"angle",t,e),this.type="category"}var o=i(1),a=i(33);n.prototype={constructor:n,pointToData:function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},dataToAngle:a.prototype.dataToCoord,angleToData:a.prototype.coordToData},o.inherits(n,a),t.exports=n},function(t,e,i){"use strict";function n(t,e){return e.type||(e.data?"category":"value")}var o=i(1),a=i(13),r=i(58),s=a.extend({type:"polarAxis",axis:null,getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"polar",index:this.option.polarIndex,id:this.option.polarId})[0]}});o.merge(s.prototype,i(42));var l={angle:{startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:!1}},radius:{splitNumber:5}};r("angle",s,n,l.angle),r("radius",s,n,l.radius)},function(t,e,i){"use strict";var n=i(409),o=i(405),a=function(t){this.name=t||"",this.cx=0,this.cy=0,this._radiusAxis=new n,this._angleAxis=new o,this._radiusAxis.polar=this._angleAxis.polar=this};a.prototype={type:"polar",axisPointerEnabled:!0,constructor:a,dimensions:["radius","angle"],model:null,containPoint:function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},containData:function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},getAxis:function(t){return this["_"+t+"Axis"]},getAxes:function(){return[this._radiusAxis,this._angleAxis]},getAxesByScale:function(t){var e=[],i=this._angleAxis,n=this._radiusAxis;return i.scale.type===t&&e.push(i),n.scale.type===t&&e.push(n),e},getAngleAxis:function(){return this._angleAxis},getRadiusAxis:function(){return this._radiusAxis},getOtherAxis:function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},getTooltipAxes:function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},dataToPoints:function(t){return t.mapArray(this.dimensions,function(t,e){return this.dataToPoint([t,e])},this)},dataToPoint:function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},pointToData:function(t,e){var i=this.pointToCoord(t);return[this._radiusAxis.radiusToData(i[0],e),this._angleAxis.angleToData(i[1],e)]},pointToCoord:function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=this.getAngleAxis(),o=n.getExtent(),a=Math.min(o[0],o[1]),r=Math.max(o[0],o[1]);n.inverse?a=r-360:r=a+360;var s=Math.sqrt(e*e+i*i);e/=s,i/=s;for(var l=Math.atan2(-i,e)/Math.PI*180,u=l<a?1:-1;l<a||l>r;)l+=360*u;return[s,l]},coordToPoint:function(t){var e=t[0],i=t[1]/180*Math.PI,n=Math.cos(i)*e+this.cx,o=-Math.sin(i)*e+this.cy;return[n,o]}},t.exports=a},function(t,e,i){"use strict";i(406),i(2).extendComponentModel({type:"polar",dependencies:["polarAxis","angleAxis"],coordinateSystem:null,findAxisModel:function(t){var e,i=this.ecModel;return i.eachComponent(t,function(t){t.getCoordSysModel()===this&&(e=t)},this),e},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"80%"}})},function(t,e,i){"use strict";function n(t,e){a.call(this,"radius",t,e),this.type="category"}var o=i(1),a=i(33);n.prototype={constructor:n,pointToData:function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},dataToRadius:a.prototype.dataToCoord,radiusToData:a.prototype.coordToData},o.inherits(n,a),t.exports=n},function(t,e,i){function n(t,e,i){a.call(this,t,e,i),this.type="value",this.angle=0,this.name="",this.model}var o=i(1),a=i(33);o.inherits(n,a),t.exports=n},function(t,e,i){function n(t,e,i){this._model=t,this.dimensions=[],this._indicatorAxes=o.map(t.getIndicatorModels(),function(t,e){var i="indicator_"+e,n=new a(i,new r);return n.name=t.get("name"),n.model=t,t.axis=n,this.dimensions.push(i),n},this),this.resize(t,i),this.cx,this.cy,this.r,this.startAngle}var o=i(1),a=i(410),r=i(43),s=i(4),l=i(17);n.prototype.getIndicatorAxes=function(){return this._indicatorAxes},n.prototype.dataToPoint=function(t,e){var i=this._indicatorAxes[e];return this.coordToPoint(i.dataToCoord(t),e)},n.prototype.coordToPoint=function(t,e){var i=this._indicatorAxes[e],n=i.angle,o=this.cx+t*Math.cos(n),a=this.cy-t*Math.sin(n);return[o,a]},n.prototype.pointToData=function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=Math.sqrt(e*e+i*i);e/=n,i/=n;for(var o,a=Math.atan2(-i,e),r=1/0,s=-1,l=0;l<this._indicatorAxes.length;l++){var u=this._indicatorAxes[l],c=Math.abs(a-u.angle);c<r&&(o=u,s=l,r=c)}return[s,+(o&&o.coodToData(n))]},n.prototype.resize=function(t,e){var i=t.get("center"),n=e.getWidth(),a=e.getHeight(),r=Math.min(n,a)/2;this.cx=s.parsePercent(i[0],n),this.cy=s.parsePercent(i[1],a),this.startAngle=t.get("startAngle")*Math.PI/180,this.r=s.parsePercent(t.get("radius"),r),o.each(this._indicatorAxes,function(t,e){t.setExtent(0,this.r);var i=this.startAngle+e*Math.PI*2/this._indicatorAxes.length;i=Math.atan2(Math.sin(i),Math.cos(i)),t.angle=i},this)},n.prototype.update=function(t,e){function i(t){var e=Math.pow(10,Math.floor(Math.log(t)/Math.LN10)),i=t/e;return 2===i?i=5:i*=2,i*e}var n=this._indicatorAxes,a=this._model;o.each(n,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeriesByType("radar",function(e,i){if("radar"===e.get("coordinateSystem")&&t.getComponent("radar",e.get("radarIndex"))===a){var r=e.getData();o.each(n,function(t){t.scale.unionExtentFromData(r,t.dim)})}},this);var r=a.get("splitNumber");o.each(n,function(t,e){var n=l.getScaleExtent(t.scale,t.model);l.niceScaleExtent(t.scale,t.model);var o=t.model,a=t.scale,u=o.getMin(),c=o.getMax(),h=a.getInterval();if(null!=u&&null!=c)a.setInterval((c-u)/r);else if(null!=u){var d;do d=u+h*r,a.setExtent(+u,d),a.setInterval(h),h=i(h);while(d<n[1]&&isFinite(d)&&isFinite(n[1]))}else if(null!=c){var f;do f=c-h*r,a.setExtent(f,+c),a.setInterval(h),h=i(h);while(f>n[0]&&isFinite(f)&&isFinite(n[0]))}else{var p=a.getTicks().length-1;p>r&&(h=i(h));var g=Math.round((n[0]+n[1])/2/h)*h,m=Math.round(r/2);a.setExtent(s.round(g-m*h),s.round(g+(r-m)*h)),a.setInterval(h)}})},n.dimensions=[],n.create=function(t,e){var i=[];return t.eachComponent("radar",function(o){var a=new n(o,t,e);i.push(a),o.coordinateSystem=a}),t.eachSeriesByType("radar",function(t){"radar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("radarIndex")||0])}),i},i(26).register("radar",n),t.exports=n},function(t,e,i){function n(t,e){return s.defaults({show:e},t)}var o=i(94),a=o.valueAxis,r=i(10),s=i(1),l=i(42),u=i(2).extendComponentModel({type:"radar",optionUpdated:function(){var t=this.get("boundaryGap"),e=this.get("splitNumber"),i=this.get("scale"),n=this.get("axisLine"),o=this.get("axisTick"),a=this.get("axisLabel"),u=this.get("name.textStyle"),c=this.get("name.show"),h=this.get("name.formatter"),d=this.get("nameGap"),f=this.get("triggerEvent"),p=s.map(this.get("indicator")||[],function(p){if(null!=p.max&&p.max>0&&!p.min?p.min=0:null!=p.min&&p.min<0&&!p.max&&(p.max=0),p=s.merge(s.clone(p),{boundaryGap:t,splitNumber:e,scale:i,axisLine:n,axisTick:o,axisLabel:a,name:p.text,nameLocation:"end",nameGap:d,nameTextStyle:u,triggerEvent:f},!1),c||(p.name=""),"string"==typeof h){var g=p.name;p.name=h.replace("{value}",null!=g?g:"")}else"function"==typeof h&&(p.name=h(p.name,p));var m=s.extend(new r(p,null,this.ecModel),l);return m.mainType="radar",m.componentIndex=this.componentIndex,m},this);this.getIndicatorModels=function(){return p}},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"75%",startAngle:90,name:{show:!0},boundaryGap:[0,0],splitNumber:5,nameGap:15,scale:!1,shape:"polygon",axisLine:s.merge({lineStyle:{color:"#bbb"}},a.axisLine),axisLabel:n(a.axisLabel,!1),axisTick:n(a.axisTick,!1),splitLine:n(a.splitLine,!0),splitArea:n(a.splitArea,!0),indicator:[]}});t.exports=u},function(t,e,i){function n(t,e){return e.type||(e.data?"category":"value")}var o=i(13),a=i(58),r=i(1),s=o.extend({type:"singleAxis",layoutMode:"box",axis:null,coordinateSystem:null,getCoordSysModel:function(){return this}}),l={left:"5%",top:"5%",right:"5%",bottom:"5%",type:"value",position:"bottom",orient:"horizontal",axisLine:{show:!0,lineStyle:{width:2,type:"solid"}},tooltip:{show:!0},axisTick:{show:!0,length:6,lineStyle:{width:2}},axisLabel:{show:!0,interval:"auto"},splitLine:{show:!0,lineStyle:{type:"dashed",opacity:.2}}};r.merge(s.prototype,i(42)),a("single",s,n,l),t.exports=s},function(t,e,i){function n(t,e,i){this.dimension="single",this.dimensions=["single"],this._axis=null,this._rect,this._init(t,e,i),this.model=t}var o=i(415),a=i(17),r=i(12);n.prototype={type:"singleAxis",axisPointerEnabled:!0,constructor:n,_init:function(t,e,i){var n=this.dimension,r=new o(n,a.createScaleByModel(t),[0,0],t.get("type"),t.get("position")),s="category"===r.type;r.onBand=s&&t.get("boundaryGap"),r.inverse=t.get("inverse"),r.orient=t.get("orient"),t.axis=r,r.model=t,r.coordinateSystem=this,this._axis=r},update:function(t,e){t.eachSeries(function(t){if(t.coordinateSystem===this){var e=t.getData(),i=this.dimension;this._axis.scale.unionExtentFromData(e,t.coordDimToDataDim(i)),a.niceScaleExtent(this._axis.scale,this._axis.model)}},this)},resize:function(t,e){this._rect=r.getLayoutRect({left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")},{width:e.getWidth(),height:e.getHeight()}),this._adjustAxis()},getRect:function(){return this._rect},_adjustAxis:function(){var t=this._rect,e=this._axis,i=e.isHorizontal(),n=i?[0,t.width]:[0,t.height],o=e.reverse?1:0;e.setExtent(n[o],n[1-o]),this._updateAxisTransform(e,i?t.x:t.y)},_updateAxisTransform:function(t,e){var i=t.getExtent(),n=i[0]+i[1],o=t.isHorizontal();t.toGlobalCoord=o?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord=o?function(t){return t-e}:function(t){return n-t+e}},getAxis:function(){return this._axis},getBaseAxis:function(){return this._axis},getAxes:function(){return[this._axis]},getTooltipAxes:function(){return{baseAxes:[this.getAxis()]}},containPoint:function(t){var e=this.getRect(),i=this.getAxis(),n=i.orient;return"horizontal"===n?i.contain(i.toLocalCoord(t[0]))&&t[1]>=e.y&&t[1]<=e.y+e.height:i.contain(i.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},pointToData:function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},dataToPoint:function(t){var e=this.getAxis(),i=this.getRect(),n=[],o="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),n[o]=e.toGlobalCoord(e.dataToCoord(+t)),n[1-o]=0===o?i.y+i.height/2:i.x+i.width/2,n}},t.exports=n},function(t,e,i){var n=i(1),o=i(33),a=i(17),r=function(t,e,i,n,a){o.call(this,t,e,i),this.type=n||"value",this.position=a||"bottom",this.orient=null,this._labelInterval=null};r.prototype={constructor:r,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getLabelInterval:function(){var t=this._labelInterval;if(!t){var e=this.model,i=e.getModel("axisLabel"),o=i.get("interval");if("category"!==this.type||"auto"!==o)return t=this._labelInterval="auto"===o?0:o;t=this._labelInterval=a.getAxisLabelInterval(n.map(this.scale.getTicks(),this.dataToCoord,this),e.getFormattedLabels(),i.getModel("textStyle").getFont(),this.isHorizontal())}return t},pointToData:function(t,e){return this.coordinateSystem.pointToData(t,e)[0]},toGlobalCoord:null,toLocalCoord:null},n.inherits(r,o),t.exports=r},function(t,e,i){function n(t,e){var i=[];return t.eachComponent("singleAxis",function(n,a){var r=new o(n,t,e);r.name="single_"+a,r.resize(n,e),n.coordinateSystem=r,i.push(r)}),t.eachSeries(function(e){if("singleAxis"===e.get("coordinateSystem")){var i=t.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0];e.coordinateSystem=i&&i.coordinateSystem}}),i}var o=i(414);i(26).register("single",{create:n,dimensions:o.prototype.dimensions})},function(t,e,i){"use strict";function n(t,e){this.id=null==t?"":t,this.inEdges=[],this.outEdges=[],this.edges=[],this.hostGraph,
-this.dataIndex=null==e?-1:e}function o(t,e,i){this.node1=t,this.node2=e,this.dataIndex=null==i?-1:i}var a=i(1),r=function(t){this._directed=t||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this.data,this.edgeData},s=r.prototype;s.type="graph",s.isDirected=function(){return this._directed},s.addNode=function(t,e){t=t||""+e;var i=this._nodesMap;if(!i[t]){var o=new n(t,e);return o.hostGraph=this,this.nodes.push(o),i[t]=o,o}},s.getNodeByIndex=function(t){var e=this.data.getRawIndex(t);return this.nodes[e]},s.getNodeById=function(t){return this._nodesMap[t]},s.addEdge=function(t,e,i){var a=this._nodesMap,r=this._edgesMap;if("number"==typeof t&&(t=this.nodes[t]),"number"==typeof e&&(e=this.nodes[e]),t instanceof n||(t=a[t]),e instanceof n||(e=a[e]),t&&e){var s=t.id+"-"+e.id;if(!r[s]){var l=new o(t,e,i);return l.hostGraph=this,this._directed&&(t.outEdges.push(l),e.inEdges.push(l)),t.edges.push(l),t!==e&&e.edges.push(l),this.edges.push(l),r[s]=l,l}}},s.getEdgeByIndex=function(t){var e=this.edgeData.getRawIndex(t);return this.edges[e]},s.getEdge=function(t,e){t instanceof n&&(t=t.id),e instanceof n&&(e=e.id);var i=this._edgesMap;return this._directed?i[t+"-"+e]:i[t+"-"+e]||i[e+"-"+t]},s.eachNode=function(t,e){for(var i=this.nodes,n=i.length,o=0;o<n;o++)i[o].dataIndex>=0&&t.call(e,i[o],o)},s.eachEdge=function(t,e){for(var i=this.edges,n=i.length,o=0;o<n;o++)i[o].dataIndex>=0&&i[o].node1.dataIndex>=0&&i[o].node2.dataIndex>=0&&t.call(e,i[o],o)},s.breadthFirstTraverse=function(t,e,i,o){if(e instanceof n||(e=this._nodesMap[e]),e){for(var a="out"===i?"outEdges":"in"===i?"inEdges":"edges",r=0;r<this.nodes.length;r++)this.nodes[r].__visited=!1;if(!t.call(o,e,null))for(var s=[e];s.length;)for(var l=s.shift(),u=l[a],r=0;r<u.length;r++){var c=u[r],h=c.node1===l?c.node2:c.node1;if(!h.__visited){if(t.call(h,h,l))return;s.push(h),h.__visited=!0}}}},s.update=function(){for(var t=this.data,e=this.edgeData,i=this.nodes,n=this.edges,o=0,a=i.length;o<a;o++)i[o].dataIndex=-1;for(var o=0,a=t.count();o<a;o++)i[t.getRawIndex(o)].dataIndex=o;e.filterSelf(function(t){var i=n[e.getRawIndex(t)];return i.node1.dataIndex>=0&&i.node2.dataIndex>=0});for(var o=0,a=n.length;o<a;o++)n[o].dataIndex=-1;for(var o=0,a=e.count();o<a;o++)n[e.getRawIndex(o)].dataIndex=o},s.clone=function(){for(var t=new r(this._directed),e=this.nodes,i=this.edges,n=0;n<e.length;n++)t.addNode(e[n].id,e[n].dataIndex);for(var n=0;n<i.length;n++){var o=i[n];t.addEdge(o.node1.id,o.node2.id,o.dataIndex)}return t},n.prototype={constructor:n,degree:function(){return this.edges.length},inDegree:function(){return this.inEdges.length},outDegree:function(){return this.outEdges.length},getModel:function(t){if(!(this.dataIndex<0)){var e=this.hostGraph,i=e.data.getItemModel(this.dataIndex);return i.getModel(t)}}},o.prototype.getModel=function(t){if(!(this.dataIndex<0)){var e=this.hostGraph,i=e.edgeData.getItemModel(this.dataIndex);return i.getModel(t)}};var l=function(t,e){return{getValue:function(i){var n=this[t][e];return n.get(n.getDimension(i||"value"),this.dataIndex)},setVisual:function(i,n){this.dataIndex>=0&&this[t][e].setItemVisual(this.dataIndex,i,n)},getVisual:function(i,n){return this[t][e].getItemVisual(this.dataIndex,i,n)},setLayout:function(i,n){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,i,n)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}};a.mixin(n,l("hostGraph","data")),a.mixin(o,l("hostGraph","edgeData")),r.Node=n,r.Edge=o,t.exports=r},function(t,e,i){function n(t,e){this.root,this.data,this._nodes=[],this.hostModel=t,this.levelModels=a.map(e||[],function(e){return new r(e,t,t.ecModel)})}function o(t,e){var i=e.children;t.parentNode!==e&&(i.push(t),t.parentNode=e)}var a=i(1),r=i(10),s=i(14),l=i(264),u=i(25),c=function(t,e){this.name=t||"",this.depth=0,this.height=0,this.parentNode=null,this.dataIndex=-1,this.children=[],this.viewChildren=[],this.hostTree=e};c.prototype={constructor:c,isRemoved:function(){return this.dataIndex<0},eachNode:function(t,e,i){"function"==typeof t&&(i=e,e=t,t=null),t=t||{},a.isString(t)&&(t={order:t});var n,o=t.order||"preorder",r=this[t.attr||"children"];"preorder"===o&&(n=e.call(i,this));for(var s=0;!n&&s<r.length;s++)r[s].eachNode(t,e,i);"postorder"===o&&e.call(i,this)},updateDepthAndHeight:function(t){var e=0;this.depth=t;for(var i=0;i<this.children.length;i++){var n=this.children[i];n.updateDepthAndHeight(t+1),n.height>e&&(e=n.height)}this.height=e+1},getNodeById:function(t){if(this.getId()===t)return this;for(var e=0,i=this.children,n=i.length;e<n;e++){var o=i[e].getNodeById(t);if(o)return o}},contains:function(t){if(t===this)return!0;for(var e=0,i=this.children,n=i.length;e<n;e++){var o=i[e].contains(t);if(o)return o}},getAncestors:function(t){for(var e=[],i=t?this:this.parentNode;i;)e.push(i),i=i.parentNode;return e.reverse(),e},getValue:function(t){var e=this.hostTree.data;return e.get(e.getDimension(t||"value"),this.dataIndex)},setLayout:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},getLayout:function(){return this.hostTree.data.getItemLayout(this.dataIndex)},getModel:function(t){if(!(this.dataIndex<0)){var e=this.hostTree,i=e.data.getItemModel(this.dataIndex),n=this.getLevelModel();return i.getModel(t,(n||e.hostModel).getModel(t))}},getLevelModel:function(){return(this.hostTree.levelModels||[])[this.depth]},setVisual:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},getVisual:function(t,e){return this.hostTree.data.getItemVisual(this.dataIndex,t,e)},getRawIndex:function(){return this.hostTree.data.getRawIndex(this.dataIndex)},getId:function(){return this.hostTree.data.getId(this.dataIndex)}},n.prototype={constructor:n,type:"tree",eachNode:function(t,e,i){this.root.eachNode(t,e,i)},getNodeByDataIndex:function(t){var e=this.data.getRawIndex(t);return this._nodes[e]},getNodeByName:function(t){return this.root.getNodeByName(t)},update:function(){for(var t=this.data,e=this._nodes,i=0,n=e.length;i<n;i++)e[i].dataIndex=-1;for(var i=0,n=t.count();i<n;i++)e[t.getRawIndex(i)].dataIndex=i},clearLayouts:function(){this.data.clearItemLayouts()}},n.createTree=function(t,e,i){function r(t,e){var i=t.value;f=Math.max(f,a.isArray(i)?i.length:1),d.push(t);var n=new c(t.name,h);e?o(n,e):h.root=n,h._nodes.push(n);var s=t.children;if(s)for(var l=0;l<s.length;l++)r(s[l],n)}var h=new n(e,i),d=[],f=1;r(t),h.root.updateDepthAndHeight(0);var p=u([{name:"value"}],d,{dimCount:f}),g=new s(p,e);return g.initData(d),l({mainData:g,struct:h,structAttr:"tree"}),h.update(),h},t.exports=n},function(t,e,i){function n(){var t,e=[],i={};return{add:function(t,n,a,r,s){return o.isString(r)&&(s=r,r=0),!i[t.id]&&(i[t.id]=1,e.push({el:t,target:n,time:a,delay:r,easing:s}),!0)},done:function(e){return t=e,this},start:function(){function n(){o--,o||(e.length=0,i={},t&&t())}for(var o=e.length,a=0,r=e.length;a<r;a++){var s=e[a];s.el.animateTo(s.target,s.time,s.delay,s.easing,n)}return this}}}var o=i(1);t.exports={createWrap:n}}])});
\ No newline at end of file
+var a=i(71),o=i(9),r=i(1),s=i(152),l=i(155),u=i(156),c=i(163),h=!o.canvasSupported,d={canvas:i(154)},f={},p={};p.version="3.5.0",p.init=function(t,e){var i=new g(a(),t,e);return f[i.id]=i,i},p.dispose=function(t){if(t)t.dispose();else{for(var e in f)f.hasOwnProperty(e)&&f[e].dispose();f={}}return p},p.getInstance=function(t){return f[t]},p.registerPainter=function(t,e){d[t]=e};var g=function(t,e,i){i=i||{},this.dom=e,this.id=t;var n=this,a=new l,f=i.renderer;if(h){if(!d.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");f="vml"}else f&&d[f]||(f="canvas");var p=new d[f](e,a,i);this.storage=a,this.painter=p;var g=o.node?null:new c(p.getViewportRoot());this.handler=new s(a,p,g,p.root),this.animation=new u({stage:{update:r.bind(this.flush,this)}}),this.animation.start(),this._needsRefresh;var m=a.delFromStorage,v=a.addToStorage;a.delFromStorage=function(t){m.call(a,t),t&&t.removeSelfFromZr(n)},a.addToStorage=function(t){v.call(a,t),t.addSelfToZr(n)}};g.prototype={constructor:g,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,i){this.handler.on(t,e,i)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,n(this.id)}},t.exports=p},function(t,e,i){var n=i(2),a=i(1);t.exports=function(t,e){a.each(e,function(e){e.update="updateView",n.registerAction(e,function(i,n){var a={};return n.eachComponent({mainType:"series",subType:t,query:i},function(t){t[e.method]&&t[e.method](i.name);var n=t.getData();n.each(function(e){var i=n.getName(e);a[i]=t.isSelected(i)||!1})}),{name:i.name,selected:a}})})}},function(t,e,i){"use strict";var n=i(17),a=i(28);t.exports=n.extend({type:"series.__base_bar__",getInitialData:function(t,e){return a(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var i=e.dataToPoint(t,!0),n=this.getData(),a=n.getLayout("offset"),o=n.getLayout("size"),r=e.getBaseAxis().isHorizontal()?0:1;return i[r]+=a+o/2,i}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,itemStyle:{normal:{},emphasis:{}}}})},function(t,e,i){function n(t,e,i,n,a){o.setText(t,e,i),t.text=n,"outside"===t.textPosition&&(t.textPosition=a)}var a=i(1),o=i(3),r={};r.setLabel=function(t,e,i,o,r,s,l){var u=i.getModel("label.normal"),c=i.getModel("label.emphasis");u.get("show")?n(t,u,o,a.retrieve(r.getFormattedLabel(s,"normal"),r.getRawValue(s)),l):t.text="",c.get("show")?n(e,c,o,a.retrieve(r.getFormattedLabel(s,"emphasis"),r.getRawValue(s)),l):e.text=""},t.exports=r},function(t,e,i){var n=i(3),a=i(1),o=i(5),r={};r.findLabelValueDim=function(t){var e,i=o.otherDimToDataDim(t,"label");if(i.length)e=i[0];else for(var n,a=t.dimensions.slice();a.length&&(e=a.pop(),n=t.getDimensionInfo(e).type,"ordinal"===n||"time"===n););return e},r.setTextToStyle=function(t,e,i,o,r,s,l){null!=i&&s.getShallow("show")?(n.setText(o,s,l),o.text=a.retrieve(r.getFormattedLabel(e,"normal"),t.get(i,e))):o.text=""},t.exports=r},function(t,e,i){function n(t){return isNaN(t[0])||isNaN(t[1])}function a(t,e,i,a,o,r,g,m,v,y,x){for(var _=0,b=i,w=0;w<a;w++){var S=e[b];if(b>=o||b<0)break;if(n(S)){if(x){b+=r;continue}break}if(b===i)t[r>0?"moveTo":"lineTo"](S[0],S[1]),h(f,S);else if(v>0){var M=b+r,I=e[M];if(x)for(;I&&n(e[M]);)M+=r,I=e[M];var T=.5,A=e[_],I=e[M];if(!I||n(I))h(p,S);else{n(I)&&!x&&(I=S),s.sub(d,I,A);var C,L;if("x"===y||"y"===y){var D="x"===y?0:1;C=Math.abs(S[D]-A[D]),L=Math.abs(S[D]-I[D])}else C=s.dist(S,A),L=s.dist(S,I);T=L/(L+C),c(p,S,d,-v*(1-T))}l(f,f,m),u(f,f,g),l(p,p,m),u(p,p,g),t.bezierCurveTo(f[0],f[1],p[0],p[1],S[0],S[1]),c(f,S,d,v*T)}else t.lineTo(S[0],S[1]);_=b,b+=r}return w}function o(t,e){var i=[1/0,1/0],n=[-(1/0),-(1/0)];if(e)for(var a=0;a<t.length;a++){var o=t[a];o[0]<i[0]&&(i[0]=o[0]),o[1]<i[1]&&(i[1]=o[1]),o[0]>n[0]&&(n[0]=o[0]),o[1]>n[1]&&(n[1]=o[1])}return{min:e?i:n,max:e?n:i}}var r=i(8),s=i(6),l=s.min,u=s.max,c=s.scaleAndAdd,h=s.copy,d=[],f=[],p=[];t.exports={Polyline:r.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},buildPath:function(t,e){var i=e.points,r=0,s=i.length,l=o(i,e.smoothConstraint);if(e.connectNulls){for(;s>0&&n(i[s-1]);s--);for(;r<s&&n(i[r]);r++);}for(;r<s;)r+=a(t,i,r,s,s,1,l.min,l.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),Polygon:r.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},buildPath:function(t,e){var i=e.points,r=e.stackedOnPoints,s=0,l=i.length,u=e.smoothMonotone,c=o(i,e.smoothConstraint),h=o(r,e.smoothConstraint);if(e.connectNulls){for(;l>0&&n(i[l-1]);l--);for(;s<l&&n(i[s]);s++);}for(;s<l;){var d=a(t,i,s,l,l,1,c.min,c.max,e.smooth,u,e.connectNulls);a(t,r,s+d-1,d,l,-1,h.min,h.max,e.stackedOnSmooth,u,e.connectNulls),s+=d+1,t.closePath()}}})}},function(t,e,i){var n=i(1),a={retrieveTargetInfo:function(t,e){if(t&&("treemapZoomToNode"===t.type||"treemapRootToNode"===t.type)){var i=e.getData().tree.root,n=t.targetNode;if(n&&i.contains(n))return{node:n};var a=t.targetNodeId;if(null!=a&&(n=i.getNodeById(a)))return{node:n}}},getPathToRoot:function(t){for(var e=[];t;)t=t.parentNode,t&&e.push(t);return e.reverse()},aboveViewRoot:function(t,e){var i=a.getPathToRoot(t);return n.indexOf(i,e)>=0},wrapTreePathInfo:function(t,e){for(var i=[];t;){var n=t.dataIndex;i.push({name:t.name,dataIndex:n,value:e.getRawValue(n)}),t=t.parentNode}return i.reverse(),i}};t.exports=a},function(t,e,i){function n(t){this.pointerChecker,this._zr=t,this._opt={};var e=d.bind,i=e(a,this),n=e(o,this),u=e(r,this),c=e(s,this),f=e(l,this);h.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(e,a){this.disable(),this._opt=d.defaults(d.clone(a)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}),null==e&&(e=!0),e!==!0&&"move"!==e&&"pan"!==e||(t.on("mousedown",i),t.on("mousemove",n),t.on("mouseup",u)),e!==!0&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",c),t.on("pinch",f))},this.disable=function(){t.off("mousedown",i),t.off("mousemove",n),t.off("mouseup",u),t.off("mousewheel",c),t.off("pinch",f)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function a(t){if(!t.target||!t.target.draggable){var e=t.offsetX,i=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,i)&&(this._x=e,this._y=i,this._dragging=!0)}}function o(t){if(c(this,"moveOnMouseMove",t)&&this._dragging&&"pinch"!==t.gestureEvent&&!p.isTaken(this._zr,"globalPan")){var e=t.offsetX,i=t.offsetY,n=this._x,a=this._y,o=e-n,r=i-a;this._x=e,this._y=i,this._opt.preventDefaultMouseMove&&f.stop(t.event),this.trigger("pan",o,r,n,a,e,i)}}function r(t){this._dragging=!1}function s(t){if(c(this,"zoomOnMouseWheel",t)&&0!==t.wheelDelta){var e=t.wheelDelta>0?1.1:1/1.1;u.call(this,t,e,t.offsetX,t.offsetY)}}function l(t){if(!p.isTaken(this._zr,"globalPan")){var e=t.pinchScale>1?1.1:1/1.1;u.call(this,t,e,t.pinchX,t.pinchY)}}function u(t,e,i,n){this.pointerChecker&&this.pointerChecker(t,i,n)&&(f.stop(t.event),this.trigger("zoom",e,i,n))}function c(t,e,i){var n=t._opt[e];return n&&(!d.isString(n)||i.event[n+"Key"])}var h=i(23),d=i(1),f=i(21),p=i(129);d.mixin(n,h),t.exports=n},function(t,e,i){var n=i(1),a={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,textStyle:{fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},o=n.merge({boundaryGap:!0,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},a),r=n.merge({boundaryGap:[0,0],splitNumber:5},a),s=n.defaults({scale:!0,min:"dataMin",max:"dataMax"},r),l=n.defaults({scale:!0,logBase:10},r);t.exports={categoryAxis:o,valueAxis:r,timeAxis:s,logAxis:l}},function(t,e){t.exports={containStroke:function(t,e,i,n,a,o,r){if(0===a)return!1;var s=a,l=0,u=t;if(r>e+s&&r>n+s||r<e-s&&r<n-s||o>t+s&&o>i+s||o<t-s&&o<i-s)return!1;if(t===i)return Math.abs(o-t)<=s/2;l=(e-n)/(t-i),u=(t*n-i*e)/(t-i);var c=l*o-r+u,h=c*c/(l*l+1);return h<=s/2*s/2}}},function(t,e,i){var n=i(20);t.exports={containStroke:function(t,e,i,a,o,r,s,l,u){if(0===s)return!1;var c=s;if(u>e+c&&u>a+c&&u>r+c||u<e-c&&u<a-c&&u<r-c||l>t+c&&l>i+c&&l>o+c||l<t-c&&l<i-c&&l<o-c)return!1;var h=n.quadraticProjectPoint(t,e,i,a,o,r,l,u,null);return h<=c/2}}},function(t,e){t.exports=function(t,e,i,n,a,o){if(o>e&&o>n||o<e&&o<n)return 0;if(n===e)return 0;var r=n<e?1:-1,s=(o-e)/(n-e);1!==s&&0!==s||(r=n<e?.5:-.5);var l=s*(i-t)+t;return l>a?r:0}},function(t,e,i){"use strict";var n=i(1),a=i(39),o=function(t,e,i,n,o,r){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==i?1:i,this.y2=null==n?0:n,this.type="linear",this.global=r||!1,a.call(this,o)};o.prototype={constructor:o},n.inherits(o,a),t.exports=o},function(t,e,i){"use strict";function n(t){a.each(o,function(e){this[e]=a.bind(t[e],t)},this)}var a=i(1),o=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"];t.exports=n},function(t,e,i){var n=i(1);i(57),i(103),i(104);var a=i(82),o=i(2);o.registerLayout(n.curry(a,"bar")),o.registerVisual(function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),i(32)},function(t,e,i){t.exports=i(90).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"})},function(t,e,i){"use strict";function n(t,e,i){i.style.text="",l.updateProps(i,{shape:{width:0}},e,t,function(){i.parent&&i.parent.remove(i)})}function a(t,e,i){i.style.text="",l.updateProps(i,{shape:{r:i.shape.r0}},e,t,function(){i.parent&&i.parent.remove(i)})}function o(t,e,i,n,a,o,r,c){var h=e.getItemVisual(i,"color"),d=e.getItemVisual(i,"opacity"),f=n.getModel("itemStyle.normal"),p=n.getModel("itemStyle.emphasis").getBarItemStyle();!c&&r&&t.setShape("r",f.get("barBorderRadius")||0),t.useStyle(s.defaults({fill:h,opacity:d},f.getBarItemStyle()));var g=r?a.height>0?"bottom":"top":a.width>0?"left":"right";c||u.setLabel(t.style,p,n,h,o,i,g),l.setHoverStyle(t,p)}function r(t,e){var i=t.get(c)||0;return Math.min(i,Math.abs(e.width),Math.abs(e.height))}var s=i(1),l=i(3),u=i(91),c=["itemStyle","normal","barBorderWidth"];s.extend(i(10).prototype,i(105));var h=i(2).extendChartView({type:"bar",render:function(t,e,i){var n=t.get("coordinateSystem");return"cartesian2d"!==n&&"polar"!==n||this._render(t,e,i),this.group},dispose:s.noop,_render:function(t,e,i){var r,s=this.group,u=t.getData(),c=this._data,h=t.coordinateSystem,p=h.getBaseAxis();"cartesian2d"===h.type?r=p.isHorizontal():"polar"===h.type&&(r="angle"===p.dim);var g=t.isAnimationEnabled()?t:null;u.diff(c).add(function(e){if(u.hasValue(e)){var i=u.getItemModel(e),n=f[h.type](u,e,i),a=d[h.type](u,e,i,n,r,g);u.setItemGraphicEl(e,a),s.add(a),o(a,u,e,i,n,t,r,"polar"===h.type)}}).update(function(e,i){var n=c.getItemGraphicEl(i);if(!u.hasValue(e))return void s.remove(n);var a=u.getItemModel(e),p=f[h.type](u,e,a);n?l.updateProps(n,{shape:p},g,e):n=d[h.type](u,e,a,p,r,g,!0),u.setItemGraphicEl(e,n),s.add(n),o(n,u,e,a,p,t,r,"polar"===h.type)}).remove(function(t){var e=c.getItemGraphicEl(t);"cartesian2d"===h.type?e&&n(t,g,e):e&&a(t,g,e)}).execute(),this._data=u},remove:function(t,e){var i=this.group,o=this._data;t.get("animation")?o&&o.eachItemGraphicEl(function(e){"sector"===e.type?a(e.dataIndex,t,e):n(e.dataIndex,t,e)}):i.removeAll()}}),d={cartesian2d:function(t,e,i,n,a,o,r){var u=new l.Rect({shape:s.extend({},n)});if(o){var c=u.shape,h=a?"height":"width",d={};c[h]=0,d[h]=n[h],l[r?"updateProps":"initProps"](u,{shape:d},o,e)}return u},polar:function(t,e,i,n,a,o,r){var u=new l.Sector({shape:s.extend({},n)});if(o){var c=u.shape,h=a?"r":"endAngle",d={};c[h]=a?0:n.startAngle,d[h]=n[h],l[r?"updateProps":"initProps"](u,{shape:d},o,e)}return u}},f={cartesian2d:function(t,e,i){var n=t.getItemLayout(e),a=r(i,n),o=n.width>0?1:-1,s=n.height>0?1:-1;return{x:n.x+o*a/2,y:n.y+s*a/2,width:n.width-o*a,height:n.height-s*a}},polar:function(t,e,i){var n=t.getItemLayout(e);return{cx:n.cx,cy:n.cy,r0:n.r0,r:n.r,startAngle:n.startAngle,endAngle:n.endAngle}}};t.exports=h},function(t,e,i){var n=i(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getBarItemStyle:function(t){var e=n.call(this,t);if(this.getBorderLineDash){var i=this.getBorderLineDash();i&&(e.lineDash=i)}return e}}},function(t,e,i){function n(t){return"_"+t+"Type"}function a(t,e,i){var n=e.getItemVisual(i,"color"),a=e.getItemVisual(i,t),o=e.getItemVisual(i,t+"Size");if(a&&"none"!==a){f.isArray(o)||(o=[o,o]);var r=u.createSymbol(a,-o[0]/2,-o[1]/2,o[0],o[1],n);return r.name=t,r}}function o(t){var e=new h({name:"line"});return r(e.shape,t),e}function r(t,e){var i=e[0],n=e[1],a=e[2];t.x1=i[0],t.y1=i[1],t.x2=n[0],t.y2=n[1],t.percent=1,a?(t.cpx1=a[0],t.cpy1=a[1]):(t.cpx1=NaN,t.cpy1=NaN)}function s(){var t=this,e=t.childOfName("fromSymbol"),i=t.childOfName("toSymbol"),n=t.childOfName("label");if(e||i||!n.ignore){for(var a=1,o=this.parent;o;)o.scale&&(a/=o.scale[0]),o=o.parent;var r=t.childOfName("line");if(this.__dirty||r.__dirty){var s=r.shape.percent,l=r.pointAt(0),u=r.pointAt(s),h=c.sub([],u,l);if(c.normalize(h,h),e){e.attr("position",l);var d=r.tangentAt(0);e.attr("rotation",Math.PI/2-Math.atan2(d[1],d[0])),e.attr("scale",[a*s,a*s])}if(i){i.attr("position",u);var d=r.tangentAt(1);i.attr("rotation",-Math.PI/2-Math.atan2(d[1],d[0])),i.attr("scale",[a*s,a*s])}if(!n.ignore){n.attr("position",u);var f,p,g,m=5*a;if("end"===n.__position)f=[h[0]*m+u[0],h[1]*m+u[1]],p=h[0]>.8?"left":h[0]<-.8?"right":"center",g=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";else if("middle"===n.__position){var v=s/2,d=r.tangentAt(v),y=[d[1],-d[0]],x=r.pointAt(v);y[1]>0&&(y[0]=-y[0],y[1]=-y[1]),f=[x[0]+y[0]*m,x[1]+y[1]*m],p="center",g="bottom";var _=-Math.atan2(d[1],d[0]);u[0]<l[0]&&(_=Math.PI+_),n.attr("rotation",_)}else f=[-h[0]*m+l[0],-h[1]*m+l[1]],p=h[0]>.8?"right":h[0]<-.8?"left":"center",g=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";n.attr({style:{textVerticalAlign:n.__verticalAlign||g,textAlign:n.__textAlign||p},position:f,scale:[a,a]})}}}}function l(t,e,i){d.Group.call(this),this._createLine(t,e,i)}var u=i(24),c=i(6),h=i(190),d=i(3),f=i(1),p=i(4),g=["fromSymbol","toSymbol"],m=l.prototype;m.beforeUpdate=s,m._createLine=function(t,e,i){var r=t.hostModel,s=t.getItemLayout(e),l=o(s);l.shape.percent=0,d.initProps(l,{shape:{percent:1}},r,e),this.add(l);var u=new d.Text({name:"label"});this.add(u),f.each(g,function(i){var o=a(i,t,e);this.add(o),this[n(i)]=t.getItemVisual(e,i)},this),this._updateCommonStl(t,e,i)},m.updateData=function(t,e,i){var o=t.hostModel,s=this.childOfName("line"),l=t.getItemLayout(e),u={shape:{}};r(u.shape,l),d.updateProps(s,u,o,e),f.each(g,function(i){var o=t.getItemVisual(e,i),r=n(i);if(this[r]!==o){this.remove(this.childOfName(i));var s=a(i,t,e);this.add(s)}this[r]=o},this),this._updateCommonStl(t,e,i)},m._updateCommonStl=function(t,e,i){var n=t.hostModel,a=this.childOfName("line"),o=i&&i.lineStyle,r=i&&i.hoverLineStyle,s=i&&i.labelModel,l=i&&i.hoverLabelModel;if(!i||t.hasItemOption){var u=t.getItemModel(e);o=u.getModel("lineStyle.normal").getLineStyle(),r=u.getModel("lineStyle.emphasis").getLineStyle(),s=u.getModel("label.normal"),l=u.getModel("label.emphasis")}var c=t.getItemVisual(e,"color"),h=f.retrieve(t.getItemVisual(e,"opacity"),o.opacity,1);a.useStyle(f.defaults({strokeNoScale:!0,fill:"none",stroke:c,opacity:h},o)),a.hoverStyle=r,f.each(g,function(t){var e=this.childOfName(t);e&&(e.setColor(c),e.setStyle({opacity:h}))},this);var m,v,y=s.getShallow("show"),x=l.getShallow("show"),_=this.childOfName("label");if(y||x){var b=n.getRawValue(e);v=null==b?v=t.getName(e):isFinite(b)?p.round(b):b,m=c||"#000"}if(y){var w=s.getModel("textStyle");_.setStyle({text:f.retrieve(n.getFormattedLabel(e,"normal",t.dataType),v),textFont:w.getFont(),fill:w.getTextColor()||m}),_.__textAlign=w.get("align"),_.__verticalAlign=w.get("baseline"),_.__position=s.get("position")}else _.setStyle("text","");if(x){var S=l.getModel("textStyle");_.hoverStyle={text:f.retrieve(n.getFormattedLabel(e,"emphasis",t.dataType),v),textFont:S.getFont(),fill:S.getTextColor()||m}}else _.hoverStyle={text:""};_.ignore=!y&&!x,d.setHoverStyle(this)},m.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},m.setLinePoints=function(t){var e=this.childOfName("line");r(e.shape,t),e.dirty()},f.inherits(l,d.Group),t.exports=l},function(t,e,i){function n(t){return isNaN(t[0])||isNaN(t[1])}function a(t){return!n(t[0])&&!n(t[1])}function o(t){this._ctor=t||s,this.group=new r.Group}var r=i(3),s=i(106),l=o.prototype;l.updateData=function(t){var e=this._lineData,i=this.group,n=this._ctor,o=t.hostModel,r={lineStyle:o.getModel("lineStyle.normal").getLineStyle(),hoverLineStyle:o.getModel("lineStyle.emphasis").getLineStyle(),labelModel:o.getModel("label.normal"),hoverLabelModel:o.getModel("label.emphasis")};t.diff(e).add(function(e){if(a(t.getItemLayout(e))){var o=new n(t,e,r);t.setItemGraphicEl(e,o),i.add(o)}}).update(function(o,s){var l=e.getItemGraphicEl(s);return a(t.getItemLayout(o))?(l?l.updateData(t,o,r):l=new n(t,o,r),t.setItemGraphicEl(o,l),void i.add(l)):void i.remove(l)}).remove(function(t){i.remove(e.getItemGraphicEl(t))}).execute(),this._lineData=t},l.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,i){e.updateLayout(t,i)},this)},l.remove=function(){this.group.removeAll()},t.exports=o},function(t,e,i){var n=i(1),a=i(2),o=a.PRIORITY;i(109),i(110),a.registerVisual(n.curry(i(50),"line","circle","line")),a.registerLayout(n.curry(i(61),"line")),a.registerProcessor(o.PROCESSOR.STATISTIC,n.curry(i(147),"line")),i(32)},function(t,e,i){"use strict";var n=i(28),a=i(17);t.exports=a.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return n(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}})},function(t,e,i){"use strict";function n(t,e){if(t.length===e.length){for(var i=0;i<t.length;i++){var n=t[i],a=e[i];if(n[0]!==a[0]||n[1]!==a[1])return}return!0}}function a(t){return"number"==typeof t?t:t?.3:0}function o(t){var e=t.getGlobalExtent();if(t.onBand){var i=t.getBandWidth()/2-1,n=e[1]>e[0]?1:-1;e[0]+=n*i,e[1]-=n*i}return e}function r(t){return t>=0?1:-1}function s(t,e){var i=t.getBaseAxis(),n=t.getOtherAxis(i),a=i.onZero?0:n.scale.getExtent()[0],o=n.dim,s="x"===o||"radius"===o?1:0;return e.mapArray([o],function(n,l){for(var u,c=e.stackedOn;c&&r(c.get(o,l))===r(n);){u=c;break}var h=[];return h[s]=e.get(i.dim,l),h[1-s]=u?u.get(o,l,!0):a,t.dataToPoint(h)},!0)}function l(t,e,i){var n=o(t.getAxis("x")),a=o(t.getAxis("y")),r=t.getBaseAxis().isHorizontal(),s=Math.min(n[0],n[1]),l=Math.min(a[0],a[1]),u=Math.max(n[0],n[1])-s,c=Math.max(a[0],a[1])-l,h=i.get("lineStyle.normal.width")||2,d=i.get("clipOverflow")?h/2:Math.max(u,c);r?(l-=d,c+=2*d):(s-=d,u+=2*d);var f=new v.Rect({shape:{x:s,y:l,width:u,height:c}});return e&&(f.shape[r?"width":"height"]=0,v.initProps(f,{shape:{width:u,height:c}},i)),f}function u(t,e,i){var n=t.getAngleAxis(),a=t.getRadiusAxis(),o=a.getExtent(),r=n.getExtent(),s=Math.PI/180,l=new v.Sector({shape:{cx:t.cx,cy:t.cy,r0:o[0],r:o[1],startAngle:-r[0]*s,endAngle:-r[1]*s,clockwise:n.inverse}});return e&&(l.shape.endAngle=-r[0]*s,v.initProps(l,{shape:{endAngle:-r[1]*s}},i)),l}function c(t,e,i){return"polar"===t.type?u(t,e,i):l(t,e,i)}function h(t,e,i){for(var n=e.getBaseAxis(),a="x"===n.dim||"radius"===n.dim?0:1,o=[],r=0;r<t.length-1;r++){var s=t[r+1],l=t[r];o.push(l);var u=[];switch(i){case"end":u[a]=s[a],u[1-a]=l[1-a],o.push(u);break;case"middle":var c=(l[a]+s[a])/2,h=[];u[a]=h[a]=c,u[1-a]=l[1-a],h[1-a]=s[1-a],o.push(u),o.push(h);break;default:u[a]=l[a],u[1-a]=s[1-a],o.push(u)}}return t[r]&&o.push(t[r]),o}function d(t,e){var i=t.getVisual("visualMeta");if(i&&i.length&&t.count()){for(var n,a=i.length-1;a>=0;a--)if(i[a].dimension<2){n=i[a];break}if(n&&"cartesian2d"===e.type){var o=n.dimension,r=t.dimensions[o],s=e.getAxis(r),l=f.map(n.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),u=l.length,c=n.outerColors.slice();u&&l[0].coord>l[u-1].coord&&(l.reverse(),c.reverse());var h=10,d=l[0].coord-h,p=l[u-1].coord+h,g=p-d;if(g<.001)return"transparent";f.each(l,function(t){t.offset=(t.coord-d)/g}),l.push({offset:u?l[u-1].offset:.5,color:c[1]||"transparent"}),l.unshift({offset:u?l[0].offset:.5,color:c[0]||"transparent"});var m=new v.LinearGradient(0,0,0,0,l,(!0));return m[r]=d,m[r+"2"]=p,m}}}var f=i(1),p=i(44),g=i(54),m=i(111),v=i(3),y=i(5),x=i(93),_=i(30);t.exports=_.extend({type:"line",init:function(){var t=new v.Group,e=new p;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var o=t.coordinateSystem,r=this.group,l=t.getData(),u=t.getModel("lineStyle.normal"),p=t.getModel("areaStyle.normal"),g=l.mapArray(l.getItemLayout,!0),m="polar"===o.type,v=this._coordSys,y=this._symbolDraw,x=this._polyline,_=this._polygon,b=this._lineGroup,w=t.get("animation"),S=!p.isEmpty(),M=s(o,l),I=t.get("showSymbol"),T=I&&!m&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,o),A=this._data;A&&A.eachItemGraphicEl(function(t,e){t.__temp&&(r.remove(t),A.setItemGraphicEl(e,null))}),I||y.remove(),r.add(b);var C=!m&&t.get("step");x&&v.type===o.type&&C===this._step?(S&&!_?_=this._newPolygon(g,M,o,w):_&&!S&&(b.remove(_),_=this._polygon=null),b.setClipPath(c(o,!1,t)),I&&y.updateData(l,T),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),n(this._stackedOnPoints,M)&&n(this._points,g)||(w?this._updateAnimation(l,M,o,i,C):(C&&(g=h(g,o,C),M=h(M,o,C)),x.setShape({points:g}),_&&_.setShape({points:g,stackedOnPoints:M})))):(I&&y.updateData(l,T),C&&(g=h(g,o,C),M=h(M,o,C)),x=this._newPolyline(g,o,w),S&&(_=this._newPolygon(g,M,o,w)),b.setClipPath(c(o,!0,t)));var L=d(l,o)||l.getVisual("color");x.useStyle(f.defaults(u.getLineStyle(),{fill:"none",stroke:L,lineJoin:"bevel"}));var D=t.get("smooth");if(D=a(t.get("smooth")),x.setShape({smooth:D,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),_){var P=l.stackedOn,k=0;if(_.useStyle(f.defaults(p.getAreaStyle(),{fill:L,opacity:.7,lineJoin:"bevel"})),P){var O=P.hostModel;k=a(O.get("smooth"))}_.setShape({smooth:D,stackedOnSmooth:k,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=l,this._coordSys=o,this._stackedOnPoints=M,this._points=g,this._step=C},dispose:function(){},highlight:function(t,e,i,n){var a=t.getData(),o=y.queryDataIndex(a,n);if(!(o instanceof Array)&&null!=o&&o>=0){var r=a.getItemGraphicEl(o);if(!r){var s=a.getItemLayout(o);if(!s)return;r=new g(a,o),r.position=s,r.setZ(t.get("zlevel"),t.get("z")),r.ignore=isNaN(s[0])||isNaN(s[1]),r.__temp=!0,a.setItemGraphicEl(o,r),r.stopSymbolAnimation(!0),this.group.add(r)}r.highlight()}else _.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var a=t.getData(),o=y.queryDataIndex(a,n);if(null!=o&&o>=0){var r=a.getItemGraphicEl(o);r&&(r.__temp?(a.setItemGraphicEl(o,null),this.group.remove(r)):r.downplay())}else _.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new x.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new x.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i,i},_getSymbolIgnoreFunc:function(t,e){var i=e.getAxesByScale("ordinal")[0];if(i&&i.isLabelIgnored)return f.bind(i.isLabelIgnored,i)},_updateAnimation:function(t,e,i,n,a){var o=this._polyline,r=this._polygon,s=t.hostModel,l=m(this._data,t,this._stackedOnPoints,e,this._coordSys,i),u=l.current,c=l.stackedOnCurrent,d=l.next,f=l.stackedOnNext;a&&(u=h(l.current,i,a),c=h(l.stackedOnCurrent,i,a),d=h(l.next,i,a),f=h(l.stackedOnNext,i,a)),o.shape.__points=l.current,o.shape.points=u,v.updateProps(o,{shape:{points:d}},s),r&&(r.setShape({points:u,stackedOnPoints:c}),v.updateProps(r,{shape:{points:d,stackedOnPoints:f}},s));for(var p=[],g=l.status,y=0;y<g.length;y++){var x=g[y].cmd;if("="===x){var _=t.getItemGraphicEl(g[y].idx1);_&&p.push({el:_,ptIdx:y})}}o.animators&&o.animators.length&&o.animators[0].during(function(){for(var t=0;t<p.length;t++){var e=p[t].el;e.attr("position",o.shape.__points[p[t].ptIdx])}})},remove:function(t){var e=this.group,i=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),i&&i.eachItemGraphicEl(function(t,n){t.__temp&&(e.remove(t),i.setItemGraphicEl(n,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}})},function(t,e){function i(t){return t>=0?1:-1}function n(t,e,n){for(var a,o=t.getBaseAxis(),r=t.getOtherAxis(o),s=o.onZero?0:r.scale.getExtent()[0],l=r.dim,u="x"===l||"radius"===l?1:0,c=e.stackedOn,h=e.get(l,n);c&&i(c.get(l,n))===i(h);){a=c;break}var d=[];return d[u]=e.get(o.dim,n),d[1-u]=a?a.get(l,n,!0):s,t.dataToPoint(d)}function a(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+",idx:t})}).update(function(t,e){i.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){i.push({cmd:"-",idx:t})}).execute(),i}t.exports=function(t,e,i,o,r,s){for(var l=a(t,e),u=[],c=[],h=[],d=[],f=[],p=[],g=[],m=s.dimensions,v=0;v<l.length;v++){var y=l[v],x=!0;switch(y.cmd){case"=":var _=t.getItemLayout(y.idx),b=e.getItemLayout(y.idx1);(isNaN(_[0])||isNaN(_[1]))&&(_=b.slice()),u.push(_),c.push(b),h.push(i[y.idx]),d.push(o[y.idx1]),g.push(e.getRawIndex(y.idx1));break;case"+":var w=y.idx;u.push(r.dataToPoint([e.get(m[0],w,!0),e.get(m[1],w,!0)])),c.push(e.getItemLayout(w).slice()),h.push(n(r,e,w)),d.push(o[w]),g.push(e.getRawIndex(w));break;case"-":var w=y.idx,S=t.getRawIndex(w);S!==w?(u.push(t.getItemLayout(w)),c.push(s.dataToPoint([t.get(m[0],w,!0),t.get(m[1],w,!0)])),h.push(i[w]),d.push(n(s,t,w)),g.push(S)):x=!1}x&&(f.push(y),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});for(var M=[],I=[],T=[],A=[],C=[],v=0;v<p.length;v++){var w=p[v];M[v]=u[w],I[v]=c[w],T[v]=h[w],A[v]=d[w],C[v]=f[w]}return{current:M,next:I,stackedOnCurrent:T,stackedOnNext:A,status:C}}},function(t,e,i){var n=i(1),a=i(2);i(113),i(114),i(89)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),a.registerVisual(n.curry(i(84),"pie")),a.registerLayout(n.curry(i(116),"pie")),a.registerProcessor(n.curry(i(63),"pie"))},function(t,e,i){"use strict";var n=i(14),a=i(1),o=i(5),r=i(25),s=i(78),l=i(2).extendSeriesModel({type:"series.pie",init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(t.data),this._defaultLabelLine(t)},mergeOption:function(t){l.superCall(this,"mergeOption",t),this.updateSelectedMap(this.option.data)},getInitialData:function(t,e){var i=r(["value"],t.data),a=new n(i,this);return a.initData(t.data),a},getDataParams:function(t){var e=this.getData(),i=l.superCall(this,"getDataParams",t),n=e.getSum("value");return i.percent=n?+(e.get("value",t)/n*100).toFixed(2):0,i.$vars.push("percent"),i},_defaultLabelLine:function(t){o.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,stillShowZeroSum:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderWidth:1},emphasis:{}},animationType:"expansion",animationEasing:"cubicOut",data:[]}});a.mixin(l,s),t.exports=l},function(t,e,i){function n(t,e,i,n){var o=e.getData(),r=this.dataIndex,s=o.getName(r),l=e.get("selectedOffset");n.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),o.each(function(t){a(o.getItemGraphicEl(t),o.getItemLayout(t),e.isSelected(o.getName(t)),l,i)})}function a(t,e,i,n,a){var o=(e.startAngle+e.endAngle)/2,r=Math.cos(o),s=Math.sin(o),l=i?n:0,u=[r*l,s*l];a?t.animate().when(200,{position:u}).start("bounceOut"):t.attr("position",u)}function o(t,e){function i(){o.ignore=o.hoverIgnore,r.ignore=r.hoverIgnore}function n(){o.ignore=o.normalIgnore,r.ignore=r.normalIgnore}s.Group.call(this);var a=new s.Sector({z2:2}),o=new s.Polyline,r=new s.Text;this.add(a),this.add(o),this.add(r),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function r(t,e,i,n,a){var o=n.getModel("textStyle"),r="inside"===a||"inner"===a;return{fill:o.getTextColor()||(r?"#fff":t.getItemVisual(e,"color")),opacity:t.getItemVisual(e,"opacity"),textFont:o.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var s=i(3),l=i(1),u=o.prototype;u.updateData=function(t,e,i){function n(){r.stopAnimation(!0),r.animateTo({shape:{r:h.r+10}},300,"elasticOut")}function o(){r.stopAnimation(!0),r.animateTo({shape:{r:h.r}},300,"elasticOut")}var r=this.childAt(0),u=t.hostModel,c=t.getItemModel(e),h=t.getItemLayout(e),d=l.extend({},h);if(d.label=null,i){r.setShape(d);var f=u.getShallow("animationType");"scale"===f?(r.shape.r=h.r0,s.initProps(r,{shape:{r:h.r}},u,e)):(r.shape.endAngle=h.startAngle,s.updateProps(r,{
+shape:{endAngle:h.endAngle}},u,e))}else s.updateProps(r,{shape:d},u,e);var p=c.getModel("itemStyle"),g=t.getItemVisual(e,"color");r.useStyle(l.defaults({lineJoin:"bevel",fill:g},p.getModel("normal").getItemStyle())),r.hoverStyle=p.getModel("emphasis").getItemStyle(),a(this,t.getItemLayout(e),c.get("selected"),u.get("selectedOffset"),u.get("animation")),r.off("mouseover").off("mouseout").off("emphasis").off("normal"),c.get("hoverAnimation")&&u.isAnimationEnabled()&&r.on("mouseover",n).on("mouseout",o).on("emphasis",n).on("normal",o),this._updateLabel(t,e),s.setHoverStyle(this)},u._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),a=t.hostModel,o=t.getItemModel(e),l=t.getItemLayout(e),u=l.label,c=t.getItemVisual(e,"color");s.updateProps(i,{shape:{points:u.linePoints||[[u.x,u.y],[u.x,u.y],[u.x,u.y]]}},a,e),s.updateProps(n,{style:{x:u.x,y:u.y}},a,e),n.attr({style:{textVerticalAlign:u.verticalAlign,textAlign:u.textAlign,textFont:u.font},rotation:u.rotation,origin:[u.x,u.y],z2:10});var h=o.getModel("label.normal"),d=o.getModel("label.emphasis"),f=o.getModel("labelLine.normal"),p=o.getModel("labelLine.emphasis"),g=h.get("position")||d.get("position");n.setStyle(r(t,e,"normal",h,g)),n.ignore=n.normalIgnore=!h.get("show"),n.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:c,opacity:t.getItemVisual(e,"opacity")}),i.setStyle(f.getModel("lineStyle").getLineStyle()),n.hoverStyle=r(t,e,"emphasis",d,g),i.hoverStyle=p.getModel("lineStyle").getLineStyle();var m=f.get("smooth");m&&m===!0&&(m=.4),i.setShape({smooth:m})},l.inherits(o,s.Group);var c=i(30).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,i,a){if(!a||a.from!==this.uid){var r=t.getData(),s=this._data,u=this.group,c=e.get("animation"),h=!s,d=t.get("animationType"),f=l.curry(n,this.uid,t,c,i),p=t.get("selectedMode");if(r.diff(s).add(function(t){var e=new o(r,t);h&&"scale"!==d&&e.eachChild(function(t){t.stopAnimation(!0)}),p&&e.on("click",f),r.setItemGraphicEl(t,e),u.add(e)}).update(function(t,e){var i=s.getItemGraphicEl(e);i.updateData(r,t),i.off("click"),p&&i.on("click",f),u.add(i),r.setItemGraphicEl(t,i)}).remove(function(t){var e=s.getItemGraphicEl(t);u.remove(e)}).execute(),c&&h&&r.count()>0&&"scale"!==d){var g=r.getItemLayout(0),m=Math.max(i.getWidth(),i.getHeight())/2,v=l.bind(u.removeClipPath,u);u.setClipPath(this._createClipPath(g.cx,g.cy,m,g.startAngle,g.clockwise,v,t))}this._data=r}},dispose:function(){},_createClipPath:function(t,e,i,n,a,o,r){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:i,startAngle:n,endAngle:n,clockwise:a}});return s.initProps(l,{shape:{endAngle:n+(a?1:-1)*Math.PI*2}},r,o),l},containPoint:function(t,e){var i=e.getData(),n=i.getItemLayout(0);if(n){var a=t[0]-n.cx,o=t[1]-n.cy,r=Math.sqrt(a*a+o*o);return r<=n.r&&r>=n.r0}}});t.exports=c},function(t,e,i){"use strict";function n(t,e,i,n,a,o,r){function s(e,i,n,a){for(var o=e;o<i;o++)if(t[o].y+=n,o>e&&o+1<i&&t[o+1].y>t[o].y+t[o].height)return void l(o,n/2);l(i-1,n/2)}function l(e,i){for(var n=e;n>=0&&(t[n].y-=i,!(n>0&&t[n].y>t[n-1].y+t[n-1].height));n--);}function u(t,e,i,n,a,o){for(var r=o>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var u=Math.abs(t[s].y-n),c=t[s].len,h=t[s].len2,d=u<a+c?Math.sqrt((a+c+h)*(a+c+h)-u*u):Math.abs(t[s].x-i);e&&d>=r&&(d=r-10),!e&&d<=r&&(d=r+10),t[s].x=i+d*o,r=d}}t.sort(function(t,e){return t.y-e.y});for(var c,h=0,d=t.length,f=[],p=[],g=0;g<d;g++)c=t[g].y-h,c<0&&s(g,d,-c,a),h=t[g].y+t[g].height;r-h<0&&l(d-1,h-r);for(var g=0;g<d;g++)t[g].y>=i?p.push(t[g]):f.push(t[g]);u(f,!1,e,i,n,a),u(p,!0,e,i,n,a)}function a(t,e,i,a,o,r){for(var s=[],l=[],u=0;u<t.length;u++)t[u].x<e?s.push(t[u]):l.push(t[u]);n(l,e,i,a,1,o,r),n(s,e,i,a,-1,o,r);for(var u=0;u<t.length;u++){var c=t[u].linePoints;if(c){var h=c[1][0]-c[2][0];t[u].x<e?c[2][0]=t[u].x+3:c[2][0]=t[u].x-3,c[1][1]=c[2][1]=t[u].y,c[1][0]=c[2][0]+h}}}var o=i(16);t.exports=function(t,e,i,n){var r,s,l=t.getData(),u=[],c=!1;l.each(function(i){var n,a,h,d,f=l.getItemLayout(i),p=l.getItemModel(i),g=p.getModel("label.normal"),m=g.get("position")||p.get("label.emphasis.position"),v=p.getModel("labelLine.normal"),y=v.get("length"),x=v.get("length2"),_=(f.startAngle+f.endAngle)/2,b=Math.cos(_),w=Math.sin(_);r=f.cx,s=f.cy;var S="inside"===m||"inner"===m;if("center"===m)n=f.cx,a=f.cy,d="center";else{var M=(S?(f.r+f.r0)/2*b:f.r*b)+r,I=(S?(f.r+f.r0)/2*w:f.r*w)+s;if(n=M+3*b,a=I+3*w,!S){var T=M+b*(y+e-f.r),A=I+w*(y+e-f.r),C=T+(b<0?-1:1)*x,L=A;n=C+(b<0?-5:5),a=L,h=[[M,I],[T,A],[C,L]]}d=S?"center":b>0?"left":"right"}var D=g.getModel("textStyle").getFont(),P=g.get("rotate")?b<0?-_+Math.PI:-_:0,k=t.getFormattedLabel(i,"normal")||l.getName(i),O=o.getBoundingRect(k,D,d,"top");c=!!P,f.label={x:n,y:a,position:m,height:O.height,len:y,len2:x,linePoints:h,textAlign:d,verticalAlign:"middle",font:D,rotation:P},S||u.push(f.label)}),!c&&t.get("avoidLabelOverlap")&&a(u,r,s,e,i,n)}},function(t,e,i){var n=i(4),a=n.parsePercent,o=i(115),r=i(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,i,u){e.eachSeriesByType(t,function(t){var e=t.get("center"),u=t.get("radius");r.isArray(u)||(u=[0,u]),r.isArray(e)||(e=[e,e]);var c=i.getWidth(),h=i.getHeight(),d=Math.min(c,h),f=a(e[0],c),p=a(e[1],h),g=a(u[0],d/2),m=a(u[1],d/2),v=t.getData(),y=-t.get("startAngle")*l,x=t.get("minAngle")*l,_=0;v.each("value",function(t){!isNaN(t)&&_++});var b=v.getSum("value"),w=Math.PI/(b||_)*2,S=t.get("clockwise"),M=t.get("roseType"),I=t.get("stillShowZeroSum"),T=v.getDataExtent("value");T[0]=0;var A=s,C=0,L=y,D=S?1:-1;if(v.each("value",function(t,e){var i;if(isNaN(t))return void v.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:S,cx:f,cy:p,r0:g,r:M?NaN:m});i="area"!==M?0===b&&I?w:t*w:s/_,i<x?(i=x,A-=x):C+=t;var a=L+D*i;v.setItemLayout(e,{angle:i,startAngle:L,endAngle:a,clockwise:S,cx:f,cy:p,r0:g,r:M?n.linearMap(t,T,[g,m]):m}),L=a},!0),A<s&&_)if(A<=.001){var P=s/_;v.each("value",function(t,e){if(!isNaN(t)){var i=v.getItemLayout(e);i.angle=P,i.startAngle=y+D*e*P,i.endAngle=y+D*(e+1)*P}})}else w=A/C,L=y,v.each("value",function(t,e){if(!isNaN(t)){var i=v.getItemLayout(e),n=i.angle===x?x:t*w;i.startAngle=L,i.endAngle=L+D*n,L+=D*n}});o(t,m,c,h)})}},function(t,e,i){"use strict";i(60),i(118)},function(t,e,i){var n=i(1),a=i(3),o=i(40),r=i(41),s=i(75),l=o.ifIgnoreOnTick,u=o.getInterval,c=["axisLine","axisLabel","axisTick","axisName"],h=["splitArea","splitLine"],d=r.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,i,r){this.group.removeAll();var l=this._axisGroup;if(this._axisGroup=new a.Group,this.group.add(this._axisGroup),t.get("show")){var u=t.getCoordSysModel(),f=s.layout(u,t),p=new o(t,f);n.each(c,p.add,p),this._axisGroup.add(p.getGroup()),n.each(h,function(e){t.get(e+".show")&&this["_"+e](t,u,f.labelInterval)},this),a.groupTransition(l,this._axisGroup,t),d.superCall(this,"render",t,e,i,r)}},_splitLine:function(t,e,i){var o=t.axis;if(!o.scale.isBlank()){var r=t.getModel("splitLine"),s=r.getModel("lineStyle"),c=s.get("color"),h=u(r,i);c=n.isArray(c)?c:[c];for(var d=e.coordinateSystem.getRect(),f=o.isHorizontal(),p=0,g=o.getTicksCoords(),m=o.scale.getTicks(),v=[],y=[],x=s.getLineStyle(),_=0;_<g.length;_++)if(!l(o,_,h)){var b=o.toGlobalCoord(g[_]);f?(v[0]=b,v[1]=d.y,y[0]=b,y[1]=d.y+d.height):(v[0]=d.x,v[1]=b,y[0]=d.x+d.width,y[1]=b);var w=p++%c.length;this._axisGroup.add(new a.Line(a.subPixelOptimizeLine({anid:"line_"+m[_],shape:{x1:v[0],y1:v[1],x2:y[0],y2:y[1]},style:n.defaults({stroke:c[w]},x),silent:!0})))}}},_splitArea:function(t,e,i){var o=t.axis;if(!o.scale.isBlank()){var r=t.getModel("splitArea"),s=r.getModel("areaStyle"),c=s.get("color"),h=e.coordinateSystem.getRect(),d=o.getTicksCoords(),f=o.scale.getTicks(),p=o.toGlobalCoord(d[0]),g=o.toGlobalCoord(d[0]),m=0,v=u(r,i),y=s.getAreaStyle();c=n.isArray(c)?c:[c];for(var x=1;x<d.length;x++)if(!l(o,x,v)){var _,b,w,S,M=o.toGlobalCoord(d[x]);o.isHorizontal()?(_=p,b=h.y,w=M-_,S=h.height):(_=h.x,b=g,w=h.width,S=M-b);var I=m++%c.length;this._axisGroup.add(new a.Rect({anid:"area_"+f[x],shape:{x:_,y:b,width:w,height:S},style:n.defaults({fill:c[I]},y),silent:!0})),p=_+w,g=b+S}}}});d.extend({type:"xAxis"}),d.extend({type:"yAxis"})},function(t,e,i){"use strict";function n(){}function a(t,e,i,n){o(f(i).lastProp,n)||(f(i).lastProp=n,e?d.updateProps(i,n,t):(i.stopAnimation(),i.attr(n)))}function o(t,e){if(c.isObject(t)&&c.isObject(e)){var i=!0;return c.each(e,function(e,n){i&=o(t[n],e)}),!!i}return t===e}function r(t,e){t[e.get("label.show")?"show":"hide"]()}function s(t){return{position:t.position.slice(),rotation:t.rotation||0}}function l(t,e){var i=t.get("icon"),n={x:-1,y:-1,width:2,height:2},a=c.extend({style:{strokeNoScale:!0},rectHover:!0,cursor:"move",draggable:!0},e);return 0===i.indexOf("image://")?(n.image=i.slice(8),a.style=n,new d.Image(a)):d.makePath(i.replace("path://",""),a,n,"center")}function u(t,e,i){var n=e.get("z"),a=e.get("zlevel");t&&t.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=a&&(t.zlevel=a),t.silent=i)})}var c=i(1),h=i(15),d=i(3),f=i(5).makeGetter(),p=i(45),g=i(21),m=i(37),v=c.clone,y=c.bind;n.prototype={_group:null,_lastGraphicKey:null,_handle:null,_dragging:!1,_lastValue:null,_lastStatus:null,_payloadInfo:null,animationThreshold:15,render:function(t,e,i,n){var o=e.get("value"),r=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=i,n||this._lastValue!==o||this._lastStatus!==r){this._lastValue=o,this._lastStatus=r;var s=this._group,l=this._handle;if(!r||"hide"===r)return s&&s.hide(),void(l&&l.hide());s&&s.show(),l&&l.show();var h={};this.makeElOption(h,o,t,e,i);var f=h.graphicKey;f!==this._lastGraphicKey&&this.clear(i),this._lastGraphicKey=f;var p=this._moveAnimation=this.determineAnimation(t,e);if(s){var g=c.curry(a,e,p);this.updatePointerEl(s,h,g,e),this.updateLabelEl(s,h,g,e)}else s=this._group=new d.Group,this.createPointerEl(s,h,t,e),this.createLabelEl(s,h,t,e),i.getZr().add(s);u(s,e,!0),this._renderHandle(o)}},remove:function(t){this.clear(t)},dispose:function(t){this.clear(t)},determineAnimation:function(t,e){var i=e.get("animation"),n=t.axis,a="category"===n.type,o=e.get("snap");if(!o&&!a)return!1;if("auto"===i||null==i){var r=this.animationThreshold;if(a&&n.getBandWidth()>r)return!0;if(o){var s=p.getAxisInfo(t).seriesDataCount,l=n.getExtent();return Math.abs(l[0]-l[1])/s>r}return!1}return i===!0},makeElOption:function(t,e,i,n,a){},createPointerEl:function(t,e,i,n){var a=e.pointer;if(a){var o=f(t).pointerEl=new d[a.type](v(e.pointer));t.add(o)}},createLabelEl:function(t,e,i,n){if(e.label){var a=f(t).labelEl=new d.Rect(v(e.label));t.add(a),r(a,n)}},updatePointerEl:function(t,e,i){var n=f(t).pointerEl;n&&(n.setStyle(e.pointer.style),i(n,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,i,n){var a=f(t).labelEl;a&&(a.setStyle(e.label.style),i(a,{shape:e.label.shape,position:e.label.position}),r(a,n))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e=this._axisPointerModel,i=this._api.getZr(),n=this._handle,a=e.getModel("handle"),o=e.get("status");if(!a.get("show")||!o||"hide"===o)return n&&i.remove(n),void(this._handle=null);var r;this._handle||(r=!0,n=this._handle=l(a,{onmousemove:function(t){g.stop(t.event)},onmousedown:y(this._onHandleDragMove,this,0,0),drift:y(this._onHandleDragMove,this),ondragend:y(this._onHandleDragEnd,this)}),i.add(n)),u(n,e,!1);var s=["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];n.setStyle(a.getItemStyle(null,s));var h=a.get("size");c.isArray(h)||(h=[h,h]),n.attr("scale",[h[0]/2,h[1]/2]),m.createOrUpdate(this,"_doDispatchAxisPointer",a.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,r)}},_moveHandleToValue:function(t,e){a(this._axisPointerModel,!e&&this._moveAnimation,this._handle,s(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var i=this._handle;if(i){this._dragging=!0;var n=this.updateHandleTransform(s(i),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=n,i.stopAnimation(),i.attr(s(n)),f(i).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){var t=this._handle;if(t){var e=this._payloadInfo,i=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:e.cursorPoint[0],y:e.cursorPoint[1],tooltipOption:e.tooltipOption,axesInfo:[{axisDim:i.axis.dim,axisIndex:i.componentIndex}]})}},_onHandleDragEnd:function(t){this._dragging=!1;var e=this._handle;if(e){var i=this._axisPointerModel.get("value");this._moveHandleToValue(i),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),i=this._group,n=this._handle;e&&i&&(this._lastGraphicKey=null,i&&e.remove(i),n&&e.remove(n),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,i){return i=i||0,{x:t[i],y:t[1-i],width:e[i],height:e[1-i]}}},n.prototype.constructor=n,h.enableClassExtend(n),t.exports=n},function(t,e,i){"use strict";function n(t,e){var i={};return i[e.dim+"AxisIndex"]=e.index,t.getCartesian(i)}function a(t){return"x"===t.dim?0:1}var o=i(3),r=i(119),s=i(76),l=i(75),u=i(41),c=r.extend({makeElOption:function(t,e,i,a,o){var r=i.axis,u=r.grid,c=a.get("type"),d=n(u,r).getOtherAxis(r).getGlobalExtent(),f=r.toGlobalCoord(r.dataToCoord(e,!0));if(c&&"none"!==c){var p=s.buildElStyle(a),g=h[c](r,f,d,p);g.style=p,t.graphicKey=g.type,t.pointer=g}var m=l.layout(u.model,i);s.buildCartesianSingleLabelElOption(e,t,m,i,a,o)},getHandleTransform:function(t,e,i){var n=l.layout(e.axis.grid.model,e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:s.getTransformedPosition(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,a){var o=i.axis,r=o.grid,s=o.getGlobalExtent(!0),l=n(r,o).getOtherAxis(o).getGlobalExtent(),u="x"===o.dim?0:1,c=t.position;c[u]+=e[u],c[u]=Math.min(s[1],c[u]),c[u]=Math.max(s[0],c[u]);var h=(l[1]+l[0])/2,d=[h,h];d[u]=c[u];var f=[{verticalAlign:"middle"},{align:"center"}];return{position:c,rotation:t.rotation,cursorPoint:d,tooltipOption:f[u]}}}),h={line:function(t,e,i,n){var r=s.makeLineShape([e,i[0]],[e,i[1]],a(t));return o.subPixelOptimizeLine({shape:r,style:n}),{type:"Line",shape:r}},shadow:function(t,e,i,n){var o=t.getBandWidth(),r=i[1]-i[0];return{type:"Rect",shape:s.makeRectShape([e-o/2,i[0]],[o,r],a(t))}}};u.registerAxisPointerClass("CartesianAxisPointer",c),t.exports=c},function(t,e,i){var n=i(1),a=i(5);t.exports=function(t,e){var i,o=[],r=t.seriesIndex;if(null==r||!(i=e.getSeriesByIndex(r)))return{point:[]};var s=i.getData(),l=a.queryDataIndex(s,t);if(null==l||n.isArray(l))return{point:[]};var u=s.getItemGraphicEl(l),c=i.coordinateSystem;if(i.getTooltipPosition)o=i.getTooltipPosition(l)||[];else if(c&&c.dataToPoint)o=c.dataToPoint(s.getValues(n.map(c.dimensions,function(t){return i.coordDimToDataDim(t)[0]}),l,!0))||[];else if(u){var h=u.getBoundingRect().clone();h.applyTransform(u.transform),o=[h.x+h.width/2,h.y+h.height/2]}return{point:o,el:u}}},function(t,e,i){function n(t,e){function i(i,n){t.on(i,function(i){var o=s(e);h(c(t).records,function(t){t&&n(t,i,o.dispatchAction)}),a(o.pendings,e)})}c(t).initialized||(c(t).initialized=!0,i("click",u.curry(r,"click")),i("mousemove",u.curry(r,"mousemove")),i("globalout",o))}function a(t,e){var i,n=t.showTip.length,a=t.hideTip.length;n?i=t.showTip[n-1]:a&&(i=t.hideTip[a-1]),i&&(i.dispatchAction=null,e.dispatchAction(i))}function o(t,e,i){t.handler("leave",null,i)}function r(t,e,i,n){e.handler(t,i,n)}function s(t){var e={showTip:[],hideTip:[]},i=function(n){var a=e[n.type];a?a.push(n):(n.dispatchAction=i,t.dispatchAction(n))};return{dispatchAction:i,pendings:e}}var l=i(9),u=i(1),c=i(5).makeGetter(),h=u.each,d={};d.register=function(t,e,i){if(!l.node){var a=e.getZr();c(a).records||(c(a).records={}),n(a,e);var o=c(a).records[t]||(c(a).records[t]={});o.handler=i}},d.unregister=function(t,e){if(!l.node){var i=e.getZr(),n=(c(i).records||{})[t];n&&(c(i).records[t]=null)}},t.exports=d},function(t,e,i){var n=i(1),a=i(77),o=i(2);o.registerAction("dataZoom",function(t,e){var i=a.createLinkedNodesFinder(n.bind(e.eachComponent,e,"dataZoom"),a.eachAxisDim,function(t,e){return t.get(e.axisIndex)}),o=[];e.eachComponent({mainType:"dataZoom",query:t},function(t,e){o.push.apply(o,i(t).nodes)}),n.each(o,function(e,i){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})})},function(t,e,i){function n(t,e,i){i.getAxisProxy(t.name,e).reset(i)}function a(t,e,i){i.getAxisProxy(t.name,e).filterData(i)}var o=i(2);o.registerProcessor(function(t,e){t.eachComponent("dataZoom",function(t){t.eachTargetAxis(n),t.eachTargetAxis(a)}),t.eachComponent("dataZoom",function(t){var e=t.findRepresentativeAxisProxy(),i=e.getDataPercentWindow(),n=e.getDataValueWindow();t.setRawRange({start:i[0],end:i[1],startValue:n[0],endValue:n[1]},!0)})})},function(t,e,i){function n(t){var e=t[r];return e||(e=t[r]=[{}]),e}var a=i(1),o=a.each,r="\0_ec_hist_store",s={push:function(t,e){var i=n(t);o(e,function(e,n){for(var a=i.length-1;a>=0;a--){var o=i[a];if(o[n])break}if(a<0){var r=t.queryComponents({mainType:"dataZoom",subType:"select",id:n})[0];if(r){var s=r.getPercentRange();i[0][n]={dataZoomId:n,start:s[0],end:s[1]}}}}),i.push(e)},pop:function(t){var e=n(t),i=e[e.length-1];e.length>1&&e.pop();var a={};return o(i,function(t,i){for(var n=e.length-1;n>=0;n--){var t=e[n][i];if(t){a[i]=t;break}}}),a},clear:function(t){t[r]=null},count:function(t){return n(t).length}};t.exports=s},function(t,e,i){i(13).registerSubTypeDefaulter("dataZoom",function(t){return"slider"})},function(t,e,i){function n(t){V.call(this),this._zr=t,this.group=new G.Group,this._brushType,this._brushOption,this._panels,this._track=[],this._dragging,this._covers=[],this._creatingCover,this._creatingPanel,this._enableGlobalPan,this._uid="brushController_"+it++,this._handlers={},Z(nt,function(t,e){this._handlers[e]=B.bind(t,this)},this)}function a(t,e){var i=t._zr;t._enableGlobalPan||H.take(i,J,t._uid),Z(t._handlers,function(t,e){i.on(e,t)}),t._brushType=e.brushType,t._brushOption=B.merge(B.clone(et),e,!0)}function o(t){var e=t._zr;H.release(e,J,t._uid),Z(t._handlers,function(t,i){e.off(i,t)}),t._brushType=t._brushOption=null}function r(t,e){var i=at[e.brushType].createCover(t,e);return i.__brushOption=e,u(i,e),t.group.add(i),i}function s(t,e){var i=h(e);return i.endCreating&&(i.endCreating(t,e),u(e,e.__brushOption)),e}function l(t,e){var i=e.__brushOption;h(e).updateCoverShape(t,e,i.range,i)}function u(t,e){var i=e.z;null==i&&(i=Y),t.traverse(function(t){t.z=i,t.z2=i})}function c(t,e){h(e).updateCommon(t,e),l(t,e)}function h(t){return at[t.__brushOption.brushType]}function d(t,e,i){var n=t._panels;if(!n)return!0;var a,o=t._transform;return Z(n,function(t){t.isTargetByCursor(e,i,o)&&(a=t)}),a}function f(t,e){var i=t._panels;if(!i)return!0;var n=e.__brushOption.panelId;return null==n||i[n]}function p(t){var e=t._covers,i=e.length;return Z(e,function(e){t.group.remove(e)},t),e.length=0,!!i}function g(t,e){var i=q(t._covers,function(t){var e=t.__brushOption,i=B.clone(e.range);return{brushType:e.brushType,panelId:e.panelId,range:i}});t.trigger("brush",i,{isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function m(t){var e=t._track;if(!e.length)return!1;var i=e[e.length-1],n=e[0],a=i[0]-n[0],o=i[1]-n[1],r=X(a*a+o*o,.5);return r>$}function v(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function y(t,e,i,n){var a=new G.Group;return a.add(new G.Rect({name:"main",style:w(i),silent:!0,draggable:!0,cursor:"move",drift:W(t,e,a,"nswe"),ondragend:W(g,e,{isEnd:!0})})),Z(n,function(i){a.add(new G.Rect({name:i,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:W(t,e,a,i),ondragend:W(g,e,{isEnd:!0})}))}),a}function x(t,e,i,n){var a=n.brushStyle.lineWidth||0,o=U(a,K),r=i[0][0],s=i[1][0],l=r-a/2,u=s-a/2,c=i[0][1],h=i[1][1],d=c-o+a/2,f=h-o+a/2,p=c-r,g=h-s,m=p+a,v=g+a;b(t,e,"main",r,s,p,g),n.transformable&&(b(t,e,"w",l,u,o,v),b(t,e,"e",d,u,o,v),b(t,e,"n",l,u,m,o),b(t,e,"s",l,f,m,o),b(t,e,"nw",l,u,o,o),b(t,e,"ne",d,u,o,o),b(t,e,"sw",l,f,o,o),b(t,e,"se",d,f,o,o))}function _(t,e){var i=e.__brushOption,n=i.transformable,a=e.childAt(0);a.useStyle(w(i)),a.attr({silent:!n,cursor:n?"move":"default"}),Z(["w","e","n","s","se","sw","ne","nw"],function(i){var a=e.childOfName(i),o=I(t,i);a&&a.attr({silent:!n,invisible:!n,cursor:n?tt[o]+"-resize":null})})}function b(t,e,i,n,a,o,r){var s=e.childOfName(i);s&&s.setShape(D(L(t,e,[[n,a],[n+o,a+r]])))}function w(t){return B.defaults({strokeNoScale:!0},t.brushStyle)}function S(t,e,i,n){var a=[j(t,i),j(e,n)],o=[U(t,i),U(e,n)];return[[a[0],o[0]],[a[1],o[1]]]}function M(t){return G.getTransform(t.group)}function I(t,e){if(e.length>1){e=e.split("");var i=[I(t,e[0]),I(t,e[1])];return("e"===i[0]||"w"===i[0])&&i.reverse(),i.join("")}var n={w:"left",e:"right",n:"top",s:"bottom"},a={left:"w",right:"e",top:"n",bottom:"s"},i=G.transformDirection(n[e],M(t));return a[i]}function T(t,e,i,n,a,o,r,s){var l=n.__brushOption,u=t(l.range),h=C(i,o,r);Z(a.split(""),function(t){var e=Q[t];u[e[0]][e[1]]+=h[e[0]]}),l.range=e(S(u[0][0],u[1][0],u[0][1],u[1][1])),c(i,n),g(i,{isEnd:!1})}function A(t,e,i,n,a){var o=e.__brushOption.range,r=C(t,i,n);Z(o,function(t){t[0]+=r[0],t[1]+=r[1]}),c(t,e),g(t,{isEnd:!1})}function C(t,e,i){var n=t.group,a=n.transformCoordToLocal(e,i),o=n.transformCoordToLocal(0,0);return[a[0]-o[0],a[1]-o[1]]}function L(t,e,i){var n=f(t,e);return n&&n!==!0?n.clipPath(i,t._transform):B.clone(i)}function D(t){var e=j(t[0][0],t[1][0]),i=j(t[0][1],t[1][1]),n=U(t[0][0],t[1][0]),a=U(t[0][1],t[1][1]);return{x:e,y:i,width:n-e,height:a-i}}function P(t,e,i){if(t._brushType){var n=t._zr,a=t._covers,o=d(t,e,i);if(!t._dragging)for(var r=0;r<a.length;r++){var s=a[r].__brushOption;if(o&&(o===!0||s.panelId===o.panelId)&&at[s.brushType].contain(a[r],i[0],i[1]))return}o&&n.setCursorStyle("crosshair")}}function k(t){var e=t.event;e.preventDefault&&e.preventDefault()}function O(t,e,i){return t.childOfName("main").contain(e,i)}function z(t,e,i,n){var a,o=t._creatingCover,u=t._creatingPanel,c=t._brushOption;if(t._track.push(i.slice()),m(t)||o){if(u&&!o){"single"===c.brushMode&&p(t);var h=B.clone(c);h.brushType=E(h.brushType,u),h.panelId=u===!0?null:u.panelId,o=t._creatingCover=r(t,h),t._covers.push(o)}if(o){var f=at[E(t._brushType,u)],g=o.__brushOption;g.range=f.getCreatingRange(L(t,o,t._track)),n&&(s(t,o),f.updateCommon(t,o)),l(t,o),a={isEnd:n}}}else n&&"single"===c.brushMode&&c.removeOnClick&&d(t,e,i)&&p(t)&&(a={isEnd:n,removeOnClick:!0});return a}function E(t,e){return"auto"===t?e.defaultBrushType:t}function R(t){if(this._dragging){k(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY),i=z(this,t,e,!0);this._dragging=!1,this._track=[],this._creatingCover=null,i&&g(this,i)}}function N(t){return{createCover:function(e,i){return y(W(T,function(e){var i=[e,[0,100]];return t&&i.reverse(),i},function(e){return e[t]}),e,i,[["w","e"],["n","s"]][t])},getCreatingRange:function(e){var i=v(e),n=j(i[0][t],i[1][t]),a=U(i[0][t],i[1][t]);return[n,a]},updateCoverShape:function(e,i,n,a){var o,r=f(e,i);if(r!==!0&&r.getLinearBrushOtherExtent)o=r.getLinearBrushOtherExtent(t,e._transform);else{var s=e._zr;o=[0,[s.getWidth(),s.getHeight()][1-t]]}var l=[n,o];t&&l.reverse(),x(e,i,l,a)},updateCommon:_,contain:O}}var V=i(23),B=i(1),G=i(3),H=i(129),F=i(48),W=B.curry,Z=B.each,q=B.map,j=Math.min,U=Math.max,X=Math.pow,Y=1e4,$=6,K=6,J="globalPan",Q={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},tt={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},et={brushStyle:{lineWidth:2,stroke:"rgba(0,0,0,0.3)",fill:"rgba(0,0,0,0.1)"},transformable:!0,brushMode:"single",removeOnClick:!1},it=0;n.prototype={constructor:n,enableBrush:function(t){return this._brushType&&o(this),t.brushType&&a(this,t),this},setPanels:function(t){if(t&&t.length){var e=this._panels={};B.each(t,function(t){e[t.panelId]=B.clone(t)})}else this._panels=null;return this},mount:function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({position:t.position||[0,0],rotation:t.rotation||0,scale:t.scale||[1,1]}),this._transform=e.getLocalTransform(),this},eachCover:function(t,e){Z(this._covers,t,e)},updateCovers:function(t){function e(t,e){return(null!=t.id?t.id:o+e)+"-"+t.brushType}function i(t,i){return e(t.__brushOption,i)}function n(e,i){var n=t[e];if(null!=i&&l[i]===d)u[e]=l[i];else{var a=u[e]=null!=i?(l[i].__brushOption=n,l[i]):s(h,r(h,n));c(h,a)}}function a(t){l[t]!==d&&h.group.remove(l[t])}t=B.map(t,function(t){return B.merge(B.clone(et),t,!0)});var o="\0-brush-index-",l=this._covers,u=this._covers=[],h=this,d=this._creatingCover;return new F(l,t,i,e).add(n).update(n).remove(a).execute(),this},unmount:function(){return this.enableBrush(!1),p(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},B.mixin(n,V);var nt={mousedown:function(t){if(this._dragging)R.call(this,t);else if(!t.target||!t.target.draggable){k(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null;var i=this._creatingPanel=d(this,t,e);i&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);if(P(this,t,e),this._dragging){k(t);var i=z(this,t,e,!1);i&&g(this,i)}},mouseup:R},at={lineX:N(0),lineY:N(1),rect:{createCover:function(t,e){return y(W(T,function(t){return t},function(t){return t}),t,e,["w","e","n","s","se","sw","ne","nw"])},getCreatingRange:function(t){var e=v(t);return S(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,i,n){x(t,e,i,n)},updateCommon:_,contain:O},polygon:{createCover:function(t,e){var i=new G.Group;return i.add(new G.Polyline({name:"main",style:w(e),silent:!0})),i},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new G.Polygon({name:"main",draggable:!0,drift:W(A,t,e),ondragend:W(g,t,{isEnd:!0})}))},updateCoverShape:function(t,e,i,n){e.childAt(0).setShape({points:L(t,e,i)})},updateCommon:_,contain:O}};t.exports=n},function(t,e){var i={},n={axisPointer:1,tooltip:1,brush:1};i.onIrrelevantElement=function(t,e,i){var a=e.getComponentByElement(t.topTarget),o=a&&a.coordinateSystem;return a&&a!==i&&!n[a.mainType]&&o&&o.model!==i},t.exports=i},function(t,e,i){function n(t){return t[a]||(t[a]={})}var a="\0_ec_interaction_mutex",o={take:function(t,e,i){var a=n(t);a[e]=i},release:function(t,e,i){var a=n(t),o=a[e];o===i&&(a[e]=null)},isTaken:function(t,e){return!!n(t)[e]}};i(2).registerAction({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),t.exports=o},function(t,e,i){function n(t,e,i){a.positionElement(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"))}var a=i(12),o=i(7),r=i(3);t.exports={layout:function(t,e,i){var o=a.getLayoutRect(e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"));a.box(e.get("orient"),t,e.get("itemGap"),o.width,o.height),n(t,e,i)},addBackground:function(t,e){var i=o.normalizeCssArray(e.get("padding")),n=t.getBoundingRect(),a=e.getItemStyle(["color","opacity"]);a.fill=e.get("backgroundColor");var s=new r.Rect({shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[1]+i[3],height:n.height+i[0]+i[2]},style:a,silent:!0,z2:-1});r.subPixelOptimizeRect(s),t.add(s)}}},function(t,e,i){var n=i(1),a=i(33),o=function(t,e,i,n,o){a.call(this,t,e,i),this.type=n||"value",this.position=o||"bottom"};o.prototype={constructor:o,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},n.inherits(o,a),t.exports=o},function(t,e,i){"use strict";function n(t){return this._axes[t]}var a=i(1),o=function(t){this._axes={},this._dimList=[],this.name=t||""};o.prototype={constructor:o,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return a.map(this._dimList,n,this)},getAxesByScale:function(t){return t=t.toLowerCase(),a.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var i=this._dimList,n=t instanceof Array?[]:{},a=0;a<i.length;a++){var o=i[a],r=this._axes[o];n[o]=r[e](t[o])}return n}},t.exports=o},function(t,e,i){"use strict";function n(t){o.call(this,t)}var a=i(1),o=i(132);n.prototype={constructor:n,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),i=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&i.contain(i.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoints:function(t,e){return t.mapArray(["x","y"],function(t,e){return this.dataToPoint([t,e])},e,this)},dataToPoint:function(t,e){var i=this.getAxis("x"),n=this.getAxis("y");return[i.toGlobalCoord(i.dataToCoord(t[0],e)),n.toGlobalCoord(n.dataToCoord(t[1],e))]},pointToData:function(t,e){var i=this.getAxis("x"),n=this.getAxis("y");return[i.coordToData(i.toLocalCoord(t[0]),e),n.coordToData(n.toLocalCoord(t[1]),e)]},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},a.inherits(n,o),t.exports=n},function(t,e,i){"use strict";i(60);var n=i(13);t.exports=n.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}})},function(t,e,i){var n=i(28),a=i(24),o=i(18),r=i(42),s=i(10),l=i(1);t.exports={createList:function(t){var e=t.get("data");return n(e,t,t.ecModel)},completeDimensions:i(25),createSymbol:a.createSymbol,createScale:function(t,e){var i=e;e instanceof s||(i=new s(e),l.mixin(i,r));var n=o.createScaleByModel(i);return n.setExtent(t[0],t[1]),o.niceScaleExtent(n,i),n},mixinAxisModelCommonMethods:function(t){l.mixin(t,r)}}},function(t,e,i){var n=i(3),a=i(1),o=Math.PI;t.exports=function(t,e){e=e||{},a.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var i=new n.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),r=new n.Arc({shape:{startAngle:-o/2,endAngle:-o/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new n.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});r.animateShape(!0).when(1e3,{endAngle:3*o/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*o/2}).delay(300).start("circularInOut");var l=new n.Group;return l.add(r),l.add(s),l.add(i),l.resize=function(){var e=t.getWidth()/2,n=t.getHeight()/2;r.setShape({cx:e,cy:n});var a=r.shape.r;s.setShape({x:e-a,y:n-a,width:2*a,height:2*a}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,i){function n(t,e){c.each(e,function(e,i){x.hasClass(i)||("object"==typeof e?t[i]=t[i]?c.merge(t[i],e,!1):c.clone(e):null==t[i]&&(t[i]=e))})}function a(t){t=t,this.option={},this.option[b]=1,this._componentsMap=c.createHashMap({series:[]
+}),this._seriesIndices=null,n(t,this._theme.option),c.merge(t,_,!1),this.mergeOption(t)}function o(t,e){c.isArray(e)||(e=e?[e]:[]);var i={};return f(e,function(e){i[e]=(t.get(e)||[]).slice()}),i}function r(t,e,i){var n=e.type?e.type:i?i.subType:x.determineSubType(t,e);return n}function s(t){return g(t,function(t){return t.componentIndex})||[]}function l(t,e){return e.hasOwnProperty("subType")?p(t,function(t){return t.subType===e.subType}):t}function u(t){}var c=i(1),h=i(5),d=i(10),f=c.each,p=c.filter,g=c.map,m=c.isArray,v=c.indexOf,y=c.isObject,x=i(13),_=i(139),b="\0_ec_inner",w=d.extend({constructor:w,init:function(t,e,i,n){i=i||{},this.option=null,this._theme=new d(i),this._optionManager=n},setOption:function(t,e){c.assert(!(b in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,i=this._optionManager;if(!t||"recreate"===t){var n=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(n)):a.call(this,n),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(this.mergeOption(o),e=!0)}if(!t||"recreate"===t||"media"===t){var r=i.getMediaOption(this,this._api);r.length&&f(r,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,a){var l=h.normalizeToArray(t[e]),u=h.mappingToExists(n.get(e),l);h.makeIdAndName(u),f(u,function(t,i){var n=t.option;y(n)&&(t.keyInfo.mainType=e,t.keyInfo.subType=r(e,n,t.exist))});var d=o(n,a);i[e]=[],n.set(e,[]),f(u,function(t,a){var o=t.exist,r=t.option;if(c.assert(y(r)||o,"Empty component definition"),r){var s=x.getClass(e,t.keyInfo.subType,!0);if(o&&o instanceof s)o.name=t.keyInfo.name,o.mergeOption(r,this),o.optionUpdated(r,!1);else{var l=c.extend({dependentModels:d,componentIndex:a},t.keyInfo);o=new s(r,this,this,l),c.extend(o,l),o.init(r,this,this,l),o.optionUpdated(null,!0)}}else o.mergeOption({},this),o.optionUpdated({},!1);n.get(e)[a]=o,i[e][a]=o.option},this),"series"===e&&(this._seriesIndices=s(n.get("series")))}var i=this.option,n=this._componentsMap,a=[];f(t,function(t,e){null!=t&&(x.hasClass(e)?a.push(e):i[e]=null==i[e]?c.clone(t):c.merge(i[e],t,!0))}),x.topologicalTravel(a,x.getAllClassMainTypes(),e,this),this._seriesIndices=this._seriesIndices||[]},getOption:function(){var t=c.clone(this.option);return f(t,function(e,i){if(x.hasClass(i)){for(var e=h.normalizeToArray(e),n=e.length-1;n>=0;n--)h.isIdInner(e[n])&&e.splice(n,1);t[i]=e}}),delete t[b],t},getTheme:function(){return this._theme},getComponent:function(t,e){var i=this._componentsMap.get(t);if(i)return i[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var i=t.index,n=t.id,a=t.name,o=this._componentsMap.get(e);if(!o||!o.length)return[];var r;if(null!=i)m(i)||(i=[i]),r=p(g(i,function(t){return o[t]}),function(t){return!!t});else if(null!=n){var s=m(n);r=p(o,function(t){return s&&v(n,t.id)>=0||!s&&t.id===n})}else if(null!=a){var u=m(a);r=p(o,function(t){return u&&v(a,t.name)>=0||!u&&t.name===a})}else r=o.slice();return l(r,t)},findComponents:function(t){function e(t){var e=a+"Index",i=a+"Id",n=a+"Name";return!t||null==t[e]&&null==t[i]&&null==t[n]?null:{mainType:a,index:t[e],id:t[i],name:t[n]}}function i(e){return t.filter?p(e,t.filter):e}var n=t.query,a=t.mainType,o=e(n),r=o?this.queryComponents(o):this._componentsMap.get(a);return i(l(r,t))},eachComponent:function(t,e,i){var n=this._componentsMap;if("function"==typeof t)i=e,e=t,n.each(function(t,n){f(t,function(t,a){e.call(i,n,t,a)})});else if(c.isString(t))f(n.get(t),e,i);else if(y(t)){var a=this.findComponents(t);f(a,e,i)}},getSeriesByName:function(t){var e=this._componentsMap.get("series");return p(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(t){var e=this._componentsMap.get("series");return p(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.get("series").slice()},eachSeries:function(t,e){u(this),f(this._seriesIndices,function(i){var n=this._componentsMap.get("series")[i];t.call(e,n,i)},this)},eachRawSeries:function(t,e){f(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(t,e,i){u(this),f(this._seriesIndices,function(n){var a=this._componentsMap.get("series")[n];a.subType===t&&e.call(i,a,n)},this)},eachRawSeriesByType:function(t,e,i){return f(this.getSeriesByType(t),e,i)},isSeriesFiltered:function(t){return u(this),c.indexOf(this._seriesIndices,t.componentIndex)<0},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){u(this);var i=p(this._componentsMap.get("series"),t,e);this._seriesIndices=s(i)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=s(t.get("series"));var e=[];t.each(function(t,i){e.push(i)}),x.topologicalTravel(e,x.getAllClassMainTypes(),function(e,i){f(t.get(e),function(t){t.restoreData()})})}});c.mixin(w,i(62)),t.exports=w},function(t,e,i){function n(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function a(t,e,i){var n,a,o=[],r=[],s=t.timeline;if(t.baseOption&&(a=t.baseOption),(s||t.options)&&(a=a||{},o=(t.options||[]).slice()),t.media){a=a||{};var l=t.media;d(l,function(t){t&&t.option&&(t.query?r.push(t):n||(n=t))})}return a||(a=t),a.timeline||(a.timeline=s),d([a].concat(o).concat(u.map(r,function(t){return t.option})),function(t){d(e,function(e){e(t,i)})}),{baseOption:a,timelineOptions:o,mediaDefault:n,mediaList:r}}function o(t,e,i){var n={width:e,height:i,aspectratio:e/i},a=!0;return u.each(t,function(t,e){var i=e.match(m);if(i&&i[1]&&i[2]){var o=i[1],s=i[2].toLowerCase();r(n[s],t,o)||(a=!1)}}),a}function r(t,e,i){return"min"===i?t>=e:"max"===i?t<=e:t===e}function s(t,e){return t.join(",")===e.join(",")}function l(t,e){e=e||{},d(e,function(e,i){if(null!=e){var n=t[i];if(h.hasClass(i)){e=c.normalizeToArray(e),n=c.normalizeToArray(n);var a=c.mappingToExists(n,e);t[i]=p(a,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[i]=g(n,e,!0)}})}var u=i(1),c=i(5),h=i(13),d=u.each,f=u.clone,p=u.map,g=u.merge,m=/^(min|max)?(.+)$/;n.prototype={constructor:n,setOption:function(t,e){t=f(t,!0);var i=this._optionBackup,n=a.call(this,t,e,!i);this._newBaseOption=n.baseOption,i?(l(i.baseOption,n.baseOption),n.timelineOptions.length&&(i.timelineOptions=n.timelineOptions),n.mediaList.length&&(i.mediaList=n.mediaList),n.mediaDefault&&(i.mediaDefault=n.mediaDefault)):this._optionBackup=n},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=p(e.timelineOptions,f),this._mediaList=p(e.mediaList,f),this._mediaDefault=f(e.mediaDefault),this._currentMediaIndices=[],f(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,i=this._timelineOptions;if(i.length){var n=t.getComponent("timeline");n&&(e=f(i[n.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),i=this._api.getHeight(),n=this._mediaList,a=this._mediaDefault,r=[],l=[];if(!n.length&&!a)return l;for(var u=0,c=n.length;u<c;u++)o(n[u].query,e,i)&&r.push(u);return!r.length&&a&&(r=[-1]),r.length&&!s(r,this._currentMediaIndices)&&(l=p(r,function(t){return f(t===-1?a.option:n[t].option)})),this._currentMediaIndices=r,l}},t.exports=n},function(t,e){var i="";"undefined"!=typeof navigator&&(i=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],textStyle:{fontFamily:i.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1}},function(t,e,i){t.exports={getAreaStyle:i(31)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,i){var n=i(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]);t.exports={getItemStyle:function(t,e){var i=n.call(this,t,e),a=this.getBorderLineDash();return a&&(i.lineDash=a),i},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,i){var n=i(31)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=n.call(this,t),i=this.getLineDash(e.lineWidth);return i&&(e.lineDash=i),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),i=Math.max(t,2),n=4*t;return"solid"===e||null==e?null:"dashed"===e?[n,n]:[i,i]}}},function(t,e,i){var n=i(16),a=i(3);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){return a.getFont({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(t){return n.getBoundingRect(t,this.getFont(),this.getShallow("align"),this.getShallow("baseline"))},truncateText:function(t,e,i,a){return n.truncateText(t,e,this.getFont(),i,a)}}},function(t,e,i){function n(t,e){e=e.split(",");for(var i=t,n=0;n<e.length&&(i=i&&i[e[n]],null!=i);n++);return i}function a(t,e,i,n){e=e.split(",");for(var a,o=t,r=0;r<e.length-1;r++)a=e[r],null==o[a]&&(o[a]={}),o=o[a];(n||null==o[e[r]])&&(o[e[r]]=i)}function o(t){h(l,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}var r=i(1),s=i(146),l=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],u=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],c=["bar","boxplot","candlestick","chord","effectScatter","funnel","gauge","lines","graph","heatmap","line","map","parallel","pie","radar","sankey","scatter","treemap"],h=r.each;t.exports=function(t){h(t.series,function(t){if(r.isObject(t)){var e=t.type;if(s(t),"pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var i=n(t,"pointer.color");null!=i&&a(t,"itemStyle.normal.color",i)}for(var l=0;l<c.length;l++)if(c[l]===t.type){o(t);break}}}),t.dataRange&&(t.visualMap=t.dataRange),h(u,function(e){var i=t[e];i&&(r.isArray(i)||(i=[i]),h(i,function(t){o(t)}))})}},function(t,e,i){function n(t){var e=t&&t.itemStyle;e&&a.each(o,function(i){var n=e.normal,o=e.emphasis;n&&n[i]&&(t[i]=t[i]||{},t[i].normal?a.merge(t[i].normal,n[i]):t[i].normal=n[i],n[i]=null),o&&o[i]&&(t[i]=t[i]||{},t[i].emphasis?a.merge(t[i].emphasis,o[i]):t[i].emphasis=o[i],o[i]=null)})}var a=i(1),o=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];t.exports=function(t){if(t){n(t),n(t.markPoint),n(t.markLine);var e=t.data;if(e){for(var i=0;i<e.length;i++)n(e[i]);var o=t.markPoint;if(o&&o.data)for(var r=o.data,i=0;i<r.length;i++)n(r[i]);var s=t.markLine;if(s&&s.data)for(var l=s.data,i=0;i<l.length;i++)a.isArray(l[i])?(n(l[i][0]),n(l[i][1])):n(l[i])}}}},function(t,e){var i={average:function(t){for(var e=0,i=0,n=0;n<t.length;n++)isNaN(t[n])||(e+=t[n],i++);return 0===i?NaN:e/i},sum:function(t){for(var e=0,i=0;i<t.length;i++)e+=t[i]||0;return e},max:function(t){for(var e=-(1/0),i=0;i<t.length;i++)t[i]>e&&(e=t[i]);return e},min:function(t){for(var e=1/0,i=0;i<t.length;i++)t[i]<e&&(e=t[i]);return e},nearest:function(t){return t[0]}},n=function(t,e){return Math.round(t.length/2)};t.exports=function(t,e,a){e.eachSeriesByType(t,function(t){var e=t.getData(),a=t.get("sampling"),o=t.coordinateSystem;if("cartesian2d"===o.type&&a){var r=o.getBaseAxis(),s=o.getOtherAxis(r),l=r.getExtent(),u=l[1]-l[0],c=Math.round(e.count()/u);if(c>1){var h;"string"==typeof a?h=i[a]:"function"==typeof a&&(h=a),h&&(e=e.downSample(s.dim,1/c,h,n),t.setData(e))}}},this)}},function(t,e,i){function n(t,e){return h(t,c(e))}var a=i(1),o=i(34),r=i(4),s=i(43),l=o.prototype,u=s.prototype,c=r.getPrecisionSafe,h=r.round,d=Math.floor,f=Math.ceil,p=Math.pow,g=Math.log,m=o.extend({type:"log",base:10,$constructor:function(){o.apply(this,arguments),this._originalScale=new s},getTicks:function(){var t=this._originalScale,e=this._extent,i=t.getExtent();return a.map(u.getTicks.call(this),function(a){var o=r.round(p(this.base,a));return o=a===e[0]&&t.__fixMin?n(o,i[0]):o,o=a===e[1]&&t.__fixMax?n(o,i[1]):o},this)},getLabel:u.getLabel,scale:function(t){return t=l.scale.call(this,t),p(this.base,t)},setExtent:function(t,e){var i=this.base;t=g(t)/g(i),e=g(e)/g(i),u.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=l.getExtent.call(this);e[0]=p(t,e[0]),e[1]=p(t,e[1]);var i=this._originalScale,a=i.getExtent();return i.__fixMin&&(e[0]=n(e[0],a[0])),i.__fixMax&&(e[1]=n(e[1],a[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=g(t[0])/g(e),t[1]=g(t[1])/g(e),l.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0];if(!(i===1/0||i<=0)){var n=r.quantity(i),a=t/i*n;for(a<=.5&&(n*=10);!isNaN(n)&&Math.abs(n)<1&&Math.abs(n)>0;)n*=10;var o=[r.round(f(e[0]/n)*n),r.round(d(e[1]/n)*n)];this._interval=n,this._niceExtent=o}},niceExtent:function(t){u.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});a.each(["contain","normalize"],function(t){m.prototype[t]=function(e){return e=g(e)/g(this.base),l[t].call(this,e)}}),m.create=function(){return new m},t.exports=m},function(t,e,i){var n=i(1),a=i(34),o=a.prototype,r=a.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?n.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),o.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return o.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(o.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!1))},niceTicks:n.noop,niceExtent:n.noop});r.create=function(){return new r},t.exports=r},function(t,e,i){var n=i(1),a=i(4),o=i(7),r=i(64),s=i(43),l=s.prototype,u=Math.ceil,c=Math.floor,h=1e3,d=60*h,f=60*d,p=24*f,g=function(t,e,i,n){for(;i<n;){var a=i+n>>>1;t[a][2]<e?i=a+1:n=a}return i},m=s.extend({type:"time",getLabel:function(t){var e=this._stepLvl,i=new Date(t);return o.formatTime(e[0],i,this.getSetting("useUTC"))},niceExtent:function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=p,e[1]+=p),e[1]===-(1/0)&&e[0]===1/0){var i=new Date;e[1]=new Date(i.getFullYear(),i.getMonth(),i.getDate()),e[0]=e[1]-p}this.niceTicks(t.splitNumber);var n=this._interval;t.fixMin||(e[0]=a.round(c(e[0]/n)*n)),t.fixMax||(e[1]=a.round(u(e[1]/n)*n))},niceTicks:function(t){var e=this.getSetting("useUTC")?0:60*a.getTimezoneOffset()*1e3;t=t||10;var i=this._extent,n=i[1]-i[0],o=n/t,s=v.length,l=g(v,o,0,s),h=v[Math.min(l,s-1)],d=h[2];if("year"===h[0]){var f=n/d,p=a.nice(f/t,!0);d*=p}var m=[Math.round(u((i[0]-e)/d)*d+e),Math.round(c((i[1]-e)/d)*d+e)];r.fixExtent(m,i),this._stepLvl=h,this._interval=d,this._niceExtent=m},parse:function(t){return+a.parseDate(t)}});n.each(["contain","normalize"],function(t){m.prototype[t]=function(e){return l[t].call(this,this.parse(e))}});var v=[["hh:mm:ss",1,h],["hh:mm:ss",5,5*h],["hh:mm:ss",10,10*h],["hh:mm:ss",15,15*h],["hh:mm:ss",30,30*h],["hh:mm\nMM-dd",1,d],["hh:mm\nMM-dd",5,5*d],["hh:mm\nMM-dd",10,10*d],["hh:mm\nMM-dd",15,15*d],["hh:mm\nMM-dd",30,30*d],["hh:mm\nMM-dd",1,f],["hh:mm\nMM-dd",2,2*f],["hh:mm\nMM-dd",6,6*f],["hh:mm\nMM-dd",12,12*f],["MM-dd\nyyyy",1,p],["week",7,7*p],["month",1,31*p],["quarter",3,380*p/4],["half-year",6,380*p/2],["year",1,380*p]];m.create=function(t){return new m({useUTC:t.ecModel.get("useUTC")})},t.exports=m},function(t,e,i){var n=i(39);t.exports=function(t){function e(e){var i=(e.visualColorAccessPath||"itemStyle.normal.color").split("."),a=e.getData(),o=e.get(i)||e.getColorFromPalette(e.get("name"));a.setVisual("color",o),t.isSeriesFiltered(e)||("function"!=typeof o||o instanceof n||a.each(function(t){a.setItemVisual(t,"color",o(e.getDataParams(t)))}),a.each(function(t){var e=a.getItemModel(t),n=e.get(i,!0);null!=n&&a.setItemVisual(t,"color",n)}))}t.eachRawSeries(e)}},function(t,e,i){"use strict";function n(t,e,i){return{type:t,event:i,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:i.zrX,offsetY:i.zrY,gestureEvent:i.gestureEvent,pinchX:i.pinchX,pinchY:i.pinchY,pinchScale:i.pinchScale,wheelDelta:i.zrDelta,zrByTouch:i.zrByTouch}}function a(){}function o(t,e,i){if(t[t.rectHover?"rectContain":"contain"](e,i)){for(var n,a=t;a;){if(a.clipPath&&!a.clipPath.contain(e,i))return!1;a.silent&&(n=!0),a=a.parent}return!n||u}return!1}var r=i(1),s=i(179),l=i(23),u="silent";a.prototype.dispose=function(){};var c=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],h=function(t,e,i,n){l.call(this),this.storage=t,this.painter=e,this.painterRoot=n,i=i||new a,this.proxy=i,i.handler=this,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,s.call(this),r.each(c,function(t){i.on&&i.on(t,this[t],this)},this)};h.prototype={constructor:h,mousemove:function(t){var e=t.zrX,i=t.zrY,n=this._hovered,a=this._hovered=this.findHover(e,i),o=a.target,r=n.target,s=this.proxy;s.setCursor&&s.setCursor(o?o.cursor:"default"),r&&o!==r&&r.__zr&&this.dispatchToElement(n,"mouseout",t),this.dispatchToElement(a,"mousemove",t),o&&o!==r&&this.dispatchToElement(a,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,i=t.toElement||t.relatedTarget;do i=i&&i.parentNode;while(i&&9!=i.nodeType&&!(e=i===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var i=this[t];i&&i.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,i){t=t||{};for(var a="on"+e,o=n(e,t,i),r=t.target;r&&(r[a]&&(o.cancelBubble=r[a].call(r,o)),r.trigger(e,o),r=r.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[a]&&t[a].call(t,o),t.trigger&&t.trigger(e,o)}))},findHover:function(t,e,i){for(var n=this.storage.getDisplayList(),a={},r=n.length-1;r>=0;r--){var s;if(n[r]!==i&&!n[r].ignore&&(s=o(n[r],t,e))&&(!a.topTarget&&(a.topTarget=n[r]),s!==u)){a.target=n[r];break}}return a}},r.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){h.prototype[t]=function(e){var i=this.findHover(e.zrX,e.zrY),n=i.target;if("mousedown"===t)this._downel=n,this._upel=n;else if("mosueup"===t)this._upel=n;else if("click"===t&&this._downel!==this._upel)return;this.dispatchToElement(i,t,e)}}),r.mixin(h,l),r.mixin(h,s),t.exports=h},function(t,e,i){function n(){return!1}function a(t,e,i,n){var a=document.createElement(e),o=i.getWidth(),r=i.getHeight(),s=a.style;return s.position="absolute",s.left=0,s.top=0,s.width=o+"px",s.height=r+"px",a.width=o*n,a.height=r*n,a.setAttribute("data-zr-dom-id",t),a}var o=i(1),r=i(35),s=i(73),l=i(72),u=function(t,e,i){var s;i=i||r.devicePixelRatio,"string"==typeof t?s=a(t,"canvas",e,i):o.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=n,l["-webkit-user-select"]="none",l["user-select"]="none",l["-webkit-touch-callout"]="none",l["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",l.padding=0,l.margin=0,l["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=i};u.prototype={constructor:u,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=a("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var i=this.dpr,n=this.dom,a=n.style,o=this.domBack;a.width=t+"px",a.height=e+"px",n.width=t*i,n.height=e*i,o&&(o.width=t*i,o.height=e*i,1!=i&&this.ctxBack.scale(i,i))},clear:function(t){var e=this.dom,i=this.ctx,n=e.width,a=e.height,o=this.clearColor,r=this.motionBlur&&!t,u=this.lastFrameAlpha,c=this.dpr;if(r&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,n/c,a/c)),i.clearRect(0,0,n,a),o){var h;o.colorStops?(h=o.__canvasGradient||s.getGradient(i,o,{x:0,y:0,width:n,height:a}),o.__canvasGradient=h):o.image&&(h=l.prototype.getCanvasPattern.call(o,i)),i.save(),i.fillStyle=h||o,i.fillRect(0,0,n,a),i.restore()}if(r){var d=this.domBack;i.save(),i.globalAlpha=u,i.drawImage(d,0,0,n,a),i.restore()}}},t.exports=u},function(t,e,i){"use strict";function n(t){return parseInt(t,10)}function a(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function o(t){t.__unusedCount++}function r(t){1==t.__unusedCount&&t.clear()}function s(t,e,i){return x.copy(t.getBoundingRect()),t.transform&&x.applyTransform(t.transform),_.width=e,_.height=i,!x.intersect(_)}function l(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var i=0;i<t.length;i++)if(t[i]!==e[i])return!0}function u(t,e){for(var i=0;i<t.length;i++){var n=t[i];n.setTransform(e),e.beginPath(),n.buildPath(e,n.shape),e.clip(),n.restoreTransform(e)}}function c(t,e){var i=document.createElement("div");return i.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",i}var h=i(35),d=i(1),f=i(52),p=i(11),g=i(51),m=i(153),v=i(68),y=5,x=new p(0,0,0,0),_=new p(0,0,0,0),b=function(t,e,i){var n=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=i=d.extend({},i||{}),this.dpr=i.devicePixelRatio||h.devicePixelRatio,this._singleCanvas=n,this.root=t;var a=t.style;a&&(a["-webkit-tap-highlight-color"]="transparent",a["-webkit-user-select"]=a["user-select"]=a["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var o=this._zlevelList=[],r=this._layers={};if(this._layerConfig={},n){null!=i.width&&(t.width=i.width),null!=i.height&&(t.height=i.height);var s=t.width,l=t.height;this._width=s,this._height=l;var u=new m(t,this,1);u.initContext(),r[0]=u,o.push(0),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var f=this._domRoot=c(this._width,this._height);t.appendChild(f)}this._progressiveLayers=[],this._hoverlayer,this._hoverElements=[]};b.prototype={constructor:b,isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},refresh:function(t){var e=this.storage.getDisplayList(!0),i=this._zlevelList;this._paintList(e,t);for(var n=0;n<i.length;n++){var a=i[n],o=this._layers[a];!o.__builtin__&&o.refresh&&o.refresh()}return this.refreshHover(),this._progressiveLayers.length&&this._startProgessive(),this},addHover:function(t,e){if(!t.__hoverMir){var i=new t.constructor({style:t.style,shape:t.shape});i.__from=t,t.__hoverMir=i,i.setStyle(e),this._hoverElements.push(i)}},removeHover:function(t){var e=t.__hoverMir,i=this._hoverElements,n=d.indexOf(i,e);n>=0&&i.splice(n,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,i=0;i<e.length;i++){var n=e[i].__from;n&&(n.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,i=this._hoverlayer;if(i&&i.clear(),e){g(t,this.storage.displayableSortFunc),i||(i=this._hoverlayer=this.getLayer(1e5));var n={};i.ctx.save();for(var a=0;a<e;){var o=t[a],r=o.__from;r&&r.__zr?(a++,r.invisible||(o.transform=r.transform,o.invTransform=r.invTransform,o.__clipPaths=r.__clipPaths,this._doPaintEl(o,i,!0,n))):(t.splice(a,1),r.__hoverMir=null,e--)}i.ctx.restore()}},_startProgessive:function(){function t(){i===e._progressiveToken&&e.storage&&(e._doPaintList(e.storage.getDisplayList()),e._furtherProgressive?(e._progress++,v(t)):e._progressiveToken=-1)}var e=this;if(e._furtherProgressive){var i=e._progressiveToken=+new Date;e._progress++,v(t)}},_clearProgressive:function(){this._progressiveToken=-1,this._progress=0,d.each(this._progressiveLayers,function(t){t.__dirty&&t.clear()})},_paintList:function(t,e){null==e&&(e=!1),this._updateLayerStatus(t),this._clearProgressive(),this.eachBuiltinLayer(o),this._doPaintList(t,e),this.eachBuiltinLayer(r)},_doPaintList:function(t,e){function i(t){var e=o.dpr||1;o.save(),o.globalAlpha=1,o.shadowBlur=0,n.__dirty=!0,o.setTransform(1,0,0,1,0,0),o.drawImage(t.dom,0,0,c*e,h*e),o.restore()}for(var n,a,o,r,s,l,u=0,c=this._width,h=this._height,p=this._progress,g=0,m=t.length;g<m;g++){var v=t[g],x=this._singleCanvas?0:v.zlevel,_=v.__frame;if(_<0&&s&&(i(s),s=null),a!==x&&(o&&o.restore(),r={},a=x,n=this.getLayer(a),n.__builtin__||f("ZLevel "+a+" has been used by unkown layer "+n.id),o=n.ctx,o.save(),n.__unusedCount=0,(n.__dirty||e)&&n.clear()),n.__dirty||e){if(_>=0){if(!s){if(s=this._progressiveLayers[Math.min(u++,y-1)],s.ctx.save(),s.renderScope={},s&&s.__progress>s.__maxProgress){g=s.__nextIdxNotProg-1;continue}l=s.__progress,s.__dirty||(p=l),s.__progress=p+1}_===p&&this._doPaintEl(v,s,!0,s.renderScope)}else this._doPaintEl(v,n,e,r);v.__dirty=!1}}s&&i(s),o&&o.restore(),this._furtherProgressive=!1,d.each(this._progressiveLayers,function(t){t.__maxProgress>=t.__progress&&(this._furtherProgressive=!0)},this)},_doPaintEl:function(t,e,i,n){var a=e.ctx,o=t.transform;if((e.__dirty||i)&&!t.invisible&&0!==t.style.opacity&&(!o||o[0]||o[3])&&(!t.culling||!s(t,this._width,this._height))){var r=t.__clipPaths;(n.prevClipLayer!==e||l(r,n.prevElClipPaths))&&(n.prevElClipPaths&&(n.prevClipLayer.ctx.restore(),n.prevClipLayer=n.prevElClipPaths=null,n.prevEl=null),r&&(a.save(),u(r,a),n.prevClipLayer=e,n.prevElClipPaths=r)),t.beforeBrush&&t.beforeBrush(a),t.brush(a,n.prevEl||null),n.prevEl=t,t.afterBrush&&t.afterBrush(a)}},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new m("zr_"+t,this,this.dpr),e.__builtin__=!0,this._layerConfig[t]&&d.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var i=this._layers,n=this._zlevelList,o=n.length,r=null,s=-1,l=this._domRoot;if(i[t])return void f("ZLevel "+t+" has been used already");if(!a(e))return void f("Layer of zlevel "+t+" is not valid");if(o>0&&t>n[0]){for(s=0;s<o-1&&!(n[s]<t&&n[s+1]>t);s++);r=i[n[s]]}if(n.splice(s+1,0,t),i[t]=e,!e.virtual)if(r){var u=r.dom;u.nextSibling?l.insertBefore(e.dom,u.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom)},eachLayer:function(t,e){var i,n,a=this._zlevelList;for(n=0;n<a.length;n++)i=a[n],t.call(e,this._layers[i],i)},eachBuiltinLayer:function(t,e){var i,n,a,o=this._zlevelList;for(a=0;a<o.length;a++)n=o[a],i=this._layers[n],i.__builtin__&&t.call(e,i,n)},eachOtherLayer:function(t,e){var i,n,a,o=this._zlevelList;for(a=0;a<o.length;a++)n=o[a],i=this._layers[n],i.__builtin__||t.call(e,i,n)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){var e=this._layers,i=this._progressiveLayers,n={},a={};this.eachBuiltinLayer(function(t,e){n[e]=t.elCount,t.elCount=0,t.__dirty=!1}),d.each(i,function(t,e){a[e]=t.elCount,t.elCount=0,t.__dirty=!1});for(var o,r,s=0,l=0,u=0,c=t.length;u<c;u++){var h=t[u],f=this._singleCanvas?0:h.zlevel,p=e[f],g=h.progressive;if(p&&(p.elCount++,p.__dirty=p.__dirty||h.__dirty),g>=0){r!==g&&(r=g,l++);var v=h.__frame=l-1;if(!o){var x=Math.min(s,y-1);o=i[x],o||(o=i[x]=new m("progressive",this,this.dpr),o.initContext()),o.__maxProgress=0}o.__dirty=o.__dirty||h.__dirty,o.elCount++,o.__maxProgress=Math.max(o.__maxProgress,v),o.__maxProgress>=o.__progress&&(p.__dirty=!0)}else h.__frame=-1,o&&(o.__nextIdxNotProg=u,s++,o=null)}o&&(s++,o.__nextIdxNotProg=u),this.eachBuiltinLayer(function(t,e){n[e]!==t.elCount&&(t.__dirty=!0)}),i.length=Math.min(s,y),d.each(i,function(t,e){a[e]!==t.elCount&&(h.__dirty=!0),t.__dirty&&(t.__progress=0)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var i=this._layerConfig;i[t]?d.merge(i[t],e,!0):i[t]=e;var n=this._layers[t];n&&d.merge(n,i[t],!0)}},delLayer:function(t){var e=this._layers,i=this._zlevelList,n=e[t];n&&(n.dom.parentNode.removeChild(n.dom),delete e[t],i.splice(d.indexOf(i,t),1))},resize:function(t,e){var i=this._domRoot;i.style.display="none";var n=this._opts;if(null!=t&&(n.width=t),null!=e&&(n.height=e),t=this._getSize(0),e=this._getSize(1),i.style.display="",this._width!=t||e!=this._height){i.style.width=t+"px",i.style.height=e+"px";for(var a in this._layers)this._layers.hasOwnProperty(a)&&this._layers[a].resize(t,e);d.each(this._progressiveLayers,function(i){i.resize(t,e)}),this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){function e(t,e){var n=r._zlevelList;null==t&&(t=-(1/0));for(var a,o=0;o<n.length;o++){var s=n[o],l=r._layers[s];if(!l.__builtin__&&s>t&&s<e){a=l;break}}a&&a.renderToCanvas&&(i.ctx.save(),a.renderToCanvas(i.ctx),i.ctx.restore())}if(t=t||{},this._singleCanvas)return this._layers[0].dom;var i=new m("image",this,t.pixelRatio||this.dpr);i.initContext(),i.clearColor=t.backgroundColor,i.clear();for(var n,a=this.storage.getDisplayList(!0),o={},r=this,s=0;s<a.length;s++){var l=a[s];l.zlevel!==n&&(e(n,l.zlevel),n=l.zlevel),this._doPaintEl(l,i,!0,o)}return e(n,1/0),i.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,i=["width","height"][t],a=["clientWidth","clientHeight"][t],o=["paddingLeft","paddingTop"][t],r=["paddingRight","paddingBottom"][t];if(null!=e[i]&&"auto"!==e[i])return parseFloat(e[i]);var s=this.root,l=document.defaultView.getComputedStyle(s);return(s[a]||n(l[i])||n(s.style[i]))-(n(l[o])||0)-(n(l[r])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var n=document.createElement("canvas"),a=n.getContext("2d"),o=t.getBoundingRect(),r=t.style,s=r.shadowBlur,l=r.shadowOffsetX,u=r.shadowOffsetY,c=r.hasStroke()?r.lineWidth:0,h=Math.max(c/2,-l+s),d=Math.max(c/2,l+s),f=Math.max(c/2,-u+s),p=Math.max(c/2,u+s),g=o.width+h+d,m=o.height+f+p;n.width=g*e,n.height=m*e,a.scale(e,e),a.clearRect(0,0,g,m),a.dpr=e;var v={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[h-o.x,f-o.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(a);var y=i(53),x=new y({style:{x:0,y:0,image:n}});return null!=v.position&&(x.position=t.position=v.position),null!=v.rotation&&(x.rotation=t.rotation=v.rotation),null!=v.scale&&(x.scale=t.scale=v.scale),x}},t.exports=b},function(t,e,i){"use strict";function n(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var a=i(1),o=i(9),r=i(36),s=i(51),l=function(){this._roots=[],this._displayList=[],this._displayListLen=0};l.prototype={constructor:l,traverse:function(t,e){for(var i=0;i<this._roots.length;i++)this._roots[i].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){
+this._displayListLen=0;for(var e=this._roots,i=this._displayList,a=0,r=e.length;a<r;a++)this._updateAndAddDisplayable(e[a],null,t);i.length=this._displayListLen,o.canvasSupported&&s(i,n)},_updateAndAddDisplayable:function(t,e,i){if(!t.ignore||i){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var n=t.clipPath;if(n){e=e?e.slice():[];for(var a=n,o=t;a;)a.parent=o,a.updateTransform(),e.push(a),o=a,a=a.clipPath}if(t.isGroup){for(var r=t._children,s=0;s<r.length;s++){var l=r[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,i)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof r&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var i=this._roots[e];i instanceof r&&i.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var e=0,n=t.length;e<n;e++)this.delRoot(t[e]);else{var o=a.indexOf(this._roots,t);o>=0&&(this.delFromStorage(t),this._roots.splice(o,1),t instanceof r&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t.__storage=this,t.dirty(!1),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:n},t.exports=l},function(t,e,i){"use strict";var n=i(1),a=i(21).Dispatcher,o=i(68),r=i(67),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,a.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),i=0;i<e.length;i++)this.addClip(e[i])},removeClip:function(t){var e=n.indexOf(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),i=0;i<e.length;i++)this.removeClip(e[i]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,i=this._clips,n=i.length,a=[],o=[],r=0;r<n;r++){var s=i[r],l=s.step(t,e);l&&(a.push(l),o.push(s))}for(var r=0;r<n;)i[r]._needsRemove?(i[r]=i[n-1],i.pop(),n--):r++;n=a.length;for(var r=0;r<n;r++)o[r].fire(a[r]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(o(t),!e._paused&&e._update())}var e=this;this._running=!0,o(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var i=new r(t,e.loop,e.getter,e.setter);return this.addAnimator(i),i}},n.mixin(s,a),t.exports=s},function(t,e,i){function n(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}var a=i(158);n.prototype={constructor:n,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)return void(this._pausedTime+=e);var i=(t-this._startTime-this._pausedTime)/this._life;if(!(i<0)){i=Math.min(i,1);var n=this.easing,o="string"==typeof n?a[n]:n,r="function"==typeof o?o(i):i;return this.fire("frame",r),1==i?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}},t.exports=n},function(t,e){var i={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)))},elasticOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},elasticInOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),(t*=2)<1?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)):i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-i.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*i.bounceIn(2*t):.5*i.bounceOut(2*t-1)+.5}};t.exports=i},function(t,e,i){var n=i(69).normalizeRadian,a=2*Math.PI;t.exports={containStroke:function(t,e,i,o,r,s,l,u,c){if(0===l)return!1;var h=l;u-=t,c-=e;var d=Math.sqrt(u*u+c*c);if(d-h>i||d+h<i)return!1;if(Math.abs(o-r)%a<1e-4)return!0;if(s){var f=o;o=n(r),r=n(f)}else o=n(o),r=n(r);o>r&&(r+=a);var p=Math.atan2(c,u);return p<0&&(p+=a),p>=o&&p<=r||p+a>=o&&p+a<=r}}},function(t,e,i){var n=i(20);t.exports={containStroke:function(t,e,i,a,o,r,s,l,u,c,h){if(0===u)return!1;var d=u;if(h>e+d&&h>a+d&&h>r+d&&h>l+d||h<e-d&&h<a-d&&h<r-d&&h<l-d||c>t+d&&c>i+d&&c>o+d&&c>s+d||c<t-d&&c<i-d&&c<o-d&&c<s-d)return!1;var f=n.cubicProjectPoint(t,e,i,a,o,r,s,l,c,h,null);return f<=d/2}}},function(t,e,i){"use strict";function n(t,e){return Math.abs(t-e)<x}function a(){var t=b[0];b[0]=b[1],b[1]=t}function o(t,e,i,n,o,r,s,l,u,c){if(c>e&&c>n&&c>r&&c>l||c<e&&c<n&&c<r&&c<l)return 0;var h=g.cubicRootAt(e,n,r,l,c,_);if(0===h)return 0;for(var d,f,p=0,m=-1,v=0;v<h;v++){var y=_[v],x=0===y||1===y?.5:1,w=g.cubicAt(t,i,o,s,y);w<u||(m<0&&(m=g.cubicExtrema(e,n,r,l,b),b[1]<b[0]&&m>1&&a(),d=g.cubicAt(e,n,r,l,b[0]),m>1&&(f=g.cubicAt(e,n,r,l,b[1]))),p+=2==m?y<b[0]?d<e?x:-x:y<b[1]?f<d?x:-x:l<f?x:-x:y<b[0]?d<e?x:-x:l<d?x:-x)}return p}function r(t,e,i,n,a,o,r,s){if(s>e&&s>n&&s>o||s<e&&s<n&&s<o)return 0;var l=g.quadraticRootAt(e,n,o,s,_);if(0===l)return 0;var u=g.quadraticExtremum(e,n,o);if(u>=0&&u<=1){for(var c=0,h=g.quadraticAt(e,n,o,u),d=0;d<l;d++){var f=0===_[d]||1===_[d]?.5:1,p=g.quadraticAt(t,i,a,_[d]);p<r||(c+=_[d]<u?h<e?f:-f:o<h?f:-f)}return c}var f=0===_[0]||1===_[0]?.5:1,p=g.quadraticAt(t,i,a,_[0]);return p<r?0:o<e?f:-f}function s(t,e,i,n,a,o,r,s){if(s-=e,s>i||s<-i)return 0;var l=Math.sqrt(i*i-s*s);_[0]=-l,_[1]=l;var u=Math.abs(n-a);if(u<1e-4)return 0;if(u%y<1e-4){n=0,a=y;var c=o?1:-1;return r>=_[0]+t&&r<=_[1]+t?c:0}if(o){var l=n;n=p(a),a=p(l)}else n=p(n),a=p(a);n>a&&(a+=y);for(var h=0,d=0;d<2;d++){var f=_[d];if(f+t>r){var g=Math.atan2(s,f),c=o?1:-1;g<0&&(g=y+g),(g>=n&&g<=a||g+y>=n&&g+y<=a)&&(g>Math.PI/2&&g<1.5*Math.PI&&(c=-c),h+=c)}}return h}function l(t,e,i,a,l){for(var c=0,p=0,g=0,y=0,x=0,_=0;_<t.length;){var b=t[_++];switch(b===u.M&&_>1&&(i||(c+=m(p,g,y,x,a,l))),1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case u.M:y=t[_++],x=t[_++],p=y,g=x;break;case u.L:if(i){if(v(p,g,t[_],t[_+1],e,a,l))return!0}else c+=m(p,g,t[_],t[_+1],a,l)||0;p=t[_++],g=t[_++];break;case u.C:if(i){if(h.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,a,l))return!0}else c+=o(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],a,l)||0;p=t[_++],g=t[_++];break;case u.Q:if(i){if(d.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,a,l))return!0}else c+=r(p,g,t[_++],t[_++],t[_],t[_+1],a,l)||0;p=t[_++],g=t[_++];break;case u.A:var w=t[_++],S=t[_++],M=t[_++],I=t[_++],T=t[_++],A=t[_++],C=(t[_++],1-t[_++]),L=Math.cos(T)*M+w,D=Math.sin(T)*I+S;_>1?c+=m(p,g,L,D,a,l):(y=L,x=D);var P=(a-w)*I/M+w;if(i){if(f.containStroke(w,S,I,T,T+A,C,e,P,l))return!0}else c+=s(w,S,I,T,T+A,C,P,l);p=Math.cos(T+A)*M+w,g=Math.sin(T+A)*I+S;break;case u.R:y=p=t[_++],x=g=t[_++];var k=t[_++],O=t[_++],L=y+k,D=x+O;if(i){if(v(y,x,L,x,e,a,l)||v(L,x,L,D,e,a,l)||v(L,D,y,D,e,a,l)||v(y,D,y,x,e,a,l))return!0}else c+=m(L,x,L,D,a,l),c+=m(y,D,y,x,a,l);break;case u.Z:if(i){if(v(p,g,y,x,e,a,l))return!0}else c+=m(p,g,y,x,a,l);p=y,g=x}}return i||n(g,x)||(c+=m(p,g,y,x,a,l)||0),0!==c}var u=i(27).CMD,c=i(97),h=i(160),d=i(98),f=i(159),p=i(69).normalizeRadian,g=i(20),m=i(99),v=c.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,i){return l(t,0,!1,e,i)},containStroke:function(t,e,i,n){return l(t,e,!0,i,n)}}},function(t,e,i){"use strict";function n(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}function a(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var o=i(21),r=function(){this._track=[]};r.prototype={constructor:r,recognize:function(t,e,i){return this._doTrack(t,e,i),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,i){var n=t.touches;if(n){for(var a={points:[],touches:[],target:e,event:t},r=0,s=n.length;r<s;r++){var l=n[r],u=o.clientToLocal(i,l,{});a.points.push([u.zrX,u.zrY]),a.touches.push(l)}this._track.push(a)}},_recognize:function(t){for(var e in s)if(s.hasOwnProperty(e)){var i=s[e](this._track,t);if(i)return i}}};var s={pinch:function(t,e){var i=t.length;if(i){var o=(t[i-1]||{}).points,r=(t[i-2]||{}).points||o;if(r&&r.length>1&&o&&o.length>1){var s=n(o)/n(r);!isFinite(s)&&(s=1),e.pinchScale=s;var l=a(o);return e.pinchX=l[0],e.pinchY=l[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=r},function(t,e,i){function n(t){return"mousewheel"===t&&d.browser.firefox?"DOMMouseScroll":t}function a(t,e,i){var n=t._gestureMgr;"start"===i&&n.clear();var a=n.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===i&&n.clear(),a){var o=a.type;e.gestureEvent=o,t.handler.dispatchToElement({target:a.target},o,a.event)}}function o(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function r(t){var e=t.pointerType;return"pen"===e||"touch"===e}function s(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}c.each(x,function(e){t._handlers[e]=c.bind(w[e],t)}),c.each(b,function(e){t._handlers[e]=c.bind(w[e],t)}),c.each(y,function(i){t._handlers[i]=e(w[i],t)})}function l(t){function e(e,i){c.each(e,function(e){p(t,n(e),i._handlers[e])},i)}h.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new f,this._handlers={},s(this),d.pointerEventsSupported?e(b,this):(d.touchEventsSupported&&e(x,this),e(y,this))}var u=i(21),c=i(1),h=i(23),d=i(9),f=i(162),p=u.addEventListener,g=u.removeEventListener,m=u.normalizeEvent,v=300,y=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],x=["touchstart","touchend","touchmove"],_={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},b=c.map(y,function(t){var e=t.replace("mouse","pointer");return _[e]?e:t}),w={mousemove:function(t){t=m(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){t=m(this.dom,t);var e=t.toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){t=m(this.dom,t),t.zrByTouch=!0,this._lastTouchMoment=new Date,a(this,t,"start"),w.mousemove.call(this,t),w.mousedown.call(this,t),o(this)},touchmove:function(t){t=m(this.dom,t),t.zrByTouch=!0,a(this,t,"change"),w.mousemove.call(this,t),o(this)},touchend:function(t){t=m(this.dom,t),t.zrByTouch=!0,a(this,t,"end"),w.mouseup.call(this,t),+new Date-this._lastTouchMoment<v&&w.click.call(this,t),o(this)},pointerdown:function(t){w.mousedown.call(this,t)},pointermove:function(t){r(t)||w.mousemove.call(this,t)},pointerup:function(t){w.mouseup.call(this,t)},pointerout:function(t){r(t)||w.mouseout.call(this,t)}};c.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){w[t]=function(e){e=m(this.dom,e),this.trigger(t,e)}});var S=l.prototype;S.dispose=function(){for(var t=y.concat(x),e=0;e<t.length;e++){var i=t[e];g(this.dom,n(i),this._handlers[i])}},S.setCursor=function(t){this.dom.style.cursor=t||"default"},c.mixin(l,h),t.exports=l},function(t,e,i){var n=i(8);t.exports=n.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,i=0;i<e.length;i++)t=t||e[i].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),i=0;i<t.length;i++)t[i].path||t[i].createPathProxy(),t[i].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var i=e.paths||[],n=0;n<i.length;n++)i[n].buildPath(t,i[n].shape,!0)},afterBrush:function(){for(var t=this.shape.paths,e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),n.prototype.getBoundingRect.call(this)}})},function(t,e,i){"use strict";var n=i(1),a=i(39),o=function(t,e,i,n,o){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==i?.5:i,this.type="radial",this.global=o||!1,a.call(this,n)};o.prototype={constructor:o},n.inherits(o,a),t.exports=o},function(t,e){t.exports={buildPath:function(t,e){var i,n,a,o,r=e.x,s=e.y,l=e.width,u=e.height,c=e.r;l<0&&(r+=l,l=-l),u<0&&(s+=u,u=-u),"number"==typeof c?i=n=a=o=c:c instanceof Array?1===c.length?i=n=a=o=c[0]:2===c.length?(i=a=c[0],n=o=c[1]):3===c.length?(i=c[0],n=o=c[1],a=c[2]):(i=c[0],n=c[1],a=c[2],o=c[3]):i=n=a=o=0;var h;i+n>l&&(h=i+n,i*=l/h,n*=l/h),a+o>l&&(h=a+o,a*=l/h,o*=l/h),n+a>u&&(h=n+a,n*=u/h,a*=u/h),i+o>u&&(h=i+o,i*=u/h,o*=u/h),t.moveTo(r+i,s),t.lineTo(r+l-n,s),0!==n&&t.quadraticCurveTo(r+l,s,r+l,s+n),t.lineTo(r+l,s+u-a),0!==a&&t.quadraticCurveTo(r+l,s+u,r+l-a,s+u),t.lineTo(r+o,s+u),0!==o&&t.quadraticCurveTo(r,s+u,r,s+u-o),t.lineTo(r,s+i),0!==i&&t.quadraticCurveTo(r,s,r+i,s)}}},function(t,e,i){var n=i(6),a=n.min,o=n.max,r=n.scale,s=n.distance,l=n.add;t.exports=function(t,e,i,u){var c,h,d,f,p=[],g=[],m=[],v=[];if(u){d=[1/0,1/0],f=[-(1/0),-(1/0)];for(var y=0,x=t.length;y<x;y++)a(d,d,t[y]),o(f,f,t[y]);a(d,d,u[0]),o(f,f,u[1])}for(var y=0,x=t.length;y<x;y++){var _=t[y];if(i)c=t[y?y-1:x-1],h=t[(y+1)%x];else{if(0===y||y===x-1){p.push(n.clone(t[y]));continue}c=t[y-1],h=t[y+1]}n.sub(g,h,c),r(g,g,e);var b=s(_,c),w=s(_,h),S=b+w;0!==S&&(b/=S,w/=S),r(m,g,-b),r(v,g,w);var M=l([],_,m),I=l([],_,v);u&&(o(M,M,d),a(M,M,f),o(I,I,d),a(I,I,f)),p.push(M),p.push(I)}return i&&p.push(p.shift()),p}},function(t,e,i){function n(t,e,i,n,a,o,r){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*r+(-3*(e-i)-2*s-l)*o+s*a+e}var a=i(6);t.exports=function(t,e){for(var i=t.length,o=[],r=0,s=1;s<i;s++)r+=a.distance(t[s-1],t[s]);var l=r/2;l=l<i?i:l;for(var s=0;s<l;s++){var u,c,h,d=s/(l-1)*(e?i:i-1),f=Math.floor(d),p=d-f,g=t[f%i];e?(u=t[(f-1+i)%i],c=t[(f+1)%i],h=t[(f+2)%i]):(u=t[0===f?f:f-1],c=t[f>i-2?i-1:f+1],h=t[f>i-3?i-1:f+2]);var m=p*p,v=p*m;o.push([n(u[0],g[0],c[0],h[0],p,m,v),n(u[1],g[1],c[1],h[1],p,m,v)])}return o}},function(t,e,i){t.exports=i(8).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.cx,n=e.cy,a=Math.max(e.r,0),o=e.startAngle,r=e.endAngle,s=e.clockwise,l=Math.cos(o),u=Math.sin(o);t.moveTo(l*a+i,u*a+n),t.arc(i,n,a,o,r,!s)}})},function(t,e,i){"use strict";function n(t,e,i){var n=t.cpx2,a=t.cpy2;return null===n||null===a?[(i?h:u)(t.x1,t.cpx1,t.cpx2,t.x2,e),(i?h:u)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(i?c:l)(t.x1,t.cpx1,t.x2,e),(i?c:l)(t.y1,t.cpy1,t.y2,e)]}var a=i(20),o=i(6),r=a.quadraticSubdivide,s=a.cubicSubdivide,l=a.quadraticAt,u=a.cubicAt,c=a.quadraticDerivativeAt,h=a.cubicDerivativeAt,d=[];t.exports=i(8).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,a=e.x2,o=e.y2,l=e.cpx1,u=e.cpy1,c=e.cpx2,h=e.cpy2,f=e.percent;0!==f&&(t.moveTo(i,n),null==c||null==h?(f<1&&(r(i,l,a,f,d),l=d[1],a=d[2],r(n,u,o,f,d),u=d[1],o=d[2]),t.quadraticCurveTo(l,u,a,o)):(f<1&&(s(i,l,c,a,f,d),l=d[1],c=d[2],a=d[3],s(n,u,h,o,f,d),u=d[1],h=d[2],o=d[3]),t.bezierCurveTo(l,u,c,h,a,o)))},pointAt:function(t){return n(this.shape,t,!1)},tangentAt:function(t){var e=n(this.shape,t,!0);return o.normalize(e,e)}})},function(t,e,i){"use strict";t.exports=i(8).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,i){i&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,i){t.exports=i(8).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,a=e.x2,o=e.y2,r=e.percent;0!==r&&(t.moveTo(i,n),r<1&&(a=i*(1-r)+a*r,o=n*(1-r)+o*r),t.lineTo(a,o))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,i){var n=i(74);t.exports=i(8).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){n.buildPath(t,e,!0)}})},function(t,e,i){var n=i(74);t.exports=i(8).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){n.buildPath(t,e,!1)}})},function(t,e,i){var n=i(166);t.exports=i(8).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,a=e.y,o=e.width,r=e.height;e.r?n.buildPath(t,e):t.rect(i,a,o,r),t.closePath()}})},function(t,e,i){t.exports=i(8).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var i=e.cx,n=e.cy,a=2*Math.PI;t.moveTo(i+e.r,n),t.arc(i,n,e.r,0,a,!1),t.moveTo(i+e.r0,n),t.arc(i,n,e.r0,0,a,!0)}})},function(t,e,i){var n=i(9),a=i(8),o=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]];t.exports=a.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:n.browser.ie&&n.browser.version>=11?function(){var t,e=this.__clipPaths,i=this.style;if(e)for(var n=0;n<e.length;n++){var r=e[n]&&e[n].shape;if(r&&r.startAngle===r.endAngle){for(var s=0;s<o.length;s++)o[s][2]=i[o[s][0]],i[o[s][0]]=o[s][1];t=!0;break}}if(a.prototype.brush.apply(this,arguments),t)for(var s=0;s<o.length;s++)i[o[s][0]]=o[s][2]}:a.prototype.brush,buildPath:function(t,e){var i=e.cx,n=e.cy,a=Math.max(e.r0||0,0),o=Math.max(e.r,0),r=e.startAngle,s=e.endAngle,l=e.clockwise,u=Math.cos(r),c=Math.sin(r);t.moveTo(u*a+i,c*a+n),t.lineTo(u*o+i,c*o+n),t.arc(i,n,o,r,s,!l),t.lineTo(Math.cos(s)*a+i,Math.sin(s)*a+n),0!==a&&t.arc(i,n,a,s,r,l),t.closePath()}})},function(t,e,i){"use strict";var n=i(67),a=i(1),o=a.isString,r=a.isFunction,s=a.isObject,l=i(52),u=function(){this.animators=[]};u.prototype={constructor:u,animate:function(t,e){var i,o=!1,r=this,s=this.__zr;if(t){var u=t.split("."),c=r;o="shape"===u[0];for(var h=0,d=u.length;h<d;h++)c&&(c=c[u[h]]);c&&(i=c)}else i=r;if(!i)return void l('Property "'+t+'" is not existed in element '+r.id);var f=r.animators,p=new n(i,e);return p.during(function(t){r.dirty(o)}).done(function(){f.splice(a.indexOf(f,p),1)}),f.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,i=e.length,n=0;n<i;n++)e[n].stop(t);return e.length=0,this},animateTo:function(t,e,i,n,a){function s(){u--,u||a&&a()}o(i)?(a=n,n=i,i=0):r(n)?(a=n,n="linear",i=0):r(i)?(a=i,i=0):r(e)?(a=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,i,n,a);var l=this.animators.slice(),u=l.length;u||a&&a();for(var c=0;c<l.length;c++)l[c].done(s).start(n)},_animateToShallow:function(t,e,i,n,o){var r={},l=0;for(var u in i)if(i.hasOwnProperty(u))if(null!=e[u])s(i[u])&&!a.isArrayLike(i[u])?this._animateToShallow(t?t+"."+u:u,e[u],i[u],n,o):(r[u]=i[u],l++);else if(null!=i[u])if(t){var c={};c[t]={},c[t][u]=i[u],this.attr(c)}else this.attr(u,i[u]);return l>0&&this.animate(t,!1).when(null==n?500:n,r).delay(o||0),this}},t.exports=u},function(t,e){function i(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function n(t,e){return{target:t,topTarget:e&&e.topTarget}}i.prototype={constructor:i,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(n(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var i=t.offsetX,a=t.offsetY,o=i-this._x,r=a-this._y;this._x=i,this._y=a,e.drift(o,r,t),this.dispatchToElement(n(e,t),"drag",t.event);var s=this.findHover(i,a,e).target,l=this._dropTarget;this._dropTarget=s,e!==s&&(l&&s!==l&&this.dispatchToElement(n(l,t),"dragleave",t.event),s&&s!==l&&this.dispatchToElement(n(s,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(n(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(n(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=i},function(t,e,i){function n(t,e,i,n,a,o,r,s,l,u,p){var v=l*(f/180),y=d(v)*(t-i)/2+h(v)*(e-n)/2,x=-1*h(v)*(t-i)/2+d(v)*(e-n)/2,_=y*y/(r*r)+x*x/(s*s);_>1&&(r*=c(_),s*=c(_));var b=(a===o?-1:1)*c((r*r*(s*s)-r*r*(x*x)-s*s*(y*y))/(r*r*(x*x)+s*s*(y*y)))||0,w=b*r*x/s,S=b*-s*y/r,M=(t+i)/2+d(v)*w-h(v)*S,I=(e+n)/2+h(v)*w+d(v)*S,T=m([1,0],[(y-w)/r,(x-S)/s]),A=[(y-w)/r,(x-S)/s],C=[(-1*y-w)/r,(-1*x-S)/s],L=m(A,C);g(A,C)<=-1&&(L=f),g(A,C)>=1&&(L=0),0===o&&L>0&&(L-=2*f),1===o&&L<0&&(L+=2*f),p.addData(u,M,I,r,s,T,L,v,o)}function a(t){if(!t)return[];var e,i=t.replace(/-/g," -").replace(/  /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e<u.length;e++)i=i.replace(new RegExp(u[e],"g"),"|"+u[e]);var a,o=i.split("|"),r=0,l=0,c=new s,h=s.CMD;for(e=1;e<o.length;e++){var d,f=o[e],p=f.charAt(0),g=0,m=f.slice(1).replace(/e,-/g,"e-").split(",");m.length>0&&""===m[0]&&m.shift();for(var v=0;v<m.length;v++)m[v]=parseFloat(m[v]);for(;g<m.length&&!isNaN(m[g])&&!isNaN(m[0]);){var y,x,_,b,w,S,M,I=r,T=l;switch(p){case"l":r+=m[g++],l+=m[g++],d=h.L,c.addData(d,r,l);break;case"L":r=m[g++],l=m[g++],d=h.L,c.addData(d,r,l);break;case"m":r+=m[g++],l+=m[g++],d=h.M,c.addData(d,r,l),p="l";break;case"M":r=m[g++],l=m[g++],d=h.M,c.addData(d,r,l),p="L";break;case"h":r+=m[g++],d=h.L,c.addData(d,r,l);break;case"H":r=m[g++],d=h.L,c.addData(d,r,l);break;case"v":l+=m[g++],d=h.L,c.addData(d,r,l);break;case"V":l=m[g++],d=h.L,c.addData(d,r,l);break;case"C":d=h.C,c.addData(d,m[g++],m[g++],m[g++],m[g++],m[g++],m[g++]),r=m[g-2],l=m[g-1];break;case"c":d=h.C,c.addData(d,m[g++]+r,m[g++]+l,m[g++]+r,m[g++]+l,m[g++]+r,m[g++]+l),r+=m[g-2],l+=m[g-1];break;case"S":y=r,x=l;var A=c.len(),C=c.data;a===h.C&&(y+=r-C[A-4],x+=l-C[A-3]),d=h.C,I=m[g++],T=m[g++],r=m[g++],l=m[g++],c.addData(d,y,x,I,T,r,l);break;case"s":y=r,x=l;var A=c.len(),C=c.data;a===h.C&&(y+=r-C[A-4],x+=l-C[A-3]),d=h.C,I=r+m[g++],T=l+m[g++],r+=m[g++],l+=m[g++],c.addData(d,y,x,I,T,r,l);break;case"Q":I=m[g++],T=m[g++],r=m[g++],l=m[g++],d=h.Q,c.addData(d,I,T,r,l);break;case"q":I=m[g++]+r,T=m[g++]+l,r+=m[g++],l+=m[g++],d=h.Q,c.addData(d,I,T,r,l);break;case"T":y=r,x=l;var A=c.len(),C=c.data;a===h.Q&&(y+=r-C[A-4],x+=l-C[A-3]),r=m[g++],l=m[g++],d=h.Q,c.addData(d,y,x,r,l);break;case"t":y=r,x=l;var A=c.len(),C=c.data;a===h.Q&&(y+=r-C[A-4],x+=l-C[A-3]),r+=m[g++],l+=m[g++],d=h.Q,c.addData(d,y,x,r,l);break;case"A":_=m[g++],b=m[g++],w=m[g++],S=m[g++],M=m[g++],I=r,T=l,r=m[g++],l=m[g++],d=h.A,n(I,T,r,l,S,M,_,b,w,d,c);break;case"a":_=m[g++],b=m[g++],w=m[g++],S=m[g++],M=m[g++],I=r,T=l,r+=m[g++],l+=m[g++],d=h.A,n(I,T,r,l,S,M,_,b,w,d,c)}}"z"!==p&&"Z"!==p||(d=h.Z,c.addData(d)),a=d}return c.toStatic(),c}function o(t,e){var i=a(t);return e=e||{},e.buildPath=function(t){if(t.setData){t.setData(i.data);var e=t.getContext();e&&t.rebuildPath(e)}else{var e=t;i.rebuildPath(e)}},e.applyTransform=function(t){l(i,t),this.dirty(!0)},e}var r=i(8),s=i(27),l=i(181),u=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],c=Math.sqrt,h=Math.sin,d=Math.cos,f=Math.PI,p=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},g=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(p(t)*p(e))},m=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(g(t,e))};t.exports={createFromString:function(t,e){return new r(o(t,e))},extendFromString:function(t,e){return r.extend(o(t,e))},mergePath:function(t,e){for(var i=[],n=t.length,a=0;a<n;a++){var o=t[a];o.path||o.createPathProxy(),o.__dirtyPath&&o.buildPath(o.path,o.shape,!0),i.push(o.path)}var s=new r(e);return s.createPathProxy(),s.buildPath=function(t){t.appendPath(i);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,i){function n(t,e){var i,n,o,c,h,d,f=t.data,p=a.M,g=a.C,m=a.L,v=a.R,y=a.A,x=a.Q;for(o=0,c=0;o<f.length;){switch(i=f[o++],c=o,n=0,i){case p:n=1;break;case m:n=1;break;case g:n=3;break;case x:n=2;break;case y:var _=e[4],b=e[5],w=l(e[0]*e[0]+e[1]*e[1]),S=l(e[2]*e[2]+e[3]*e[3]),M=u(-e[1]/S,e[0]/w);f[o]*=w,f[o++]+=_,f[o]*=S,f[o++]+=b,f[o++]*=w,f[o++]*=S,f[o++]+=M,f[o++]+=M,o+=2,c=o;break;case v:d[0]=f[o++],d[1]=f[o++],r(d,d,e),f[c++]=d[0],f[c++]=d[1],d[0]+=f[o++],d[1]+=f[o++],r(d,d,e),f[c++]=d[0],f[c++]=d[1]}for(h=0;h<n;h++){var d=s[h];d[0]=f[o++],d[1]=f[o++],r(d,d,e),f[c++]=d[0],f[c++]=d[1]}}}var a=i(27).CMD,o=i(6),r=o.applyTransform,s=[[],[],[]],l=Math.sqrt,u=Math.atan2;t.exports=n},function(t,e,i){if(!i(9).canvasSupported){var n,a="urn:schemas-microsoft-com:vml",o=window,r=o.document,s=!1;try{!r.namespaces.zrvml&&r.namespaces.add("zrvml",a),n=function(t){return r.createElement("<zrvml:"+t+' class="zrvml">')}}catch(l){n=function(t){return r.createElement("<"+t+' xmlns="'+a+'" class="zrvml">')}}var u=function(){if(!s){s=!0;var t=r.styleSheets;t.length<31?r.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}};t.exports={doc:r,initVML:u,createNode:n}}},function(t,e,i){"use strict";var n=i(14),a=i(25),o=i(313),r=i(1),s={_baseAxisDim:null,getInitialData:function(t,e){var i,o,s=e.getComponent("xAxis",this.get("xAxisIndex")),l=e.getComponent("yAxis",this.get("yAxisIndex")),u=s.get("type"),c=l.get("type");"category"===u?(t.layout="horizontal",i=s.getCategories(),o=!0):"category"===c?(t.layout="vertical",i=l.getCategories(),o=!0):t.layout=t.layout||"horizontal";var h=["x","y"],d="horizontal"===t.layout?0:1,f=this._baseAxisDim=h[d],p=h[1-d],g=t.data;o&&r.each(g,function(t,e){r.isArray(t)&&t.unshift(e)});var m=[{name:f,otherDims:{tooltip:!1},dimsDef:["base"]},{name:p,dimsDef:this.defaultValueDimensions.slice()}];m=a(m,g,{encodeDef:this.get("encode"),dimsDef:this.get("dimensions")});var v=new n(m,this);return v.initData(g,i?i.slice():null),v},getBaseAxis:function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis}},l={init:function(){var t=this._whiskerBoxDraw=new o(this.getStyleUpdater());this.group.add(t.group)},render:function(t,e,i){this._whiskerBoxDraw.updateData(t.getData())},remove:function(t){this._whiskerBoxDraw.remove()}};t.exports={seriesModelMixin:s,viewMixin:l}},function(t,e,i){function n(t,e,i){var n=this._targetInfoList=[],a={},r=o(e,t);p(_,function(t,e){(!i||!i.include||g(i.include,e)>=0)&&t(r,n,a)})}function a(t){return t[0]>t[1]&&t.reverse(),t}function o(t,e){return d.parseFinder(t,e,{includeMainTypes:y})}function r(t,e,i,n){var o=i.getAxis(["x","y"][t]),r=a(c.map([0,1],function(t){return e?o.coordToData(o.toLocalCoord(n[t])):o.toGlobalCoord(o.dataToCoord(n[t]))})),s=[];return s[t]=r,s[1-t]=[NaN,NaN],{values:r,xyMinMax:s}}function s(t,e,i,n){return[e[0]-n[t]*i[0],e[1]-n[t]*i[1]]}function l(t,e){var i=u(t),n=u(e),a=[i[0]/n[0],i[1]/n[1]];return isNaN(a[0])&&(a[0]=1),isNaN(a[1])&&(a[1]=1),a}function u(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var c=i(1),h=i(3),d=i(5),f=i(185),p=c.each,g=c.indexOf,m=c.curry,v=["dataToPoint","pointToData"],y=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],x=n.prototype;x.setOutputRanges=function(t,e){this.matchOutputRanges(t,e,function(t,e,i){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var n=S[t.brushType](0,i,e);t.__rangeOffset={offset:M[t.brushType](n.values,t.range,[1,1]),xyMinMax:n.xyMinMax}}})},x.matchOutputRanges=function(t,e,i){p(t,function(t){var n=this.findTargetInfo(t,e);n&&n!==!0&&c.each(n.coordSyses,function(n){var a=S[t.brushType](1,n,t.range);i(t,a.values,n,e)})},this)},x.setInputRanges=function(t,e){p(t,function(t){var i=this.findTargetInfo(t,e);if(t.range=t.range||[],i&&i!==!0){t.panelId=i.panelId;var n=S[t.brushType](0,i.coordSys,t.coordRange),a=t.__rangeOffset;t.range=a?M[t.brushType](n.values,a.offset,l(n.xyMinMax,a.xyMinMax)):n.values}},this)},x.makePanelOpts=function(t,e){return c.map(this._targetInfoList,function(i){var n=i.getPanelRect();return{panelId:i.panelId,defaultBrushType:e&&e(i),clipPath:f.makeRectPanelClipPath(n),isTargetByCursor:f.makeRectIsTargetByCursor(n,t,i.coordSysModel),getLinearBrushOtherExtent:f.makeLinearBrushOtherExtent(n)}})},x.controlSeries=function(t,e,i){var n=this.findTargetInfo(t,i);return n===!0||n&&g(n.coordSyses,e.coordinateSystem)>=0},x.findTargetInfo=function(t,e){for(var i=this._targetInfoList,n=o(e,t),a=0;a<i.length;a++){var r=i[a],s=t.panelId;if(s){if(r.panelId===s)return r}else for(var a=0;a<b.length;a++)if(b[a](n,r))return r}return!0};var _={grid:function(t,e){var i=t.xAxisModels,n=t.yAxisModels,a=t.gridModels,o=c.createHashMap(),r={},s={};(i||n||a)&&(p(i,function(t){var e=t.axis.grid.model;o.set(e.id,e),r[e.id]=!0}),p(n,function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0}),p(a,function(t){o.set(t.id,t),r[t.id]=!0,s[t.id]=!0}),o.each(function(t){var a=t.coordinateSystem,o=[];p(a.getCartesians(),function(t,e){(g(i,t.getAxis("x").model)>=0||g(n,t.getAxis("y").model)>=0)&&o.push(t)}),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:w.grid,xAxisDeclared:r[t.id],yAxisDeclared:s[t.id]})}))},geo:function(t,e){p(t.geoModels,function(t){var i=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:i,coordSyses:[i],getPanelRect:w.geo})})}},b=[function(t,e){var i=t.xAxisModel,n=t.yAxisModel,a=t.gridModel;return!a&&i&&(a=i.axis.grid.model),!a&&n&&(a=n.axis.grid.model),a&&a===e.gridModel},function(t,e){var i=t.geoModel;return i&&i===e.geoModel}],w={grid:function(){return this.coordSys.grid.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(h.getTransform(t)),e}},S={lineX:m(r,0),lineY:m(r,1),rect:function(t,e,i){var n=e[v[t]]([i[0][0],i[1][0]]),o=e[v[t]]([i[0][1],i[1][1]]),r=[a([n[0],o[0]]),a([n[1],o[1]])];return{values:r,xyMinMax:r}},
+polygon:function(t,e,i){var n=[[1/0,-(1/0)],[1/0,-(1/0)]],a=c.map(i,function(i){var a=e[v[t]](i);return n[0][0]=Math.min(n[0][0],a[0]),n[1][0]=Math.min(n[1][0],a[1]),n[0][1]=Math.max(n[0][1],a[0]),n[1][1]=Math.max(n[1][1],a[1]),a});return{values:a,xyMinMax:n}}},M={lineX:m(s,0),lineY:m(s,1),rect:function(t,e,i){return[[t[0][0]-i[0]*e[0][0],t[0][1]-i[0]*e[0][1]],[t[1][0]-i[1]*e[1][0],t[1][1]-i[1]*e[1][1]]]},polygon:function(t,e,i){return c.map(t,function(t,n){return[t[0]-i[0]*e[n][0],t[1]-i[1]*e[n][1]]})}};t.exports=n},function(t,e,i){function n(t){return o.create(t)}var a=i(128),o=i(11),r=i(3),s={};s.makeRectPanelClipPath=function(t){return t=n(t),function(e,i){return r.clipPointsByRect(e,t)}},s.makeLinearBrushOtherExtent=function(t,e){return t=n(t),function(i){var n=null!=e?e:i,a=n?t.width:t.height,o=n?t.x:t.y;return[o,o+(a||0)]}},s.makeRectIsTargetByCursor=function(t,e,i){return t=n(t),function(n,o,r){return t.contain(o[0],o[1])&&!a.onIrrelevantElement(n,e,i)}},t.exports=s},function(t,e,i){function n(t,e){var i=t.get("boundingCoords");if(null!=i){var n=i[0],a=i[1];isNaN(n[0])||isNaN(n[1])||isNaN(a[0])||isNaN(a[1])||this.setBoundingRect(n[0],n[1],a[0]-n[0],a[1]-n[1])}var o,s=this.getBoundingRect(),u=t.get("layoutCenter"),c=t.get("layoutSize"),h=e.getWidth(),d=e.getHeight(),f=t.get("aspectScale")||.75,p=s.width/s.height*f,g=!1;u&&c&&(u=[l.parsePercent(u[0],h),l.parsePercent(u[1],d)],c=l.parsePercent(c,Math.min(h,d)),isNaN(u[0])||isNaN(u[1])||isNaN(c)||(g=!0));var m;if(g){var m={};p>1?(m.width=c,m.height=c/p):(m.height=c,m.width=c*p),m.y=u[1]-m.height/2,m.x=u[0]-m.width/2}else o=t.getBoxLayoutParams(),o.aspect=p,m=r.getLayoutRect(o,{width:h,height:d});this.setViewRect(m.x,m.y,m.width,m.height),this.setCenter(t.get("center")),this.setZoom(t.get("zoom"))}function a(t,e){s.each(e.get("geoCoord"),function(e,i){t.addGeoCoord(i,e)})}var o=i(398),r=i(12),s=i(1),l=i(4),u={},c={dimensions:o.prototype.dimensions,create:function(t,e){var i=[];t.eachComponent("geo",function(t,r){var s=t.get("map"),l=u[s],c=new o(s+r,s,l&&l.geoJson,l&&l.specialAreas,t.get("nameMap"));c.zoomLimit=t.get("scaleLimit"),i.push(c),a(c,t),t.coordinateSystem=c,c.model=t,c.resize=n,c.resize(t,e)}),t.eachSeries(function(t){var e=t.get("coordinateSystem");if("geo"===e){var n=t.get("geoIndex")||0;t.coordinateSystem=i[n]}});var r={};return t.eachSeriesByType("map",function(t){if(!t.getHostGeoModel()){var e=t.getMapType();r[e]=r[e]||[],r[e].push(t)}}),s.each(r,function(t,r){var l=u[r],c=s.map(t,function(t){return t.get("nameMap")}),h=new o(r,r,l&&l.geoJson,l&&l.specialAreas,s.mergeAll(c));h.zoomLimit=s.retrieve.apply(null,s.map(t,function(t){return t.get("scaleLimit")})),i.push(h),h.resize=n,h.resize(t[0],e),s.each(t,function(t){t.coordinateSystem=h,a(h,t)})}),i},registerMap:function(t,e,i){e.geoJson&&!e.features&&(i=e.specialAreas,e=e.geoJson),"string"==typeof e&&(e="undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")()),u[t]={geoJson:e,specialAreas:i}},getMap:function(t){return u[t]},getFilledRegions:function(t,e){var i=(t||[]).slice(),n=c.getMap(e),a=n&&n.geoJson;if(!a)return t;for(var o=s.createHashMap(),r=a.features,l=0;l<i.length;l++)o.set(i[l].name,i[l]);for(var l=0;l<r.length;l++){var u=r[l].properties.name;o.get(u)||i.push({name:u})}return i}},h=i(2);h.registerMap=c.registerMap,h.getMap=c.getMap,h.parseGeoJSON=i(262),h.loadMap=function(){},h.registerCoordinateSystem("geo",c),t.exports=c},function(t,e,i){function n(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}var a=i(1),o=i(83),r=a.each,s={createVisualMappings:function(t,e,i){function n(){var t=function(){};t.prototype.__hidden=t.prototype;var e=new t;return e}var s={};return r(e,function(e){var l=s[e]=n();r(t[e],function(t,n){if(o.isValidType(n)){var r={type:n,visual:t};i&&i(r,e),l[n]=new o(r),"opacity"===n&&(r=a.clone(r),r.type="colorAlpha",l.__hidden.__alphaForOpacity=new o(r))}})}),s},replaceVisualOption:function(t,e,i){var o;a.each(i,function(t){e.hasOwnProperty(t)&&n(e[t])&&(o=!0)}),o&&a.each(i,function(i){e.hasOwnProperty(i)&&n(e[i])?t[i]=a.clone(e[i]):delete t[i]})},applyVisual:function(t,e,i,n,r,s){function l(t){return i.getItemVisual(d,t)}function u(t,e){i.setItemVisual(d,t,e)}function c(t,a){d=null==s?t:a;var o=i.getRawDataItem(d);if(!o||o.visualMap!==!1)for(var c=n.call(r,t),f=e[c],p=h[c],g=0,m=p.length;g<m;g++){var v=p[g];f[v]&&f[v].applyVisual(t,l,u)}}var h={};a.each(t,function(t){var i=o.prepareVisualTypes(e[t]);h[t]=i});var d;null==s?i.each(c,!0):i.each([s],c,!0)}};t.exports=s},function(t,e){function i(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function a(t){if(c===setTimeout)return setTimeout(t,0);if((c===i||!c)&&setTimeout)return c=setTimeout,setTimeout(t,0);try{return c(t,0)}catch(e){try{return c.call(null,t,0)}catch(e){return c.call(this,t,0)}}}function o(t){if(h===clearTimeout)return clearTimeout(t);if((h===n||!h)&&clearTimeout)return h=clearTimeout,clearTimeout(t);try{return h(t)}catch(e){try{return h.call(null,t)}catch(e){return h.call(this,t)}}}function r(){g&&f&&(g=!1,f.length?p=f.concat(p):m=-1,p.length&&s())}function s(){if(!g){var t=a(r);g=!0;for(var e=p.length;e;){for(f=p,p=[];++m<e;)f&&f[m].run();m=-1,e=p.length}f=null,g=!1,o(t)}}function l(t,e){this.fun=t,this.array=e}function u(){}var c,h,d=t.exports={};!function(){try{c="function"==typeof setTimeout?setTimeout:i}catch(t){c=i}try{h="function"==typeof clearTimeout?clearTimeout:n}catch(t){h=n}}();var f,p=[],g=!1,m=-1;d.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)e[i-1]=arguments[i];p.push(new l(t,e)),1!==p.length||g||a(s)},l.prototype.run=function(){this.fun.apply(null,this.array)},d.title="browser",d.browser=!0,d.env={},d.argv=[],d.version="",d.versions={},d.on=u,d.addListener=u,d.once=u,d.off=u,d.removeListener=u,d.removeAllListeners=u,d.emit=u,d.binding=function(t){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(t){throw new Error("process.chdir is not supported")},d.umask=function(){return 0}},function(t,e,i){function n(){this.group=new a.Group,this._symbolEl=new r({})}var a=i(3),o=i(24),r=a.extendShape({shape:{points:null,sizes:null},symbolProxy:null,buildPath:function(t,e){for(var i=e.points,n=e.sizes,a=this.symbolProxy,o=a.shape,r=0;r<i.length;r++){var s=i[r],l=n[r];l[0]<4?t.rect(s[0]-l[0]/2,s[1]-l[1]/2,l[0],l[1]):(o.x=s[0]-l[0]/2,o.y=s[1]-l[1]/2,o.width=l[0],o.height=l[1],a.buildPath(t,o,!0))}},findDataIndex:function(t,e){for(var i=this.shape,n=i.points,a=i.sizes,o=n.length-1;o>=0;o--){var r=n[o],s=a[o],l=r[0]-s[0]/2,u=r[1]-s[1]/2;if(t>=l&&e>=u&&t<=l+s[0]&&e<=u+s[1])return o}return-1}}),s=n.prototype;s.updateData=function(t){this.group.removeAll();var e=this._symbolEl,i=t.hostModel;e.setShape({points:t.mapArray(t.getItemLayout),sizes:t.mapArray(function(e){var i=t.getItemVisual(e,"symbolSize");return i instanceof Array||(i=[i,i]),i})}),e.symbolProxy=o.createSymbol(t.getVisual("symbol"),0,0,0,0),e.setColor=e.symbolProxy.setColor,e.useStyle(i.getModel("itemStyle.normal").getItemStyle(["color"]));var n=t.getVisual("color");n&&e.setColor(n),e.seriesIndex=i.seriesIndex,e.on("mousemove",function(t){e.dataIndex=null;var i=e.findDataIndex(t.offsetX,t.offsetY);i>0&&(e.dataIndex=i)}),this.group.add(e)},s.updateLayout=function(t){var e=t.getData();this._symbolEl.setShape({points:e.mapArray(e.getItemLayout)})},s.remove=function(){this.group.removeAll()},t.exports=n},function(t,e,i){function n(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var a=i(3),o=i(6),r=a.Line.prototype,s=a.BezierCurve.prototype;t.exports=a.extendShape({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(n(e)?r:s).buildPath(t,e)},pointAt:function(t){return n(this.shape)?r.pointAt.call(this,t):s.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,i=n(e)?[e.x2-e.x1,e.y2-e.y1]:s.tangentAt.call(this,t);return o.normalize(i,i)}})},function(t,e,i){var n=i(1),a=i(2);i(192),i(193),a.registerVisual(n.curry(i(50),"scatter","circle",null)),a.registerLayout(n.curry(i(61),"scatter")),i(32)},function(t,e,i){"use strict";var n=i(28),a=i(17);t.exports=a.extend({type:"series.scatter",dependencies:["grid","polar","geo","singleAxis","calendar"],getInitialData:function(t,e){return n(t.data,this,e)},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{normal:{opacity:.8}}}})},function(t,e,i){var n=i(44),a=i(189);i(2).extendChartView({type:"scatter",init:function(){this._normalSymbolDraw=new n,this._largeSymbolDraw=new a},render:function(t,e,i){var n=t.getData(),a=this._largeSymbolDraw,o=this._normalSymbolDraw,r=this.group,s=t.get("large")&&n.count()>t.get("largeThreshold")?a:o;this._symbolDraw=s,s.updateData(n),r.add(s.group),r.remove(s===a?o.group:a.group)},updateLayout:function(t){this._symbolDraw.updateLayout(t)},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e,!0)},dispose:function(){}})},function(t,e,i){var n=i(2),a=n.extendComponentModel({type:"axisPointer",coordSysAxesInfo:null,defaultOption:{show:"auto",triggerOn:null,zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#aaa",width:1,type:"solid"},shadowStyle:{color:"rgba(150,150,150,0.3)"},label:{show:!0,formatter:null,precision:"auto",margin:3,textStyle:{color:"#fff"},padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,shadowBlur:3,shadowColor:"#aaa"},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}}});t.exports=a},function(t,e,i){var n=i(122),a=i(2).extendComponentView({type:"axisPointer",render:function(t,e,i){var a=e.getComponent("tooltip"),o=t.get("triggerOn")||a&&a.get("triggerOn")||"mousemove|click";n.register("axisPointer",i,function(t,e,i){"none"!==o&&("leave"===t||o.indexOf(t)>=0)&&i({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})})},remove:function(t,e){n.disopse(e.getZr(),"axisPointer"),a.superApply(this._model,"remove",arguments)},dispose:function(t,e){n.unregister("axisPointer",e),a.superApply(this._model,"dispose",arguments)}})},function(t,e,i){function n(t,e,i,n,o,p,g,m){n=n||{},f(i)&&(i=v({seriesIndex:n.seriesIndex,dataIndex:n.dataIndex},p).point);var _=f(i),b=n.axesInfo,w=t.axesInfo,S="leave"===e||f(i),M={},I={},T={list:[],map:{}},A={showPointer:x(r,I),showTooltip:x(s,T)};y(t.coordSysMap,function(e,n){var o=_||e.containPoint(i);y(t.coordSysAxesInfo[n],function(t,e){var n=t.axis,r=h(b,t);if(!S&&o&&(!b||r)){var s=r&&r.value;null!=s||_||(s=n.pointToData(i)),null!=s&&a(t,s,A,!1,M)}})});var C={};return y(w,function(t,e){var i=t.linkGroup;i&&!I[e]&&y(i.axesInfo,function(e,n){var a=I[n];if(e!==t&&a){var o=a.value;i.mapper&&(o=t.axis.scale.parse(i.mapper(o,d(e),d(t)))),C[t.key]=o}})}),y(C,function(t,e){a(w[e],t,A,!0,M)}),l(I,w,M),u(T,i,m,o),c(w,o,g),M}function a(t,e,i,n,a){var r=t.axis;if(!r.scale.isBlank()&&r.containData(e)){if(!t.involveSeries)return void i.showPointer(t,e);var s=o(e,t),l=s.payloadBatch,u=s.snapToValue;l[0]&&null==a.seriesIndex&&p.extend(a,l[0]),!n&&t.snap&&r.containData(u)&&null!=u&&(e=u),i.showPointer(t,e,l,a),i.showTooltip(t,s,u)}}function o(t,e){var i=e.axis,n=i.dim,a=t,o=[],r=Number.MAX_VALUE,s=-1;return y(e.seriesModels,function(e,l){var u,c,h=e.coordDimToDataDim(n);if(e.getAxisTooltipData){var d=e.getAxisTooltipData(h,t,i);c=d.dataIndices,u=d.nestestValue}else{if(c=e.getData().indicesOfNearest(h[0],t,!1,"category"===i.type?.5:null),!c.length)return;u=e.getData().get(h[0],c[0])}if(null!=u&&isFinite(u)){var f=t-u,p=Math.abs(f);p<=r&&((p<r||f>=0&&s<0)&&(r=p,s=f,a=u,o.length=0),y(c,function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})}))}}),{payloadBatch:o,snapToValue:a}}function r(t,e,i,n){t[e.key]={value:i,payloadBatch:n}}function s(t,e,i,n){var a=i.payloadBatch,o=e.axis,r=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&a.length){var l=e.coordSys.model,u=m.makeKey(l),c=t.map[u];c||(c=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(c)),c.dataByAxis.push({axisDim:o.dim,axisIndex:r.componentIndex,axisType:r.type,axisId:r.id,value:n,valueLabelOpt:{precision:s.get("label.precision"),formatter:s.get("label.formatter")},seriesDataIndices:a.slice()})}}function l(t,e,i){var n=i.axesInfo=[];y(e,function(e,i){var a=e.axisPointerModel.option,o=t[i];o?(!e.useHandle&&(a.status="show"),a.value=o.value,a.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(a.status="hide"),"show"===a.status&&n.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:a.value})})}function u(t,e,i,n){if(f(e)||!t.list.length)return void n({type:"hideTip"});var a=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};n({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:i,dataIndexInside:a.dataIndexInside,dataIndex:a.dataIndex,seriesIndex:a.seriesIndex,dataByCoordSys:t.list})}function c(t,e,i){var n=i.getZr(),a="axisPointerLastHighlights",o=_(n)[a]||{},r=_(n)[a]={};y(t,function(t,e){var i=t.axisPointerModel.option;"show"===i.status&&y(i.seriesDataIndices,function(t){var e=t.seriesIndex+" | "+t.dataIndex;r[e]=t})});var s=[],l=[];p.each(o,function(t,e){!r[e]&&l.push(t)}),p.each(r,function(t,e){!o[e]&&s.push(t)}),l.length&&i.dispatchAction({type:"downplay",escapeConnect:!0,batch:l}),s.length&&i.dispatchAction({type:"highlight",escapeConnect:!0,batch:s})}function h(t,e){for(var i=0;i<(t||[]).length;i++){var n=t[i];if(e.axis.dim===n.axisDim&&e.axis.model.componentIndex===n.axisIndex)return n}}function d(t){var e=t.axis.model,i={},n=i.axisDim=t.axis.dim;return i.axisIndex=i[n+"AxisIndex"]=e.componentIndex,i.axisName=i[n+"AxisName"]=e.name,i.axisId=i[n+"AxisId"]=e.id,i}function f(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}var p=i(1),g=i(5),m=i(45),v=i(121),y=p.each,x=p.curry,_=g.makeGetter();t.exports=n},function(t,e,i){i(126),i(46),i(47),i(203),i(204),i(199),i(200),i(124),i(123)},function(t,e,i){function n(t,e,i){var n=[1/0,-(1/0)];return c(i,function(t){var i=t.getData();i&&c(t.coordDimToDataDim(e),function(t){var e=i.getDataExtent(t);e[0]<n[0]&&(n[0]=e[0]),e[1]>n[1]&&(n[1]=e[1])})}),n[1]<n[0]&&(n=[NaN,NaN]),a(t,n),n}function a(t,e){var i=t.getAxisModel(),n=i.getMin(!0),a="category"===i.get("type"),o=a&&(i.get("data")||[]).length;null!=n&&"dataMin"!==n?e[0]=n:a&&(e[0]=o>0?0:NaN);var r=i.getMax(!0);return null!=r&&"dataMax"!==r?e[1]=r:a&&(e[1]=o>0?o-1:NaN),i.get("scale",!0)||(e[0]>0&&(e[0]=0),e[1]<0&&(e[1]=0)),e}function o(t,e){var i=t.getAxisModel(),n=t._percentWindow,a=t._valueWindow;if(n){var o=l.getPixelPrecision(a,[0,500]),r=e||0===n[0]&&100===n[1];i.setRange(r?null:+a[0].toFixed(o),r?null:+a[1].toFixed(o))}}function r(t){var e=t._minMaxSpan={},i=t._dataZoomModel;c(["min","max"],function(n){e[n+"Span"]=i.get(n+"Span");var a=i.get(n+"ValueSpan");null!=a&&(e[n+"ValueSpan"]=a,a=t.getAxisModel().axis.scale.parse(a),null!=a&&(e[n+"Span"]=l.linearMap(a,t._dataExtent,[0,100],!0)))})}var s=i(1),l=i(4),u=i(77),c=s.each,h=l.asc,d=function(t,e,i,n){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this._minMaxSpan,this.ecModel=n,this._dataZoomModel=i};d.prototype={constructor:d,hostedBy:function(t){return this._dataZoomModel===t},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[],e=this.ecModel;return e.eachSeries(function(i){if(u.isCoordSupported(i.get("coordinateSystem"))){var n=this._dimName,a=e.queryComponents({mainType:n+"Axis",index:i.get(n+"AxisIndex"),id:i.get(n+"AxisId")})[0];this._axisIndex===(a&&a.componentIndex)&&t.push(i)}},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,i=this._dimName,n=this.ecModel,a=this.getAxisModel(),o="x"===i||"y"===i;o?(e="gridIndex",t="x"===i?"y":"x"):(e="polarIndex",t="angle"===i?"radius":"angle");var r;return n.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(a.get(e)||0)&&(r=t)}),r},getMinMaxSpan:function(){return s.clone(this._minMaxSpan)},calculateDataWindow:function(t){var e=this._dataExtent,i=this.getAxisModel(),n=i.axis.scale,a=this._dataZoomModel.getRangePropMode(),o=[0,100],r=[t.start,t.end],s=[];return c(["startValue","endValue"],function(e){s.push(null!=t[e]?n.parse(t[e]):null)}),c([0,1],function(t){var i=s[t],u=r[t];"percent"===a[t]?(null==u&&(u=o[t]),i=n.parse(l.linearMap(u,o,e,!0))):u=l.linearMap(i,e,o,!0),s[t]=i,r[t]=u}),{valueWindow:h(s),percentWindow:h(r)}},reset:function(t){if(t===this._dataZoomModel){this._dataExtent=n(this,this._dimName,this.getTargetSeriesModels());var e=this.calculateDataWindow(t.option);this._valueWindow=e.valueWindow,this._percentWindow=e.percentWindow,r(this),o(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,o(this,!0))},filterData:function(t){function e(t){return t>=o[0]&&t<=o[1]}if(t===this._dataZoomModel){var i=this._dimName,n=this.getTargetSeriesModels(),a=t.get("filterMode"),o=this._valueWindow;if("none"!==a){var r=this.getOtherAxisModel();t.get("$fromToolbox")&&r&&"category"===r.get("type")&&(a="empty"),c(n,function(t){var n=t.getData(),r=t.coordDimToDataDim(i);"weakFilter"===a?n&&n.filterSelf(function(t){for(var e,i,a,s=0;s<r.length;s++){var l=n.get(r[s],t),u=!isNaN(l),c=l<o[0],h=l>o[1];if(u&&!c&&!h)return!0;u&&(a=!0),c&&(e=!0),h&&(i=!0)}return a&&e&&i}):n&&c(r,function(i){"empty"===a?t.setData(n.map(i,function(t){return e(t)?t:NaN})):n.filterSelf(i,e)})})}}}},t.exports=d},function(t,e,i){t.exports=i(46).extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}})},function(t,e,i){var n=i(47),a=i(1),o=i(56),r=i(205),s=a.bind,l=n.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,i,n){l.superApply(this,"render",arguments),r.shouldRecordRange(n,t.id)&&(this._range=t.getPercentRange()),a.each(this.getTargetCoordInfo(),function(e,n){var o=a.map(e,function(t){return r.generateCoordId(t.model)});a.each(e,function(e){var a=e.model,l=t.option;r.register(i,{coordId:r.generateCoordId(a),allCoordIds:o,containsPoint:function(t,e,i){return a.coordinateSystem.containPoint([e,i])},dataZoomId:t.id,throttleRate:t.get("throttle",!0),panGetRange:s(this._onPan,this,e,n),zoomGetRange:s(this._onZoom,this,e,n),zoomLock:l.zoomLock,disabled:l.disabled,roamControllerOpt:{zoomOnMouseWheel:l.zoomOnMouseWheel,moveOnMouseMove:l.moveOnMouseMove,preventDefaultMouseMove:l.preventDefaultMouseMove}})},this)},this)},dispose:function(){r.unregister(this.api,this.dataZoomModel.id),l.superApply(this,"dispose",arguments),this._range=null},_onPan:function(t,e,i,n,a,r,s,l,c){var h=this._range.slice(),d=t.axisModels[0];if(d){var f=u[e]([r,s],[l,c],d,i,t),p=f.signal*(h[1]-h[0])*f.pixel/f.pixelLength;return o(p,h,[0,100],"all"),this._range=h}},_onZoom:function(t,e,i,n,a,r){var s=this._range.slice(),l=t.axisModels[0];if(l){var c=u[e](null,[a,r],l,i,t),h=(c.pixel-c.pixelStart)/c.pixelLength*(s[1]-s[0])+s[0];n=Math.max(1/n,0),s[0]=(s[0]-h)*n+h,s[1]=(s[1]-h)*n+h;var d=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return o(0,s,[0,100],0,d.minSpan,d.maxSpan),this._range=s}}}),u={grid:function(t,e,i,n,a){var o=i.axis,r={},s=a.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(r.pixel=e[0]-t[0],r.pixelLength=s.width,r.pixelStart=s.x,r.signal=o.inverse?1:-1):(r.pixel=e[1]-t[1],r.pixelLength=s.height,r.pixelStart=s.y,r.signal=o.inverse?-1:1),r},polar:function(t,e,i,n,a){var o=i.axis,r={},s=a.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===i.mainType?(r.pixel=e[0]-t[0],r.pixelLength=l[1]-l[0],r.pixelStart=l[0],r.signal=o.inverse?1:-1):(r.pixel=e[1]-t[1],r.pixelLength=u[1]-u[0],r.pixelStart=u[0],r.signal=o.inverse?-1:1),r},singleAxis:function(t,e,i,n,a){var o=i.axis,r=a.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=r.width,s.pixelStart=r.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=r.height,s.pixelStart=r.y,s.signal=o.inverse?-1:1),s}};t.exports=l},function(t,e,i){var n=i(46);t.exports=n.extend({type:"dataZoom.select"})},function(t,e,i){t.exports=i(47).extend({type:"dataZoom.select"})},function(t,e,i){var n=i(46),a=n.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}});t.exports=a},function(t,e,i){function n(t){var e={x:"y",y:"x",radius:"angle",angle:"radius"};return e[t]}var a=i(1),o=i(3),r=i(37),s=i(47),l=o.Rect,u=i(4),c=u.linearMap,h=i(12),d=i(56),f=i(21),p=u.asc,g=a.bind,m=a.each,v=7,y=1,x=30,_="horizontal",b="vertical",w=5,S=["line","bar","candlestick","scatter"],M=s.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){return M.superApply(this,"render",arguments),r.createOrUpdate(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),this.dataZoomModel.get("show")===!1?void this.group.removeAll():(n&&"dataZoom"===n.type&&n.from===this.uid||this._buildView(),void this._updateView())},remove:function(){M.superApply(this,"remove",arguments),r.clear(this,"_dispatchZoomAction")},dispose:function(){M.superApply(this,"dispose",arguments),r.clear(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new o.Group;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},o=this._orient===_?{right:n.width-i.x-i.width,top:n.height-x-v,width:i.width,height:x}:{right:v,top:i.y,width:x,height:i.height},r=h.getLayoutParams(t.option);a.each(["right","top","width","height"],function(t){"ph"===r[t]&&(r[t]=o[t])});var s=h.getLayoutRect(r,n,t.padding);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===b&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),a=n&&n.get("inverse"),o=this._displayables.barGroup,r=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(i!==_||a?i===_&&a?{scale:r?[-1,1]:[-1,-1]}:i!==b||a?{scale:r?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:r?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:r?[1,1]:[1,-1]});var s=t.getBoundingRect([o]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size,i=this._displayables.barGroup;i.add(new l({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40})),i.add(new l({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:a.bind(this._onClickPanelClick,this)}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),r=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=r){var s=n.getDataExtent(r),l=.3*(s[1]-s[0]);s=[s[0]-l,s[1]+l];var u,h=[0,e[1]],d=[0,e[0]],f=[[e[0],0],[0,0]],p=[],g=d[1]/(n.count()-1),m=0,v=Math.round(n.count()/e[0]);n.each([r],function(t,e){if(v>0&&e%v)return void(m+=g);var i=null==t||isNaN(t)||""===t,n=i?0:c(t,s,h,!0);i&&!u&&e?(f.push([f[f.length-1][0],0]),p.push([p[p.length-1][0],0])):!i&&u&&(f.push([m,0]),p.push([m,0])),f.push([m,n]),p.push([m,n]),m+=g,u=i});var y=this.dataZoomModel;this._displayables.barGroup.add(new o.Polygon({shape:{points:f},style:a.defaults({fill:y.get("dataBackgroundColor")},y.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new o.Polyline({shape:{points:p},style:y.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(e!==!1){var i,o=this.ecModel;return t.eachTargetAxis(function(r,s){var l=t.getAxisProxy(r.name,s).getTargetSeriesModels();a.each(l,function(t){if(!(i||e!==!0&&a.indexOf(S,t.get("type"))<0)){var l,u=o.getComponent(r.axis,s).axis,c=n(r.name),h=t.coordinateSystem;null!=c&&h.getOtherAxis&&(l=h.getOtherAxis(u).inverse),i={thisAxis:u,series:t,thisDim:r.name,otherDim:c,otherAxisInverse:l}}},this)},this),i}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],i=t.handleLabels=[],n=this._displayables.barGroup,a=this._size,r=this.dataZoomModel;n.add(t.filler=new l({draggable:!0,cursor:"move",drift:g(this._onDragMove,this,"all"),onmousemove:function(t){f.stop(t.event)},ondragstart:g(this._showDataInfo,this,!0),ondragend:g(this._onDragEnd,this),onmouseover:g(this._showDataInfo,this,!0),onmouseout:g(this._showDataInfo,this,!1),style:{fill:r.get("fillerColor"),textPosition:"inside"}})),n.add(new l(o.subPixelOptimizeRect({silent:!0,shape:{x:0,y:0,width:a[0],height:a[1]},style:{stroke:r.get("dataBackgroundColor")||r.get("borderColor"),lineWidth:y,fill:"rgba(0,0,0,0)"}})));var s=r.get("handleIcon");m([0,1],function(t){var a={style:{strokeNoScale:!0},rectHover:!0,cursor:"vertical"===this._orient?"ns-resize":"ew-resize",draggable:!0,drift:g(this._onDragMove,this,t),onmousemove:function(t){f.stop(t.event)},ondragend:g(this._onDragEnd,this),onmouseover:g(this._showDataInfo,this,!0),onmouseout:g(this._showDataInfo,this,!1)},l={x:-1,y:0,width:2,height:2},c=0===s.indexOf("image://")?(l.image=s.slice(8),a.style=l,new o.Image(a)):o.makePath(s.replace("path://",""),a,l,"center"),h=c.getBoundingRect();this._handleHeight=u.parsePercent(r.get("handleSize"),this._size[1]),this._handleWidth=h.width/h.height*this._handleHeight,c.setStyle(r.getModel("handleStyle").getItemStyle());var d=r.get("handleColor");null!=d&&(c.style.fill=d),n.add(e[t]=c);var p=r.textStyleModel;this.group.add(i[t]=new o.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",fill:p.getTextColor(),textFont:p.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[c(t[0],[0,100],e,!0),c(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var i=this.dataZoomModel,n=this._handleEnds,a=this._getViewExtent(),o=i.findRepresentativeAxisProxy().getMinMaxSpan(),r=[0,100];d(e,n,a,i.get("zoomLock")?"all":t,null!=o.minSpan?c(o.minSpan,r,a,!0):null,null!=o.maxSpan?c(o.maxSpan,r,a,!0):null),this._range=p([c(n[0],a,r,!0),c(n[1],a,r,!0)])},_updateView:function(t){var e=this._displayables,i=this._handleEnds,n=p(i.slice()),a=this._size;m([0,1],function(t){var n=e.handles[t],o=this._handleHeight;n.attr({scale:[o/2,o/2],position:[i[t],a[1]/2-o/2]})},this),e.filler.setShape({x:n[0],y:0,width:n[1]-n[0],height:a[1]}),this._updateDataInfo(t)},_updateDataInfo:function(t){function e(t){var e=o.getTransform(n.handles[t].parent,this.group),i=o.transformDirection(0===t?"right":"left",e),l=this._handleWidth/2+w,u=o.applyTransform([d[t]+(0===t?-l:l),this._size[1]/2],e);a[t].setStyle({x:u[0],y:u[1],textVerticalAlign:r===_?"middle":i,textAlign:r===_?i:"center",text:s[t]})}var i=this.dataZoomModel,n=this._displayables,a=n.handleLabels,r=this._orient,s=["",""];if(i.get("showDetail")){var l=i.findRepresentativeAxisProxy();if(l){var u=l.getAxisModel().axis,c=this._range,h=t?l.calculateDataWindow({start:c[0],end:c[1]}).valueWindow:l.getDataValueWindow();s=[this._formatLabel(h[0],u),this._formatLabel(h[1],u)]}}var d=p(this._handleEnds.slice());e.call(this,0),e.call(this,1)},_formatLabel:function(t,e){var i=this.dataZoomModel,n=i.get("labelFormatter"),o=i.get("labelPrecision");null!=o&&"auto"!==o||(o=e.getPixelPrecision());var r=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(o,20));return a.isFunction(n)?n(t,r):a.isString(n)?n.replace("{value}",r):r},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,i){this._dragging=!0;var n=this._displayables.barGroup.getLocalTransform(),a=o.applyTransform([e,i],n,!0);this._updateInterval(t,a[0]);var r=this.dataZoomModel.get("realtime");this._updateView(!r),r&&r&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),this._dispatchZoomAction()},_onClickPanelClick:function(t){var e=this._size,i=this._displayables.barGroup.transformCoordToLocal(t.offsetX,t.offsetY);if(!(i[0]<0||i[0]>e[0]||i[1]<0||i[1]>e[1])){var n=this._handleEnds,a=(n[0]+n[1])/2;this._updateInterval("all",i[0]-a),this._updateView(),this._dispatchZoomAction()}},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_findCoordRect:function(){var t;if(m(this.getTargetCoordInfo(),function(e){if(!t&&e.length){var i=e[0].model.coordinateSystem;t=i.getRect&&i.getRect()}}),!t){var e=this.api.getWidth(),i=this.api.getHeight();t={x:.2*e,y:.2*i,width:.6*e,height:.6*i}}return t}});t.exports=M},function(t,e,i){function n(t){var e=t.getZr();return e[p]||(e[p]={})}function a(t,e){var i=new h(t.getZr());return i.on("pan",f(r,e)),i.on("zoom",f(s,e)),i}function o(t){c.each(t,function(e,i){e.count||(e.controller.dispose(),delete t[i])})}function r(t,e,i,n,a,o,r){l(t,function(s){return s.panGetRange(t.controller,e,i,n,a,o,r)})}function s(t,e,i,n){l(t,function(a){return a.zoomGetRange(t.controller,e,i,n)})}function l(t,e){var i=[];c.each(t.dataZoomInfos,function(t){var n=e(t);n&&i.push({dataZoomId:t.dataZoomId,start:n[0],end:n[1]})}),t.dispatchAction(i)}function u(t,e){t.dispatchAction({type:"dataZoom",batch:e})}var c=i(1),h=i(95),d=i(37),f=c.curry,p="\0_ec_dataZoom_roams",g={register:function(t,e){var i=n(t),r=e.dataZoomId,s=e.coordId;c.each(i,function(t,i){var n=t.dataZoomInfos;n[r]&&c.indexOf(e.allCoordIds,s)<0&&(delete n[r],t.count--)}),o(i);var l=i[s];l||(l=i[s]={coordId:s,dataZoomInfos:{},count:0},l.controller=a(t,l),l.dispatchAction=c.curry(u,t)),l.controller.enable(!e.disabled&&(!e.zoomLock||"move"),e.roamControllerOpt),l.controller.setPointerChecker(e.containsPoint),d.createOrUpdate(l,"dispatchAction",e.throttleRate,"fixRate"),!l.dataZoomInfos[r]&&l.count++,l.dataZoomInfos[r]=e},unregister:function(t,e){var i=n(t);c.each(i,function(t){t.controller.dispose();var i=t.dataZoomInfos;i[e]&&(delete i[e],t.count--)}),o(i)},shouldRecordRange:function(t,e){if(t&&"dataZoom"===t.type&&t.batch)for(var i=0,n=t.batch.length;i<n;i++)if(t.batch[i].dataZoomId===e)return!1;
+return!0},generateCoordId:function(t){return t.type+"\0_"+t.id}};t.exports=g},function(t,e,i){i(126),i(46),i(47),i(201),i(202),i(124),i(123)},function(t,e,i){function n(t,e,i,n){var a=i.type,o=f[a.charAt(0).toUpperCase()+a.slice(1)],r=new o(i);e.add(r),n.set(t,r),r.__ecGraphicId=t}function a(t,e){var i=t&&t.parent;i&&("group"===t.type&&t.traverse(function(t){a(t,e)}),e.removeKey(t.__ecGraphicId),i.remove(t))}function o(t){return t=h.extend({},t),h.each(["id","parentId","$action","hv","bounding"].concat(p.LOCATION_PARAMS),function(e){delete t[e]}),t}function r(t,e){var i;return h.each(e,function(e){null!=t[e]&&"auto"!==t[e]&&(i=!0)}),i}function s(t,e){var i=t.exist;if(e.id=t.keyInfo.id,!e.type&&i&&(e.type=i.type),null==e.parentId){var n=e.parentOption;n?e.parentId=n.id:i&&(e.parentId=i.parentId)}e.parentOption=null}function l(t,e,i){var n=h.extend({},i),a=t[e],o=i.$action||"merge";if("merge"===o)if(a){h.merge(a,n,!0),p.mergeLayoutParam(a,n,{ignoreSize:!0}),p.copyLayoutParams(i,a)}else t[e]=n;else"replace"===o?t[e]=n:"remove"===o&&a&&(t[e]=null)}function u(t,e){t&&(t.hv=e.hv=[r(e,["left","right"]),r(e,["top","bottom"])],"group"===t.type&&(null==t.width&&(t.width=e.width=0),null==t.height&&(t.height=e.height=0)))}var c=i(2),h=i(1),d=i(5),f=i(3),p=i(12);c.registerPreprocessor(function(t){var e=t.graphic;h.isArray(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])});var g=c.extendComponentModel({type:"graphic",defaultOption:{elements:[],parentId:null},_elOptionsToUpdate:null,mergeOption:function(t){var e=this.option.elements;this.option.elements=null,g.superApply(this,"mergeOption",arguments),this.option.elements=e},optionUpdated:function(t,e){var i=this.option,n=(e?i:t).elements,a=i.elements=e?[]:i.elements,o=[];this._flatten(n,o);var r=d.mappingToExists(a,o);d.makeIdAndName(r);var c=this._elOptionsToUpdate=[];h.each(r,function(t,e){var i=t.option;i&&(c.push(i),s(t,i),l(a,e,i),u(a[e],i))},this);for(var f=a.length-1;f>=0;f--)null==a[f]?a.splice(f,1):delete a[f].$action},_flatten:function(t,e,i){h.each(t,function(t){if(t){i&&(t.parentOption=i),e.push(t);var n=t.children;"group"===t.type&&n&&this._flatten(n,e,t),delete t.children}},this)},useElOptionsToUpdate:function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t}});c.extendComponentView({type:"graphic",init:function(t,e){this._elMap=h.createHashMap(),this._lastGraphicModel},render:function(t,e,i){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t,i),this._relocate(t,i)},_updateElements:function(t,e){var i=t.useElOptionsToUpdate();if(i){var r=this._elMap,s=this.group;h.each(i,function(t){var e=t.$action,i=t.id,l=r.get(i),u=t.parentId,c=null!=u?r.get(u):s;t.hv&&t.hv[1]&&"text"===t.type&&(t.style=h.defaults({textBaseline:"middle"},t.style),t.style.textVerticalAlign=null);var d=o(t);e&&"merge"!==e?"replace"===e?(a(l,r),n(i,c,d,r)):"remove"===e&&a(l,r):l?l.attr(d):n(i,c,d,r);var f=r.get(i);f&&(f.__ecGraphicWidth=t.width,f.__ecGraphicHeight=t.height)})}},_relocate:function(t,e){for(var i=t.option.elements,n=this.group,a=this._elMap,o=i.length-1;o>=0;o--){var r=i[o],s=a.get(r.id);if(s){var l=s.parent,u=l===n?{width:e.getWidth(),height:e.getHeight()}:{width:l.__ecGraphicWidth||0,height:l.__ecGraphicHeight||0};p.positionElement(s,r,u,null,{hv:r.hv,boundingMode:r.bounding})}}},_clear:function(){var t=this._elMap;t.each(function(e){a(e,t)}),this._elMap=h.createHashMap()},dispose:function(){this._clear()}})},function(t,e,i){i(32),i(120),i(55)},function(t,e,i){i(210),i(212),i(211);var n=i(2);n.registerProcessor(i(213))},function(t,e,i){"use strict";var n=i(1),a=i(10),o=i(2).extendComponentModel({type:"legend",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,i){this.mergeDefaultAndTheme(t,i),t.selected=t.selected||{}},mergeOption:function(t){o.superCall(this,"mergeOption",t)},optionUpdated:function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,i=0;i<t.length;i++){var n=t[i].get("name");if(this.isSelected(n)){this.select(n),e=!0;break}}!e&&this.select(t[0].get("name"))}},_updateData:function(t){var e=n.map(this.get("data")||[],function(t){return"string"!=typeof t&&"number"!=typeof t||(t={name:t}),new a(t,this,this.ecModel)},this);this._data=e;var i=n.map(t.getSeries(),function(t){return t.name});t.eachSeries(function(t){if(t.legendDataProvider){var e=t.legendDataProvider();i=i.concat(e.mapArray(e.getName))}}),this._availableNames=i},getData:function(){return this._data},select:function(t){var e=this.option.selected,i=this.get("selectedMode");if("single"===i){var a=this._data;n.each(a,function(t){e[t.get("name")]=!1})}e[t]=!0},unSelect:function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},isSelected:function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&n.indexOf(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:"top",align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,tooltip:{show:!1}}});t.exports=o},function(t,e,i){function n(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function a(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get("legendHoverLink")&&i.dispatchAction({type:"highlight",seriesName:t.name,name:e})}function o(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get("legendHoverLink")&&i.dispatchAction({type:"downplay",seriesName:t.name,name:e})}var r=i(1),s=i(24),l=i(3),u=i(130),c=r.curry;t.exports=i(2).extendComponentView({type:"legend",init:function(){this._symbolTypeStore={}},render:function(t,e,i){var s=this.group;if(s.removeAll(),t.get("show")){var h=t.get("selectedMode"),d=t.get("align");"auto"===d&&(d="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left");var f=r.createHashMap();r.each(t.getData(),function(r){var u=r.get("name");if(""===u||"\n"===u)return void s.add(new l.Group({newline:!0}));var p=e.getSeriesByName(u)[0];if(!f.get(u))if(p){var g=p.getData(),m=g.getVisual("color");"function"==typeof m&&(m=m(p.getDataParams(0)));var v=g.getVisual("legendSymbol")||"roundRect",y=g.getVisual("symbol"),x=this._createItem(u,r,t,v,y,d,m,h);x.on("click",c(n,u,i)).on("mouseover",c(a,p,null,i)).on("mouseout",c(o,p,null,i)),f.set(u,!0)}else e.eachRawSeries(function(e){if(!f.get(u)&&e.legendDataProvider){var s=e.legendDataProvider(),l=s.indexOfName(u);if(l<0)return;var p=s.getItemVisual(l,"color"),g="roundRect",m=this._createItem(u,r,t,g,null,d,p,h);m.on("click",c(n,u,i)).on("mouseover",c(a,e,u,i)).on("mouseout",c(o,e,u,i)),f.set(u,!0)}},this)},this),u.layout(s,t,i),u.addBackground(s,t)}},_createItem:function(t,e,i,n,a,o,u,c){var h=i.get("itemWidth"),d=i.get("itemHeight"),f=i.get("inactiveColor"),p=i.isSelected(t),g=new l.Group,m=e.getModel("textStyle"),v=e.get("icon"),y=e.getModel("tooltip"),x=y.parentModel;if(n=v||n,g.add(s.createSymbol(n,0,0,h,d,p?u:f)),!v&&a&&(a!==n||"none"==a)){var _=.8*d;"none"===a&&(a="circle"),g.add(s.createSymbol(a,(h-_)/2,(d-_)/2,_,_,p?u:f))}var b="left"===o?h+5:-5,w=o,S=i.get("formatter"),M=t;"string"==typeof S&&S?M=S.replace("{name}",null!=t?t:""):"function"==typeof S&&(M=S(t));var I=new l.Text({style:{text:M,x:b,y:d/2,fill:p?m.getTextColor():f,textFont:m.getFont(),textAlign:w,textVerticalAlign:"middle"}});g.add(I);var T=new l.Rect({shape:g.getBoundingRect(),invisible:!0,tooltip:y.get("show")?r.extend({content:t,formatter:x.get("formatter",!0)||function(){return t},formatterParams:{componentType:"legend",legendIndex:i.componentIndex,name:t,$vars:["name"]}},y.option):null});return g.add(T),g.eachChild(function(t){t.silent=!0}),T.silent=!c,this.group.add(g),l.setHoverStyle(g),g}})},function(t,e,i){function n(t,e,i){var n,a={},r="toggleSelected"===t;return i.eachComponent("legend",function(i){r&&null!=n?i[n?"select":"unSelect"](e.name):(i[t](e.name),n=i.isSelected(e.name));var s=i.getData();o.each(s,function(t){var e=t.get("name");if("\n"!==e&&""!==e){var n=i.isSelected(e);a.hasOwnProperty(e)?a[e]=a[e]&&n:a[e]=n}})}),{name:e.name,selected:a}}var a=i(2),o=i(1);a.registerAction("legendToggleSelect","legendselectchanged",o.curry(n,"toggleSelected")),a.registerAction("legendSelect","legendselected",o.curry(n,"select")),a.registerAction("legendUnSelect","legendunselected",o.curry(n,"unSelect"))},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var i=0;i<e.length;i++)if(!e[i].isSelected(t.name))return!1;return!0})}},function(t,e,i){i(217),i(218),i(2).registerPreprocessor(function(t){t.markArea=t.markArea||{}})},function(t,e,i){i(219),i(220),i(2).registerPreprocessor(function(t){t.markLine=t.markLine||{}})},function(t,e,i){i(221),i(222),i(2).registerPreprocessor(function(t){t.markPoint=t.markPoint||{}})},function(t,e,i){t.exports=i(79).extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{normal:{show:!0,position:"top"},emphasis:{show:!0,position:"top"}},itemStyle:{normal:{borderWidth:0}}}})},function(t,e,i){function n(t){return!isNaN(t)&&!isFinite(t)}function a(t,e,i,a){var o=1-t;return n(e[o])&&n(i[o])}function o(t,e){var i=e.coord[0],n=e.coord[1];return!("cartesian2d"!==t.type||!i||!n||!a(1,i,n,t)&&!a(0,i,n,t))||(f.dataFilter(t,{coord:i,x:e.x0,y:e.y0})||f.dataFilter(t,{coord:n,x:e.x1,y:e.y1}))}function r(t,e,i,a,o){var r,s=a.coordinateSystem,l=t.getItemModel(e),u=c.parsePercent(l.get(i[0]),o.getWidth()),h=c.parsePercent(l.get(i[1]),o.getHeight());if(isNaN(u)||isNaN(h)){if(a.getMarkerPosition)r=a.getMarkerPosition(t.getValues(i,e));else{var d=t.get(i[0],e),f=t.get(i[1],e);r=s.dataToPoint([d,f],!0)}if("cartesian2d"===s.type){var p=s.getAxis("x"),g=s.getAxis("y"),d=t.get(i[0],e),f=t.get(i[1],e);n(d)?r[0]=p.toGlobalCoord(p.getExtent()["x0"===i[0]?0:1]):n(f)&&(r[1]=g.toGlobalCoord(g.getExtent()["y0"===i[1]?0:1]))}isNaN(u)||(r[0]=u),isNaN(h)||(r[1]=h)}else r=[u,h];return r}function s(t,e,i){var n,a,r=["x0","y0","x1","y1"];t?(n=l.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}),a=new u(l.map(r,function(t,e){return{name:t,type:n[e%2].type}}),i)):(n=[{name:"value",type:"float"}],a=new u(n,i));var s=l.map(i.get("data"),l.curry(p,e,t,i));t&&(s=l.filter(s,l.curry(o,t)));var c=t?function(t,e,i,n){return t.coord[Math.floor(n/2)][n%2]}:function(t){return t.value};return a.initData(s,null,c),a.hasItemOption=!0,a}var l=i(1),u=i(14),c=i(4),h=i(3),d=i(22),f=i(81),p=function(t,e,i,n){var a=f.dataTransform(t,n[0]),o=f.dataTransform(t,n[1]),r=l.retrieve,s=a.coord,u=o.coord;s[0]=r(s[0],-(1/0)),s[1]=r(s[1],-(1/0)),u[0]=r(u[0],1/0),u[1]=r(u[1],1/0);var c=l.mergeAll([{},a,o]);return c.coord=[a.coord,o.coord],c.x0=a.x,c.y0=a.y,c.x1=o.x,c.y1=o.y,c},g=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];i(80).extend({type:"markArea",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var n=e.getData();n.each(function(e){var a=l.map(g,function(a){return r(n,e,a,t,i)});n.setItemLayout(e,a);var o=n.getItemGraphicEl(e);o.setShape("points",a)})}},this)},renderSeries:function(t,e,i,n){var a=t.coordinateSystem,o=t.name,u=t.getData(),c=this.markerGroupMap,f=c.get(o)||c.set(o,{group:new h.Group});this.group.add(f.group),f.__keep=!0;var p=s(a,t,e);e.setData(p),p.each(function(e){p.setItemLayout(e,l.map(g,function(i){return r(p,e,i,t,n)})),p.setItemVisual(e,{color:u.getVisual("color")})}),p.diff(f.__data).add(function(t){var e=new h.Polygon({shape:{points:p.getItemLayout(t)}});p.setItemGraphicEl(t,e),f.group.add(e)}).update(function(t,i){var n=f.__data.getItemGraphicEl(i);h.updateProps(n,{shape:{points:p.getItemLayout(t)}},e,t),f.group.add(n),p.setItemGraphicEl(t,n)}).remove(function(t){var e=f.__data.getItemGraphicEl(t);f.group.remove(e)}).execute(),p.eachItemGraphicEl(function(t,i){var n=p.getItemModel(i),a=n.getModel("label.normal"),o=n.getModel("label.emphasis"),r=p.getItemVisual(i,"color");t.useStyle(l.defaults(n.getModel("itemStyle.normal").getItemStyle(),{fill:d.modifyAlpha(r,.4),stroke:r})),t.hoverStyle=n.getModel("itemStyle.normal").getItemStyle();var s=p.getName(i)||"",u=r||t.style.fill;a.getShallow("show")?(h.setText(t.style,a,u),t.style.text=l.retrieve(e.getFormattedLabel(i,"normal"),s)):t.style.text="",o.getShallow("show")?(h.setText(t.hoverStyle,o,u),t.hoverStyle.text=l.retrieve(e.getFormattedLabel(i,"emphasis"),s)):t.hoverStyle.text="",h.setHoverStyle(t,{}),t.dataModel=e}),f.__data=p,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,i){t.exports=i(79).extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"end"},emphasis:{show:!0}},lineStyle:{normal:{type:"dashed"},emphasis:{width:3}},animationEasing:"linear"}})},function(t,e,i){function n(t){return!isNaN(t)&&!isFinite(t)}function a(t,e,i,a){var o=1-t,r=a.dimensions[t];return n(e[o])&&n(i[o])&&e[t]===i[t]&&a.getAxis(r).containData(e[t])}function o(t,e){if("cartesian2d"===t.type){var i=e[0].coord,n=e[1].coord;if(i&&n&&(a(1,i,n,t)||a(0,i,n,t)))return!0}return h.dataFilter(t,e[0])&&h.dataFilter(t,e[1])}function r(t,e,i,a,o){var r,s=a.coordinateSystem,l=t.getItemModel(e),u=c.parsePercent(l.get("x"),o.getWidth()),h=c.parsePercent(l.get("y"),o.getHeight());if(isNaN(u)||isNaN(h)){if(a.getMarkerPosition)r=a.getMarkerPosition(t.getValues(t.dimensions,e));else{var d=s.dimensions,f=t.get(d[0],e),p=t.get(d[1],e);r=s.dataToPoint([f,p])}if("cartesian2d"===s.type){var g=s.getAxis("x"),m=s.getAxis("y"),d=s.dimensions;n(t.get(d[0],e))?r[0]=g.toGlobalCoord(g.getExtent()[i?0:1]):n(t.get(d[1],e))&&(r[1]=m.toGlobalCoord(m.getExtent()[i?0:1]))}isNaN(u)||(r[0]=u),isNaN(h)||(r[1]=h)}else r=[u,h];t.setItemLayout(e,r)}function s(t,e,i){var n;n=t?l.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:"value",type:"float"}];var a=new u(n,i),r=new u(n,i),s=new u([],i),c=l.map(i.get("data"),l.curry(f,e,t,i));t&&(c=l.filter(c,l.curry(o,t)));var d=t?h.dimValueGetter:function(t){return t.value};return a.initData(l.map(c,function(t){return t[0]}),null,d),r.initData(l.map(c,function(t){return t[1]}),null,d),s.initData(l.map(c,function(t){return t[2]})),s.hasItemOption=!0,{from:a,to:r,line:s}}var l=i(1),u=i(14),c=i(4),h=i(81),d=i(107),f=function(t,e,i,n){var a=t.getData(),o=n.type;if(!l.isArray(n)&&("min"===o||"max"===o||"average"===o||null!=n.xAxis||null!=n.yAxis)){var r,s,u;if(null!=n.yAxis||null!=n.xAxis)s=null!=n.yAxis?"y":"x",r=e.getAxis(s),u=l.retrieve(n.yAxis,n.xAxis);else{var c=h.getAxisInfo(n,a,e,t);s=c.valueDataDim,r=c.valueAxis,u=h.numCalculate(a,s,o)}var d="x"===s?0:1,f=1-d,p=l.clone(n),g={};p.type=null,p.coord=[],g.coord=[],p.coord[f]=-(1/0),g.coord[f]=1/0;var m=i.get("precision");m>=0&&"number"==typeof u&&(u=+u.toFixed(m)),p.coord[d]=g.coord[d]=u,n=[p,g,{type:o,valueIndex:n.valueIndex,value:u}]}return n=[h.dataTransform(t,n[0]),h.dataTransform(t,n[1]),l.extend({},n[2])],n[2].type=n[2].type||"",l.merge(n[2],n[0]),l.merge(n[2],n[1]),n};i(80).extend({type:"markLine",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markLineModel;if(e){var n=e.getData(),a=e.__from,o=e.__to;a.each(function(e){r(a,e,!0,t,i),r(o,e,!1,t,i)}),n.each(function(t){n.setItemLayout(t,[a.getItemLayout(t),o.getItemLayout(t)])}),this.markerGroupMap.get(t.name).updateLayout()}},this)},renderSeries:function(t,e,i,n){function a(e,i,a){var o=e.getItemModel(i);r(e,i,a,t,n),e.setItemVisual(i,{symbolSize:o.get("symbolSize")||x[a?0:1],symbol:o.get("symbol",!0)||y[a?0:1],color:o.get("itemStyle.normal.color")||c.getVisual("color")})}var o=t.coordinateSystem,u=t.name,c=t.getData(),h=this.markerGroupMap,f=h.get(u)||h.set(u,new d);this.group.add(f.group);var p=s(o,t,e),g=p.from,m=p.to,v=p.line;e.__from=g,e.__to=m,e.setData(v);var y=e.get("symbol"),x=e.get("symbolSize");l.isArray(y)||(y=[y,y]),"number"==typeof x&&(x=[x,x]),p.from.each(function(t){a(g,t,!0),a(m,t,!1)}),v.each(function(t){var e=v.getItemModel(t).get("lineStyle.normal.color");v.setItemVisual(t,{color:e||g.getItemVisual(t,"color")}),v.setItemLayout(t,[g.getItemLayout(t),m.getItemLayout(t)]),v.setItemVisual(t,{fromSymbolSize:g.getItemVisual(t,"symbolSize"),fromSymbol:g.getItemVisual(t,"symbol"),toSymbolSize:m.getItemVisual(t,"symbolSize"),toSymbol:m.getItemVisual(t,"symbol")})}),f.updateData(v),p.line.eachItemGraphicEl(function(t,i){t.traverse(function(t){t.dataModel=e})}),f.__keep=!0,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,i){t.exports=i(79).extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"inside"},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:2}}}})},function(t,e,i){function n(t,e,i){var n=e.coordinateSystem;t.each(function(a){var o,r=t.getItemModel(a),l=s.parsePercent(r.get("x"),i.getWidth()),u=s.parsePercent(r.get("y"),i.getHeight());if(isNaN(l)||isNaN(u)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,a));else if(n){var c=t.get(n.dimensions[0],a),h=t.get(n.dimensions[1],a);o=n.dataToPoint([c,h])}}else o=[l,u];isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u),t.setItemLayout(a,o)})}function a(t,e,i){var n;n=t?r.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:"value",type:"float"}];var a=new l(n,i),o=r.map(i.get("data"),r.curry(u.dataTransform,e));return t&&(o=r.filter(o,r.curry(u.dataFilter,t))),a.initData(o,null,t?u.dimValueGetter:function(t){return t.value}),a}var o=i(44),r=i(1),s=i(4),l=i(14),u=i(81);i(80).extend({type:"markPoint",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markPointModel;e&&(n(e.getData(),t,i),this.markerGroupMap.get(t.name).updateLayout(e))},this)},renderSeries:function(t,e,i,r){var s=t.coordinateSystem,l=t.name,u=t.getData(),c=this.markerGroupMap,h=c.get(l)||c.set(l,new o),d=a(s,t,e);e.setData(d),n(e.getData(),t,r),d.each(function(t){var i=d.getItemModel(t),n=i.getShallow("symbolSize");"function"==typeof n&&(n=n(e.getRawValue(t),e.getDataParams(t))),d.setItemVisual(t,{symbolSize:n,color:i.get("itemStyle.normal.color")||u.getVisual("color"),symbol:i.getShallow("symbol")})}),h.updateData(d),this.group.add(h.group),d.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),h.__keep=!0,h.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,i){"use strict";var n=i(2),a=i(3),o=i(12);n.extendComponentModel({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),n.extendComponentView({type:"title",render:function(t,e,i){if(this.group.removeAll(),t.get("show")){var n=this.group,r=t.getModel("textStyle"),s=t.getModel("subtextStyle"),l=t.get("textAlign"),u=t.get("textBaseline"),c=new a.Text({style:{text:t.get("text"),textFont:r.getFont(),fill:r.getTextColor()},z2:10}),h=c.getBoundingRect(),d=t.get("subtext"),f=new a.Text({style:{text:d,textFont:s.getFont(),fill:s.getTextColor(),y:h.height+t.get("itemGap"),textBaseline:"top"},z2:10}),p=t.get("link"),g=t.get("sublink");c.silent=!p,f.silent=!g,p&&c.on("click",function(){window.open(p,"_"+t.get("target"))}),g&&f.on("click",function(){window.open(g,"_"+t.get("subtarget"))}),n.add(c),d&&n.add(f);var m=n.getBoundingRect(),v=t.getBoxLayoutParams();v.width=m.width,v.height=m.height;var y=o.getLayoutRect(v,{width:i.getWidth(),height:i.getHeight()},t.get("padding"));l||(l=t.get("left")||t.get("right"),"middle"===l&&(l="center"),"right"===l?y.x+=y.width:"center"===l&&(y.x+=y.width/2)),u||(u=t.get("top")||t.get("bottom"),"center"===u&&(u="middle"),"bottom"===u?y.y+=y.height:"middle"===u&&(y.y+=y.height/2),u=u||"top"),n.attr("position",[y.x,y.y]);var x={textAlign:l,textVerticalAlign:u};c.setStyle(x),f.setStyle(x),m=n.getBoundingRect();var _=y.margin,b=t.getItemStyle(["color","opacity"]);b.fill=t.get("backgroundColor");var w=new a.Rect({shape:{x:m.x-_[3],y:m.y-_[0],width:m.width+_[1]+_[3],height:m.height+_[0]+_[2]},style:b,silent:!0});a.subPixelOptimizeRect(w),n.add(w)}}})},function(t,e,i){i(225),i(226),i(231),i(229),i(227),i(228),i(230)},function(t,e,i){var n=i(29),a=i(1),o=i(2).extendComponentModel({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(t){o.superApply(this,"mergeDefaultAndTheme",arguments),a.each(this.option.feature,function(t,e){var i=n.get(e);i&&a.merge(t,i.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{normal:{borderColor:"#666",color:"none"},emphasis:{borderColor:"#3E98C5"}}}});t.exports=o},function(t,e,i){(function(e){function n(t){return 0===t.indexOf("my")}var a=i(29),o=i(1),r=i(3),s=i(10),l=i(48),u=i(130),c=i(16);t.exports=i(2).extendComponentView({type:"toolbox",render:function(t,e,i,h){function d(o,r){var l,u=y[o],c=y[r],d=m[u],p=new s(d,t,t.ecModel);if(u&&!c){if(n(u))l={model:p,onclick:p.option.onclick,featureName:u};else{var g=a.get(u);if(!g)return;l=new g(p,e,i)}v[u]=l}else{if(l=v[c],!l)return;l.model=p,l.ecModel=e,l.api=i}return!u&&c?void(l.dispose&&l.dispose(e,i)):!p.get("show")||l.unusable?void(l.remove&&l.remove(e,i)):(f(p,l,u),p.setIconStatus=function(t,e){var i=this.option,n=this.iconPaths;i.iconStatus=i.iconStatus||{},i.iconStatus[t]=e,n[t]&&n[t].trigger(e)},void(l.render&&l.render(p,e,i,h)))}function f(n,a,s){var l=n.getModel("iconStyle"),u=a.getIcons?a.getIcons():n.get("icon"),c=n.get("title")||{};if("string"==typeof u){var h=u,d=c;u={},c={},u[s]=h,c[s]=d}var f=n.iconPaths={};o.each(u,function(s,u){var h=l.getModel("normal").getItemStyle(),d=l.getModel("emphasis").getItemStyle(),m={x:-g/2,y:-g/2,width:g,height:g},v=0===s.indexOf("image://")?(m.image=s.slice(8),new r.Image({style:m})):r.makePath(s.replace("path://",""),{style:h,hoverStyle:d,rectHover:!0},m,"center");r.setHoverStyle(v),t.get("showTitle")&&(v.__title=c[u],v.on("mouseover",function(){var t=l.getModel("emphasis").getItemStyle();v.setStyle({text:c[u],textPosition:t.textPosition||"bottom",textFill:t.fill||t.stroke||"#000",textAlign:t.textAlign||"center"})}).on("mouseout",function(){v.setStyle({textFill:null})})),v.trigger(n.get("iconStatus."+u)||"normal"),p.add(v),v.on("click",o.bind(a.onclick,a,e,i,u)),f[u]=v})}var p=this.group;if(p.removeAll(),t.get("show")){var g=+t.get("itemSize"),m=t.get("feature")||{},v=this._features||(this._features={}),y=[];o.each(m,function(t,e){y.push(e)}),new l(this._featureNames||[],y).add(d).update(d).remove(o.curry(d,null)).execute(),this._featureNames=y,u.layout(p,t,i),u.addBackground(p,t),p.eachChild(function(t){var e=t.__title,n=t.hoverStyle;if(n&&e){var a=c.getBoundingRect(e,n.font),o=t.position[0]+p.position[0],r=t.position[1]+p.position[1]+g,s=!1;r+a.height>i.getHeight()&&(n.textPosition="top",s=!0);var l=s?-5-a.height:g+8;o+a.width/2>i.getWidth()?(n.textPosition=["100%",l],n.textAlign="right"):o-a.width/2<0&&(n.textPosition=[0,l],n.textAlign="left")}})}},updateView:function(t,e,i,n){o.each(this._features,function(t){t.updateView&&t.updateView(t.model,e,i,n)})},updateLayout:function(t,e,i,n){o.each(this._features,function(t){t.updateLayout&&t.updateLayout(t.model,e,i,n)})},remove:function(t,e){o.each(this._features,function(i){i.remove&&i.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){o.each(this._features,function(i){i.dispose&&i.dispose(t,e)})}})}).call(e,i(188))},function(t,e,i){function n(t){var e={},i=[],n=[];return t.eachRawSeries(function(t){var a=t.coordinateSystem;if(!a||"cartesian2d"!==a.type&&"polar"!==a.type)i.push(t);else{var o=a.getBaseAxis();if("category"===o.type){var r=o.dim+"_"+o.index;e[r]||(e[r]={categoryAxis:o,valueAxis:a.getOtherAxis(o),series:[]},n.push({axisDim:o.dim,axisIndex:o.index})),e[r].series.push(t)}else i.push(t)}}),{seriesGroupByCategoryAxis:e,other:i,meta:n}}function a(t){var e=[];return p.each(t,function(t,i){var n=t.categoryAxis,a=t.valueAxis,o=a.dim,r=[" "].concat(p.map(t.series,function(t){return t.name})),s=[n.model.getCategories()];p.each(t.series,function(t){s.push(t.getRawData().mapArray(o,function(t){return t}))});for(var l=[r.join(v)],u=0;u<s[0].length;u++){for(var c=[],h=0;h<s.length;h++)c.push(s[h][u]);l.push(c.join(v))}e.push(l.join("\n"))}),e.join("\n\n"+m+"\n\n")}function o(t){return p.map(t,function(t){var e=t.getRawData(),i=[t.name],n=[];return e.each(e.dimensions,function(){for(var t=arguments.length,a=arguments[t-1],o=e.getName(a),r=0;r<t-1;r++)n[r]=arguments[r];i.push((o?o+v:"")+n.join(v))}),i.join("\n")}).join("\n\n"+m+"\n\n")}function r(t){var e=n(t);return{value:p.filter([a(e.seriesGroupByCategoryAxis),o(e.other)],function(t){return t.replace(/[\n\t\s]/g,"")}).join("\n\n"+m+"\n\n"),meta:e.meta}}function s(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function l(t){var e=t.slice(0,t.indexOf("\n"));if(e.indexOf(v)>=0)return!0}function u(t){for(var e=t.split(/\n+/g),i=s(e.shift()).split(y),n=[],a=p.map(i,function(t){return{name:t,data:[]}}),o=0;o<e.length;o++){var r=s(e[o]).split(y);n.push(r.shift());for(var l=0;l<r.length;l++)a[l]&&(a[l].data[o]=r[l])}return{series:a,categories:n}}function c(t){for(var e=t.split(/\n+/g),i=s(e.shift()),n=[],a=0;a<e.length;a++){var o,r=s(e[a]).split(y),l="",u=!1;isNaN(r[0])?(u=!0,l=r[0],r=r.slice(1),n[a]={name:l,value:[]},o=n[a].value):o=n[a]=[];for(var c=0;c<r.length;c++)o.push(+r[c]);1===o.length&&(u?n[a].value=o[0]:n[a]=o[0])}return{name:i,data:n}}function h(t,e){var i=t.split(new RegExp("\n*"+m+"\n*","g")),n={series:[]};return p.each(i,function(t,i){if(l(t)){var a=u(t),o=e[i],r=o.axisDim+"Axis";o&&(n[r]=n[r]||[],n[r][o.axisIndex]={data:a.categories},n.series=n.series.concat(a.series))}else{var a=c(t);n.series.push(a)}}),n}function d(t){this._dom=null,this.model=t}function f(t,e){return p.map(t,function(t,i){var n=e&&e[i];return p.isObject(n)&&!p.isArray(n)?(p.isObject(t)&&!p.isArray(t)&&(t=t.value),p.defaults({value:t},n)):t})}var p=i(1),g=i(21),m=new Array(60).join("-"),v="\t",y=new RegExp("["+v+"]+","g");d.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:"数据视图",lang:["数据视图","关闭","刷新"],backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"},d.prototype.onclick=function(t,e){function i(){n.removeChild(o),M._dom=null}var n=e.getDom(),a=this.model;this._dom&&n.removeChild(this._dom);var o=document.createElement("div");o.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",o.style.backgroundColor=a.get("backgroundColor")||"#fff";var s=document.createElement("h4"),l=a.get("lang")||[];s.innerHTML=l[0]||a.get("title"),s.style.cssText="margin: 10px 20px;",s.style.color=a.get("textColor");var u=document.createElement("div"),c=document.createElement("textarea");u.style.cssText="display:block;width:100%;overflow:auto;";var d=a.get("optionToContent"),f=a.get("contentToOption"),m=r(t);if("function"==typeof d){var y=d(e.getOption());"string"==typeof y?u.innerHTML=y:p.isDom(y)&&u.appendChild(y)}else u.appendChild(c),c.readOnly=a.get("readOnly"),c.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",c.style.color=a.get("textColor"),c.style.borderColor=a.get("textareaBorderColor"),c.style.backgroundColor=a.get("textareaColor"),c.value=m.value;var x=m.meta,_=document.createElement("div");_.style.cssText="position:absolute;bottom:0;left:0;right:0;";var b="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",w=document.createElement("div"),S=document.createElement("div");b+=";background-color:"+a.get("buttonColor"),b+=";color:"+a.get("buttonTextColor");var M=this;g.addEventListener(w,"click",i),g.addEventListener(S,"click",function(){var t;try{t="function"==typeof f?f(u,e.getOption()):h(c.value,x)}catch(n){throw i(),new Error("Data view format error "+n)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),i()}),w.innerHTML=l[1],S.innerHTML=l[2],S.style.cssText=b,w.style.cssText=b,!a.get("readOnly")&&_.appendChild(S),_.appendChild(w),g.addEventListener(c,"keydown",function(t){if(9===(t.keyCode||t.which)){var e=this.value,i=this.selectionStart,n=this.selectionEnd;this.value=e.substring(0,i)+v+e.substring(n),this.selectionStart=this.selectionEnd=i+1,g.stop(t)}}),o.appendChild(s),o.appendChild(u),o.appendChild(_),u.style.height=n.clientHeight-80+"px",n.appendChild(o),this._dom=o},d.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},d.prototype.dispose=function(t,e){this.remove(t,e)},i(29).register("dataView",d),i(2).registerAction({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(t,e){var i=[];p.each(t.newOption.series,function(t){var n=e.getSeriesByName(t.name)[0];if(n){var a=n.get("data");i.push({name:t.name,data:f(t.data,a)})}else i.push(p.extend({type:"scatter"},t))}),e.mergeOption(p.defaults({series:i},t.newOption))}),t.exports=d},function(t,e,i){"use strict";function n(t,e,i){(this._brushController=new l(i.getZr())).on("brush",s.bind(this._onBrush,this)).mount(),this._isZoomActive}function a(t){var e={};return s.each(["xAxisIndex","yAxisIndex"],function(i){e[i]=t[i],null==e[i]&&(e[i]="all"),(e[i]===!1||"none"===e[i])&&(e[i]=[])}),e}function o(t,e){t.setIconStatus("back",c.count(e)>1?"emphasis":"normal")}function r(t,e,i,n,o){var r=i._isZoomActive;n&&"takeGlobalCursor"===n.type&&(r="dataZoomSelect"===n.key&&n.dataZoomSelectActive),i._isZoomActive=r,t.setIconStatus("zoom",r?"emphasis":"normal");var s=new u(a(t.option),e,{include:["grid"]});i._brushController.setPanels(s.makePanelOpts(o,function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"})).enableBrush(!!r&&{brushType:"auto",brushStyle:{lineWidth:0,fill:"rgba(0,0,0,0.2)"}})}var s=i(1),l=i(127),u=i(184),c=i(125),h=i(56),d=s.each;i(206);var f="\0_ec_\0toolbox-dataZoom_";n.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:{zoom:"区域缩放",back:"区域缩放还原"}};var p=n.prototype;p.render=function(t,e,i,n){this.model=t,this.ecModel=e,this.api=i,r(t,e,this,n,i),o(t,e)},p.onclick=function(t,e,i){g[i].call(this)},p.remove=function(t,e){this._brushController.unmount()},p.dispose=function(t,e){this._brushController.dispose()};var g={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(c.pop(this.ecModel))}};p._onBrush=function(t,e){function i(t,e,i){var a=e.getAxis(t),s=a.model,l=n(t,s,r),u=l.findRepresentativeAxisProxy(s).getMinMaxSpan();null==u.minValueSpan&&null==u.maxValueSpan||(i=h(0,i.slice(),a.scale.getExtent(),0,u.minValueSpan,u.maxValueSpan)),l&&(o[l.id]={dataZoomId:l.id,startValue:i[0],endValue:i[1]})}function n(t,e,i){var n;return i.eachComponent({mainType:"dataZoom",subType:"select"},function(i){var a=i.getAxisModel(t,e.componentIndex);a&&(n=i)}),n}if(e.isEnd&&t.length){var o={},r=this.ecModel;this._brushController.updateCovers([]);var s=new u(a(this.model.option),r,{include:["grid"]});s.matchOutputRanges(t,r,function(t,e,n){if("cartesian2d"===n.type){
+var a=t.brushType;"rect"===a?(i("x",n,e[0]),i("y",n,e[1])):i({lineX:"x",lineY:"y"}[a],n,e)}}),c.push(r,o),this._dispatchZoomAction(o)}},p._dispatchZoomAction=function(t){var e=[];d(t,function(t,i){e.push(s.clone(t))}),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},i(29).register("dataZoom",n),i(2).registerPreprocessor(function(t){function e(t,e){if(e){var a=t+"Index",o=e[a];null==o||"all"==o||s.isArray(o)||(o=o===!1||"none"===o?[]:[o]),i(t,function(e,i){if(null==o||"all"==o||s.indexOf(o,i)!==-1){var r={type:"select",$fromToolbox:!0,id:f+t+i};r[a]=i,n.push(r)}})}}function i(e,i){var n=t[e];s.isArray(n)||(n=n?[n]:[]),d(n,i)}if(t){var n=t.dataZoom||(t.dataZoom=[]);s.isArray(n)||(t.dataZoom=n=[n]);var a=t.toolbox;if(a&&(s.isArray(a)&&(a=a[0]),a&&a.feature)){var o=a.feature.dataZoom;e("xAxis",o),e("yAxis",o)}}}),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var a=i(1);n.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"},option:{},seriesIndex:{}};var o=n.prototype;o.getIcons=function(){var t=this.model,e=t.get("icon"),i={};return a.each(t.get("type"),function(t){e[t]&&(i[t]=e[t])}),i};var r={line:function(t,e,i,n){if("bar"===t)return a.merge({id:e,type:"line",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.line")||{},!0)},bar:function(t,e,i,n){if("line"===t)return a.merge({id:e,type:"bar",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.bar")||{},!0)},stack:function(t,e,i,n){if("line"===t||"bar"===t)return a.merge({id:e,stack:"__ec_magicType_stack__"},n.get("option.stack")||{},!0)},tiled:function(t,e,i,n){if("line"===t||"bar"===t)return a.merge({id:e,stack:""},n.get("option.tiled")||{},!0)}},s=[["line","bar"],["stack","tiled"]];o.onclick=function(t,e,i){var n=this.model,o=n.get("seriesIndex."+i);if(r[i]){var l={series:[]},u=function(e){var o=e.subType,s=e.id,u=r[i](o,s,e,n);u&&(a.defaults(u,e.option),l.series.push(u));var c=e.coordinateSystem;if(c&&"cartesian2d"===c.type&&("line"===i||"bar"===i)){var h=c.getAxesByScale("ordinal")[0];if(h){var d=h.dim,f=d+"Axis",p=t.queryComponents({mainType:f,index:e.get(name+"Index"),id:e.get(name+"Id")})[0],g=p.componentIndex;l[f]=l[f]||[];for(var m=0;m<=g;m++)l[f][g]=l[f][g]||{};l[f][g].boundaryGap="bar"===i}}};a.each(s,function(t){a.indexOf(t,i)>=0&&a.each(t,function(t){n.setIconStatus(t,"normal")})}),n.setIconStatus(i,"emphasis"),t.eachComponent({mainType:"series",query:null==o?null:{seriesIndex:o}},u),e.dispatchAction({type:"changeMagicType",currentType:i,newOption:l})}};var l=i(2);l.registerAction({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),i(29).register("magicType",n),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var a=i(125);n.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:"还原"};var o=n.prototype;o.onclick=function(t,e,i){a.clear(t),e.dispatchAction({type:"restore",from:this.uid})},i(29).register("restore",n),i(2).registerAction({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")}),t.exports=n},function(t,e,i){function n(t){this.model=t}var a=i(9);n.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:"保存为图片",type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:["右键另存为图片"]},n.prototype.unusable=!a.canvasSupported;var o=n.prototype;o.onclick=function(t,e){var i=this.model,n=i.get("name")||t.get("title.0.text")||"echarts",o=document.createElement("a"),r=i.get("type",!0)||"png";o.download=n+"."+r,o.target="_blank";var s=e.getConnectedDataURL({type:r,backgroundColor:i.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:i.get("excludeComponents"),pixelRatio:i.get("pixelRatio")});if(o.href=s,"function"!=typeof MouseEvent||a.browser.ie||a.browser.edge){var l=i.get("lang"),u='<body style="margin:0;"><img src="'+s+'" style="max-width:100%;" title="'+(l&&l[0]||"")+'" /></body>',c=window.open();c.document.write(u)}else{var h=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});o.dispatchEvent(h)}},i(29).register("saveAsImage",n),t.exports=n},function(t,e,i){i(55),i(234),i(235),i(2).registerAction({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),i(2).registerAction({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){})},function(t,e,i){function n(t){var e="cubic-bezier(0.23, 1, 0.32, 1)",i="left "+t+"s "+e+",top "+t+"s "+e;return s.map(p,function(t){return t+"transition:"+i}).join(";")}function a(t){var e=[],i=t.get("fontSize"),n=t.getTextColor();return n&&e.push("color:"+n),e.push("font:"+t.getFont()),i&&e.push("line-height:"+Math.round(3*i/2)+"px"),h(["decoration","align"],function(i){var n=t.get(i);n&&e.push("text-"+i+":"+n)}),e.join(";")}function o(t){var e=[],i=t.get("transitionDuration"),o=t.get("backgroundColor"),r=t.getModel("textStyle"),s=t.get("padding");return i&&e.push(n(i)),o&&(f.canvasSupported?e.push("background-Color:"+o):(e.push("background-Color:#"+l.toHex(o)),e.push("filter:alpha(opacity=70)"))),h(["width","color","radius"],function(i){var n="border-"+i,a=d(n),o=t.get(a);null!=o&&e.push(n+":"+o+("color"===i?"":"px"))}),e.push(a(r)),null!=s&&e.push("padding:"+c.normalizeCssArray(s).join("px ")+"px"),e.join(";")+";"}function r(t,e){var i=document.createElement("div"),n=this._zr=e.getZr();this.el=i,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(i),this._container=t,this._show=!1,this._hideTimeout;var a=this;i.onmouseenter=function(){a._enterable&&(clearTimeout(a._hideTimeout),a._show=!0),a._inContent=!0},i.onmousemove=function(e){if(e=e||window.event,!a._enterable){var i=n.handler;u.normalizeEvent(t,e,!0),i.dispatch("mousemove",e)}},i.onmouseleave=function(){a._enterable&&a._show&&a.hideLater(a._hideDelay),a._inContent=!1}}var s=i(1),l=i(22),u=i(21),c=i(7),h=s.each,d=c.toCamelCase,f=i(9),p=["","-webkit-","-moz-","-o-"],g="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;";r.prototype={constructor:r,_enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),i=t.style;"absolute"!==i.position&&"absolute"!==e.position&&(i.position="relative")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText=g+o(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),e.style.display=e.innerHTML?"block":"none",this._show=!0},setContent:function(t){this.el.innerHTML=null==t?"":t},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el;return[t.clientWidth,t.clientHeight]},moveTo:function(t,e){var i,n=this._zr;n&&n.painter&&(i=n.painter.getViewportRoot())&&(t+=i.offsetLeft||0,e+=i.offsetTop||0);var a=this.el.style;a.left=t+"px",a.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(s.bind(this.hide,this),t)):this.hide())},isShow:function(){return this._show}},t.exports=r},function(t,e,i){i(2).extendComponentModel({type:"tooltip",dependencies:["axisPointer"],defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#fff",fontSize:14}}})},function(t,e,i){function n(t){for(var e=t.pop();t.length;){var i=t.pop();i&&(i instanceof v&&(i=i.get("tooltip",!0)),"string"==typeof i&&(i={formatter:i}),e=new v(i,e,e.ecModel))}return e}function a(t,e){return t.dispatchAction||c.bind(e.dispatchAction,e)}function o(t,e,i,n,a,o,r){var s=i.clientWidth,l=i.clientHeight;return null!=o&&(t+s+o>n?t-=s+o:t+=o),null!=r&&(e+l+r>a?e-=l+r:e+=r),[t,e]}function r(t,e,i,n,a){var o=i.clientWidth,r=i.clientHeight;return t=Math.min(t+o,n)-o,e=Math.min(e+r,a)-r,t=Math.max(t,0),e=Math.max(e,0),[t,e]}function s(t,e,i){var n=i[0],a=i[1],o=5,r=0,s=0,l=e.width,u=e.height;switch(t){case"inside":r=e.x+l/2-n/2,s=e.y+u/2-a/2;break;case"top":r=e.x+l/2-n/2,s=e.y-a-o;break;case"bottom":r=e.x+l/2-n/2,s=e.y+u+o;break;case"left":r=e.x-n-o,s=e.y+u/2-a/2;break;case"right":r=e.x+l+o,s=e.y+u/2-a/2}return[r,s]}function l(t){return"center"===t||"middle"===t}var u=i(233),c=i(1),h=i(7),d=i(4),f=i(3),p=i(121),g=i(12),m=i(9),v=i(10),y=i(122),x=i(18),_=i(76),b=c.bind,w=c.each,S=d.parsePercent,M=new f.Rect({shape:{x:-1,y:-1,width:2,height:2}});i(2).extendComponentView({type:"tooltip",init:function(t,e){if(!m.node){var i=new u(e.getDom(),e);this._tooltipContent=i}},render:function(t,e,i){if(!m.node){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=i,this._lastDataByCoordSys=null,this._alwaysShowContent=t.get("alwaysShowContent");var n=this._tooltipContent;n.update(),n.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow()}},_initGlobalListener:function(){var t=this._tooltipModel,e=t.get("triggerOn");y.register("itemTooltip",this._api,b(function(t,i,n){"none"!==e&&(e.indexOf(t)>=0?this._tryShow(i,n):"leave"===t&&this._hide(n))},this))},_keepShow:function(){var t=this._tooltipModel,e=this._ecModel,i=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var n=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){n.manuallyShowTip(t,e,i,{x:n._lastX,y:n._lastY})})}},manuallyShowTip:function(t,e,i,n){if(n.from!==this.uid&&!m.node){var o=a(n,i);this._ticket="";var r=n.dataByCoordSys;if(n.tooltip&&null!=n.x&&null!=n.y){var s=M;s.position=[n.x,n.y],s.update(),s.tooltip=n.tooltip,this._tryShow({offsetX:n.x,offsetY:n.y,target:s},o)}else if(r)this._tryShow({offsetX:n.x,offsetY:n.y,position:n.position,event:{},dataByCoordSys:n.dataByCoordSys,tooltipOption:n.tooltipOption},o);else if(null!=n.seriesIndex){if(this._manuallyAxisShowTip(t,e,i,n))return;var l=p(n,e),u=l.point[0],c=l.point[1];null!=u&&null!=c&&this._tryShow({offsetX:u,offsetY:c,position:n.position,target:l.el,event:{}},o)}else null!=n.x&&null!=n.y&&(i.dispatchAction({type:"updateAxisPointer",x:n.x,y:n.y}),this._tryShow({offsetX:n.x,offsetY:n.y,position:n.position,target:i.getZr().findHover(n.x,n.y).target,event:{}},o))}},manuallyHideTip:function(t,e,i,n){var o=this._tooltipContent;this._alwaysShowContent||o.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=null,n.from!==this.uid&&this._hide(a(n,i))},_manuallyAxisShowTip:function(t,e,i,a){var o=a.seriesIndex,r=a.dataIndex,s=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=o&&null!=r&&null!=s){var l=e.getSeriesByIndex(o);if(l){var u=l.getData(),t=n([u.getItemModel(r),l,(l.coordinateSystem||{}).model,t]);if("axis"===t.get("trigger"))return i.dispatchAction({type:"updateAxisPointer",seriesIndex:o,dataIndex:r}),!0}}},_tryShow:function(t,e){var i=t.target,n=this._tooltipModel;if(n){this._lastX=t.offsetX,this._lastY=t.offsetY;var a=t.dataByCoordSys;a&&a.length?this._showAxisTooltip(a,t):i&&null!=i.dataIndex?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(t,i,e)):i&&i.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(t,i,e)):(this._lastDataByCoordSys=null,this._hide(e))}},_showOrMove:function(t,e){var i=t.get("showDelay");e=c.bind(e,this),clearTimeout(this._showTimout),i>0?this._showTimout=setTimeout(e,i):e()},_showAxisTooltip:function(t,e){var i=this._ecModel,a=this._tooltipModel,o=[e.offsetX,e.offsetY],r=[],s=[],l=n([e.tooltipOption,a]);w(t,function(t){w(t.dataByAxis,function(t){var e=i.getComponent(t.axisDim+"Axis",t.axisIndex),n=t.value,a=[];if(e&&null!=n){var o=_.getValueLabel(n,e.axis,i,t.seriesDataIndices,t.valueLabelOpt);c.each(t.seriesDataIndices,function(r){var l=i.getSeriesByIndex(r.seriesIndex),u=r.dataIndexInside,c=l&&l.getDataParams(u);c.axisDim=t.axisDim,c.axisIndex=t.axisIndex,c.axisType=t.axisType,c.axisId=t.axisId,c.axisValue=x.getAxisRawValue(e.axis,n),c.axisValueLabel=o,c&&(s.push(c),a.push(l.formatTooltip(u,!0)))});var l=o;r.push((l?h.encodeHTML(l)+"<br />":"")+a.join("<br />"))}})},this),r.reverse(),r=r.join("<br /><br />");var u=e.position;this._showOrMove(l,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(l,u,o[0],o[1],this._tooltipContent,s):this._showTooltipContent(l,r,s,Math.random(),o[0],o[1],u)})},_showSeriesItemTooltip:function(t,e,i){var a=this._ecModel,o=e.seriesIndex,r=a.getSeriesByIndex(o),s=e.dataModel||r,l=e.dataIndex,u=e.dataType,c=s.getData(),h=n([c.getItemModel(l),s,r&&(r.coordinateSystem||{}).model,this._tooltipModel]),d=h.get("trigger");if(null==d||"item"===d){var f=s.getDataParams(l,u),p=s.formatTooltip(l,!1,u),g="item_"+s.name+"_"+l;this._showOrMove(h,function(){this._showTooltipContent(h,p,f,g,t.offsetX,t.offsetY,t.position,t.target)}),i({type:"showTip",dataIndexInside:l,dataIndex:c.getRawIndex(l),seriesIndex:o,from:this.uid})}},_showComponentItemTooltip:function(t,e,i){var n=e.tooltip;if("string"==typeof n){var a=n;n={content:a,formatter:a}}var o=new v(n,this._tooltipModel,this._ecModel),r=o.get("content"),s=Math.random();this._showOrMove(o,function(){this._showTooltipContent(o,r,o.get("formatterParams")||{},s,t.offsetX,t.offsetY,t.position,e)}),i({type:"showTip",from:this.uid})},_showTooltipContent:function(t,e,i,n,a,o,r,s){if(this._ticket="",t.get("showContent")&&t.get("show")){var l=this._tooltipContent,u=t.get("formatter");r=r||t.get("position");var c=e;if(u&&"string"==typeof u)c=h.formatTpl(u,i,!0);else if("function"==typeof u){var d=b(function(e,n){e===this._ticket&&(l.setContent(n),this._updatePosition(t,r,a,o,l,i,s))},this);this._ticket=n,c=u(i,n,d)}l.setContent(c),l.show(t),this._updatePosition(t,r,a,o,l,i,s)}},_updatePosition:function(t,e,i,n,a,u,h){var d=this._api.getWidth(),f=this._api.getHeight();e=e||t.get("position");var p=a.getSize(),m=t.get("align"),v=t.get("verticalAlign"),y=h&&h.getBoundingRect().clone();if(h&&y.applyTransform(h.transform),"function"==typeof e&&(e=e([i,n],u,a.el,y,{viewSize:[d,f],contentSize:p.slice()})),c.isArray(e))i=S(e[0],d),n=S(e[1],f);else if(c.isObject(e)){e.width=p[0],e.height=p[1];var x=g.getLayoutRect(e,{width:d,height:f});i=x.x,n=x.y,m=null,v=null}else if("string"==typeof e&&h){var _=s(e,y,p);i=_[0],n=_[1]}else{var _=o(i,n,a.el,d,f,m?null:20,v?null:20);i=_[0],n=_[1]}if(m&&(i-=l(m)?p[0]/2:"right"===m?p[0]:0),v&&(n-=l(v)?p[1]/2:"bottom"===v?p[1]:0),t.get("confine")){var _=r(i,n,a.el,d,f);i=_[0],n=_[1]}a.moveTo(i,n)},_updateContentNotChangedOnAxis:function(t){var e=this._lastDataByCoordSys,i=!!e&&e.length===t.length;return i&&w(e,function(e,n){var a=e.dataByAxis||{},o=t[n]||{},r=o.dataByAxis||[];i&=a.length===r.length,i&&w(a,function(t,e){var n=r[e]||{},a=t.seriesDataIndices||[],o=n.seriesDataIndices||[];i&=t.value===n.value&&t.axisType===n.axisType&&t.axisId===n.axisId&&a.length===o.length,i&&w(a,function(t,e){var n=o[e];i&=t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})})}),this._lastDataByCoordSys=t,!!i},_hide:function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},dispose:function(t,e){m.node||(this._tooltipContent.hide(),y.unregister("itemTooltip",e))}})},function(t,e,i){function n(t,e){var i=t.get("center"),n=t.get("radius"),a=e.getWidth(),o=e.getHeight(),r=s.parsePercent;this.cx=r(i[0],a),this.cy=r(i[1],o);var l=this.getRadiusAxis(),u=Math.min(a,o)/2;l.setExtent(0,r(n,u))}function a(t,e){var i=this,n=i.getAngleAxis(),a=i.getRadiusAxis();if(n.scale.setExtent(1/0,-(1/0)),a.scale.setExtent(1/0,-(1/0)),t.eachSeries(function(t){if(t.coordinateSystem===i){var e=t.getData();a.scale.unionExtentFromData(e,"radius"),n.scale.unionExtentFromData(e,"angle")}}),u(n.scale,n.model),u(a.scale,a.model),"category"===n.type&&!n.onBand){var o=n.getExtent(),r=360/n.scale.count();n.inverse?o[1]+=r:o[1]-=r,n.setExtent(o[0],o[1])}}function o(t,e){if(t.type=e.get("type"),t.scale=l.createScaleByModel(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,"angleAxis"===e.mainType){var i=e.get("startAngle");t.inverse=e.get("inverse")^e.get("clockwise"),t.setExtent(i,i+(t.inverse?-360:360))}e.axis=t,t.model=e}var r=i(411),s=i(4),l=(i(1),i(18)),u=l.niceScaleExtent;i(412);var c={dimensions:r.prototype.dimensions,create:function(t,e){var i=[];return t.eachComponent("polar",function(t,s){var l=new r(s);l.resize=n,l.update=a;var u=l.getRadiusAxis(),c=l.getAngleAxis(),h=t.findAxisModel("radiusAxis"),d=t.findAxisModel("angleAxis");o(u,h),o(c,d),l.resize(t,e),i.push(l),t.coordinateSystem=l,l.model=t}),t.eachSeries(function(e){if("polar"===e.get("coordinateSystem")){var i=t.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0];e.coordinateSystem=i.coordinateSystem}}),i}};i(26).register("polar",c)},function(t,e,i){function n(t){return parseInt(t,10)}function a(t,e){s.initVML(),this.root=t,this.storage=e;var i=document.createElement("div"),n=document.createElement("div");i.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",n.style.cssText="position:absolute;left:0;top:0;",t.appendChild(i),this._vmlRoot=n,this._vmlViewport=i,this.resize();var a=e.delFromStorage,o=e.addToStorage;e.delFromStorage=function(t){a.call(e,t),t&&t.onRemove&&t.onRemove(n)},e.addToStorage=function(t){t.onAdd&&t.onAdd(n),o.call(e,t)},this._firstPaint=!0}function o(t){return function(){r('In IE8.0 VML mode painter not support method "'+t+'"')}}var r=i(52),s=i(182);a.prototype={constructor:a,getViewportRoot:function(){return this._vmlViewport},refresh:function(){var t=this.storage.getDisplayList(!0,!0);this._paintList(t)},_paintList:function(t){for(var e=this._vmlRoot,i=0;i<t.length;i++){var n=t[i];n.invisible||n.ignore?(n.__alreadyNotVisible||n.onRemove(e),n.__alreadyNotVisible=!0):(n.__alreadyNotVisible&&n.onAdd(e),n.__alreadyNotVisible=!1,n.__dirty&&(n.beforeBrush&&n.beforeBrush(),(n.brushVML||n.brush).call(n,e),n.afterBrush&&n.afterBrush())),n.__dirty=!1}this._firstPaint&&(this._vmlViewport.appendChild(e),this._firstPaint=!1)},resize:function(t,e){var t=null==t?this._getWidth():t,e=null==e?this._getHeight():e;if(this._width!=t||this._height!=e){this._width=t,this._height=e;var i=this._vmlViewport.style;i.width=t+"px",i.height=e+"px"}},dispose:function(){this.root.innerHTML="",this._vmlRoot=this._vmlViewport=this.storage=null},getWidth:function(){return this._width},getHeight:function(){return this._height},clear:function(){this._vmlViewport&&this.root.removeChild(this._vmlViewport)},_getWidth:function(){var t=this.root,e=t.currentStyle;return(t.clientWidth||n(e.width))-n(e.paddingLeft)-n(e.paddingRight)|0},_getHeight:function(){var t=this.root,e=t.currentStyle;return(t.clientHeight||n(e.height))-n(e.paddingTop)-n(e.paddingBottom)|0}};for(var l=["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],u=0;u<l.length;u++){var c=l[u];a.prototype[c]=o(c)}t.exports=a},function(t,e,i){if(!i(9).canvasSupported){var n=i(6),a=i(11),o=i(27).CMD,r=i(22),s=i(16),l=i(87),u=i(38),c=i(53),h=i(86),d=i(8),f=i(27),p=i(39),g=i(182),m=Math.round,v=Math.sqrt,y=Math.abs,x=Math.cos,_=Math.sin,b=Math.max,w=n.applyTransform,S=",",M="progid:DXImageTransform.Microsoft",I=21600,T=I/2,A=1e5,C=1e3,L=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=I+","+I,t.coordorigin="0,0"},D=function(t){return String(t).replace(/&/g,"&amp;").replace(/"/g,"&quot;")},P=function(t,e,i){return"rgb("+[t,e,i].join(",")+")"},k=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},O=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},z=function(t,e,i){return(parseFloat(t)||0)*A+(parseFloat(e)||0)*C+i},E=function(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t},R=function(t,e,i){var n=r.parse(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=P(n[0],n[1],n[2]),t.opacity=i*n[3])},N=function(t){var e=r.parse(t);return[P(e[0],e[1],e[2]),e[3]]},V=function(t,e,i){var n=e.fill;if(null!=n)if(n instanceof p){var a,o=0,r=[0,0],s=0,l=1,u=i.getBoundingRect(),c=u.width,h=u.height;if("linear"===n.type){a="gradient";var d=i.transform,f=[n.x*c,n.y*h],g=[n.x2*c,n.y2*h];d&&(w(f,f,d),w(g,g,d));var m=g[0]-f[0],v=g[1]-f[1];o=180*Math.atan2(m,v)/Math.PI,o<0&&(o+=360),o<1e-6&&(o=0)}else{a="gradientradial";var f=[n.x*c,n.y*h],d=i.transform,y=i.scale,x=c,_=h;r=[(f[0]-u.x)/x,(f[1]-u.y)/_],d&&w(f,f,d),x/=y[0]*I,_/=y[1]*I;var S=b(x,_);s=0/S,l=2*n.r/S-s}var M=n.colorStops.slice();M.sort(function(t,e){return t.offset-e.offset});for(var T=M.length,A=[],C=[],L=0;L<T;L++){var D=M[L],P=N(D.color);C.push(D.offset*l+s+" "+P[0]),0!==L&&L!==T-1||A.push(P)}if(T>=2){var k=A[0][0],O=A[1][0],z=A[0][1]*e.opacity,E=A[1][1]*e.opacity;t.type=a,t.method="none",t.focus="100%",t.angle=o,t.color=k,t.color2=O,t.colors=C.join(","),t.opacity=E,t.opacity2=z}"radial"===a&&(t.focusposition=r.join(","))}else R(t,n,e.opacity)},B=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof p||R(t,e.stroke,e.opacity)},G=function(t,e,i,n){var a="fill"==e,o=t.getElementsByTagName(e)[0];null!=i[e]&&"none"!==i[e]&&(a||!a&&i.lineWidth)?(t[a?"filled":"stroked"]="true",i[e]instanceof p&&O(t,o),o||(o=g.createNode(e)),a?V(o,i,n):B(o,i),k(t,o)):(t[a?"filled":"stroked"]="false",O(t,o))},H=[[],[],[]],F=function(t,e){var i,n,a,r,s,l,u=o.M,c=o.C,h=o.L,d=o.A,f=o.Q,p=[];for(r=0;r<t.length;){switch(a=t[r++],n="",i=0,a){case u:n=" m ",i=1,s=t[r++],l=t[r++],H[0][0]=s,H[0][1]=l;break;case h:n=" l ",i=1,s=t[r++],l=t[r++],H[0][0]=s,H[0][1]=l;break;case f:case c:n=" c ",i=3;var g,y,b=t[r++],M=t[r++],A=t[r++],C=t[r++];a===f?(g=A,y=C,A=(A+2*b)/3,C=(C+2*M)/3,b=(s+2*b)/3,M=(l+2*M)/3):(g=t[r++],y=t[r++]),H[0][0]=b,H[0][1]=M,H[1][0]=A,H[1][1]=C,H[2][0]=g,H[2][1]=y,s=g,l=y;break;case d:var L=0,D=0,P=1,k=1,O=0;e&&(L=e[4],D=e[5],P=v(e[0]*e[0]+e[1]*e[1]),k=v(e[2]*e[2]+e[3]*e[3]),O=Math.atan2(-e[1]/k,e[0]/P));var z=t[r++],E=t[r++],R=t[r++],N=t[r++],V=t[r++]+O,B=t[r++]+V+O;r++;var G=t[r++],F=z+x(V)*R,W=E+_(V)*N,b=z+x(B)*R,M=E+_(B)*N,Z=G?" wa ":" at ";Math.abs(F-b)<1e-4&&(Math.abs(B-V)>.01?G&&(F+=270/I):Math.abs(W-E)<1e-4?G&&F<z||!G&&F>z?M-=270/I:M+=270/I:G&&W<E||!G&&W>E?b+=270/I:b-=270/I),p.push(Z,m(((z-R)*P+L)*I-T),S,m(((E-N)*k+D)*I-T),S,m(((z+R)*P+L)*I-T),S,m(((E+N)*k+D)*I-T),S,m((F*P+L)*I-T),S,m((W*k+D)*I-T),S,m((b*P+L)*I-T),S,m((M*k+D)*I-T)),s=b,l=M;break;case o.R:var q=H[0],j=H[1];q[0]=t[r++],q[1]=t[r++],j[0]=q[0]+t[r++],j[1]=q[1]+t[r++],e&&(w(q,q,e),w(j,j,e)),q[0]=m(q[0]*I-T),j[0]=m(j[0]*I-T),q[1]=m(q[1]*I-T),j[1]=m(j[1]*I-T),p.push(" m ",q[0],S,q[1]," l ",j[0],S,q[1]," l ",j[0],S,j[1]," l ",q[0],S,j[1]);break;case o.Z:p.push(" x ")}if(i>0){p.push(n);for(var U=0;U<i;U++){var X=H[U];e&&w(X,X,e),p.push(m(X[0]*I-T),S,m(X[1]*I-T),U<i-1?S:"")}}}return p.join("")};d.prototype.brushVML=function(t){var e=this.style,i=this._vmlEl;i||(i=g.createNode("shape"),L(i),this._vmlEl=i),G(i,"fill",e,this),G(i,"stroke",e,this);var n=this.transform,a=null!=n,o=i.getElementsByTagName("stroke")[0];if(o){var r=e.lineWidth;if(a&&!e.strokeNoScale){var s=n[0]*n[3]-n[1]*n[2];r*=v(y(s))}o.weight=r+"px"}var l=this.path||(this.path=new f);this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),l.toStatic(),this.__dirtyPath=!1),i.path=F(l.data,this.transform),i.style.zIndex=z(this.zlevel,this.z,this.z2),k(t,i),null!=e.text?this.drawRectText(t,this.getBoundingRect()):this.removeRectText(t)},d.prototype.onRemove=function(t){O(t,this._vmlEl),this.removeRectText(t)},d.prototype.onAdd=function(t){k(t,this._vmlEl),this.appendRectText(t)};var W=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};c.prototype.brushVML=function(t){var e,i,n=this.style,a=n.image;if(W(a)){var o=a.src;if(o===this._imageSrc)e=this._imageWidth,i=this._imageHeight;else{var r=a.runtimeStyle,s=r.width,l=r.height;r.width="auto",r.height="auto",e=a.width,i=a.height,r.width=s,r.height=l,this._imageSrc=o,this._imageWidth=e,this._imageHeight=i}a=o}else a===this._imageSrc&&(e=this._imageWidth,i=this._imageHeight);if(a){var u=n.x||0,c=n.y||0,h=n.width,d=n.height,f=n.sWidth,p=n.sHeight,y=n.sx||0,x=n.sy||0,_=f&&p,I=this._vmlEl;I||(I=g.doc.createElement("div"),L(I),this._vmlEl=I);var T,A=I.style,C=!1,D=1,P=1;if(this.transform&&(T=this.transform,D=v(T[0]*T[0]+T[1]*T[1]),P=v(T[2]*T[2]+T[3]*T[3]),C=T[1]||T[2]),C){var O=[u,c],E=[u+h,c],R=[u,c+d],N=[u+h,c+d];w(O,O,T),w(E,E,T),w(R,R,T),w(N,N,T);var V=b(O[0],E[0],R[0],N[0]),B=b(O[1],E[1],R[1],N[1]),G=[];G.push("M11=",T[0]/D,S,"M12=",T[2]/P,S,"M21=",T[1]/D,S,"M22=",T[3]/P,S,"Dx=",m(u*D+T[4]),S,"Dy=",m(c*P+T[5])),A.padding="0 "+m(V)+"px "+m(B)+"px 0",A.filter=M+".Matrix("+G.join("")+", SizingMethod=clip)"}else T&&(u=u*D+T[4],c=c*P+T[5]),A.filter="",A.left=m(u)+"px",A.top=m(c)+"px";var H=this._imageEl,F=this._cropEl;H||(H=g.doc.createElement("div"),this._imageEl=H);var Z=H.style;if(_){if(e&&i)Z.width=m(D*e*h/f)+"px",Z.height=m(P*i*d/p)+"px";else{var q=new Image,j=this;q.onload=function(){q.onload=null,e=q.width,i=q.height,Z.width=m(D*e*h/f)+"px",Z.height=m(P*i*d/p)+"px",j._imageWidth=e,j._imageHeight=i,j._imageSrc=a},q.src=a}F||(F=g.doc.createElement("div"),F.style.overflow="hidden",this._cropEl=F);var U=F.style;U.width=m((h+y*h/f)*D),U.height=m((d+x*d/p)*P),U.filter=M+".Matrix(Dx="+-y*h/f*D+",Dy="+-x*d/p*P+")",F.parentNode||I.appendChild(F),H.parentNode!=F&&F.appendChild(H)}else Z.width=m(D*h)+"px",Z.height=m(P*d)+"px",I.appendChild(H),F&&F.parentNode&&(I.removeChild(F),this._cropEl=null);var X="",Y=n.opacity;Y<1&&(X+=".Alpha(opacity="+m(100*Y)+") "),X+=M+".AlphaImageLoader(src="+a+", SizingMethod=scale)",Z.filter=X,I.style.zIndex=z(this.zlevel,this.z,this.z2),k(t,I),null!=n.text&&this.drawRectText(t,this.getBoundingRect())}},c.prototype.onRemove=function(t){O(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},c.prototype.onAdd=function(t){k(t,this._vmlEl),this.appendRectText(t)};var Z,q="normal",j={},U=0,X=100,Y=document.createElement("div"),$=function(t){var e=j[t];if(!e){U>X&&(U=0,j={});var i,n=Y.style;try{n.font=t,i=n.fontFamily.split(",")[0]}catch(a){}e={style:n.fontStyle||q,variant:n.fontVariant||q,weight:n.fontWeight||q,size:0|parseFloat(n.fontSize||12),family:i||"Microsoft YaHei"},j[t]=e,U++}return e};s.measureText=function(t,e){var i=g.doc;Z||(Z=i.createElement("div"),Z.style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",g.doc.body.appendChild(Z));try{Z.style.font=e}catch(n){}return Z.innerHTML="",Z.appendChild(i.createTextNode(t)),{width:Z.offsetWidth}};for(var K=new a,J=function(t,e,i,n){var a=this.style,o=a.text;if(null!=o&&(o+=""),o){var r,l,u=a.textAlign,c=$(a.textFont),h=c.style+" "+c.variant+" "+c.weight+" "+c.size+'px "'+c.family+'"',d=a.textBaseline,f=a.textVerticalAlign;i=i||s.getBoundingRect(o,h,u,d);var p=this.transform;if(p&&!n&&(K.copy(e),K.applyTransform(p),e=K),n)r=e.x,l=e.y;else{var v=a.textPosition,y=a.textDistance;if(v instanceof Array)r=e.x+E(v[0],e.width),l=e.y+E(v[1],e.height),u=u||"left",d=d||"top";else{var x=s.adjustTextPositionOnRect(v,e,i,y);r=x.x,l=x.y,u=u||x.textAlign,d=d||x.textBaseline}}if(f){switch(f){case"middle":l-=i.height/2;break;case"bottom":l-=i.height}d="top"}var _=c.size;switch(d){case"hanging":case"top":l+=_/1.75;break;case"middle":break;default:l-=_/2.25}switch(u){case"left":break;case"center":r-=i.width/2;break;case"right":r-=i.width}var b,M,I,T=g.createNode,A=this._textVmlEl;A?(I=A.firstChild,b=I.nextSibling,M=b.nextSibling):(A=T("line"),b=T("path"),M=T("textpath"),I=T("skew"),M.style["v-text-align"]="left",L(A),b.textpathok=!0,M.on=!0,A.from="0 0",A.to="1000 0.05",k(A,I),k(A,b),k(A,M),this._textVmlEl=A);var C=[r,l],P=A.style;p&&n?(w(C,C,p),I.on=!0,I.matrix=p[0].toFixed(3)+S+p[2].toFixed(3)+S+p[1].toFixed(3)+S+p[3].toFixed(3)+",0,0",I.offset=(m(C[0])||0)+","+(m(C[1])||0),I.origin="0 0",P.left="0px",P.top="0px"):(I.on=!1,P.left=m(r)+"px",P.top=m(l)+"px"),M.string=D(o);try{M.style.font=h}catch(O){}G(A,"fill",{fill:n?a.fill:a.textFill,opacity:a.opacity},this),G(A,"stroke",{stroke:n?a.stroke:a.textStroke,opacity:a.opacity,lineDash:a.lineDash},this),A.style.zIndex=z(this.zlevel,this.z,this.z2),k(t,A)}},Q=function(t){O(t,this._textVmlEl),this._textVmlEl=null},tt=function(t){k(t,this._textVmlEl)},et=[l,u,c,d,h],it=0;it<et.length;it++){var nt=et[it].prototype;nt.drawRectText=J,nt.removeRectText=Q,nt.appendRectText=tt}h.prototype.brushVML=function(t){var e=this.style;null!=e.text?this.drawRectText(t,{x:e.x||0,y:e.y||0,width:0,height:0},this.getBoundingRect(),!0):this.removeRectText(t)},h.prototype.onRemove=function(t){this.removeRectText(t)},h.prototype.onAdd=function(t){this.appendRectText(t)}}},function(t,e,i){i(238),i(88).registerPainter("vml",i(237))},function(t,e,i){var n=i(1),a=i(241),o=i(2);o.registerAction({type:"geoRoam",event:"geoRoam",update:"updateLayout"},function(t,e){var i=t.componentType||"series";e.eachComponent({mainType:i,query:t},function(e){var o=e.coordinateSystem;if("geo"===o.type){var r=a.updateCenterAndZoom(o,t,e.get("scaleLimit"));e.setCenter&&e.setCenter(r.center),e.setZoom&&e.setZoom(r.zoom),"series"===i&&n.each(e.seriesGroup,function(t){t.setCenter(r.center),t.setZoom(r.zoom)})}})})},function(t,e){var i={};i.updateCenterAndZoom=function(t,e,i){var n=t.getZoom(),a=t.getCenter(),o=e.zoom,r=t.dataToPoint(a);if(null!=e.dx&&null!=e.dy){r[0]-=e.dx,r[1]-=e.dy;var a=t.pointToData(r);t.setCenter(a)}if(null!=o){if(i){var s=i.min||0,l=i.max||1/0;o=Math.max(Math.min(n*o,l),s)/n}t.scale[0]*=o,t.scale[1]*=o;var u=t.position,c=(e.originX-u[0])*(o-1),h=(e.originY-u[1])*(o-1);u[0]-=c,u[1]-=h,t.updateTransform();var a=t.pointToData(r);t.setCenter(a),t.setZoom(o*n)}return{center:t.getCenter(),zoom:t.getZoom()}},t.exports=i},function(t,e,i){var n=i(6);t.exports=function(t){var e=t.coordinateSystem;if(!e||"view"===e.type){var i=e.getBoundingRect(),a=t.getData(),o=a.graph,r=0,s=a.getSum("value"),l=2*Math.PI/(s||a.count()),u=i.width/2+i.x,c=i.height/2+i.y,h=Math.min(i.width,i.height)/2;o.eachNode(function(t){var e=t.getValue("value");r+=l*(s?e:1)/2,t.setLayout([h*Math.cos(r)+u,h*Math.sin(r)+c]),r+=l*(s?e:1)/2}),a.setLayout({cx:u,cy:c}),o.eachEdge(function(t){var e,i=t.getModel().get("lineStyle.normal.curveness")||0,a=n.clone(t.node1.getLayout()),o=n.clone(t.node2.getLayout()),r=(a[0]+o[0])/2,s=(a[1]+o[1])/2;+i&&(i*=3,e=[u*i+r*(1-i),c*i+s*(1-i)]),t.setLayout([a,o,e])})}}},function(t,e,i){var n=i(6);t.exports=function(t){t.eachEdge(function(t){var e=t.getModel().get("lineStyle.normal.curveness")||0,i=n.clone(t.node1.getLayout()),a=n.clone(t.node2.getLayout()),o=[i,a];+e&&o.push([(i[0]+a[0])/2-(i[1]-a[1])*e,(i[1]+a[1])/2-(a[0]-i[0])*e]),t.setLayout(o)})}},function(t,e,i){var n=i(243);t.exports=function(t){
+var e=t.coordinateSystem;if(!e||"view"===e.type){var i=t.getGraph();i.eachNode(function(t){var e=t.getModel();t.setLayout([+e.get("x"),+e.get("y")])}),n(i)}}},function(t,e,i){function n(t,e,i){a.Group.call(this),this.add(this.createLine(t,e,i)),this._updateEffectSymbol(t,e)}var a=i(3),o=i(106),r=i(1),s=i(24),l=i(6),u=i(20),c=n.prototype;c.createLine=function(t,e,i){return new o(t,e,i)},c._updateEffectSymbol=function(t,e){var i=t.getItemModel(e),n=i.getModel("effect"),a=n.get("symbolSize"),o=n.get("symbol");r.isArray(a)||(a=[a,a]);var l=n.get("color")||t.getItemVisual(e,"color"),u=this.childAt(1);this._symbolType!==o&&(this.remove(u),u=s.createSymbol(o,-.5,-.5,1,1,l),u.z2=100,u.culling=!0,this.add(u)),u&&(u.setStyle("shadowColor",l),u.setStyle(n.getItemStyle(["color"])),u.attr("scale",a),u.setColor(l),u.attr("scale",a),this._symbolType=o,this._updateEffectAnimation(t,n,e))},c._updateEffectAnimation=function(t,e,i){var n=this.childAt(1);if(n){var a=this,o=t.getItemLayout(i),s=1e3*e.get("period"),l=e.get("loop"),u=e.get("constantSpeed"),c=r.retrieve(e.get("delay"),function(e){return e/t.count()*s/3}),h="function"==typeof c;if(n.ignore=!0,this.updateAnimationPoints(n,o),u>0&&(s=this.getLineLength(n)/u*1e3),s!==this._period||l!==this._loop){n.stopAnimation();var d=c;h&&(d=c(i)),n.__t>0&&(d=-s*n.__t),n.__t=0;var f=n.animate("",l).when(s,{__t:1}).delay(d).during(function(){a.updateSymbolPosition(n)});l||f.done(function(){a.remove(n)}),f.start()}this._period=s,this._loop=l}},c.getLineLength=function(t){return l.dist(t.__p1,t.__cp1)+l.dist(t.__cp1,t.__p2)},c.updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},c.updateData=function(t,e,i){this.childAt(0).updateData(t,e,i),this._updateEffectSymbol(t,e)},c.updateSymbolPosition=function(t){var e=t.__p1,i=t.__p2,n=t.__cp1,a=t.__t,o=t.position,r=u.quadraticAt,s=u.quadraticDerivativeAt;o[0]=r(e[0],n[0],i[0],a),o[1]=r(e[1],n[1],i[1],a);var l=s(e[0],n[0],i[0],a),c=s(e[1],n[1],i[1],a);t.rotation=-Math.atan2(c,l)-Math.PI/2,t.ignore=!1},c.updateLayout=function(t,e){this.childAt(0).updateLayout(t,e);var i=t.getItemModel(e).getModel("effect");this._updateEffectAnimation(t,i,e)},r.inherits(n,a.Group),t.exports=n},function(t,e,i){function n(t,e,i){a.Group.call(this),this._createPolyline(t,e,i)}var a=i(3),o=i(1),r=n.prototype;r._createPolyline=function(t,e,i){var n=t.getItemLayout(e),o=new a.Polyline({shape:{points:n}});this.add(o),this._updateCommonStl(t,e,i)},r.updateData=function(t,e,i){var n=t.hostModel,o=this.childAt(0),r={shape:{points:t.getItemLayout(e)}};a.updateProps(o,r,n,e),this._updateCommonStl(t,e,i)},r._updateCommonStl=function(t,e,i){var n=this.childAt(0),r=t.getItemModel(e),s=t.getItemVisual(e,"color"),l=i&&i.lineStyle,u=i&&i.hoverLineStyle;i&&!t.hasItemOption||(l=r.getModel("lineStyle.normal").getLineStyle(),u=r.getModel("lineStyle.emphasis").getLineStyle()),n.useStyle(o.defaults({strokeNoScale:!0,fill:"none",stroke:s},l)),n.hoverStyle=u,a.setHoverStyle(this)},r.updateLayout=function(t,e){var i=this.childAt(0);i.setShape("points",t.getItemLayout(e))},o.inherits(n,a.Group),t.exports=n},function(t,e,i){var n=i(14),a=i(423),o=i(264),r=i(25),s=i(26),l=i(1),u=i(28);t.exports=function(t,e,i,c,h){for(var d=new a(c),f=0;f<t.length;f++)d.addNode(l.retrieve(t[f].id,t[f].name,f),f);for(var p=[],g=[],m=0,f=0;f<e.length;f++){var v=e[f],y=v.source,x=v.target;d.addEdge(y,x,m)&&(g.push(v),p.push(l.retrieve(v.id,y+" > "+x)),m++)}var _,b=i.get("coordinateSystem");if("cartesian2d"===b||"polar"===b)_=u(t,i,i.ecModel);else{var w=s.get(b),S=r((w&&"view"!==w.type?w.dimensions||[]:[]).concat(["value"]),t);_=new n(S,i),_.initData(t)}var M=new n(["value"],i);return M.initData(g,p),h&&h(_,M),o({mainData:_,struct:d,structAttr:"graph",datas:{node:_,edge:M},datasAttr:{node:"data",edge:"edgeData"}}),d.update(),d}},function(t,e,i){var n=i(1),a={};a.layout=function(t,e){e=e||{};var i=t.coordinateSystem,a=t.axis,o={},r=a.position,s=a.orient,l=i.getRect(),u=[l.x,l.x+l.width,l.y,l.y+l.height],c={horizontal:{top:u[2],bottom:u[3]},vertical:{left:u[0],right:u[1]}};o.position=["vertical"===s?c.vertical[r]:u[0],"horizontal"===s?c.horizontal[r]:u[3]];var h={horizontal:0,vertical:1};o.rotation=Math.PI/2*h[s];var d={top:-1,bottom:1,right:1,left:-1};o.labelDirection=o.tickDirection=o.nameDirection=d[r],t.get("axisTick.inside")&&(o.tickDirection=-o.tickDirection),n.retrieve(e.labelInside,t.get("axisLabel.inside"))&&(o.labelDirection=-o.labelDirection);var f=e.rotate;return null==f&&(f=t.get("axisLabel.rotate")),o.labelRotation="top"===r?-f:f,o.labelInterval=a.getLabelInterval(),o.z2=1,o},t.exports=a},function(t,e,i){function n(t,e){var i=t.getItemStyle(),n=t.get("areaColor");return null!=n&&(i.fill=n),i}function a(t,e,i,n,a){i.off("click"),i.off("mousedown"),e.get("selectedMode")&&(i.on("mousedown",function(){t._mouseDownFlag=!0}),i.on("click",function(r){if(t._mouseDownFlag){t._mouseDownFlag=!1;for(var s=r.target;!s.__regions;)s=s.parent;if(s){var l={type:("geo"===e.mainType?"geo":"map")+"ToggleSelect",batch:h.map(s.__regions,function(t){return{name:t.name,from:a.uid}})};l[e.mainType+"Id"]=e.id,n.dispatchAction(l),o(e,i)}}}))}function o(t,e){e.eachChild(function(e){h.each(e.__regions,function(i){e.trigger(t.isSelected(i.name)?"emphasis":"normal")})})}function r(t,e){var i=new c.Group;this._controller=new s(t.getZr()),this._controllerHost={target:e?i:null},this.group=i,this._updateGroup=e,this._mouseDownFlag}var s=i(95),l=i(250),u=i(128),c=i(3),h=i(1);r.prototype={constructor:r,draw:function(t,e,i,r,s){var l="geo"===t.mainType,u=t.getData&&t.getData();l&&e.eachComponent({mainType:"series",subType:"map"},function(e){u||e.getHostGeoModel()!==t||(u=e.getData())});var d=t.coordinateSystem,f=this.group,p=d.scale,g={position:d.position,scale:p};!f.childAt(0)||s?f.attr(g):c.updateProps(f,g,t),f.removeAll();var m=["itemStyle","normal"],v=["itemStyle","emphasis"],y=["label","normal"],x=["label","emphasis"],_=h.createHashMap();h.each(d.regions,function(e){var i=_.get(e.name)||_.set(e.name,new c.Group),a=new c.CompoundPath({shape:{paths:[]}});i.add(a);var o,r=t.getRegionModel(e.name)||t,s=r.getModel(m),d=r.getModel(v),g=n(s,p),b=n(d,p),w=r.getModel(y),S=r.getModel(x);if(u){o=u.indexOfName(e.name);var M=u.getItemVisual(o,"color",!0);M&&(g.fill=M)}var I=w.getModel("textStyle"),T=S.getModel("textStyle");h.each(e.geometries,function(t){if("polygon"===t.type){a.shape.paths.push(new c.Polygon({shape:{points:t.exterior}}));for(var e=0;e<(t.interiors?t.interiors.length:0);e++)a.shape.paths.push(new c.Polygon({shape:{points:t.interiors[e]}}))}}),a.setStyle(g),a.style.strokeNoScale=!0,a.culling=!0;var A=w.get("show"),C=S.get("show"),L=u&&isNaN(u.get("value",o)),D=u&&u.getItemLayout(o);if(l||L&&(A||C)||D&&D.showLabel){var P=u?o:e.name,k=t.getFormattedLabel(P,"normal"),O=t.getFormattedLabel(P,"emphasis"),z=new c.Text({style:{text:A?k||e.name:"",fill:I.getTextColor(),textFont:I.getFont(),textAlign:"center",textVerticalAlign:"middle"},hoverStyle:{text:C?O||e.name:"",fill:T.getTextColor(),textFont:T.getFont()},position:e.center.slice(),scale:[1/p[0],1/p[1]],z2:10,silent:!0});i.add(z)}if(u)u.setItemGraphicEl(o,i);else{var r=t.getRegionModel(e.name);a.eventData={componentType:"geo",geoIndex:t.componentIndex,name:e.name,region:r&&r.option||{}}}var E=i.__regions||(i.__regions=[]);E.push(e),c.setHoverStyle(i,b,{hoverSilentOnTouch:!!t.get("selectedMode")}),f.add(i)}),this._updateController(t,e,i),a(this,t,f,i,r),o(t,f)},remove:function(){this.group.removeAll(),this._controller.dispose(),this._controllerHost={}},_updateController:function(t,e,i){function n(){var e={type:"geoRoam",componentType:s};return e[s+"Id"]=t.id,e}var a=t.coordinateSystem,o=this._controller,r=this._controllerHost;r.zoomLimit=t.get("scaleLimit"),r.zoom=a.getZoom(),o.enable(t.get("roam")||!1);var s=t.mainType;o.off("pan").on("pan",function(t,e){this._mouseDownFlag=!1,l.updateViewOnPan(r,t,e),i.dispatchAction(h.extend(n(),{dx:t,dy:e}))},this),o.off("zoom").on("zoom",function(t,e,a){if(this._mouseDownFlag=!1,l.updateViewOnZoom(r,t,e,a),i.dispatchAction(h.extend(n(),{zoom:t,originX:e,originY:a})),this._updateGroup){var o=this.group,s=o.scale;o.traverse(function(t){"text"===t.type&&t.attr("scale",[1/s[0],1/s[1]])})}},this),o.setPointerChecker(function(e,n,o){return a.getViewRectAfterRoam().contain(n,o)&&!u.onIrrelevantElement(e,i,t)})}},t.exports=r},function(t,e){var i={};i.updateViewOnPan=function(t,e,i){var n=t.target,a=n.position;a[0]+=e,a[1]+=i,n.dirty()},i.updateViewOnZoom=function(t,e,i,n){var a=t.target,o=t.zoomLimit,r=a.position,s=a.scale,l=t.zoom=t.zoom||1;if(l*=e,o){var u=o.min||0,c=o.max||1/0;l=Math.max(Math.min(c,l),u)}var h=l/t.zoom;t.zoom=l,r[0]-=(i-r[0])*(h-1),r[1]-=(n-r[1])*(h-1),s[0]*=h,s[1]*=h,a.dirty()},t.exports=i},function(t,e,i){function n(t,e){var i=t._model;return i.get("axisExpandable")&&i.get("axisExpandTriggerOn")===e}i(263),i(407),i(372);var a=i(2),o=i(1),r=i(37),s=5;a.extendComponentView({type:"parallel",render:function(t,e,i){this._model=t,this._api=i,this._handlers||(this._handlers={},o.each(l,function(t,e){i.getZr().on(e,this._handlers[e]=o.bind(t,this))},this)),r.createOrUpdate(this,"_throttledDispatchExpand",t.get("axisExpandRate"),"fixRate")},dispose:function(t,e){o.each(this._handlers,function(t,i){e.getZr().off(i,t)}),this._handlers=null},_throttledDispatchExpand:function(t){this._dispatchExpand(t)},_dispatchExpand:function(t){t&&this._api.dispatchAction(o.extend({type:"parallelAxisExpand"},t))}});var l={mousedown:function(t){n(this,"click")&&(this._mouseDownPoint=[t.offsetX,t.offsetY])},mouseup:function(t){var e=this._mouseDownPoint;if(n(this,"click")&&e){var i=[t.offsetX,t.offsetY],a=Math.pow(e[0]-i[0],2)+Math.pow(e[1]-i[1],2);if(a>s)return;var o=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==o.behavior&&this._dispatchExpand({axisExpandWindow:o.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&n(this,"mousemove")){var e=this._model,i=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),a=i.behavior;"jump"===a&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===a?null:{axisExpandWindow:i.axisExpandWindow,animation:"jump"===a&&null})}}};a.registerPreprocessor(i(408))},function(t,e,i){i(422),i(357),i(418),i(55),i(360);var n=i(2);n.extendComponentView({type:"single"})},function(t,e,i){var n=i(2),a=i(1),o=i(9),r=i(266),s=i(83),l=i(187),u=s.mapVisual,c=i(5),h=s.eachVisual,d=i(4),f=a.isArray,p=a.each,g=d.asc,m=d.linearMap,v=a.noop,y=["#f6efa6","#d88273","#bf444c"],x=n.extendComponentModel({type:"visualMap",dependencies:["series"],stateList:["inRange","outOfRange"],replacableOptionKeys:["inRange","outOfRange","target","controller","color"],dataBound:[-(1/0),1/0],layoutMode:{type:"box",ignoreSize:!0},defaultOption:{show:!0,zlevel:0,z:4,seriesIndex:null,min:0,max:200,dimension:null,inRange:null,outOfRange:null,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,color:null,formatter:null,text:null,textStyle:{color:"#333"}},init:function(t,e,i){this._dataExtent,this.targetVisuals={},this.controllerVisuals={},this.textStyleModel,this.itemSize,this.mergeDefaultAndTheme(t,i)},optionUpdated:function(t,e){var i=this.option;o.canvasSupported||(i.realtime=!1),!e&&l.replaceVisualOption(i,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},resetVisual:function(t){var e=this.stateList;t=a.bind(t,this),this.controllerVisuals=l.createVisualMappings(this.option.controller,e,t),this.targetVisuals=l.createVisualMappings(this.option.target,e,t)},resetTargetSeries:function(){var t=this.option,e=null==t.seriesIndex;t.seriesIndex=e?[]:c.normalizeToArray(t.seriesIndex),e&&this.ecModel.eachSeries(function(e,i){t.seriesIndex.push(i)})},eachTargetSeries:function(t,e){a.each(this.option.seriesIndex,function(i){t.call(e,this.ecModel.getSeriesByIndex(i))},this)},isTargetSeries:function(t){var e=!1;return this.eachTargetSeries(function(i){i===t&&(e=!0)}),e},formatValueText:function(t,e,i){function n(t){return t===u[0]?"min":t===u[1]?"max":(+t).toFixed(l)}var o,r,s=this.option,l=s.precision,u=this.dataBound,c=s.formatter;return i=i||["<",">"],a.isArray(t)&&(t=t.slice(),o=!0),r=e?t:o?[n(t[0]),n(t[1])]:n(t),a.isString(c)?c.replace("{value}",o?r[0]:r).replace("{value2}",o?r[1]:r):a.isFunction(c)?o?c(t[0],t[1]):c(t):o?t[0]===u[0]?i[0]+" "+r[1]:t[1]===u[1]?i[1]+" "+r[0]:r[0]+" - "+r[1]:r},resetExtent:function(){var t=this.option,e=g([t.min,t.max]);this._dataExtent=e},getDataDimension:function(t){var e=this.option.dimension;return null!=e?e:t.dimensions.length-1},getExtent:function(){return this._dataExtent.slice()},completeVisualOption:function(){function t(t){f(n.color)&&!t.inRange&&(t.inRange={color:n.color.slice().reverse()}),t.inRange=t.inRange||{color:y},p(this.stateList,function(e){var i=t[e];if(a.isString(i)){var n=r.get(i,"active",d);n?(t[e]={},t[e][i]=n):delete t[e]}},this)}function e(t,e,i){var n=t[e],a=t[i];n&&!a&&(a=t[i]={},p(n,function(t,e){if(s.isValidType(e)){var i=r.get(e,"inactive",d);null!=i&&(a[e]=i,"color"!==e||a.hasOwnProperty("opacity")||a.hasOwnProperty("colorAlpha")||(a.opacity=[0,0]))}}))}function i(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,i=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,n=this.get("inactiveColor");p(this.stateList,function(o){var r=this.itemSize,s=t[o];s||(s=t[o]={color:d?n:[n]}),null==s.symbol&&(s.symbol=e&&a.clone(e)||(d?"roundRect":["roundRect"])),null==s.symbolSize&&(s.symbolSize=i&&a.clone(i)||(d?r[0]:[r[0],r[0]])),s.symbol=u(s.symbol,function(t){return"none"===t||"square"===t?"roundRect":t});var l=s.symbolSize;if(null!=l){var c=-(1/0);h(l,function(t){t>c&&(c=t)}),s.symbolSize=u(l,function(t){return m(t,[0,c],[0,r[0]],!0)})}},this)}var n=this.option,o={inRange:n.inRange,outOfRange:n.outOfRange},l=n.target||(n.target={}),c=n.controller||(n.controller={});a.merge(l,o),a.merge(c,o);var d=this.isCategory();t.call(this,l),t.call(this,c),e.call(this,l,"inRange","outOfRange"),i.call(this,c)},resetItemSize:function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},isCategory:function(){return!!this.option.categories},setSelected:v,getValueState:v,getVisualMeta:v});t.exports=x},function(t,e,i){var n=i(1),a=i(3),o=i(7),r=i(12),s=i(2),l=i(83);t.exports=s.extendComponentView({type:"visualMap",autoPositionValues:{left:1,right:1,top:1,bottom:1},init:function(t,e){this.ecModel=t,this.api=e,this.visualMapModel},render:function(t,e,i,n){return this.visualMapModel=t,t.get("show")===!1?void this.group.removeAll():void this.doRender.apply(this,arguments)},renderBackground:function(t){var e=this.visualMapModel,i=o.normalizeCssArray(e.get("padding")||0),n=t.getBoundingRect();t.add(new a.Rect({z2:-1,silent:!0,shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[3]+i[1],height:n.height+i[0]+i[2]},style:{fill:e.get("backgroundColor"),stroke:e.get("borderColor"),lineWidth:e.get("borderWidth")}}))},getControllerVisual:function(t,e,i){function a(t){return u[t]}function o(t,e){u[t]=e}i=i||{};var r=i.forceState,s=this.visualMapModel,u={};if("symbol"===e&&(u.symbol=s.get("itemSymbol")),"color"===e){var c=s.get("contentColor");u.color=c}var h=s.controllerVisuals[r||s.getValueState(t)],d=l.prepareVisualTypes(h);return n.each(d,function(n){var r=h[n];i.convertOpacityToAlpha&&"opacity"===n&&(n="colorAlpha",r=h.__alphaForOpacity),l.dependsOn(n,e)&&r&&r.applyVisual(t,a,o)}),u[e]},positionGroup:function(t){var e=this.visualMapModel,i=this.api;r.positionElement(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()})},doRender:n.noop})},function(t,e,i){var n=i(1),a=i(12),o={getItemAlign:function(t,e,i){var n=t.option,o=n.align;if(null!=o&&"auto"!==o)return o;for(var r={width:e.getWidth(),height:e.getHeight()},s="horizontal"===n.orient?1:0,l=[["left","right","width"],["top","bottom","height"]],u=l[s],c=[0,null,10],h={},d=0;d<3;d++)h[l[1-s][d]]=c[d],h[u[d]]=2===d?i[0]:n[u[d]];var f=[["x","width",3],["y","height",0]][s],p=a.getLayoutRect(h,r,n.padding);return u[(p.margin[f[2]]||0)+p[f[0]]+.5*p[f[1]]<.5*r[f[1]]?0:1]},convertDataIndex:function(t){return n.each(t||[],function(e){null!=t.dataIndex&&(t.dataIndexInside=t.dataIndex,t.dataIndex=null)}),t}};t.exports=o},function(t,e,i){function n(t,e){return t&&t.hasOwnProperty&&t.hasOwnProperty(e)}var a=i(1),o=a.each;t.exports=function(t){var e=t&&t.visualMap;a.isArray(e)||(e=e?[e]:[]),o(e,function(t){if(t){n(t,"splitList")&&!n(t,"pieces")&&(t.pieces=t.splitList,delete t.splitList);var e=t.pieces;e&&a.isArray(e)&&o(e,function(t){a.isObject(t)&&(n(t,"start")&&!n(t,"min")&&(t.min=t.start),n(t,"end")&&!n(t,"max")&&(t.max=t.end))})}})}},function(t,e,i){i(13).registerSubTypeDefaulter("visualMap",function(t){return t.categories||(t.pieces?t.pieces.length>0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})},function(t,e,i){function n(t,e){t.eachTargetSeries(function(e){var i=e.getData();s.applyVisual(t.stateList,t.targetVisuals,i,t.getValueState,t,t.getDataDimension(i))})}function a(t){t.eachSeries(function(e){var i=e.getData(),n=[];t.eachComponent("visualMap",function(t){if(t.isTargetSeries(e)){var a=t.getVisualMeta(u.bind(o,null,e,t))||{stops:[],outerColors:[]};a.dimension=t.getDataDimension(i),n.push(a)}}),e.getData().setVisual("visualMeta",n)})}function o(t,e,i,n){function a(t){return u[t]}function o(t,e){u[t]=e}for(var r=e.targetVisuals[n],s=l.prepareVisualTypes(r),u={color:t.getData().getVisual("color")},c=0,h=s.length;c<h;c++){var d=s[c],f=r["opacity"===d?"__alphaForOpacity":d];f&&f.applyVisual(i,a,o)}return u.color}var r=i(2),s=i(187),l=i(83),u=i(1);r.registerVisual(r.PRIORITY.VISUAL.COMPONENT,function(t){t.eachComponent("visualMap",function(e){n(e,t)}),a(t)})},function(t,e,i){var n=i(2),a={type:"selectDataRange",event:"dataRangeSelected",update:"update"};n.registerAction(a,function(t,e){e.eachComponent({mainType:"visualMap",query:t},function(e){e.setSelected(t.selected)})})},function(t,e,i){function n(){l.call(this)}function a(t){this.name=t,this.zoomLimit,l.call(this),this._roamTransform=new n,this._viewTransform=new n,this._center,this._zoom}function o(t,e,i,n){var a=i.seriesModel,o=a?a.coordinateSystem:null;return o===this?o[t](n):null}var r=i(6),s=i(19),l=i(58),u=i(1),c=i(11),h=r.applyTransform;u.mixin(n,l),a.prototype={constructor:a,type:"view",dimensions:["x","y"],setBoundingRect:function(t,e,i,n){return this._rect=new c(t,e,i,n),this._rect},getBoundingRect:function(){return this._rect},setViewRect:function(t,e,i,n){this.transformTo(t,e,i,n),this._viewRect=new c(t,e,i,n)},transformTo:function(t,e,i,n){var a=this.getBoundingRect(),o=this._viewTransform;o.transform=a.calculateTransform(new c(t,e,i,n)),o.decomposeTransform(),this._updateTransform()},setCenter:function(t){t&&(this._center=t,this._updateCenterAndZoom())},setZoom:function(t){t=t||1;var e=this.zoomLimit;e&&(null!=e.max&&(t=Math.min(e.max,t)),null!=e.min&&(t=Math.max(e.min,t))),this._zoom=t,this._updateCenterAndZoom()},getDefaultCenter:function(){var t=this.getBoundingRect(),e=t.x+t.width/2,i=t.y+t.height/2;return[e,i]},getCenter:function(){return this._center||this.getDefaultCenter()},getZoom:function(){return this._zoom||1},getRoamTransform:function(){return this._roamTransform},_updateCenterAndZoom:function(){var t=this._viewTransform.getLocalTransform(),e=this._roamTransform,i=this.getDefaultCenter(),n=this.getCenter(),a=this.getZoom();n=r.applyTransform([],n,t),i=r.applyTransform([],i,t),e.origin=n,e.position=[i[0]-n[0],i[1]-n[1]],e.scale=[a,a],this._updateTransform()},_updateTransform:function(){var t=this._roamTransform,e=this._viewTransform;e.parent=t,t.updateTransform(),e.updateTransform(),e.transform&&s.copy(this.transform||(this.transform=[]),e.transform),this.transform?(this.invTransform=this.invTransform||[],s.invert(this.invTransform,this.transform)):this.invTransform=null,this.decomposeTransform()},getViewRect:function(){return this._viewRect},getViewRectAfterRoam:function(){var t=this.getBoundingRect().clone();return t.applyTransform(this.transform),t},dataToPoint:function(t){var e=this.transform;return e?h([],t,e):[t[0],t[1]]},pointToData:function(t){var e=this.invTransform;return e?h([],t,e):[t[0],t[1]]},convertToPixel:u.curry(o,"dataToPoint"),convertFromPixel:u.curry(o,"pointToData"),containPoint:function(t){return this.getViewRectAfterRoam().contain(t[0],t[1])}},u.mixin(a,l),t.exports=a},function(t,e,i){function n(t,e,i){if(this.name=t,this.geometries=e,i)i=[i[0],i[1]];else{var n=this.getBoundingRect();i=[n.x+n.width/2,n.y+n.height/2]}this.center=i}var a=i(267),o=i(11),r=i(85),s=i(6);n.prototype={constructor:n,properties:null,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,i=[e,e],n=[-e,-e],a=[],l=[],u=this.geometries,c=0;c<u.length;c++)if("polygon"===u[c].type){var h=u[c].exterior;r.fromPoints(h,a,l),s.min(i,i,a),s.max(n,n,l)}return 0===c&&(i[0]=i[1]=n[0]=n[1]=0),this._rect=new o(i[0],i[1],n[0]-i[0],n[1]-i[1])},contain:function(t){var e=this.getBoundingRect(),i=this.geometries;if(!e.contain(t[0],t[1]))return!1;t:for(var n=0,o=i.length;n<o;n++)if("polygon"===i[n].type){var r=i[n].exterior,s=i[n].interiors;if(a.contain(r,t[0],t[1])){for(var l=0;l<(s?s.length:0);l++)if(a.contain(s[l]))continue t;return!0}}return!1},transformTo:function(t,e,i,n){var a=this.getBoundingRect(),r=a.width/a.height;i?n||(n=i/r):i=r*n;for(var l=new o(t,e,i,n),u=a.calculateTransform(l),c=this.geometries,h=0;h<c.length;h++)if("polygon"===c[h].type){for(var d=c[h].exterior,f=c[h].interiors,p=0;p<d.length;p++)s.applyTransform(d[p],d[p],u);for(var g=0;g<(f?f.length:0);g++)for(var p=0;p<f[g].length;p++)s.applyTransform(f[g][p],f[g][p],u)}a=this._rect,a.copy(l),this.center=[a.x+a.width/2,a.y+a.height/2]}},t.exports=n},function(t,e,i){function n(t){if(!t.UTF8Encoding)return t;var e=t.UTF8Scale;null==e&&(e=1024);for(var i=t.features,n=0;n<i.length;n++)for(var o=i[n],r=o.geometry,s=r.coordinates,l=r.encodeOffsets,u=0;u<s.length;u++){var c=s[u];if("Polygon"===r.type)s[u]=a(c,l[u],e);else if("MultiPolygon"===r.type)for(var h=0;h<c.length;h++){var d=c[h];c[h]=a(d,l[u][h],e)}}return t.UTF8Encoding=!1,t}function a(t,e,i){for(var n=[],a=e[0],o=e[1],r=0;r<t.length;r+=2){var s=t.charCodeAt(r)-64,l=t.charCodeAt(r+1)-64;s=s>>1^-(1&s),l=l>>1^-(1&l),s+=a,l+=o,a=s,o=l,n.push([s/i,l/i])}return n}var o=i(1),r=i(261);t.exports=function(t){return n(t),o.map(o.filter(t.features,function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0}),function(t){var e=t.properties,i=t.geometry,n=i.coordinates,a=[];"Polygon"===i.type&&a.push({type:"polygon",exterior:n[0],interiors:n.slice(1)}),"MultiPolygon"===i.type&&o.each(n,function(t){t[0]&&a.push({type:"polygon",exterior:t[0],interiors:t.slice(1)})});var s=new r(e.name,a,e.cp);return s.properties=e,s})}},function(t,e,i){function n(t,e){var i=[];return t.eachComponent("parallel",function(n,o){var r=new a(n,t,e);r.name="parallel_"+o,r.resize(n,e),n.coordinateSystem=r,r.model=n,i.push(r)}),t.eachSeries(function(e){if("parallel"===e.get("coordinateSystem")){var i=t.queryComponents({mainType:"parallel",index:e.get("parallelIndex"),id:e.get("parallelId")})[0];e.coordinateSystem=i.coordinateSystem}}),i}var a=i(405);i(26).register("parallel",{create:n})},function(t,e,i){function n(t){var e=t.mainData,i=t.datas;i||(i={main:e},t.datasAttr={main:"data"}),t.datas=t.mainData=null,u(e,i,t),d(i,function(i){d(e.TRANSFERABLE_METHODS,function(e){i.wrapMethod(e,h.curry(a,t))})}),e.wrapMethod("cloneShallow",h.curry(r,t)),d(e.CHANGABLE_METHODS,function(i){e.wrapMethod(i,h.curry(o,t))}),h.assert(i[e.dataType]===e)}function a(t,e){if(l(this)){var i=h.extend({},this[f]);i[this.dataType]=e,u(e,i,t)}else c(e,this.dataType,this[p],t);return e}function o(t,e){return t.struct&&t.struct.update(this),e}function r(t,e){return d(e[f],function(i,n){i!==e&&c(i.cloneShallow(),n,e,t)}),e}function s(t){var e=this[p];return null==t||null==e?e:e[f][t]}function l(t){return t[p]===t}function u(t,e,i){t[f]={},d(e,function(e,n){c(e,n,t,i)})}function c(t,e,i,n){i[f][e]=t,t[p]=i,t.dataType=e,n.struct&&(t[n.structAttr]=n.struct,n.struct[n.datasAttr[e]]=t),t.getLinkedData=s}var h=i(1),d=h.each,f="\0__link_datas",p="\0__link_mainData";t.exports=n},function(t,e,i){function n(){function t(e,n){if(n>=i.length)return e;for(var o=-1,r=e.length,s=i[n++],l={},u={};++o<r;){var c=s(e[o]),h=u[c];h?h.push(e[o]):u[c]=[e[o]]}return a.each(u,function(e,i){l[i]=t(e,n)}),l}function e(t,o){if(o>=i.length)return t;var r=[],s=n[o++];return a.each(t,function(t,i){r.push({key:i,values:e(t,o)})}),s?r.sort(function(t,e){return s(t.key,e.key)}):r}var i=[],n=[];return{key:function(t){return i.push(t),this},sortKeys:function(t){return n[i.length-1]=t,this},entries:function(i){return e(t(i,0),0)}}}var a=i(1);t.exports=n},function(t,e,i){var n=i(1),a={get:function(t,e,i){var a=n.clone((o[t]||{})[e]);return i&&n.isArray(a)?a[a.length-1]:a}},o={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}};t.exports=a},function(t,e,i){function n(t,e){return Math.abs(t-e)<r}function a(t,e,i){var a=0,r=t[0];if(!r)return!1;for(var s=1;s<t.length;s++){var l=t[s];a+=o(r[0],r[1],l[0],l[1],e,i),r=l}var u=t[0];return n(r[0],u[0])&&n(r[1],u[1])||(a+=o(r[0],r[1],u[0],u[1],e,i)),0!==a}var o=i(99),r=1e-8;t.exports={contain:a}},function(t,e,i){var n=i(90).extend({type:"series.pictorialBar",dependencies:["grid"],defaultOption:{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,hoverAnimation:!1},getInitialData:function(t){return t.stack=null,n.superApply(this,"getInitialData",arguments)}});t.exports=n},function(t,e,i){function n(t,e,i,n){var l=t.getItemLayout(e),u=i.get("symbolRepeat"),c=i.get("symbolClip"),h=i.get("symbolPosition")||"start",d=i.get("symbolRotate"),f=(d||0)*Math.PI/180||0,p=i.get("symbolPatternSize")||2,g=i.isAnimationEnabled(),m={dataIndex:e,layout:l,itemModel:i,symbolType:t.getItemVisual(e,"symbol")||"circle",color:t.getItemVisual(e,"color"),symbolClip:c,symbolRepeat:u,symbolRepeatDirection:i.get("symbolRepeatDirection"),symbolPatternSize:p,rotation:f,animationModel:g?i:null,hoverAnimation:g&&i.get("hoverAnimation"),z2:i.getShallow("z",!0)||0};a(i,u,l,n,m),o(t,e,l,u,c,m.boundingLength,m.pxSign,p,n,m),r(i,m.symbolScale,f,n,m);var v=m.symbolSize,y=i.get("symbolOffset");return I.isArray(y)&&(y=[D(y[0],v[0]),D(y[1],v[1])]),s(i,v,l,u,c,y,h,m.valueLineWidth,m.boundingLength,m.repeatCutLength,n,m),m}function a(t,e,i,n,a){var o=n.valueDim,r=t.get("symbolBoundingData"),s=n.coordSys.getOtherAxis(n.coordSys.getBaseAxis()),l=s.toGlobalCoord(s.dataToCoord(0)),u=a.boundingLength=null!=r?s.toGlobalCoord(s.dataToCoord(s.scale.parse(r)))-l:e?n.coordSysExtent[o.index][1-+(i[o.wh]<=0)]-l:i[o.wh];e&&(a.repeatCutLength=i[o.wh]),a.pxSign=u>0?1:u<0?-1:0}function o(t,e,i,n,a,o,r,s,l,u){var c=l.valueDim,h=l.categoryDim,d=Math.abs(i[h.wh]),f=t.getItemVisual(e,"symbolSize");I.isArray(f)?f=f.slice():(null==f&&(f="100%"),f=[f,f]),f[h.index]=D(f[h.index],d),f[c.index]=D(f[c.index],n?d:Math.abs(o)),u.symbolSize=f;var p=u.symbolScale=[f[0]/s,f[1]/s];p[c.index]*=(l.isHorizontal?-1:1)*r}function r(t,e,i,n,a){var o=t.get(P)||0;o&&(O.attr({scale:e.slice(),rotation:i}),O.updateTransform(),o/=O.getLineScale(),o*=e[n.valueDim.index]),a.valueLineWidth=o}function s(t,e,i,n,a,o,r,s,l,u,c,h){var d=c.categoryDim,f=c.valueDim,p=h.pxSign,g=Math.max(e[f.index]+s,0),m=g;if(n){var v=Math.abs(l),y=I.retrieve(t.get("symbolMargin"),"15%")+"",x=!1;y.lastIndexOf("!")===y.length-1&&(x=!0,y=y.slice(0,y.length-1)),y=D(y,e[f.index]);var _=Math.max(g+2*y,0),b=x?0:2*y,w=C.isNumeric(n),S=w?n:M((v+b)/_),T=v-S*g;y=T/2/(x?S:S-1),_=g+2*y,b=x?0:2*y,w||"fixed"===n||(S=u?M((Math.abs(u)+b)/_):0),m=S*_-b,h.repeatTimes=S,h.symbolMargin=y}var A=p*(m/2),L=h.pathPosition=[];L[d.index]=i[d.wh]/2,L[f.index]="start"===r?A:"end"===r?l-A:l/2,o&&(L[0]+=o[0],L[1]+=o[1]);var P=h.bundlePosition=[];P[d.index]=i[d.xy],P[f.index]=i[f.xy];var k=h.barRectShape=I.extend({},i);k[f.wh]=p*Math.max(Math.abs(i[f.wh]),Math.abs(L[f.index]+A)),k[d.wh]=i[d.wh];var O=h.clipShape={};O[d.xy]=-i[d.xy],O[d.wh]=c.ecSize[d.wh],O[f.xy]=0,O[f.wh]=i[f.wh]}function l(t){var e=t.symbolPatternSize,i=A.createSymbol(t.symbolType,-e/2,-e/2,e,e,t.color);return i.attr({culling:!0}),"image"!==i.type&&i.setStyle({strokeNoScale:!0}),i}function u(t,e,i,n){function a(t){var e=h.slice(),n=i.pxSign,a=t;return("start"===i.symbolRepeatDirection?n>0:n<0)&&(a=f-1-t),e[d.index]=g*(a-f/2+.5)+h[d.index],{position:e,scale:i.symbolScale.slice(),rotation:i.rotation}}function o(){b(t,function(t){t.trigger("emphasis")})}function r(){b(t,function(t){t.trigger("normal")})}var s=t.__pictorialBundle,u=i.symbolSize,c=i.valueLineWidth,h=i.pathPosition,d=e.valueDim,f=i.repeatTimes||0,p=0,g=u[e.valueDim.index]+c+2*i.symbolMargin;for(b(t,function(t){t.__pictorialAnimationIndex=p,t.__pictorialRepeatTimes=f,p<f?w(t,null,a(p),i,n):w(t,null,{scale:[0,0]},i,n,function(){s.remove(t)}),m(t,i),p++});p<f;p++){var v=l(i);v.__pictorialAnimationIndex=p,v.__pictorialRepeatTimes=f,s.add(v);var y=a(p,!0);w(v,{position:y.position,scale:[0,0]},{scale:y.scale,rotation:y.rotation},i,n),v.on("mouseover",o).on("mouseout",r),m(v,i)}}function c(t,e,i,n){function a(){this.trigger("emphasis")}function o(){this.trigger("normal")}var r=t.__pictorialBundle,s=t.__pictorialMainPath;s?w(s,null,{position:i.pathPosition.slice(),scale:i.symbolScale.slice(),rotation:i.rotation},i,n):(s=t.__pictorialMainPath=l(i),r.add(s),w(s,{position:i.pathPosition.slice(),scale:[0,0],rotation:i.rotation},{scale:i.symbolScale.slice()},i,n),s.on("mouseover",a).on("mouseout",o)),m(s,i)}function h(t,e,i){var n=I.extend({},e.barRectShape),a=t.__pictorialBarRect;a?w(a,null,{shape:n},e,i):(a=t.__pictorialBarRect=new T.Rect({z2:2,shape:n,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}}),t.add(a))}function d(t,e,i,n){if(i.symbolClip){var a=t.__pictorialClipPath,o=I.extend({},i.clipShape),r=e.valueDim,s=i.animationModel,l=i.dataIndex;if(a)T.updateProps(a,{shape:o},s,l);else{o[r.wh]=0,a=new T.Rect({shape:o}),t.__pictorialBundle.setClipPath(a),t.__pictorialClipPath=a;var u={};u[r.wh]=i.clipShape[r.wh],T[n?"updateProps":"initProps"](a,{shape:u},s,l)}}}function f(t,e){var i=t.getItemModel(e);return i.getAnimationDelayParams=p,i.isAnimationEnabled=g,i}function p(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function g(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function m(t,e){t.off("emphasis").off("normal");var i=e.symbolScale.slice();e.hoverAnimation&&t.on("emphasis",function(){this.animateTo({scale:[1.1*i[0],1.1*i[1]]},400,"elasticOut")}).on("normal",function(){this.animateTo({scale:i.slice()},400,"elasticOut")})}function v(t,e,i,n){var a=new T.Group,o=new T.Group;return a.add(o),a.__pictorialBundle=o,o.attr("position",i.bundlePosition.slice()),i.symbolRepeat?u(a,e,i):c(a,e,i),h(a,i,n),d(a,e,i,n),a.__pictorialShapeStr=_(t,i),a.__pictorialSymbolMeta=i,a}function y(t,e,i){var n=i.animationModel,a=i.dataIndex,o=t.__pictorialBundle;T.updateProps(o,{position:i.bundlePosition.slice()},n,a),i.symbolRepeat?u(t,e,i,!0):c(t,e,i,!0),h(t,i,!0),d(t,e,i,!0)}function x(t,e,i,n){var a=n.__pictorialBarRect;a&&(a.style.text="");
+var o=[];b(n,function(t){o.push(t)}),n.__pictorialMainPath&&o.push(n.__pictorialMainPath),n.__pictorialClipPath&&(i=null),I.each(o,function(t){T.updateProps(t,{scale:[0,0]},i,e,function(){n.parent&&n.parent.remove(n)})}),t.setItemGraphicEl(e,null)}function _(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function b(t,e,i){I.each(t.__pictorialBundle.children(),function(n){n!==t.__pictorialBarRect&&e.call(i,n)})}function w(t,e,i,n,a,o){e&&t.attr(e),n.symbolClip&&!a?i&&t.attr(i):i&&T[a?"updateProps":"initProps"](t,i,n.animationModel,n.dataIndex,o)}function S(t,e,i){var n=i.color,a=i.dataIndex,o=i.itemModel,r=o.getModel("itemStyle.normal").getItemStyle(["color"]),s=o.getModel("itemStyle.emphasis").getItemStyle();b(t,function(t){t.setColor(n),t.setStyle(I.defaults({fill:n,opacity:i.opacity},r)),T.setHoverStyle(t,s),t.z2=i.z2});var l={},u=e.valueDim.posDesc[+(i.boundingLength>0)],c=t.__pictorialBarRect;L.setLabel(c.style,l,o,n,e.seriesModel,a,u),T.setHoverStyle(c,l)}function M(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var I=i(1),T=i(3),A=i(24),C=i(4),L=i(91),D=C.parsePercent,P=["itemStyle","normal","borderWidth"],k=[{xy:"x",wh:"width",index:0,posDesc:["left","right"]},{xy:"y",wh:"height",index:1,posDesc:["top","bottom"]}],O=new T.Circle,z=i(2).extendChartView({type:"pictorialBar",render:function(t,e,i){var a=this.group,o=t.getData(),r=this._data,s=t.coordinateSystem,l=s.getBaseAxis(),u=!!l.isHorizontal(),c=s.grid.getRect(),h={ecSize:{width:i.getWidth(),height:i.getHeight()},seriesModel:t,coordSys:s,coordSysExtent:[[c.x,c.x+c.width],[c.y,c.y+c.height]],isHorizontal:u,valueDim:k[+u],categoryDim:k[1-u]};return o.diff(r).add(function(t){if(o.hasValue(t)){var e=f(o,t),i=n(o,t,e,h),r=v(o,h,i);o.setItemGraphicEl(t,r),a.add(r),S(r,h,i)}}).update(function(t,e){var i=r.getItemGraphicEl(e);if(!o.hasValue(t))return void a.remove(i);var s=f(o,t),l=n(o,t,s,h),u=_(o,l);i&&u!==i.__pictorialShapeStr&&(a.remove(i),o.setItemGraphicEl(t,null),i=null),i?y(i,h,l):i=v(o,h,l,!0),o.setItemGraphicEl(t,i),i.__pictorialSymbolMeta=l,a.add(i),S(i,h,l)}).remove(function(t){var e=r.getItemGraphicEl(t);e&&x(r,t,e.__pictorialSymbolMeta.animationModel,e)}).execute(),this._data=o,this.group},dispose:I.noop,remove:function(t,e){var i=this.group,n=this._data;t.get("animation")?n&&n.eachItemGraphicEl(function(e){x(n,e.dataIndex,t,e)}):i.removeAll()}});t.exports=z},function(t,e,i){var n=i(2);i(271),i(272),n.registerVisual(i(274)),n.registerLayout(i(273))},function(t,e,i){"use strict";var n=i(1),a=i(17),o=i(183),r=a.extend({type:"series.boxplot",dependencies:["xAxis","yAxis","grid"],defaultValueDimensions:["min","Q1","median","Q3","max"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,layout:null,boxWidth:[7,50],itemStyle:{normal:{color:"#fff",borderWidth:1},emphasis:{borderWidth:2,shadowBlur:5,shadowOffsetX:2,shadowOffsetY:2,shadowColor:"rgba(0,0,0,0.4)"}},animationEasing:"elasticOut",animationDuration:800}});n.mixin(r,o.seriesModelMixin,!0),t.exports=r},function(t,e,i){"use strict";function n(t,e,i){var n=e.getItemModel(i),a=n.getModel(u),o=e.getItemVisual(i,"color"),s=a.getItemStyle(["borderColor"]),l=t.childAt(t.whiskerIndex);l.style.set(s),l.style.stroke=o,l.dirty();var h=t.childAt(t.bodyIndex);h.style.set(s),h.style.stroke=o,h.dirty();var d=n.getModel(c).getItemStyle();r.setHoverStyle(t,d)}var a=i(1),o=i(30),r=i(3),s=i(183),l=o.extend({type:"boxplot",getStyleUpdater:function(){return n},dispose:a.noop});a.mixin(l,s.viewMixin,!0);var u=["itemStyle","normal"],c=["itemStyle","emphasis"];t.exports=l},function(t,e,i){function n(t){var e=[],i=[];return t.eachSeriesByType("boxplot",function(t){var n=t.getBaseAxis(),a=r.indexOf(i,n);a<0&&(a=i.length,i[a]=n,e[a]={axis:n,seriesModels:[]}),e[a].seriesModels.push(t)}),e}function a(t){var e,i,n=t.axis,a=t.seriesModels,o=a.length,s=t.boxWidthList=[],c=t.boxOffsetList=[],h=[];if("category"===n.type)i=n.getBandWidth();else{var d=0;u(a,function(t){d=Math.max(d,t.getData().count())}),e=n.getExtent(),Math.abs(e[1]-e[0])/d}u(a,function(t){var e=t.get("boxWidth");r.isArray(e)||(e=[e,e]),h.push([l(e[0],i)||0,l(e[1],i)||0])});var f=.8*i-2,p=f/o*.3,g=(f-p*(o-1))/o,m=g/2-f/2;u(a,function(t,e){c.push(m),m+=p+g,s.push(Math.min(Math.max(g,h[e][0]),h[e][1]))})}function o(t,e,i){var n,a=t.coordinateSystem,o=t.getData(),s=i/2,l=t.get("layout"),u="horizontal"===l?0:1,c=1-u,h=["x","y"],d=[];r.each(o.dimensions,function(t){var e=o.getDimensionInfo(t),i=e.coordDim;i===h[c]?d.push(t):i===h[u]&&(n=t)}),null==n||d.length<5||o.each([n].concat(d),function(){function t(t){var i=[];i[u]=h,i[c]=t;var n;return isNaN(h)||isNaN(t)?n=[NaN,NaN]:(n=a.dataToPoint(i),n[u]+=e),n}function i(t,e){var i=t.slice(),n=t.slice();i[u]+=s,n[u]-=s,e?y.push(i,n):y.push(n,i)}function n(t){var e=[t.slice(),t.slice()];e[0][u]-=s,e[1][u]+=s,v.push(e)}var r=arguments,h=r[0],f=r[d.length+1],p=t(r[3]),g=t(r[1]),m=t(r[5]),v=[[g,t(r[2])],[m,t(r[4])]];n(g),n(m),n(p);var y=[];i(v[0][1],0),i(v[1][1],1),o.setItemLayout(f,{chartLayout:l,initBaseline:p[c],median:p,bodyEnds:y,whiskerEnds:v})})}var r=i(1),s=i(4),l=s.parsePercent,u=r.each;t.exports=function(t){var e=n(t);u(e,function(t){var e=t.seriesModels;e.length&&(a(t),u(e,function(e,i){o(e,t.boxOffsetList[i],t.boxWidthList[i])}))})}},function(t,e){var i=["itemStyle","normal","borderColor"];t.exports=function(t,e){var n=t.get("color");t.eachRawSeriesByType("boxplot",function(e){var a=n[e.seriesIndex%n.length],o=e.getData();o.setVisual({legendSymbol:"roundRect",color:e.get(i)||a}),t.isSeriesFiltered(e)||o.each(function(t){var e=o.getItemModel(t);o.setItemVisual(t,{color:e.get(i,!0)})})})}},function(t,e,i){var n=i(2);i(276),i(277),n.registerPreprocessor(i(280)),n.registerVisual(i(279)),n.registerLayout(i(278))},function(t,e,i){"use strict";var n=i(1),a=i(17),o=i(183),r=a.extend({type:"series.candlestick",dependencies:["xAxis","yAxis","grid"],defaultValueDimensions:["open","close","lowest","highest"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,layout:null,itemStyle:{normal:{color:"#c23531",color0:"#314656",borderWidth:1,borderColor:"#c23531",borderColor0:"#314656"},emphasis:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,animationUpdate:!1,animationEasing:"linear",animationDuration:300},getShadowDim:function(){return"open"},brushSelector:function(t,e,i){var n=e.getItemLayout(t);return i.rect(n.brushRect)}});n.mixin(r,o.seriesModelMixin,!0),t.exports=r},function(t,e,i){"use strict";function n(t,e,i){var n=e.getItemModel(i),a=n.getModel(u),o=e.getItemVisual(i,"color"),s=e.getItemVisual(i,"borderColor")||o,l=a.getItemStyle(["color","color0","borderColor","borderColor0"]),h=t.childAt(t.whiskerIndex);h.useStyle(l),h.style.stroke=s;var d=t.childAt(t.bodyIndex);d.useStyle(l),d.style.fill=o,d.style.stroke=s;var f=n.getModel(c).getItemStyle();r.setHoverStyle(t,f)}var a=i(1),o=i(30),r=i(3),s=i(183),l=o.extend({type:"candlestick",getStyleUpdater:function(){return n},dispose:a.noop});a.mixin(l,s.viewMixin,!0);var u=["itemStyle","normal"],c=["itemStyle","emphasis"];t.exports=l},function(t,e,i){function n(t,e){var i,n=t.getBaseAxis(),a="category"===n.type?n.getBandWidth():(i=n.getExtent(),Math.abs(i[1]-i[0])/e.count()),s=r(o(t.get("barMaxWidth"),a),a),l=r(o(t.get("barMinWidth"),1),a),u=t.get("barWidth");return null!=u?r(u,a):Math.max(Math.min(a/2,s),l)}var a=i(1),o=i(1).retrieve,r=i(4).parsePercent;t.exports=function(t){t.eachSeriesByType("candlestick",function(t){var e,i=t.coordinateSystem,o=t.getData(),r=n(t,o),s=t.get("layout"),l="horizontal"===s?0:1,u=1-l,c=["x","y"],h=[];a.each(o.dimensions,function(t){var i=o.getDimensionInfo(t),n=i.coordDim;n===c[u]?h.push(t):n===c[l]&&(e=t)}),null==e||h.length<4||o.each([e].concat(h),function(){function t(t){var e=[];return e[l]=c,e[u]=t,isNaN(c)||isNaN(t)?[NaN,NaN]:i.dataToPoint(e)}function e(t,e){var i=t.slice(),n=t.slice();i[l]+=r/2,n[l]-=r/2,e?M.push(i,n):M.push(n,i)}function n(){var e=t(Math.min(f,p,g,m)),i=t(Math.max(f,p,g,m));return e[l]-=r/2,i[l]-=r/2,{x:e[0],y:e[1],width:u?r:i[0]-e[0],height:u?i[1]-e[1]:r}}var a=arguments,c=a[0],d=a[h.length+1],f=a[1],p=a[2],g=a[3],m=a[4],v=Math.min(f,p),y=Math.max(f,p),x=t(v),_=t(y),b=t(g),w=t(m),S=[[w,_],[b,x]],M=[];e(_,0),e(x,1),o.setItemLayout(d,{chartLayout:s,sign:f>p?-1:f<p?1:0,initBaseline:f>p?_[u]:x[u],bodyEnds:M,whiskerEnds:S,brushRect:n()})},!0)})}},function(t,e){var i=["itemStyle","normal","borderColor"],n=["itemStyle","normal","borderColor0"],a=["itemStyle","normal","color"],o=["itemStyle","normal","color0"];t.exports=function(t,e){t.eachRawSeriesByType("candlestick",function(e){var r=e.getData();r.setVisual({legendSymbol:"roundRect"}),t.isSeriesFiltered(e)||r.each(function(t){var e=r.getItemModel(t),s=r.getItemLayout(t).sign;r.setItemVisual(t,{color:e.get(s>0?a:o),borderColor:e.get(s>0?i:n)})})})}},function(t,e,i){var n=i(1);t.exports=function(t){t&&n.isArray(t.series)&&n.each(t.series,function(t){n.isObject(t)&&"k"===t.type&&(t.type="candlestick")})}},function(t,e,i){function n(t){var e,i=t.type;if("path"===i){var n=t.shape;e=d.makePath(n.pathData,null,{x:n.x||0,y:n.y||0,width:n.width||0,height:n.height||0},"center"),e.__customPathData=t.pathData}else if("image"===i)e=new d.Image({}),e.__customImagePath=t.style.image;else if("text"===i)e=new d.Text({}),e.__customText=t.style.text;else{var a=d[i.charAt(0).toUpperCase()+i.slice(1)];e=new a}return e.__customGraphicType=i,e}function a(t,e,i,n,a,r){var s={},l=i.style||{};if(i.shape&&(s.shape=h.clone(i.shape)),i.position&&(s.position=i.position.slice()),i.scale&&(s.scale=i.scale.slice()),i.origin&&(s.origin=i.origin.slice()),i.rotation&&(s.rotation=i.rotation),"image"===t.type&&i.style){var u=s.style={};h.each(["x","y","width","height"],function(e){o(e,u,l,t.style,r)})}if("text"===t.type&&i.style){var u=s.style={};h.each(["x","y"],function(e){o(e,u,l,t.style,r)})}if("group"!==t.type&&(t.useStyle(l),r)){t.style.opacity=0;var c=l.opacity;null==c&&(c=1),d.initProps(t,{style:{opacity:c}},n,e)}r?t.attr(s):d.updateProps(t,s,n,e),t.attr({z2:i.z2||0,silent:i.silent}),t.styleEmphasis!==!1&&d.setHoverStyle(t,t.styleEmphasis)}function o(t,e,i,n,a){null==i[t]||a||(e[t]=i[t],i[t]=n[t])}function r(t,e,i,n){function a(t){null==t&&(t=w),O&&(S=e.getItemModel(t),M=S.getModel(y),I=S.getModel(x),T=f.findLabelValueDim(e),A=e.getItemVisual(t,"color"),O=!1)}function o(t,i){return null==i&&(i=w),e.get(e.getDimension(t||0),i)}function r(i,n){null==n&&(n=w),a(n);var o=S.getModel(m).getItemStyle();null!=A&&(o.fill=A);var r=e.getItemVisual(n,"opacity");return null!=r&&(o.opacity=r),f.setTextToStyle(e,n,T,o,t,M,A),i&&h.extend(o,i),o}function l(i,n){null==n&&(n=w),a(n);var o=S.getModel(v).getItemStyle();return f.setTextToStyle(e,n,T,o,t,I,A),i&&h.extend(o,i),o}function u(t,i){return null==i&&(i=w),e.getItemVisual(i,t)}function c(t){if(L.getBaseAxis){var e=L.getBaseAxis();return g.getLayoutOnAxis(h.defaults({axis:e},t),n)}}function p(){return i.getCurrentSeriesIndices()}function b(t){return d.getFont(t,i)}var w,S,M,I,T,A,C=t.get("renderItem"),L=t.coordinateSystem,D=_[L.type](L),P=h.defaults({getWidth:n.getWidth,getHeight:n.getHeight,getZr:n.getZr,getDevicePixelRatio:n.getDevicePixelRatio,value:o,style:r,styleEmphasis:l,visual:u,barLayout:c,currentSeriesIndices:p,font:b},D.api),k={context:{},seriesId:t.id,seriesName:t.name,seriesIndex:t.seriesIndex,coordSys:D.coordSys,dataInsideLength:e.count(),encode:s(t.getData())},O=!0;return function(t){return w=t,O=!0,C&&C(h.defaults({dataIndexInside:t,dataIndex:e.getRawIndex(t)},k),P)||{}}}function s(t){var e={};return h.each(t.dimensions,function(i,n){var a=t.getDimensionInfo(i);if(!a.isExtraCoord){var o=a.coordDim,r=e[o]=e[o]||[];r[a.coordDimIndex]=n}}),e}function l(t,e,i,n,a,o){t=u(t,e,i,n,a,o),t&&o.setItemGraphicEl(e,t)}function u(t,e,i,o,r,s){var l=i.type;if(!t||l===t.__customGraphicType||"path"===l&&i.pathData===t.__customPathData||"image"===l&&i.style.image===t.__customImagePath||"text"===l&&i.style.text===t.__customText||(r.remove(t),t=null),null!=l){var c=!t;return!t&&(t=n(i)),a(t,e,i,o,s,c),"group"===l&&h.each(i.children,function(i,n){u(t.childAt(n),e,i,o,t,s)}),r.add(t),t}}var c=i(2),h=i(1),d=i(3),f=i(92),p=i(28),g=i(82),m=["itemStyle","normal"],v=["itemStyle","emphasis"],y=["label","normal"],x=["label","emphasis"],_={cartesian2d:i(397),geo:i(403),singleAxis:i(421),polar:i(414),calendar:i(396)};c.extendSeriesModel({type:"series.custom",dependencies:["grid","polar","geo","singleAxis","calendar"],defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0},getInitialData:function(t,e){return p(t.data,this,e)}}),c.extendChartView({type:"custom",_data:null,render:function(t,e,i){var n=this._data,a=t.getData(),o=this.group,s=r(t,a,e,i);a.diff(n).add(function(e){a.hasValue(e)&&l(null,e,s(e),t,o,a)}).update(function(e,i){var r=n.getItemGraphicEl(i);a.hasValue(e)?l(r,e,s(e),t,o,a):r&&o.remove(r)}).remove(function(t){var e=n.getItemGraphicEl(t);e&&o.remove(e)}).execute(),this._data=a}})},function(t,e,i){var n=i(1),a=i(2);i(283),i(284),a.registerVisual(n.curry(i(50),"effectScatter","circle",null)),a.registerLayout(n.curry(i(61),"effectScatter"))},function(t,e,i){"use strict";var n=i(28),a=i(17);t.exports=a.extend({type:"series.effectScatter",dependencies:["grid","polar"],getInitialData:function(t,e){var i=n(t.data,this,e);return i},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,effectType:"ripple",progressive:0,showEffectOn:"render",rippleEffect:{period:4,scale:2.5,brushType:"fill"},symbolSize:10}})},function(t,e,i){var n=i(44),a=i(311);i(2).extendChartView({type:"effectScatter",init:function(){this._symbolDraw=new n(a)},render:function(t,e,i){var n=t.getData(),a=this._symbolDraw;a.updateData(n),this.group.add(a.group)},updateLayout:function(){this._symbolDraw.updateLayout()},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e)},dispose:function(){}})},function(t,e,i){var n=i(1),a=i(2);i(286),i(287),a.registerVisual(n.curry(i(84),"funnel")),a.registerLayout(i(288)),a.registerProcessor(n.curry(i(63),"funnel"))},function(t,e,i){"use strict";var n=i(14),a=i(5),o=i(25),r=i(2).extendSeriesModel({type:"series.funnel",init:function(t){r.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this._defaultLabelLine(t)},getInitialData:function(t,e){var i=o(["value"],t.data),a=new n(i,this);return a.initData(t.data),a},_defaultLabelLine:function(t){a.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},getDataParams:function(t){var e=this.getData(),i=r.superCall(this,"getDataParams",t),n=e.getSum("value");return i.percent=n?+(e.get("value",t)/n*100).toFixed(2):0,i.$vars.push("percent"),i},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",gap:0,funnelAlign:"center",label:{normal:{show:!0,position:"outer"},emphasis:{show:!0}},labelLine:{normal:{show:!0,length:20,lineStyle:{width:1,type:"solid"}},emphasis:{}},itemStyle:{normal:{borderColor:"#fff",borderWidth:1},emphasis:{}}}});t.exports=r},function(t,e,i){function n(t,e){function i(){r.ignore=r.hoverIgnore,s.ignore=s.hoverIgnore}function n(){r.ignore=r.normalIgnore,s.ignore=s.normalIgnore}o.Group.call(this);var a=new o.Polygon,r=new o.Polyline,s=new o.Text;this.add(a),this.add(r),this.add(s),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function a(t,e,i,n){var a=n.getModel("textStyle"),o=n.get("position"),s="inside"===o||"inner"===o||"center"===o;return{fill:a.getTextColor()||(s?"#fff":t.getItemVisual(e,"color")),textFont:a.getFont(),text:r.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var o=i(3),r=i(1),s=n.prototype,l=["itemStyle","normal","opacity"];s.updateData=function(t,e,i){var n=this.childAt(0),a=t.hostModel,s=t.getItemModel(e),u=t.getItemLayout(e),c=t.getItemModel(e).get(l);c=null==c?1:c,n.useStyle({}),i?(n.setShape({points:u.points}),n.setStyle({opacity:0}),o.initProps(n,{style:{opacity:c}},a,e)):o.updateProps(n,{style:{opacity:c},shape:{points:u.points}},a,e);var h=s.getModel("itemStyle"),d=t.getItemVisual(e,"color");n.setStyle(r.defaults({lineJoin:"round",fill:d},h.getModel("normal").getItemStyle(["opacity"]))),n.hoverStyle=h.getModel("emphasis").getItemStyle(),this._updateLabel(t,e),o.setHoverStyle(this)},s._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),r=t.hostModel,s=t.getItemModel(e),l=t.getItemLayout(e),u=l.label,c=t.getItemVisual(e,"color");o.updateProps(i,{shape:{points:u.linePoints||u.linePoints}},r,e),o.updateProps(n,{style:{x:u.x,y:u.y}},r,e),n.attr({style:{textAlign:u.textAlign,textVerticalAlign:u.verticalAlign,textFont:u.font},rotation:u.rotation,origin:[u.x,u.y],z2:10});var h=s.getModel("label.normal"),d=s.getModel("label.emphasis"),f=s.getModel("labelLine.normal"),p=s.getModel("labelLine.emphasis");n.setStyle(a(t,e,"normal",h)),n.ignore=n.normalIgnore=!h.get("show"),n.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:c}),i.setStyle(f.getModel("lineStyle").getLineStyle()),n.hoverStyle=a(t,e,"emphasis",d),i.hoverStyle=p.getModel("lineStyle").getLineStyle()},r.inherits(n,o.Group);var u=i(30).extend({type:"funnel",render:function(t,e,i){var a=t.getData(),o=this._data,r=this.group;a.diff(o).add(function(t){var e=new n(a,t);a.setItemGraphicEl(t,e),r.add(e)}).update(function(t,e){var i=o.getItemGraphicEl(e);i.updateData(a,t),r.add(i),a.setItemGraphicEl(t,i)}).remove(function(t){var e=o.getItemGraphicEl(t);r.remove(e)}).execute(),this._data=a},remove:function(){this.group.removeAll(),this._data=null},dispose:function(){}});t.exports=u},function(t,e,i){function n(t,e){return r.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function a(t,e){for(var i=t.mapArray("value",function(t){return t}),n=[],a="ascending"===e,o=0,r=t.count();o<r;o++)n[o]=o;return"function"==typeof e?n.sort(e):"none"!==e&&n.sort(function(t,e){return a?i[t]-i[e]:i[e]-i[t]}),n}function o(t){t.each(function(e){var i,n,a,o,r=t.getItemModel(e),s=r.getModel("label.normal"),l=s.get("position"),u=r.getModel("labelLine.normal"),c=t.getItemLayout(e),h=c.points,d="inner"===l||"inside"===l||"center"===l;if(d)n=(h[0][0]+h[1][0]+h[2][0]+h[3][0])/4,a=(h[0][1]+h[1][1]+h[2][1]+h[3][1])/4,i="center",o=[[n,a],[n,a]];else{var f,p,g,m=u.get("length");"left"===l?(f=(h[3][0]+h[0][0])/2,p=(h[3][1]+h[0][1])/2,g=f-m,n=g-5,i="right"):(f=(h[1][0]+h[2][0])/2,p=(h[1][1]+h[2][1])/2,g=f+m,n=g+5,i="left");var v=p;o=[[f,p],[g,v]],a=v}c.label={linePoints:o,x:n,y:a,verticalAlign:"middle",textAlign:i,inside:d}})}var r=i(12),s=i(4),l=s.parsePercent;t.exports=function(t,e,i){t.eachSeriesByType("funnel",function(t){var i=t.getData(),r=t.get("sort"),u=n(t,e),c=a(i,r),h=[l(t.get("minSize"),u.width),l(t.get("maxSize"),u.width)],d=i.getDataExtent("value"),f=t.get("min"),p=t.get("max");null==f&&(f=Math.min(d[0],0)),null==p&&(p=d[1]);var g=t.get("funnelAlign"),m=t.get("gap"),v=(u.height-m*(i.count()-1))/i.count(),y=u.y,x=function(t,e){var n,a=i.get("value",t)||0,o=s.linearMap(a,[f,p],h,!0);switch(g){case"left":n=u.x;break;case"center":n=u.x+(u.width-o)/2;break;case"right":n=u.x+u.width-o}return[[n,e],[n+o,e]]};"ascending"===r&&(v=-v,m=-m,y+=u.height,c=c.reverse());for(var _=0;_<c.length;_++){var b=c[_],w=c[_+1],S=x(b,y),M=x(w,y+v);y+=v+m,i.setItemLayout(b,{points:S.concat(M.slice().reverse())})}o(i)})}},function(t,e,i){i(290),i(291)},function(t,e,i){var n=i(14),a=i(17),o=i(1),r=a.extend({type:"series.gauge",getInitialData:function(t,e){var i=new n(["value"],this),a=t.data||[];return o.isArray(a)||(a=[a]),i.initData(a),i},defaultOption:{zlevel:0,z:2,center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,lineStyle:{color:[[.2,"#91c7ae"],[.8,"#63869e"],[1,"#c23531"]],width:30}},splitLine:{show:!0,length:30,lineStyle:{color:"#eee",width:2,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:8,lineStyle:{color:"#eee",width:1,type:"solid"}},axisLabel:{show:!0,distance:5,textStyle:{color:"auto"}},pointer:{show:!0,length:"80%",width:8},itemStyle:{normal:{color:"auto"}},title:{show:!0,offsetCenter:[0,"-40%"],textStyle:{color:"#333",fontSize:15}},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:40,offsetCenter:[0,"40%"],textStyle:{color:"auto",fontSize:30}}}});t.exports=r},function(t,e,i){function n(t,e){var i=t.get("center"),n=e.getWidth(),a=e.getHeight(),o=Math.min(n,a),r=l(i[0],e.getWidth()),s=l(i[1],e.getHeight()),u=l(t.get("radius"),o/2);return{cx:r,cy:s,r:u}}function a(t,e){return e&&("string"==typeof e?t=e.replace("{value}",null!=t?t:""):"function"==typeof e&&(t=e(t))),t}var o=i(292),r=i(3),s=i(4),l=s.parsePercent,u=2*Math.PI,c=i(30).extend({type:"gauge",render:function(t,e,i){this.group.removeAll();var a=t.get("axisLine.lineStyle.color"),o=n(t,i);this._renderMain(t,e,i,a,o)},dispose:function(){},_renderMain:function(t,e,i,n,a){for(var o=this.group,s=t.getModel("axisLine"),l=s.getModel("lineStyle"),c=t.get("clockwise"),h=-t.get("startAngle")/180*Math.PI,d=-t.get("endAngle")/180*Math.PI,f=(d-h)%u,p=h,g=l.get("width"),m=0;m<n.length;m++){var v=Math.min(Math.max(n[m][0],0),1),d=h+f*v,y=new r.Sector({shape:{startAngle:p,endAngle:d,cx:a.cx,cy:a.cy,clockwise:c,r0:a.r-g,r:a.r},silent:!0});y.setStyle({fill:n[m][1]}),y.setStyle(l.getLineStyle(["color","borderWidth","borderColor"])),o.add(y),p=d}var x=function(t){if(t<=0)return n[0][1];for(var e=0;e<n.length;e++)if(n[e][0]>=t&&(0===e?0:n[e-1][0])<t)return n[e][1];return n[e-1][1]};if(!c){var _=h;h=d,d=_}this._renderTicks(t,e,i,x,a,h,d,c),this._renderPointer(t,e,i,x,a,h,d,c),this._renderTitle(t,e,i,x,a),this._renderDetail(t,e,i,x,a)},_renderTicks:function(t,e,i,n,o,u,c,h){for(var d=this.group,f=o.cx,p=o.cy,g=o.r,m=+t.get("min"),v=+t.get("max"),y=t.getModel("splitLine"),x=t.getModel("axisTick"),_=t.getModel("axisLabel"),b=t.get("splitNumber"),w=x.get("splitNumber"),S=l(y.get("length"),g),M=l(x.get("length"),g),I=u,T=(c-u)/b,A=T/w,C=y.getModel("lineStyle").getLineStyle(),L=x.getModel("lineStyle").getLineStyle(),D=_.getModel("textStyle"),P=0;P<=b;P++){var k=Math.cos(I),O=Math.sin(I);if(y.get("show")){var z=new r.Line({shape:{x1:k*g+f,y1:O*g+p,x2:k*(g-S)+f,y2:O*(g-S)+p},style:C,silent:!0});"auto"===C.stroke&&z.setStyle({stroke:n(P/b)}),d.add(z)}if(_.get("show")){var E=a(s.round(P/b*(v-m)+m),_.get("formatter")),R=_.get("distance"),N=new r.Text({style:{text:E,x:k*(g-S-R)+f,y:O*(g-S-R)+p,fill:D.getTextColor(),textFont:D.getFont(),textVerticalAlign:O<-.4?"top":O>.4?"bottom":"middle",textAlign:k<-.4?"left":k>.4?"right":"center"},silent:!0});"auto"===N.style.fill&&N.setStyle({fill:n(P/b)}),d.add(N)}if(x.get("show")&&P!==b){for(var V=0;V<=w;V++){var k=Math.cos(I),O=Math.sin(I),B=new r.Line({shape:{x1:k*g+f,y1:O*g+p,x2:k*(g-M)+f,y2:O*(g-M)+p},silent:!0,style:L});"auto"===L.stroke&&B.setStyle({stroke:n((P+V/w)/b)}),d.add(B),I+=A}I-=A}else I+=T}},_renderPointer:function(t,e,i,n,a,u,c,h){var d=this.group,f=this._data;if(!t.get("pointer.show"))return void(f&&f.eachItemGraphicEl(function(t){d.remove(t)}));var p=[+t.get("min"),+t.get("max")],g=[u,c],m=t.getData();m.diff(f).add(function(e){var i=new o({shape:{angle:u}});r.initProps(i,{shape:{angle:s.linearMap(m.get("value",e),p,g,!0)}},t),d.add(i),m.setItemGraphicEl(e,i)}).update(function(e,i){var n=f.getItemGraphicEl(i);r.updateProps(n,{shape:{angle:s.linearMap(m.get("value",e),p,g,!0)}},t),d.add(n),m.setItemGraphicEl(e,n)}).remove(function(t){var e=f.getItemGraphicEl(t);d.remove(e)}).execute(),m.eachItemGraphicEl(function(t,e){var i=m.getItemModel(e),o=i.getModel("pointer");t.setShape({x:a.cx,y:a.cy,width:l(o.get("width"),a.r),r:l(o.get("length"),a.r)}),t.useStyle(i.getModel("itemStyle.normal").getItemStyle()),"auto"===t.style.fill&&t.setStyle("fill",n(s.linearMap(m.get("value",e),p,[0,1],!0))),r.setHoverStyle(t,i.getModel("itemStyle.emphasis").getItemStyle())}),this._data=m},_renderTitle:function(t,e,i,n,a){var o=t.getModel("title");if(o.get("show")){var u=o.getModel("textStyle"),c=o.get("offsetCenter"),h=a.cx+l(c[0],a.r),d=a.cy+l(c[1],a.r),f=new r.Text({style:{x:h,y:d,text:t.getData().getName(0),fill:u.getTextColor(),textFont:u.getFont(),textAlign:"center",textVerticalAlign:"middle"}});if("auto"===f.style.fill){var p=+t.get("min"),g=+t.get("max"),m=t.getData().get("value",0);f.setStyle("fill",n(s.linearMap(m,[p,g],[0,1],!0)))}this.group.add(f)}},_renderDetail:function(t,e,i,n,o){var u=t.getModel("detail"),c=+t.get("min"),h=+t.get("max");if(u.get("show")){var d=u.getModel("textStyle"),f=u.get("offsetCenter"),p=o.cx+l(f[0],o.r),g=o.cy+l(f[1],o.r),m=l(u.get("width"),o.r),v=l(u.get("height"),o.r),y=t.getData().get("value",0),x=new r.Rect({shape:{x:p-m/2,y:g-v/2,width:m,height:v},style:{text:a(y,u.get("formatter")),fill:u.get("backgroundColor"),textFill:d.getTextColor(),textFont:d.getFont()}});"auto"===x.style.textFill&&x.setStyle("textFill",n(s.linearMap(y,[c,h],[0,1],!0))),x.setStyle(u.getItemStyle(["color"])),this.group.add(x)}}});t.exports=c},function(t,e,i){t.exports=i(8).extend({type:"echartsGaugePointer",shape:{angle:0,width:10,r:10,x:0,y:0},buildPath:function(t,e){var i=Math.cos,n=Math.sin,a=e.r,o=e.width,r=e.angle,s=e.x-i(r)*o*(o>=a/3?1:2),l=e.y-n(r)*o*(o>=a/3?1:2);r=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+i(r)*o,e.y+n(r)*o),t.lineTo(e.x+i(e.angle)*a,e.y+n(e.angle)*a),t.lineTo(e.x-i(r)*o,e.y-n(r)*o),t.lineTo(s,l)}})},function(t,e,i){var n=i(2),a=i(1);i(294),i(295),i(304),n.registerProcessor(i(297)),n.registerVisual(a.curry(i(50),"graph","circle",null)),n.registerVisual(i(298)),n.registerVisual(i(301)),n.registerLayout(i(305)),n.registerLayout(i(299)),n.registerLayout(i(303)),n.registerCoordinateSystem("graphView",{create:i(300)})},function(t,e,i){"use strict";var n=i(14),a=i(1),o=i(5),r=i(10),s=i(7),l=i(247),u=i(2).extendSeriesModel({type:"series.graph",init:function(t){u.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._categoriesData},this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeOption:function(t){u.superApply(this,"mergeOption",arguments),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeDefaultAndTheme:function(t){u.superApply(this,"mergeDefaultAndTheme",arguments),o.defaultEmphasis(t.edgeLabel,o.LABEL_OPTIONS)},getInitialData:function(t,e){function i(t,i){function n(t){return t=this.parsePath(t),t&&"label"===t[0]?s:this.parentModel}t.wrapMethod("getItemModel",function(t){var e=o._categoriesModels,i=t.getShallow("category"),n=e[i];return n&&(n.parentModel=t.parentModel,t.parentModel=n),t});var a=o.getModel("edgeLabel"),s=new r({label:a.option},a.parentModel,e);i.wrapMethod("getItemModel",function(t){return t.customizeGetParent(n),t})}var n=t.edges||t.links||[],a=t.data||t.nodes||[],o=this;if(a&&n)return l(a,n,this,!0,i).data},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},getCategoriesData:function(){return this._categoriesData},formatTooltip:function(t,e,i){if("edge"===i){var n=this.getData(),a=this.getDataParams(t,i),o=n.graph.getEdgeByIndex(t),r=n.getName(o.node1.dataIndex),l=n.getName(o.node2.dataIndex),c=[];return null!=r&&c.push(r),null!=l&&c.push(l),c=s.encodeHTML(c.join(" > ")),a.value&&(c+=" : "+s.encodeHTML(a.value)),c}return u.superApply(this,"formatTooltip",arguments)},_updateCategoriesData:function(){var t=a.map(this.option.categories||[],function(t){return null!=t.value?t:a.extend({value:0},t)}),e=new n(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray(function(t){return e.getItemModel(t,!0)})},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},isAnimationEnabled:function(){return u.superCall(this,"isAnimationEnabled")&&!("force"===this.get("layout")&&this.get("force.layoutAnimation"))},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",legendHoverLink:!0,hoverAnimation:!0,layout:null,focusNodeAdjacency:!1,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{normal:{position:"middle"},emphasis:{}},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{normal:{show:!1,formatter:"{b}"},emphasis:{show:!0}},itemStyle:{normal:{},emphasis:{}},lineStyle:{normal:{color:"#aaa",width:1,curveness:0,opacity:.5},emphasis:{}}}});t.exports=u},function(t,e,i){function n(t,e){return t.getVisual("opacity")||t.getModel().get(e)}var a=i(44),o=i(107),r=i(95),s=i(250),l=i(128),u=i(3),c=i(296),h=i(1),d=["itemStyle","normal","opacity"],f=["lineStyle","normal","opacity"];i(2).extendChartView({type:"graph",init:function(t,e){var i=new a,n=new o,s=this.group;this._controller=new r(e.getZr()),this._controllerHost={target:s},s.add(i.group),s.add(n.group),this._symbolDraw=i,this._lineDraw=n,this._firstRender=!0},render:function(t,e,i){var n=t.coordinateSystem;this._model=t,this._nodeScaleRatio=t.get("nodeScaleRatio");var a=this._symbolDraw,o=this._lineDraw,r=this.group;if("view"===n.type){var s={position:n.position,scale:n.scale};this._firstRender?r.attr(s):u.updateProps(r,s,t)}c(t.getGraph(),this._getNodeGlobalScale(t));var l=t.getData();a.updateData(l);var h=t.getEdgeData();o.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,i),clearTimeout(this._layoutTimeout);var d=t.forceLayout,f=t.get("force.layoutAnimation");d&&this._startForceLayoutIteration(d,f),l.eachItemGraphicEl(function(e,n){var a=l.getItemModel(n);e.off("drag").off("dragend");var o=l.getItemModel(n).get("draggable");o&&e.on("drag",function(){d&&(d.warmUp(),!this._layouting&&this._startForceLayoutIteration(d,f),d.setFixed(n),l.setItemLayout(n,e.position))},this).on("dragend",function(){d&&d.setUnfixed(n)},this),e.setDraggable(o&&d),e.off("mouseover",e.__focusNodeAdjacency),e.off("mouseout",e.__unfocusNodeAdjacency),a.get("focusNodeAdjacency")&&(e.on("mouseover",e.__focusNodeAdjacency=function(){i.dispatchAction({type:"focusNodeAdjacency",seriesId:t.id,dataIndex:e.dataIndex})}),e.on("mouseout",e.__unfocusNodeAdjacency=function(){i.dispatchAction({type:"unfocusNodeAdjacency",seriesId:t.id})}))},this);var p="circular"===t.get("layout")&&t.get("circular.rotateLabel"),g=l.getLayout("cx"),m=l.getLayout("cy");l.eachItemGraphicEl(function(t,e){var i=t.getSymbolPath();if(p){var n=l.getItemLayout(e),a=Math.atan2(n[1]-m,n[0]-g);a<0&&(a=2*Math.PI+a);var o=n[0]<g;o&&(a-=Math.PI);var r=o?"left":"right";i.setStyle({textRotation:a,textPosition:r}),i.hoverStyle&&(i.hoverStyle.textPosition=r)}else i.setStyle({textRotation:0})}),this._firstRender=!1},dispose:function(){this._controller&&this._controller.dispose(),this._controllerHost={}},focusNodeAdjacency:function(t,e,i,a){function o(t,e){var i=n(t,e),a=t.getGraphicEl();null==i&&(i=1),a.traverse(function(t){t.trigger("normal"),"group"!==t.type&&t.setStyle("opacity",.1*i)})}function r(t,e){var i=n(t,e),a=t.getGraphicEl();a.traverse(function(t){t.trigger("emphasis"),"group"!==t.type&&t.setStyle("opacity",i)})}var s=this._model.getData(),l=a.dataIndex,u=s.getItemGraphicEl(l);if(u){var c=s.graph,p=u.dataType;if(null!==l&&"edge"!==p){c.eachNode(function(t){o(t,d)}),c.eachEdge(function(t){o(t,f)});var g=c.getNodeByIndex(l);r(g,d),h.each(g.edges,function(t){t.dataIndex<0||(r(t,f),r(t.node1,d),r(t.node2,d))})}}},unfocusNodeAdjacency:function(t,e,i,a){var o=this._model.getData().graph;o.eachNode(function(t){var e=n(t,d);t.getGraphicEl().traverse(function(t){t.trigger("normal"),"group"!==t.type&&t.setStyle("opacity",e)})}),o.eachEdge(function(t){var e=n(t,f);t.getGraphicEl().traverse(function(t){
+t.trigger("normal"),"group"!==t.type&&t.setStyle("opacity",e)})})},_startForceLayoutIteration:function(t,e){var i=this;!function n(){t.step(function(t){i.updateLayout(i._model),(i._layouting=!t)&&(e?i._layoutTimeout=setTimeout(n,16):n())})}()},_updateController:function(t,e,i){var n=this._controller,a=this._controllerHost,o=this.group;return n.setPointerChecker(function(e,n,a){var r=o.getBoundingRect();return r.applyTransform(o.transform),r.contain(n,a)&&!l.onIrrelevantElement(e,i,t)}),"view"!==t.coordinateSystem.type?void n.disable():(n.enable(t.get("roam")),a.zoomLimit=t.get("scaleLimit"),a.zoom=t.coordinateSystem.getZoom(),void n.off("pan").off("zoom").on("pan",function(e,n){s.updateViewOnPan(a,e,n),i.dispatchAction({seriesId:t.id,type:"graphRoam",dx:e,dy:n})}).on("zoom",function(e,n,o){s.updateViewOnZoom(a,e,n,o),i.dispatchAction({seriesId:t.id,type:"graphRoam",zoom:e,originX:n,originY:o}),this._updateNodeAndLinkScale(),c(t.getGraph(),this._getNodeGlobalScale(t)),this._lineDraw.updateLayout()},this))},_updateNodeAndLinkScale:function(){var t=this._model,e=t.getData(),i=this._getNodeGlobalScale(t),n=[i,i];e.eachItemGraphicEl(function(t,e){t.attr("scale",n)})},_getNodeGlobalScale:function(t){var e=t.coordinateSystem;if("view"!==e.type)return 1;var i=this._nodeScaleRatio,n=e.scale,a=n&&n[0]||1,o=e.getZoom(),r=(o-1)*i+1;return r/a},updateLayout:function(t){c(t.getGraph(),this._getNodeGlobalScale(t)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()}})},function(t,e,i){function n(t,e,i){for(var n,a=t[0],o=t[1],d=t[2],f=1/0,p=i*i,g=.1,m=.1;m<=.9;m+=.1){r[0]=u(a[0],o[0],d[0],m),r[1]=u(a[1],o[1],d[1],m);var v=h(c(r,e)-p);v<f&&(f=v,n=m)}for(var y=0;y<32;y++){var x=n+g;s[0]=u(a[0],o[0],d[0],n),s[1]=u(a[1],o[1],d[1],n),l[0]=u(a[0],o[0],d[0],x),l[1]=u(a[1],o[1],d[1],x);var v=c(s,e)-p;if(h(v)<.01)break;var _=c(l,e)-p;g/=2,v<0?_>=0?n+=g:n-=g:_>=0?n-=g:n+=g}return n}var a=i(20),o=i(6),r=[],s=[],l=[],u=a.quadraticAt,c=o.distSquare,h=Math.abs;t.exports=function(t,e){function i(t){var e=t.getVisual("symbolSize");return e instanceof Array&&(e=(e[0]+e[1])/2),e}var r=[],s=a.quadraticSubdivide,l=[[],[],[]],u=[[],[]],c=[];e/=2,t.eachEdge(function(t,a){var h=t.getLayout(),d=t.getVisual("fromSymbol"),f=t.getVisual("toSymbol");h.__original||(h.__original=[o.clone(h[0]),o.clone(h[1])],h[2]&&h.__original.push(o.clone(h[2])));var p=h.__original;if(null!=h[2]){if(o.copy(l[0],p[0]),o.copy(l[1],p[2]),o.copy(l[2],p[1]),d&&"none"!=d){var g=i(t.node1),m=n(l,p[0],g*e);s(l[0][0],l[1][0],l[2][0],m,r),l[0][0]=r[3],l[1][0]=r[4],s(l[0][1],l[1][1],l[2][1],m,r),l[0][1]=r[3],l[1][1]=r[4]}if(f&&"none"!=f){var g=i(t.node2),m=n(l,p[1],g*e);s(l[0][0],l[1][0],l[2][0],m,r),l[1][0]=r[1],l[2][0]=r[2],s(l[0][1],l[1][1],l[2][1],m,r),l[1][1]=r[1],l[2][1]=r[2]}o.copy(h[0],l[0]),o.copy(h[1],l[2]),o.copy(h[2],l[1])}else{if(o.copy(u[0],p[0]),o.copy(u[1],p[1]),o.sub(c,u[1],u[0]),o.normalize(c,c),d&&"none"!=d){var g=i(t.node1);o.scaleAndAdd(u[0],u[0],c,g*e)}if(f&&"none"!=f){var g=i(t.node2);o.scaleAndAdd(u[1],u[1],c,-g*e)}o.copy(h[0],u[0]),o.copy(h[1],u[1])}})}},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.eachSeriesByType("graph",function(t){var i=t.getCategoriesData(),n=t.getGraph(),a=n.data,o=i.mapArray(i.getName);a.filterSelf(function(t){var i=a.getItemModel(t),n=i.getShallow("category");if(null!=n){"number"==typeof n&&(n=o[n]);for(var r=0;r<e.length;r++)if(!e[r].isSelected(n))return!1}return!0})},this)}},function(t,e){t.exports=function(t){var e={};t.eachSeriesByType("graph",function(t){var i=t.getCategoriesData(),n=t.getData(),a={};i.each(function(n){var o=i.getName(n);a["ec-"+o]=n;var r=i.getItemModel(n),s=r.get("itemStyle.normal.color")||t.getColorFromPalette(o,e);i.setItemVisual(n,"color",s)}),i.count()&&n.each(function(t){var e=n.getItemModel(t),o=e.getShallow("category");null!=o&&("string"==typeof o&&(o=a["ec-"+o]),n.getItemVisual(t,"color",!0)||n.setItemVisual(t,"color",i.getItemVisual(o,"color")))})})}},function(t,e,i){var n=i(242);t.exports=function(t){t.eachSeriesByType("graph",function(t){"circular"===t.get("layout")&&n(t)})}},function(t,e,i){function n(t,e,i){var n=t.getBoxLayoutParams();return n.aspect=i,o.getLayoutRect(n,{width:e.getWidth(),height:e.getHeight()})}var a=i(260),o=i(12),r=i(85);t.exports=function(t,e){var i=[];return t.eachSeriesByType("graph",function(t){var o=t.get("coordinateSystem");if(!o||"view"===o){var s=t.getData(),l=s.mapArray(function(t){var e=s.getItemModel(t);return[+e.get("x"),+e.get("y")]}),u=[],c=[];r.fromPoints(l,u,c),c[0]-u[0]===0&&(c[0]+=1,u[0]-=1),c[1]-u[1]===0&&(c[1]+=1,u[1]-=1);var h=(c[0]-u[0])/(c[1]-u[1]),d=n(t,e,h);isNaN(h)&&(u=[d.x,d.y],c=[d.x+d.width,d.y+d.height]);var f=c[0]-u[0],p=c[1]-u[1],g=d.width,m=d.height,v=t.coordinateSystem=new a;v.zoomLimit=t.get("scaleLimit"),v.setBoundingRect(u[0],u[1],f,p),v.setViewRect(d.x,d.y,g,m),v.setCenter(t.get("center")),v.setZoom(t.get("zoom")),i.push(v)}}),i}},function(t,e){function i(t){return t instanceof Array||(t=[t,t]),t}t.exports=function(t){t.eachSeriesByType("graph",function(t){var e=t.getGraph(),n=t.getEdgeData(),a=i(t.get("edgeSymbol")),o=i(t.get("edgeSymbolSize")),r="lineStyle.normal.color".split("."),s="lineStyle.normal.opacity".split(".");n.setVisual("fromSymbol",a&&a[0]),n.setVisual("toSymbol",a&&a[1]),n.setVisual("fromSymbolSize",o&&o[0]),n.setVisual("toSymbolSize",o&&o[1]),n.setVisual("color",t.get(r)),n.setVisual("opacity",t.get(s)),n.each(function(t){var a=n.getItemModel(t),o=e.getEdgeByIndex(t),l=i(a.getShallow("symbol",!0)),u=i(a.getShallow("symbolSize",!0)),c=a.get(r),h=a.get(s);switch(c){case"source":c=o.node1.getVisual("color");break;case"target":c=o.node2.getVisual("color")}l[0]&&o.setVisual("fromSymbol",l[0]),l[1]&&o.setVisual("toSymbol",l[1]),u[0]&&o.setVisual("fromSymbolSize",u[0]),u[1]&&o.setVisual("toSymbolSize",u[1]),o.setVisual("color",c),o.setVisual("opacity",h)})})}},function(t,e,i){var n=i(6),a=n.scaleAndAdd;t.exports=function(t,e,i){for(var o=i.rect,r=o.width,s=o.height,l=[o.x+r/2,o.y+s/2],u=null==i.gravity?.1:i.gravity,c=0;c<t.length;c++){var h=t[c];h.p||(h.p=n.create(r*(Math.random()-.5)+l[0],s*(Math.random()-.5)+l[1])),h.pp=n.clone(h.p),h.edges=null}var d=.6;return{warmUp:function(){d=.5},setFixed:function(e){t[e].fixed=!0},setUnfixed:function(e){t[e].fixed=!1},step:function(i){for(var o=[],r=t.length,s=0;s<e.length;s++){var c=e[s],h=c.n1,f=c.n2;n.sub(o,f.p,h.p);var p=n.len(o)-c.d,g=f.w/(h.w+f.w);n.normalize(o,o),!h.fixed&&a(h.p,h.p,o,g*p*d),!f.fixed&&a(f.p,f.p,o,-(1-g)*p*d)}for(var s=0;s<r;s++){var m=t[s];m.fixed||(n.sub(o,l,m.p),n.scaleAndAdd(m.p,m.p,o,u*d))}for(var s=0;s<r;s++)for(var h=t[s],v=s+1;v<r;v++){var f=t[v];n.sub(o,f.p,h.p);var p=n.len(o);0===p&&(n.set(o,Math.random()-.5,Math.random()-.5),p=1);var y=(h.rep+f.rep)/p/p;!h.fixed&&a(h.pp,h.pp,o,y),!f.fixed&&a(f.pp,f.pp,o,-y)}for(var x=[],s=0;s<r;s++){var m=t[s];m.fixed||(n.sub(x,m.p,m.pp),n.scaleAndAdd(m.p,m.p,x,d),n.copy(m.pp,m.p))}d=.992*d,i&&i(t,e,d<.01)}}}},function(t,e,i){var n=i(302),a=i(4),o=i(244),r=i(242),s=i(6),l=i(1);t.exports=function(t){t.eachSeriesByType("graph",function(t){var e=t.coordinateSystem;if(!e||"view"===e.type)if("force"===t.get("layout")){var i=t.preservedPoints||{},u=t.getGraph(),c=u.data,h=u.edgeData,d=t.getModel("force"),f=d.get("initLayout");t.preservedPoints?c.each(function(t){var e=c.getId(t);c.setItemLayout(t,i[e]||[NaN,NaN])}):f&&"none"!==f?"circular"===f&&r(t):o(t);var p=c.getDataExtent("value"),g=h.getDataExtent("value"),m=d.get("repulsion"),v=d.get("edgeLength");l.isArray(m)||(m=[m,m]),l.isArray(v)||(v=[v,v]),v=[v[1],v[0]];var y=c.mapArray("value",function(t,e){var i=c.getItemLayout(e),n=a.linearMap(t,p,m);return isNaN(n)&&(n=(m[0]+m[1])/2),{w:n,rep:n,p:!i||isNaN(i[0])||isNaN(i[1])?null:i}}),x=h.mapArray("value",function(t,e){var i=u.getEdgeByIndex(e),n=a.linearMap(t,g,v);return isNaN(n)&&(n=(v[0]+v[1])/2),{n1:y[i.node1.dataIndex],n2:y[i.node2.dataIndex],d:n,curveness:i.getModel().get("lineStyle.normal.curveness")||0}}),e=t.coordinateSystem,_=e.getBoundingRect(),b=n(y,x,{rect:_,gravity:d.get("gravity")}),w=b.step;b.step=function(t){for(var e=0,n=y.length;e<n;e++)y[e].fixed&&s.copy(y[e].p,u.getNodeByIndex(e).getLayout());w(function(e,n,a){for(var o=0,r=e.length;o<r;o++)e[o].fixed||u.getNodeByIndex(o).setLayout(e[o].p),i[c.getId(o)]=e[o].p;for(var o=0,r=n.length;o<r;o++){var l=n[o],h=u.getEdgeByIndex(o),d=l.n1.p,f=l.n2.p,p=h.getLayout();p=p?p.slice():[],p[0]=p[0]||[],p[1]=p[1]||[],s.copy(p[0],d),s.copy(p[1],f),+l.curveness&&(p[2]=[(d[0]+f[0])/2-(d[1]-f[1])*l.curveness,(d[1]+f[1])/2-(f[0]-d[0])*l.curveness]),h.setLayout(p)}t&&t(a)})},t.forceLayout=b,t.preservedPoints=i,b.step()}else t.forceLayout=null})}},function(t,e,i){var n=i(2),a=i(241),o={type:"graphRoam",event:"graphRoam",update:"none"};n.registerAction(o,function(t,e){e.eachComponent({mainType:"series",query:t},function(e){var i=e.coordinateSystem,n=a.updateCenterAndZoom(i,t);e.setCenter&&e.setCenter(n.center),e.setZoom&&e.setZoom(n.zoom)})}),n.registerAction({type:"focusNodeAdjacency",event:"focusNodeAdjacency",update:"series.graph:focusNodeAdjacency"},function(){}),n.registerAction({type:"unfocusNodeAdjacency",event:"unfocusNodeAdjacency",update:"series.graph:unfocusNodeAdjacency"},function(){})},function(t,e,i){var n=i(244),a=i(243);t.exports=function(t,e){t.eachSeriesByType("graph",function(t){var e=t.get("layout"),i=t.coordinateSystem;if(i&&"view"!==i.type){var o=t.getData(),r=i.dimensions;o.each(r,function(){for(var t,e=arguments,n=[],a=0;a<r.length;a++)isNaN(e[a])||(t=!0),n.push(e[a]);var s=e[e.length-1];t?o.setItemLayout(s,i.dataToPoint(n)):o.setItemLayout(s,[NaN,NaN])}),a(o.graph)}else e&&"none"!==e||n(t)})}},function(t,e,i){i(308),i(309)},function(t,e,i){function n(){var t=o.createCanvas();this.canvas=t,this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={}}var a=256,o=i(1);n.prototype={update:function(t,e,i,n,o,r){var s=this._getBrush(),l=this._getGradient(t,o,"inRange"),u=this._getGradient(t,o,"outOfRange"),c=this.pointSize+this.blurSize,h=this.canvas,d=h.getContext("2d"),f=t.length;h.width=e,h.height=i;for(var p=0;p<f;++p){var g=t[p],m=g[0],v=g[1],y=g[2],x=n(y);d.globalAlpha=x,d.drawImage(s,m-c,v-c)}for(var _=d.getImageData(0,0,h.width,h.height),b=_.data,w=0,S=b.length,M=this.minOpacity,I=this.maxOpacity,T=I-M;w<S;){var x=b[w+3]/256,A=4*Math.floor(x*(a-1));if(x>0){var C=r(x)?l:u;x>0&&(x=x*T+M),b[w++]=C[A],b[w++]=C[A+1],b[w++]=C[A+2],b[w++]=C[A+3]*x*256}else w+=4}return d.putImageData(_,0,0),h},_getBrush:function(){var t=this._brushCanvas||(this._brushCanvas=o.createCanvas()),e=this.pointSize+this.blurSize,i=2*e;t.width=i,t.height=i;var n=t.getContext("2d");return n.clearRect(0,0,i,i),n.shadowOffsetX=i,n.shadowBlur=this.blurSize,n.shadowColor="#000",n.beginPath(),n.arc(-e,e,this.pointSize,0,2*Math.PI,!0),n.closePath(),n.fill(),t},_getGradient:function(t,e,i){for(var n=this._gradientPixels,a=n[i]||(n[i]=new Uint8ClampedArray(1024)),o=[0,0,0,0],r=0,s=0;s<256;s++)e[i](s/255,!0,o),a[r++]=o[0],a[r++]=o[1],a[r++]=o[2],a[r++]=o[3];return a}},t.exports=n},function(t,e,i){var n=i(17),a=i(28);t.exports=n.extend({type:"series.heatmap",getInitialData:function(t,e){return a(t.data,this,e)},defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,geoIndex:0,blurSize:30,pointSize:20,maxOpacity:1,minOpacity:0}})},function(t,e,i){function n(t,e,i){var n=t[1]-t[0];e=l.map(e,function(e){return{interval:[(e.interval[0]-t[0])/n,(e.interval[1]-t[0])/n]}});var a=e.length,o=0;return function(t){for(var n=o;n<a;n++){var r=e[n].interval;if(r[0]<=t&&t<=r[1]){o=n;break}}if(n===a)for(var n=o-1;n>=0;n--){var r=e[n].interval;if(r[0]<=t&&t<=r[1]){o=n;break}}return n>=0&&n<a&&i[n]}}function a(t,e){var i=t[1]-t[0];return e=[(e[0]-t[0])/i,(e[1]-t[0])/i],function(t){return t>=e[0]&&t<=e[1]}}function o(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var r=i(3),s=i(307),l=i(1);t.exports=i(2).extendChartView({type:"heatmap",render:function(t,e,i){var n;e.eachComponent("visualMap",function(e){e.eachTargetSeries(function(i){i===t&&(n=e)})}),this.group.removeAll();var a=t.coordinateSystem;"cartesian2d"===a.type||"calendar"===a.type?this._renderOnCartesianAndCalendar(a,t,i):o(a)&&this._renderOnGeo(a,t,n,i)},dispose:function(){},_renderOnCartesianAndCalendar:function(t,e,i){if("cartesian2d"===t.type)var n=t.getAxis("x"),a=t.getAxis("y"),o=n.getBandWidth(),s=a.getBandWidth();var u=this.group,c=e.getData(),h="itemStyle.normal",d="itemStyle.emphasis",f="label.normal",p="label.emphasis",g=e.getModel(h).getItemStyle(["color"]),m=e.getModel(d).getItemStyle(),v=e.getModel("label.normal"),y=e.getModel("label.emphasis"),x=t.type,_="cartesian2d"===x?[e.coordDimToDataDim("x")[0],e.coordDimToDataDim("y")[0],e.coordDimToDataDim("value")[0]]:[e.coordDimToDataDim("time")[0],e.coordDimToDataDim("value")[0]];c.each(function(i){var n;if("cartesian2d"===x){if(isNaN(c.get(_[2],i)))return;var a=t.dataToPoint([c.get(_[0],i),c.get(_[1],i)]);n=new r.Rect({shape:{x:a[0]-o/2,y:a[1]-s/2,width:o,height:s},style:{fill:c.getItemVisual(i,"color"),opacity:c.getItemVisual(i,"opacity")}})}else{if(isNaN(c.get(_[1],i)))return;n=new r.Rect({z2:1,shape:t.dataToRect([c.get(_[0],i)]).contentShape,style:{fill:c.getItemVisual(i,"color"),opacity:c.getItemVisual(i,"opacity")}})}var b=c.getItemModel(i);c.hasItemOption&&(g=b.getModel(h).getItemStyle(["color"]),m=b.getModel(d).getItemStyle(),v=b.getModel(f),y=b.getModel(p));var w=e.getRawValue(i),S="-";w&&null!=w[2]&&(S=w[2]),v.getShallow("show")&&(r.setText(g,v),g.text=e.getFormattedLabel(i,"normal")||S),y.getShallow("show")&&(r.setText(m,y),m.text=e.getFormattedLabel(i,"emphasis")||S),n.setStyle(g),r.setHoverStyle(n,c.hasItemOption?m:l.extend({},m)),u.add(n),c.setItemGraphicEl(i,n)})},_renderOnGeo:function(t,e,i,o){var l=i.targetVisuals.inRange,u=i.targetVisuals.outOfRange,c=e.getData(),h=this._hmLayer||this._hmLayer||new s;h.blurSize=e.get("blurSize"),h.pointSize=e.get("pointSize"),h.minOpacity=e.get("minOpacity"),h.maxOpacity=e.get("maxOpacity");var d=t.getViewRect().clone(),f=t.getRoamTransform().transform;d.applyTransform(f);var p=Math.max(d.x,0),g=Math.max(d.y,0),m=Math.min(d.width+d.x,o.getWidth()),v=Math.min(d.height+d.y,o.getHeight()),y=m-p,x=v-g,_=c.mapArray(["lng","lat","value"],function(e,i,n){var a=t.dataToPoint([e,i]);return a[0]-=p,a[1]-=g,a.push(n),a}),b=i.getExtent(),w="visualMap.continuous"===i.type?a(b,i.option.range):n(b,i.getPieceList(),i.option.selected);h.update(_,y,x,l.color.getNormalizer(),{inRange:l.color.getColorMapper(),outOfRange:u.color.getColorMapper()},w);var S=new r.Image({style:{width:y,height:x,x:p,y:g,image:h.canvas},silent:!0});this.group.add(S)}})},function(t,e,i){function n(t,e,i){r.call(this,t,e,i),this._lastFrame=0,this._lastFramePercent=0}var a=i(246),o=i(1),r=i(245),s=i(6),l=n.prototype;l.createLine=function(t,e,i){return new a(t,e,i)},l.updateAnimationPoints=function(t,e){this._points=e;for(var i=[0],n=0,a=1;a<e.length;a++){var o=e[a-1],r=e[a];n+=s.dist(o,r),i.push(n)}if(0!==n){for(var a=0;a<i.length;a++)i[a]/=n;this._offsets=i,this._length=n}},l.getLineLength=function(t){return this._length},l.updateSymbolPosition=function(t){var e=t.__t,i=this._points,n=this._offsets,a=i.length;if(n){var o,r=this._lastFrame;if(e<this._lastFramePercent){var l=Math.min(r+1,a-1);for(o=l;o>=0&&!(n[o]<=e);o--);o=Math.min(o,a-2)}else{for(var o=r;o<a&&!(n[o]>e);o++);o=Math.min(o-1,a-2)}s.lerp(t.position,i[o],i[o+1],(e-n[o])/(n[o+1]-n[o]));var u=i[o+1][0]-i[o][0],c=i[o+1][1]-i[o][1];t.rotation=-Math.atan2(c,u)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},o.inherits(n,r),t.exports=n},function(t,e,i){function n(t){return r.isArray(t)||(t=[+t,+t]),t}function a(t,e){t.eachChild(function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?e.color:null,fill:"fill"===e.brushType?e.color:null}})})}function o(t,e){h.call(this);var i=new c(t,e),n=new h;this.add(i),this.add(n),n.beforeUpdate=function(){this.attr(i.getScale())},this.updateData(t,e)}var r=i(1),s=i(24),l=i(3),u=i(4),c=i(54),h=l.Group,d=3,f=o.prototype;f.stopEffectAnimation=function(){this.childAt(1).removeAll()},f.startEffectAnimation=function(t){for(var e=t.symbolType,i=t.color,n=this.childAt(1),o=0;o<d;o++){var r=s.createSymbol(e,-1,-1,2,2,i);r.attr({style:{strokeNoScale:!0},z2:99,silent:!0,scale:[.5,.5]});var l=-o/d*t.period+t.effectOffset;r.animate("",!0).when(t.period,{scale:[t.rippleScale/2,t.rippleScale/2]}).delay(l).start(),r.animateStyle(!0).when(t.period,{opacity:0}).delay(l).start(),n.add(r)}a(n,t)},f.updateEffectAnimation=function(t){for(var e=this._effectCfg,i=this.childAt(1),n=["symbolType","period","rippleScale"],o=0;o<n;o++){var r=n[o];if(e[r]!==t[r])return this.stopEffectAnimation(),void this.startEffectAnimation(t)}a(i,t)},f.highlight=function(){this.trigger("emphasis")},f.downplay=function(){this.trigger("normal")},f.updateData=function(t,e){var i=t.hostModel;this.childAt(0).updateData(t,e);var a=this.childAt(1),o=t.getItemModel(e),r=t.getItemVisual(e,"symbol"),s=n(t.getItemVisual(e,"symbolSize")),l=t.getItemVisual(e,"color");a.attr("scale",s),a.traverse(function(t){t.attr({fill:l})});var c=o.getShallow("symbolOffset");if(c){var h=a.position;h[0]=u.parsePercent(c[0],s[0]),h[1]=u.parsePercent(c[1],s[1])}a.rotation=(o.getShallow("symbolRotate")||0)*Math.PI/180||0;var d={};if(d.showEffectOn=i.get("showEffectOn"),d.rippleScale=o.get("rippleEffect.scale"),d.brushType=o.get("rippleEffect.brushType"),d.period=1e3*o.get("rippleEffect.period"),d.effectOffset=e/t.count(),d.z=o.getShallow("z")||0,d.zlevel=o.getShallow("zlevel")||0,d.symbolType=r,d.color=l,this.off("mouseover").off("mouseout").off("emphasis").off("normal"),"render"===d.showEffectOn)this._effectCfg?this.updateEffectAnimation(d):this.startEffectAnimation(d),this._effectCfg=d;else{this._effectCfg=null,this.stopEffectAnimation();var f=this.childAt(0),p=function(){f.trigger("emphasis"),"render"!==d.showEffectOn&&this.startEffectAnimation(d)},g=function(){f.trigger("normal"),"render"!==d.showEffectOn&&this.stopEffectAnimation()};this.on("mouseover",p,this).on("mouseout",g,this).on("emphasis",p,this).on("normal",g,this)}this._effectCfg=d},f.fadeOut=function(t){this.off("mouseover").off("mouseout").off("emphasis").off("normal"),t&&t()},r.inherits(o,h),t.exports=o},function(t,e,i){function n(){this.group=new a.Group,this._lineEl=new s}var a=i(3),o=i(98),r=i(97),s=a.extendShape({shape:{polyline:!1,segs:[]},buildPath:function(t,e){for(var i=e.segs,n=e.polyline,a=0;a<i.length;a++){var o=i[a];if(n){t.moveTo(o[0][0],o[0][1]);for(var r=1;r<o.length;r++)t.lineTo(o[r][0],o[r][1])}else t.moveTo(o[0][0],o[0][1]),o.length>2?t.quadraticCurveTo(o[2][0],o[2][1],o[1][0],o[1][1]):t.lineTo(o[1][0],o[1][1])}},findDataIndex:function(t,e){for(var i=this.shape,n=i.segs,a=i.polyline,s=Math.max(this.style.lineWidth,1),l=0;l<n.length;l++){var u=n[l];if(a){for(var c=1;c<u.length;c++)if(r.containStroke(u[c-1][0],u[c-1][1],u[c][0],u[c][1],s,t,e))return l}else if(u.length>2){if(o.containStroke(u[0][0],u[0][1],u[2][0],u[2][1],u[1][0],u[1][1],s,t,e))return l}else if(r.containStroke(u[0][0],u[0][1],u[1][0],u[1][1],s,t,e))return l}return-1}}),l=n.prototype;l.updateData=function(t){this.group.removeAll();var e=this._lineEl,i=t.hostModel;e.setShape({segs:t.mapArray(t.getItemLayout),polyline:i.get("polyline")}),e.useStyle(i.getModel("lineStyle.normal").getLineStyle());var n=t.getVisual("color");n&&e.setStyle("stroke",n),e.setStyle("fill"),e.seriesIndex=i.seriesIndex,e.on("mousemove",function(t){e.dataIndex=null;var i=e.findDataIndex(t.offsetX,t.offsetY);i>0&&(e.dataIndex=i)}),this.group.add(e)},l.updateLayout=function(t){var e=t.getData();this._lineEl.setShape({segs:e.mapArray(e.getItemLayout)})},l.remove=function(){this.group.removeAll()},t.exports=n},function(t,e,i){function n(t,e,i,n){l.Group.call(this),this.bodyIndex,this.whiskerIndex,this.styleUpdater=i,this._createContent(t,e,n),this.updateData(t,e,n),this._seriesModel}function a(t,e,i){return s.map(t,function(t){return t=t.slice(),t[e]=i.initBaseline,t})}function o(t){var e={};return s.each(t,function(t,i){e["ends"+i]=t}),e}function r(t){this.group=new l.Group,this.styleUpdater=t}var s=i(1),l=i(3),u=i(8),c=u.extend({type:"whiskerInBox",shape:{},buildPath:function(t,e){for(var i in e)if(e.hasOwnProperty(i)&&0===i.indexOf("ends")){var n=e[i];t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1])}}}),h=n.prototype;h._createContent=function(t,e,i){var n=t.getItemLayout(e),r="horizontal"===n.chartLayout?1:0,u=0;this.add(new l.Polygon({shape:{points:i?a(n.bodyEnds,r,n):n.bodyEnds},style:{strokeNoScale:!0},z2:100})),this.bodyIndex=u++;var h=s.map(n.whiskerEnds,function(t){return i?a(t,r,n):t});this.add(new c({shape:o(h),style:{strokeNoScale:!0},z2:100})),this.whiskerIndex=u++},h.updateData=function(t,e,i){var n=this._seriesModel=t.hostModel,a=t.getItemLayout(e),r=l[i?"initProps":"updateProps"];r(this.childAt(this.bodyIndex),{shape:{points:a.bodyEnds}},n,e),r(this.childAt(this.whiskerIndex),{shape:o(a.whiskerEnds)},n,e),this.styleUpdater.call(null,this,t,e)},s.inherits(n,l.Group);var d=r.prototype;d.updateData=function(t){var e=this.group,i=this._data,a=this.styleUpdater;t.diff(i).add(function(i){if(t.hasValue(i)){var o=new n(t,i,a,(!0));t.setItemGraphicEl(i,o),e.add(o)}}).update(function(o,r){var s=i.getItemGraphicEl(r);return t.hasValue(o)?(s?s.updateData(t,o):s=new n(t,o,a),e.add(s),void t.setItemGraphicEl(o,s)):void e.remove(s)}).remove(function(t){var n=i.getItemGraphicEl(t);n&&e.remove(n)}).execute(),this._data=t},d.remove=function(){var t=this.group,e=this._data;this._data=null,e&&e.eachItemGraphicEl(function(e){e&&t.remove(e)})},t.exports=r},function(t,e,i){i(315),i(316);var n=i(2);n.registerLayout(i(317)),n.registerVisual(i(318))},function(t,e,i){"use strict";function n(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=r.map(e,function(t){var e=[t[0].coord,t[1].coord],i={coords:e};return t[0].name&&(i.fromName=t[0].name),t[1].name&&(i.toName=t[1].name),r.mergeAll([i,t[0],t[1]])}))}var a=i(17),o=i(14),r=i(1),s=i(7),l=(i(26),a.extend({type:"series.lines",dependencies:["grid","polar"],visualColorAccessPath:"lineStyle.normal.color",init:function(t){n(t),l.superApply(this,"init",arguments)},mergeOption:function(t){n(t),l.superApply(this,"mergeOption",arguments)},getInitialData:function(t,e){var i=new o(["value"],this);return i.hasItemOption=!1,i.initData(t.data,[],function(t,e,n,a){if(t instanceof Array)return NaN;i.hasItemOption=!0;var o=t.value;return null!=o?o instanceof Array?o[a]:o:void 0}),i},formatTooltip:function(t){var e=this.getData(),i=e.getItemModel(t),n=i.get("name");if(n)return n;var a=i.get("fromName"),o=i.get("toName"),r=[];return null!=a&&r.push(a),null!=o&&r.push(o),s.encodeHTML(r.join(" > "))},defaultOption:{coordinateSystem:"geo",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,label:{normal:{show:!1,position:"end"}},lineStyle:{normal:{opacity:.5}}}}))},function(t,e,i){var n=i(107),a=i(245),o=i(106),r=i(246),s=i(310),l=i(312);i(2).extendChartView({type:"lines",init:function(){},render:function(t,e,i){var u=t.getData(),c=this._lineDraw,h=t.get("effect.show"),d=t.get("polyline"),f=t.get("large")&&u.count()>=t.get("largeThreshold");h===this._hasEffet&&d===this._isPolyline&&f===this._isLarge||(c&&c.remove(),c=this._lineDraw=f?new l:new n(d?h?s:r:h?a:o),this._hasEffet=h,this._isPolyline=d,this._isLarge=f);var p=t.get("zlevel"),g=t.get("effect.trailLength"),m=i.getZr();if(m.painter.getLayer(p).clear(!0),null!=this._lastZlevel&&m.configLayer(this._lastZlevel,{motionBlur:!1}),h&&g){m.configLayer(p,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(g/10+.9,1),0)})}this.group.add(c.group),c.updateData(u),this._lastZlevel=p},updateLayout:function(t,e,i){this._lineDraw.updateLayout(t);var n=i.getZr();n.painter.getLayer(this._lastZlevel).clear(!0)},remove:function(t,e){this._lineDraw&&this._lineDraw.remove(e,!0)},dispose:function(){}})},function(t,e,i){t.exports=function(t){t.eachSeriesByType("lines",function(t){var e=t.coordinateSystem,i=t.getData();i.each(function(n){var a=i.getItemModel(n),o=a.option instanceof Array?a.option:a.get("coords"),r=[];if(t.get("polyline"))for(var s=0;s<o.length;s++)r.push(e.dataToPoint(o[s]));else{r[0]=e.dataToPoint(o[0]),r[1]=e.dataToPoint(o[1]);var l=a.get("lineStyle.normal.curveness");+l&&(r[2]=[(r[0][0]+r[1][0])/2-(r[0][1]-r[1][1])*l,(r[0][1]+r[1][1])/2-(r[1][0]-r[0][0])*l])}i.setItemLayout(n,r)})})}},function(t,e){function i(t){return t instanceof Array||(t=[t,t]),t}t.exports=function(t){t.eachSeriesByType("lines",function(t){var e=t.getData(),n=i(t.get("symbol")),a=i(t.get("symbolSize")),o="lineStyle.normal.opacity".split(".");e.setVisual("fromSymbol",n&&n[0]),e.setVisual("toSymbol",n&&n[1]),e.setVisual("fromSymbolSize",a&&a[0]),e.setVisual("toSymbolSize",a&&a[1]),e.setVisual("opacity",t.get(o)),e.each(function(t){var n=e.getItemModel(t),a=i(n.getShallow("symbol",!0)),r=i(n.getShallow("symbolSize",!0)),s=n.get(o);a[0]&&e.setItemVisual(t,"fromSymbol",a[0]),a[1]&&e.setItemVisual(t,"toSymbol",a[1]),r[0]&&e.setItemVisual(t,"fromSymbolSize",r[0]),r[1]&&e.setItemVisual(t,"toSymbolSize",r[1]),e.setItemVisual(t,"opacity",s)})})}},function(t,e,i){var n=i(2),a=n.PRIORITY;i(320),i(321),i(240),i(186),n.registerLayout(i(324)),n.registerVisual(i(325)),n.registerProcessor(a.PROCESSOR.STATISTIC,i(323)),n.registerPreprocessor(i(322)),i(89)("map",[{type:"mapToggleSelect",event:"mapselectchanged",method:"toggleSelected"},{type:"mapSelect",event:"mapselected",method:"select"},{type:"mapUnSelect",event:"mapunselected",method:"unSelect"}])},function(t,e,i){var n=i(14),a=i(17),o=i(1),r=i(25),s=i(7),l=s.encodeHTML,u=s.addCommas,c=i(78),h=i(186),d=a.extend({type:"series.map",dependencies:["geo"],layoutMode:"box",needsDrawMap:!1,seriesGroup:[],init:function(t){t=this._fillOption(t,this.getMapType()),this.option=t,d.superApply(this,"init",arguments),this.updateSelectedMap(t.data)},getInitialData:function(t){var e=r(["value"],t.data||[]),i=new n(e,this);return i.initData(t.data),i},mergeOption:function(t){t.data&&(t=this._fillOption(t,this.getMapType())),d.superCall(this,"mergeOption",t),this.updateSelectedMap(this.option.data)},getHostGeoModel:function(){var t=this.option.geoIndex;return null!=t?this.dependentModels.geo[t]:null},getMapType:function(){return(this.getHostGeoModel()||this).option.map},_fillOption:function(t,e){return t=o.extend({},t),t.data=h.getFilledRegions(t.data,e),t},getRawValue:function(t){return this.getData().get("value",t)},getRegionModel:function(t){var e=this.getData();return e.getItemModel(e.indexOfName(t))},formatTooltip:function(t){for(var e=this.getData(),i=u(this.getRawValue(t)),n=e.getName(t),a=this.seriesGroup,o=[],r=0;r<a.length;r++){var s=a[r].originalData.indexOfName(n);isNaN(a[r].originalData.get("value",s))||o.push(l(a[r].name))}return o.join(", ")+"<br />"+l(n+" : "+i)},getTooltipPosition:function(t){if(null!=t){var e=this.getData().getName(t),i=this.coordinateSystem,n=i.getRegion(e);return n&&i.dataToPoint(n.center)}},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},defaultOption:{zlevel:0,z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:.75,showLegendSymbol:!0,dataRangeHoverLink:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{normal:{show:!1,textStyle:{color:"#000"}},emphasis:{show:!0,textStyle:{color:"rgb(100,0,0)"}}},itemStyle:{normal:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{areaColor:"rgba(255,215,0,0.8)"}}}});o.mixin(d,c),t.exports=d},function(t,e,i){var n=i(3),a=i(249);i(2).extendChartView({type:"map",render:function(t,e,i,n){if(!n||"mapToggleSelect"!==n.type||n.from!==this.uid){var o=this.group;if(o.removeAll(),!t.getHostGeoModel()){if(n&&"geoRoam"===n.type&&"series"===n.componentType&&n.seriesId===t.id){var r=this._mapDraw;r&&o.add(r.group)}else if(t.needsDrawMap){var r=this._mapDraw||new a(i,(!0));o.add(r.group),r.draw(t,e,i,this,n),this._mapDraw=r}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;t.get("showLegendSymbol")&&e.getComponent("legend")&&this._renderSymbols(t,e,i)}}},remove:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},dispose:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null},_renderSymbols:function(t,e,i){var a=t.originalData,o=this.group;a.each("value",function(e,i){if(!isNaN(e)){var r=a.getItemLayout(i);if(r&&r.point){var s=r.point,l=r.offset,u=new n.Circle({style:{fill:t.getData().getVisual("color")},shape:{cx:s[0]+9*l,cy:s[1],r:3},silent:!0,z2:10});if(!l){var c=t.mainSeries.getData(),h=a.getName(i),d=h,f=c.indexOfName(h),p=a.getItemModel(i),g=p.getModel("label.normal"),m=p.getModel("label.emphasis"),v=g.getModel("textStyle"),y=m.getModel("textStyle"),x=c.getItemGraphicEl(f);u.setStyle({textPosition:"bottom"});var _=function(){u.setStyle({text:m.get("show")?d:"",textFill:y.getTextColor(),textFont:y.getFont()})},b=function(){u.setStyle({text:g.get("show")?d:"",textFill:v.getTextColor(),textFont:v.getFont()})};x.on("mouseover",_).on("mouseout",b).on("emphasis",_).on("normal",b),b()}o.add(u)}}})}})},function(t,e,i){var n=i(1);t.exports=function(t){var e=[];n.each(t.series,function(t){"map"===t.type&&e.push(t)}),n.each(e,function(t){t.map=t.map||t.mapType,n.defaults(t,t.mapLocation)})}},function(t,e,i){function n(t,e){var i={},n=["value"];return a.each(t,function(t){t.each(n,function(e,n){var a="ec-"+t.getName(n);i[a]=i[a]||[],isNaN(e)||i[a].push(e)})}),t[0].map(n,function(n,a){for(var o="ec-"+t[0].getName(a),r=0,s=1/0,l=-(1/0),u=i[o].length,c=0;c<u;c++)s=Math.min(s,i[o][c]),l=Math.max(l,i[o][c]),r+=i[o][c];var h;return h="min"===e?s:"max"===e?l:"average"===e?r/u:r,0===u?NaN:h})}var a=i(1);t.exports=function(t){var e={};t.eachSeriesByType("map",function(t){var i=t.getHostGeoModel(),n=i?"o"+i.id:"i"+t.getMapType();(e[n]=e[n]||[]).push(t)}),a.each(e,function(t,e){for(var i=n(a.map(t,function(t){return t.getData()}),t[0].get("mapValueCalculation")),o=0;o<t.length;o++)t[o].originalData=t[o].getData();for(var o=0;o<t.length;o++)t[o].seriesGroup=t,t[o].needsDrawMap=0===o&&!t[o].getHostGeoModel(),t[o].setData(i.cloneShallow()),t[o].mainSeries=t[0]})}},function(t,e,i){var n=i(1);t.exports=function(t){var e={};t.eachSeriesByType("map",function(i){var a=i.getMapType();if(!i.getHostGeoModel()&&!e[a]){var o={};n.each(i.seriesGroup,function(e){var i=e.coordinateSystem,n=e.originalData;e.get("showLegendSymbol")&&t.getComponent("legend")&&n.each("value",function(t,e){var a=n.getName(e),r=i.getRegion(a);if(r&&!isNaN(t)){var s=o[a]||0,l=i.dataToPoint(r.center);o[a]=s+1,n.setItemLayout(e,{point:l,offset:s})}})});var r=i.getData();r.each(function(t){var e=r.getName(t),i=r.getItemLayout(t)||{};i.showLabel=!o[e],r.setItemLayout(t,i)}),e[a]=!0}})}},function(t,e){t.exports=function(t){t.eachSeriesByType("map",function(t){var e=t.get("color"),i=t.getModel("itemStyle.normal"),n=i.get("areaColor"),a=i.get("color")||e[t.seriesIndex%e.length];t.getData().setVisual({areaColor:n,color:a})})}},function(t,e,i){var n=i(2);i(251),i(327),i(328),n.registerVisual(i(329))},function(t,e,i){function n(t,e,i){var n=t.get("data"),o=a(e);n&&n.length&&s.each(i,function(t){if(t){var e=s.indexOf(n,t[o]);t[o]=e>=0?e:NaN}})}function a(t){return+t.replace("dim","")}function o(t,e){var i=0;s.each(t,function(t){var e=a(t);e>i&&(i=e)});var n=e[0];n&&n.length-1>i&&(i=n.length-1);for(var o=[],r=0;r<=i;r++)o.push("dim"+r);return o}var r=i(14),s=i(1),l=i(17),u=i(25);t.exports=l.extend({type:"series.parallel",dependencies:["parallel"],visualColorAccessPath:"lineStyle.normal.color",getInitialData:function(t,e){var i=e.getComponent("parallel",this.get("parallelIndex")),a=i.parallelAxisIndex,l=t.data,c=i.dimensions,h=o(c,l),d=s.map(h,function(t,i){
+var o=s.indexOf(c,t),r=o>=0&&e.getComponent("parallelAxis",a[o]);return r&&"category"===r.get("type")?(n(r,t,l),{name:t,type:"ordinal"}):o<0&&u.guessOrdinal(l,i)?{name:t,type:"ordinal"}:t}),f=new r(d,this);return f.initData(l),this.option.progressive&&(this.option.animation=!1),f},getRawIndicesByActiveState:function(t){var e=this.coordinateSystem,i=this.getData(),n=[];return e.eachActiveState(i,function(e,a){t===e&&n.push(i.getRawIndex(a))}),n},defaultOption:{zlevel:0,z:2,coordinateSystem:"parallel",parallelIndex:0,label:{normal:{show:!1},emphasis:{show:!1}},inactiveOpacity:.05,activeOpacity:1,lineStyle:{normal:{width:1,opacity:.45,type:"solid"}},progressive:!1,smooth:!1,animationEasing:"linear"}})},function(t,e,i){function n(t,e,i){var n=t.model,a=t.getRect(),o=new l.Rect({shape:{x:a.x,y:a.y,width:a.width,height:a.height}}),r="horizontal"===n.get("layout")?"width":"height";return o.setShape(r,0),l.initProps(o,{shape:{width:a.width,height:a.height}},e,i),o}function a(t,e,i,n){for(var a=[],o=0;o<i.length;o++){var r=i[o],l=t.get(r,e);s(l,n.getAxis(r).type)||a.push(n.dataToPoint(l,r))}return a}function o(t,e,i,n,o){var r=a(t,i,n,o),s=new l.Polyline({shape:{points:r},silent:!0,z2:10});e.add(s),t.setItemGraphicEl(i,s)}function r(t,e){var i=t.hostModel.getModel("lineStyle.normal"),n=i.getLineStyle();t.eachItemGraphicEl(function(a,o){if(t.hasItemOption){var r=t.getItemModel(o),s=r.getModel("lineStyle.normal",i);n=s.getLineStyle(["color","stroke"])}a.useStyle(u.extend(n,{fill:null,stroke:t.getItemVisual(o,"color"),opacity:t.getItemVisual(o,"opacity")})),a.shape.smooth=e})}function s(t,e){return"category"===e?null==t:null==t||isNaN(t)}var l=i(3),u=i(1),c=.3,h=i(30).extend({type:"parallel",init:function(){this._dataGroup=new l.Group,this.group.add(this._dataGroup),this._data},render:function(t,e,i,n){this._renderForNormal(t,n)},dispose:function(){},_renderForNormal:function(t,e){function i(t){o(d,h,t,g,p,null,v)}function s(i,n){var o=f.getItemGraphicEl(n),r=a(d,i,g,p);d.setItemGraphicEl(i,o);var s=e&&e.animation===!1?null:t;l.updateProps(o,{shape:{points:r}},s,i)}function u(t){var e=f.getItemGraphicEl(t);h.remove(e)}var h=this._dataGroup,d=t.getData(),f=this._data,p=t.coordinateSystem,g=p.dimensions,m=t.option,v=m.smooth?c:null;if(d.diff(f).add(i).update(s).remove(u).execute(),r(d,v),!this._data){var y=n(p,t,function(){setTimeout(function(){h.removeClipPath()})});h.setClipPath(y)}this._data=d},remove:function(){this._dataGroup&&this._dataGroup.removeAll(),this._data=null}});t.exports=h},function(t,e){var i=["lineStyle","normal","opacity"];t.exports=function(t){t.eachSeriesByType("parallel",function(e){var n=e.getModel("itemStyle.normal"),a=e.getModel("lineStyle.normal"),o=t.get("color"),r=a.get("color")||n.get("color")||o[e.seriesIndex%o.length],s=e.get("inactiveOpacity"),l=e.get("activeOpacity"),u=e.getModel("lineStyle.normal").getLineStyle(),c=e.coordinateSystem,h=e.getData(),d={normal:u.opacity,active:l,inactive:s};c.eachActiveState(h,function(t,e){var n=h.getItemModel(e),a=d[t];if("normal"===t){var o=n.get(i,!0);null!=o&&(a=o)}h.setItemVisual(e,"opacity",a)}),h.setVisual("color",r)})}},function(t,e,i){var n=i(1);i(57),i(268),i(269);var a=i(82),o=i(2);o.registerLayout(n.curry(a,"pictorialBar")),o.registerVisual(n.curry(i(50),"pictorialBar","roundRect",null)),i(32)},function(t,e,i){var n=i(1),a=i(2);i(374),i(332),i(333),a.registerVisual(n.curry(i(84),"radar")),a.registerVisual(n.curry(i(50),"radar","circle",null)),a.registerLayout(i(335)),a.registerProcessor(n.curry(i(63),"radar")),a.registerPreprocessor(i(334))},function(t,e,i){"use strict";var n=i(17),a=i(14),o=i(25),r=i(1),s=i(7).encodeHTML,l=n.extend({type:"series.radar",dependencies:["radar"],init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()}},getInitialData:function(t,e){var i=t.data||[],n=o([],i,{extraPrefix:"indicator_",extraFromZero:!0}),r=new a(n,this);return r.initData(i),r},formatTooltip:function(t){var e=this.getRawValue(t),i=this.coordinateSystem,n=i.getIndicatorAxes(),a=this.getData().getName(t);return s(""===a?this.name:a)+"<br/>"+r.map(n,function(t,i){return s(t.name+" : "+e[i])}).join("<br />")},defaultOption:{zlevel:0,z:2,coordinateSystem:"radar",legendHoverLink:!0,radarIndex:0,lineStyle:{normal:{width:2,type:"solid"}},label:{normal:{position:"top"}},symbol:"emptyCircle",symbolSize:4}});t.exports=l},function(t,e,i){function n(t){return o.isArray(t)||(t=[+t,+t]),t}var a=i(3),o=i(1),r=i(24);t.exports=i(2).extendChartView({type:"radar",render:function(t,e,i){function s(t,e){var i=t.getItemVisual(e,"symbol")||"circle",a=t.getItemVisual(e,"color");if("none"!==i){var o=r.createSymbol(i,-.5,-.5,1,1,a);return o.attr({style:{strokeNoScale:!0},z2:100,scale:n(t.getItemVisual(e,"symbolSize"))}),o}}function l(e,i,n,o,r,l){n.removeAll();for(var u=0;u<i.length-1;u++){var c=s(o,r);c&&(c.__dimIdx=u,e[u]?(c.attr("position",e[u]),a[l?"initProps":"updateProps"](c,{position:i[u]},t,r)):c.attr("position",i[u]),n.add(c))}}function u(t){return o.map(t,function(t){return[c.cx,c.cy]})}var c=t.coordinateSystem,h=this.group,d=t.getData(),f=this._data;d.diff(f).add(function(e){var i=d.getItemLayout(e);if(i){var n=new a.Polygon,o=new a.Polyline,r={shape:{points:i}};n.shape.points=u(i),o.shape.points=u(i),a.initProps(n,r,t,e),a.initProps(o,r,t,e);var s=new a.Group,c=new a.Group;s.add(o),s.add(n),s.add(c),l(o.shape.points,i,c,d,e,!0),d.setItemGraphicEl(e,s)}}).update(function(e,i){var n=f.getItemGraphicEl(i),o=n.childAt(0),r=n.childAt(1),s=n.childAt(2),u={shape:{points:d.getItemLayout(e)}};u.shape.points&&(l(o.shape.points,u.shape.points,s,d,e,!1),a.updateProps(o,u,t),a.updateProps(r,u,t),d.setItemGraphicEl(e,n))}).remove(function(t){h.remove(f.getItemGraphicEl(t))}).execute(),d.eachItemGraphicEl(function(e,i){function n(){u.attr("ignore",v)}function r(){u.attr("ignore",m)}var s=d.getItemModel(i),l=e.childAt(0),u=e.childAt(1),c=e.childAt(2),f=d.getItemVisual(i,"color");h.add(e),l.useStyle(o.defaults(s.getModel("lineStyle.normal").getLineStyle(),{fill:"none",stroke:f})),l.hoverStyle=s.getModel("lineStyle.emphasis").getLineStyle();var p=s.getModel("areaStyle.normal"),g=s.getModel("areaStyle.emphasis"),m=p.isEmpty()&&p.parentModel.isEmpty(),v=g.isEmpty()&&g.parentModel.isEmpty();v=v&&m,u.ignore=m,u.useStyle(o.defaults(p.getAreaStyle(),{fill:f,opacity:.7})),u.hoverStyle=g.getAreaStyle();var y=s.getModel("itemStyle.normal").getItemStyle(["color"]),x=s.getModel("itemStyle.emphasis").getItemStyle(),_=s.getModel("label.normal"),b=s.getModel("label.emphasis");c.eachChild(function(e){e.setStyle(y),e.hoverStyle=o.clone(x);var n=d.get(d.dimensions[e.__dimIdx],i);a.setText(e.style,_,f),e.setStyle({text:_.get("show")?o.retrieve(t.getFormattedLabel(i,"normal",null,e.__dimIdx),n):""}),a.setText(e.hoverStyle,b,f),e.hoverStyle.text=b.get("show")?o.retrieve(t.getFormattedLabel(i,"emphasis",null,e.__dimIdx),n):""}),e.off("mouseover").off("mouseout").off("normal").off("emphasis"),e.on("emphasis",n).on("mouseover",n).on("normal",r).on("mouseout",r),a.setHoverStyle(e)}),this._data=d},remove:function(){this.group.removeAll(),this._data=null},dispose:function(){}})},function(t,e,i){var n=i(1);t.exports=function(t){var e=t.polar;if(e){n.isArray(e)||(e=[e]);var i=[];n.each(e,function(e,a){e.indicator?(e.type&&!e.shape&&(e.shape=e.type),t.radar=t.radar||[],n.isArray(t.radar)||(t.radar=[t.radar]),t.radar.push(e)):i.push(e)}),t.polar=i}n.each(t.series,function(t){"radar"===t.type&&t.polarIndex&&(t.radarIndex=t.polarIndex)})}},function(t,e){t.exports=function(t){t.eachSeriesByType("radar",function(t){function e(t,e){n[e]=n[e]||[],n[e][o]=a.dataToPoint(t,o)}var i=t.getData(),n=[],a=t.coordinateSystem;if(a){for(var o=0;o<a.getIndicatorAxes().length;o++){var r=i.dimensions[o];i.each(r,e)}i.each(function(t){n[t][0]&&n[t].push(n[t][0].slice()),i.setItemLayout(t,n[t])})}})}},function(t,e,i){var n=i(2);i(337),i(338),n.registerLayout(i(339)),n.registerVisual(i(340))},function(t,e,i){var n=i(17),a=i(247),o=i(7).encodeHTML,r=n.extend({type:"series.sankey",layoutInfo:null,getInitialData:function(t){var e=t.edges||t.links,i=t.data||t.nodes;if(i&&e){var n=a(i,e,this,!0);return n.data}},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},formatTooltip:function(t,e,i){if("edge"===i){var n=this.getDataParams(t,i),a=n.data,s=a.source+" -- "+a.target;return n.value&&(s+=" : "+n.value),o(s)}return r.superCall(this,"formatTooltip",t,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",layout:null,left:"5%",top:"5%",right:"20%",bottom:"5%",nodeWidth:20,nodeGap:8,layoutIterations:32,label:{normal:{show:!0,position:"right",textStyle:{color:"#000",fontSize:12}},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:1,borderColor:"#333"}},lineStyle:{normal:{color:"#314656",opacity:.2,curveness:.5},emphasis:{opacity:.6}},animationEasing:"linear",animationDuration:1e3}});t.exports=r},function(t,e,i){function n(t,e,i){var n=new a.Rect({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return a.initProps(n,{shape:{width:t.width+20,height:t.height+20}},e,i),n}var a=i(3),o=i(1),r=a.extendShape({shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,cpx2:0,cpy2:0,extent:0},buildPath:function(t,e){var i=e.extent/2;t.moveTo(e.x1,e.y1-i),t.bezierCurveTo(e.cpx1,e.cpy1-i,e.cpx2,e.cpy2-i,e.x2,e.y2-i),t.lineTo(e.x2,e.y2+i),t.bezierCurveTo(e.cpx2,e.cpy2+i,e.cpx1,e.cpy1+i,e.x1,e.y1+i),t.closePath()}});t.exports=i(2).extendChartView({type:"sankey",_model:null,render:function(t,e,i){var s=t.getGraph(),l=this.group,u=t.layoutInfo,c=t.getData(),h=t.getData("edge");this._model=t,l.removeAll(),l.position=[u.x,u.y],s.eachEdge(function(e){var i=new r;i.dataIndex=e.dataIndex,i.seriesIndex=t.seriesIndex,i.dataType="edge";var n=e.getModel("lineStyle.normal"),o=n.get("curveness"),s=e.node1.getLayout(),u=e.node2.getLayout(),c=e.getLayout();i.shape.extent=Math.max(1,c.dy);var d=s.x+s.dx,f=s.y+c.sy+c.dy/2,p=u.x,g=u.y+c.ty+c.dy/2,m=d*(1-o)+p*o,v=f,y=d*o+p*(1-o),x=g;switch(i.setShape({x1:d,y1:f,x2:p,y2:g,cpx1:m,cpy1:v,cpx2:y,cpy2:x}),i.setStyle(n.getItemStyle()),i.style.fill){case"source":i.style.fill=e.node1.getVisual("color");break;case"target":i.style.fill=e.node2.getVisual("color")}a.setHoverStyle(i,e.getModel("lineStyle.emphasis").getItemStyle()),l.add(i),h.setItemGraphicEl(e.dataIndex,i)}),s.eachNode(function(e){var i=e.getLayout(),n=e.getModel(),r=n.getModel("label.normal"),s=r.getModel("textStyle"),u=n.getModel("label.emphasis"),h=u.getModel("textStyle"),d=new a.Rect({shape:{x:i.x,y:i.y,width:e.getLayout().dx,height:e.getLayout().dy},style:{text:r.get("show")?t.getFormattedLabel(e.dataIndex,"normal")||e.id:"",textFont:s.getFont(),textFill:s.getTextColor(),textPosition:r.get("position")}});d.setStyle(o.defaults({fill:e.getVisual("color")},n.getModel("itemStyle.normal").getItemStyle())),a.setHoverStyle(d,o.extend(e.getModel("itemStyle.emphasis"),{text:u.get("show")?t.getFormattedLabel(e.dataIndex,"emphasis")||e.id:"",textFont:h.getFont(),textFill:h.getTextColor(),textPosition:u.get("position")})),l.add(d),c.setItemGraphicEl(e.dataIndex,d),d.dataType="node"}),!this._data&&t.get("animation")&&l.setClipPath(n(l.getBoundingRect(),t,function(){l.removeClipPath()})),this._data=t.getData()},dispose:function(){}})},function(t,e,i){function n(t,e){return M.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function a(t,e,i,n,a,o,s){r(t,i,a),u(t,e,o,n,s),m(t)}function o(t){T.each(t,function(t){var e=x(t.outEdges,S),i=x(t.inEdges,S),n=Math.max(e,i);t.setLayout({value:n},!0)})}function r(t,e,i){for(var n=t,a=null,o=0,r=0;n.length;){a=[];for(var u=0,c=n.length;u<c;u++){var h=n[u];h.setLayout({x:o},!0),h.setLayout({dx:e},!0);for(var d=0,f=h.outEdges.length;d<f;d++)a.push(h.outEdges[d].node2)}n=a,++o}s(t,o),r=(i-e)/(o-1),l(t,r)}function s(t,e){T.each(t,function(t){t.outEdges.length||t.setLayout({x:e-1},!0)})}function l(t,e){T.each(t,function(t){var i=t.getLayout().x*e;t.setLayout({x:i},!0)})}function u(t,e,i,n,a){var o=I().key(function(t){return t.getLayout().x}).sortKeys(w).entries(t).map(function(t){return t.values});c(t,o,e,i,n),h(o,n,i);for(var r=1;a>0;a--)r*=.99,d(o,r),h(o,n,i),p(o,r),h(o,n,i)}function c(t,e,i,n,a){var o=[];T.each(e,function(t){var e=t.length,i=0;T.each(t,function(t){i+=t.getLayout().value});var r=(n-(e-1)*a)/i;o.push(r)}),o.sort(function(t,e){return t-e});var r=o[0];T.each(e,function(t){T.each(t,function(t,e){t.setLayout({y:e},!0);var i=t.getLayout().value*r;t.setLayout({dy:i},!0)})}),T.each(i,function(t){var e=+t.getValue()*r;t.setLayout({dy:e},!0)})}function h(t,e,i){T.each(t,function(t){var n,a,o,r=0,s=t.length;for(t.sort(b),o=0;o<s;o++){if(n=t[o],a=r-n.getLayout().y,a>0){var l=n.getLayout().y+a;n.setLayout({y:l},!0)}r=n.getLayout().y+n.getLayout().dy+e}if(a=r-e-i,a>0){var l=n.getLayout().y-a;for(n.setLayout({y:l},!0),r=n.getLayout().y,o=s-2;o>=0;--o)n=t[o],a=n.getLayout().y+n.getLayout().dy+e-r,a>0&&(l=n.getLayout().y-a,n.setLayout({y:l},!0)),r=n.getLayout().y}})}function d(t,e){T.each(t.slice().reverse(),function(t){T.each(t,function(t){if(t.outEdges.length){var i=x(t.outEdges,f)/x(t.outEdges,S),n=t.getLayout().y+(i-_(t))*e;t.setLayout({y:n},!0)}})})}function f(t){return _(t.node2)*t.getValue()}function p(t,e){T.each(t,function(t){T.each(t,function(t){if(t.inEdges.length){var i=x(t.inEdges,g)/x(t.inEdges,S),n=t.getLayout().y+(i-_(t))*e;t.setLayout({y:n},!0)}})})}function g(t){return _(t.node1)*t.getValue()}function m(t){T.each(t,function(t){t.outEdges.sort(v),t.inEdges.sort(y)}),T.each(t,function(t){var e=0,i=0;T.each(t.outEdges,function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy}),T.each(t.inEdges,function(t){t.setLayout({ty:i},!0),i+=t.getLayout().dy})})}function v(t,e){return t.node2.getLayout().y-e.node2.getLayout().y}function y(t,e){return t.node1.getLayout().y-e.node1.getLayout().y}function x(t,e){for(var i=0,n=t.length,a=-1;++a<n;){var o=+e.call(t,t[a],a);isNaN(o)||(i+=o)}return i}function _(t){return t.getLayout().y+t.getLayout().dy/2}function b(t,e){return t.getLayout().y-e.getLayout().y}function w(t,e){return t<e?-1:t>e?1:t===e?0:NaN}function S(t){return t.getValue()}var M=i(12),I=i(265),T=i(1);t.exports=function(t,e,i){t.eachSeriesByType("sankey",function(t){var i=t.get("nodeWidth"),r=t.get("nodeGap"),s=n(t,e);t.layoutInfo=s;var l=s.width,u=s.height,c=t.getGraph(),h=c.nodes,d=c.edges;o(h);var f=T.filter(h,function(t){return 0===t.getLayout().value}),p=0!==f.length?0:t.get("layoutIterations");a(h,d,i,r,l,u,p)})}},function(t,e,i){var n=i(83),a=i(1);t.exports=function(t,e){t.eachSeriesByType("sankey",function(t){var e=t.getGraph(),i=e.nodes;i.sort(function(t,e){return t.getLayout().value-e.getLayout().value});var o=i[0].getLayout().value,r=i[i.length-1].getLayout().value;a.each(i,function(e){var i=new n({type:"color",mappingMethod:"linear",dataExtent:[o,r],visual:t.get("color")}),a=i.mapValueToVisual(e.getLayout().value);e.setVisual("color",a);var s=e.getModel(),l=s.get("itemStyle.normal.color");null!=l&&e.setVisual("color",l)})})}},function(t,e,i){var n=i(2),a=i(1);i(252),i(342),i(343),n.registerLayout(i(344)),n.registerVisual(i(345)),n.registerProcessor(a.curry(i(63),"themeRiver"))},function(t,e,i){"use strict";var n=i(25),a=i(17),o=i(14),r=i(1),s=i(7),l=s.encodeHTML,u=i(265),c=2,h=a.extend({type:"series.themeRiver",dependencies:["singleAxis"],nameMap:null,init:function(t){h.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()}},fixData:function(t){for(var e=t.length,i=u().key(function(t){return t[2]}).entries(t),n=r.map(i,function(t){return{name:t.key,dataList:t.values}}),a=n.length,o=-1,s=-1,l=0;l<a;++l){var c=n[l].dataList.length;c>o&&(o=c,s=l)}for(var h=0;h<a;++h)if(h!==s)for(var d=n[h].name,f=0;f<o;++f){for(var p=n[s].dataList[f][0],g=n[h].dataList.length,m=-1,v=0;v<g;++v){var y=n[h].dataList[v][0];if(y===p){m=v;break}}m===-1&&(t[e]=[],t[e][0]=p,t[e][1]=0,t[e][2]=d,e++)}return t},getInitialData:function(t,e){var i=[],a=e.queryComponents({mainType:"singleAxis",index:this.get("singleAxisIndex"),id:this.get("singleAxisId")})[0],s=a.get("type");i=[{name:"time",type:"category"===s?"ordinal":"time"===s?"time":"float"},{name:"value",type:"float"},{name:"name",type:"ordinal"}];for(var l=r.filter(t.data,function(t){return void 0!==t[2]}),u=this.fixData(l||[]),h=[],d=this.nameMap=r.createHashMap(),f=0,p=0;p<u.length;++p)h.push(u[p][c]),d.get(u[p][c])||(d.set(u[p][c],f),f++);i=n(i,u);var g=new o(i,this);return g.initData(u,h),g},coordDimToDataDim:function(t){return["time"]},getLayerSeries:function(){function t(t,i){return e.get("time",t)-e.get("time",i)}for(var e=this.getData(),i=e.count(),n=[],a=0;a<i;++a)n[a]=a;for(var o=u().key(function(t){return e.get("name",t)}).entries(n),s=r.map(o,function(t){return{name:t.key,indices:t.values}}),l=0;l<s.length;++l)s[l].indices.sort(t);return s},getAxisTooltipData:function(t,e,i){r.isArray(t)||(t=t?[t]:[]);for(var n,a=this.getData(),o=this.getLayerSeries(),s=[],l=o.length,u=0;u<l;++u){for(var c=Number.MAX_VALUE,h=-1,d=o[u].indices.length,f=0;f<d;++f){var p=a.get(t[0],o[u].indices[f]),g=Math.abs(p-e);g<=c&&(n=p,c=g,h=o[u].indices[f])}s.push(h)}return{dataIndices:s,nestestValue:n}},formatTooltip:function(t){var e=this.getData(),i=e.get("name",t),n=e.get("value",t);return(isNaN(n)||null==n)&&(n="-"),l(i+" : "+n)},defaultOption:{zlevel:0,z:2,coordinateSystem:"singleAxis",boundaryGap:["10%","10%"],singleAxisIndex:0,animationEasing:"linear",label:{normal:{margin:4,textAlign:"right",show:!0,position:"left",textStyle:{color:"#000",fontSize:11}},emphasis:{show:!0}}}});t.exports=h},function(t,e,i){(function(e){function n(t,e,i){var n=new o.Rect({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return o.initProps(n,{shape:{width:t.width+20,height:t.height+20}},e,i),n}var a=i(93),o=i(3),r=i(1),s=i(48);t.exports=i(2).extendChartView({type:"themeRiver",init:function(){this._layers=[]},render:function(t,e,i){function l(t){return t.name}function u(e,i,s){var l=this._layers;if("remove"===e)return void d.remove(l[i]);for(var u,p=[],g=[],m=f[i].indices,v=0;v<m.length;v++){var x=c.getItemLayout(m[v]),_=x.x,b=x.y0,w=x.y;p.push([_,b]),g.push([_,b+w]),u=h.getItemVisual(m[v],"color")}var S,M,I=c.getItemLayout(m[0]),T=c.getItemModel(m[v-1]),A=T.getModel("label.normal"),C=A.get("margin");if("add"===e){var L=y[i]=new o.Group;S=new a.Polygon({shape:{points:p,stackedOnPoints:g,smooth:.4,stackedOnSmooth:.4,smoothConstraint:!1},z2:0}),M=new o.Text({style:{x:I.x-C,y:I.y0+I.y/2}}),L.add(S),L.add(M),d.add(L),S.setClipPath(n(S.getBoundingRect(),t,function(){S.removeClipPath()}))}else{var L=l[s];S=L.childAt(0),M=L.childAt(1),d.add(L),y[i]=L,o.updateProps(S,{shape:{points:p,stackedOnPoints:g}},t),o.updateProps(M,{style:{x:I.x-C,y:I.y0+I.y/2}},t)}var D=T.getModel("itemStyle.emphasis"),P=T.getModel("itemStyle.normal"),k=A.getModel("textStyle");M.setStyle({text:A.get("show")?t.getFormattedLabel(m[v-1],"normal")||c.getName(m[v-1]):"",textFont:k.getFont(),textAlign:A.get("textAlign"),textVerticalAlign:"middle"}),S.setStyle(r.extend({fill:u},P.getItemStyle(["color"]))),o.setHoverStyle(S,D.getItemStyle())}var c=t.getData(),h=t.getRawData();if(c.count()){var d=this.group,f=t.getLayerSeries(),p=c.getLayout("layoutInfo"),g=p.rect,m=p.boundaryGap;d.attr("position",[0,g.y+m[0]]);var v=new s(this._layersSeries||[],f,l,l),y={};v.add(r.bind(r.curry(u,"add"),this)).update(r.bind(r.curry(u,"update"),this)).remove(r.bind(r.curry(u,"remove"),this)).execute(),this._layersSeries=f,this._layers=y}},dispose:function(){}})}).call(e,i(188))},function(t,e,i){function n(t,e,i){if(t.count())for(var n,r=e.coordinateSystem,s=e.getLayerSeries(),l=o.map(s,function(e){return o.map(e.indices,function(e){var i=r.dataToPoint(t.get("time",e));return i[1]=t.get("value",e),i})}),u=a(l),c=u.y0,h=i/u.max,d=s.length,f=s[0].indices.length,p=0;p<f;++p){n=c[p]*h,t.setItemLayout(s[0].indices[p],{layerIndex:0,x:l[0][p][0],y0:n,y:l[0][p][1]*h});for(var g=1;g<d;++g)n+=l[g-1][p][1]*h,t.setItemLayout(s[g].indices[p],{layerIndex:g,x:l[g][p][0],y0:n,y:l[g][p][1]*h})}}function a(t){for(var e,i=t.length,n=t[0].length,a=[],o=[],r=0,s={},l=0;l<n;++l){for(var u=0,e=0;u<i;++u)e+=t[u][l][1];e>r&&(r=e),a.push(e)}for(var c=0;c<n;++c)o[c]=(r-a[c])/2;r=0;for(var h=0;h<n;++h){var d=a[h]+o[h];d>r&&(r=d)}return s.y0=o,s.max=r,s}var o=i(1),r=i(4);t.exports=function(t,e){t.eachSeriesByType("themeRiver",function(t){var e=t.getData(),i=t.coordinateSystem,a={},o=i.getRect();a.rect=o;var s=t.get("boundaryGap"),l=i.getAxis();if(a.boundaryGap=s,"horizontal"===l.orient){s[0]=r.parsePercent(s[0],o.height),s[1]=r.parsePercent(s[1],o.height);var u=o.height-s[0]-s[1];n(e,t,u)}else{s[0]=r.parsePercent(s[0],o.width),s[1]=r.parsePercent(s[1],o.width);var c=o.width-s[0]-s[1];n(e,t,c)}e.setLayout("layoutInfo",a)})}},function(t,e){t.exports=function(t){t.eachSeriesByType("themeRiver",function(t){var e=t.getData(),i=t.getRawData(),n=t.get("color");e.each(function(a){var o=e.getName(a),r=n[(t.nameMap.get(o)-1)%n.length];i.setItemVisual(a,"color",r)})})}},function(t,e,i){var n=i(2);i(348),i(349),i(350),n.registerVisual(i(352)),n.registerLayout(i(351))},function(t,e,i){function n(t){this.group=new r.Group,t.add(this.group)}function a(t,e,i,n,a,o){var r=[[a?t:t-d,e],[t+i,e],[t+i,e+n],[a?t:t-d,e+n]];return!o&&r.splice(2,0,[t+i+d,e+n/2]),!a&&r.push([t,e+n/2]),r}function o(t,e,i){t.eventData={componentType:"series",componentSubType:"treemap",seriesIndex:e.componentIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:i&&i.dataIndex,name:i&&i.name},treePathInfo:i&&u.wrapTreePathInfo(i,e)}}var r=i(3),s=i(12),l=i(1),u=i(94),c=8,h=8,d=5;n.prototype={constructor:n,render:function(t,e,i,n){var a=t.getModel("breadcrumb"),o=this.group;if(o.removeAll(),a.get("show")&&i){var r=a.getModel("itemStyle.normal"),l=r.getModel("textStyle"),u={pos:{left:a.get("left"),right:a.get("right"),top:a.get("top"),bottom:a.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:a.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(i,u,l),this._renderContent(t,u,r,l,n),s.positionElement(o,u.pos,u.box)}},_prepare:function(t,e,i){for(var n=t;n;n=n.parentNode){var a=n.getModel().get("name"),o=i.getTextRect(a),r=Math.max(o.width+2*c,e.emptyItemWidth);e.totalWidth+=r+h,e.renderList.push({node:n,text:a,width:r})}},_renderContent:function(t,e,i,n,u){for(var c=0,d=e.emptyItemWidth,f=t.get("breadcrumb.height"),p=s.getAvailableSize(e.pos,e.box),g=e.totalWidth,m=e.renderList,v=m.length-1;v>=0;v--){var y=m[v],x=y.node,_=y.width,b=y.text;g>p.width&&(g-=_-d,_=d,b="");var w=new r.Polygon({shape:{points:a(c,0,_,f,v===m.length-1,0===v)},style:l.defaults(i.getItemStyle(),{lineJoin:"bevel",text:b,textFill:n.getTextColor(),textFont:n.getFont()}),z:10,onclick:l.curry(u,x)});this.group.add(w),o(w,t,x),c+=_+h}},remove:function(){this.group.removeAll()}},t.exports=n},function(t,e,i){function n(t){var e=0;s.each(t.children,function(t){n(t);var i=t.value;s.isArray(i)&&(i=i[0]),e+=i});var i=t.value;s.isArray(i)&&(i=i[0]),(null==i||isNaN(i))&&(i=e),i<0&&(i=0),s.isArray(t.value)?t.value[0]=i:t.value=i}function a(t,e){var i=e.get("color");if(i){t=t||[];var n;if(s.each(t,function(t){var e=new l(t),i=e.get("color");(e.get("itemStyle.normal.color")||i&&"none"!==i)&&(n=!0)}),!n){var a=t[0]||(t[0]={});a.color=i.slice()}return t}}var o=i(17),r=i(424),s=i(1),l=i(10),u=i(7),c=i(94),h=u.encodeHTML,d=u.addCommas;t.exports=o.extend({type:"series.treemap",layoutMode:"box",dependencies:["grid","polar"],_viewRoot:null,defaultOption:{progressive:0,hoverLayerThreshold:1/0,left:"center",top:"middle",right:null,bottom:null,width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{normal:{color:"rgba(0,0,0,0.7)",borderColor:"rgba(255,255,255,0.7)",borderWidth:1,shadowColor:"rgba(150,150,150,1)",shadowBlur:3,shadowOffsetX:0,shadowOffsetY:0,textStyle:{color:"#fff"}},emphasis:{textStyle:{}}}},label:{normal:{show:!0,position:"inside",textStyle:{color:"#fff",ellipsis:!0}}},itemStyle:{normal:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},getInitialData:function(t,e){var i=t.name;null==i&&(i=t.name);var o={name:i,children:t.data};n(o);var s=t.levels||[];return s=t.levels=a(s,e),r.createTree(o,this,s).data},optionUpdated:function(){this.resetViewRoot()},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=d(s.isArray(i)?i[0]:i),a=e.getName(t);return h(a+": "+n)},getDataParams:function(t){var e=o.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(t);return e.treePathInfo=c.wrapTreePathInfo(i,this),e},setLayoutInfo:function(t){this.layoutInfo=this.layoutInfo||{},s.extend(this.layoutInfo,t)},mapIdToIndex:function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=s.createHashMap(),this._idIndexMapCount=0);var i=e.get(t);return null==i&&e.set(t,i=this._idIndexMapCount++),i},getViewRoot:function(){return this._viewRoot},resetViewRoot:function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)}})},function(t,e,i){function n(){return{nodeGroup:[],background:[],content:[]}}function a(t,e,i,n,a,l,u,c,h,d){function f(e){E.dataIndex=u.dataIndex,E.seriesIndex=t.seriesIndex;var i=T.borderWidth,n=Math.max(A-2*i,0),a=Math.max(C-2*i,0);E.culling=!0,E.setShape({x:i,y:i,width:n,height:a});var o=u.getVisual("color",!0);p(E,function(){var t={fill:o},e=u.getModel("itemStyle.emphasis").getItemStyle();g(t,e,o,n,a),E.setStyle(t),s.setHoverStyle(E,e)}),e.add(E)}function p(t,e){L?!t.invisible&&l.push(t):(e(),t.__tmWillVisible||(t.invisible=!1))}function g(e,i,n,a,o){var r=u.getModel(),s=r.get("name");if(T.isLeafRoot){var l=t.get("drillDownIcon",!0);s=l?l+" "+s:s}y(s,e,r,_,n,a,o),y(s,i,r,b,n,a,o)}function y(t,e,i,n,a,o,r){var l=i.getModel(n),u=l.getModel("textStyle");s.setText(e,l,a),e.textAlign=u.get("align"),e.textVerticalAlign=u.get("baseline");var c=u.getTextRect(t);!l.getShallow("show")||c.height>r?e.text="":c.width>o?e.text=u.get("ellipsis")?u.truncateText(t,o,null,{minChar:2}):"":e.text=t}function x(t,n,r,s){var l=null!=P&&i[t][P],u=a[t];return l?(i[t][P]=null,w(u,l,t)):L||(l=new n({z:o(r,s)}),l.__tmDepth=r,l.__tmStorageName=t,I(u,l,t)),e[t][D]=l}function w(t,e,i){var n=t[D]={};n.old="nodeGroup"===i?e.position.slice():r.extend({},e.shape)}function I(t,e,i){var o=t[D]={},r=u.parentNode;if(r&&(!n||"drillDown"===n.direction)){var s=0,l=0,c=a.background[r.getRawIndex()];!n&&c&&c.old&&(s=c.old.width,l=c.old.height),o.old="nodeGroup"===i?[0,l]:{x:s,y:l,width:0,height:0}}o.fadein="nodeGroup"!==i}if(u){var T=u.getLayout();if(T&&T.isInView){var A=T.width,C=T.height,L=T.invisible,D=u.getRawIndex(),P=c&&c.getRawIndex(),k=x("nodeGroup",m);if(k){if(h.add(k),k.attr("position",[T.x||0,T.y||0]),k.__tmNodeWidth=A,k.__tmNodeHeight=C,T.isAboveViewRoot)return k;var O=x("background",v,d,S);O&&(O.setShape({x:0,y:0,width:A,height:C}),p(O,function(){O.setStyle("fill",u.getVisual("borderColor",!0))}),k.add(O));var z=u.viewChildren;if(!z||!z.length){var E=x("content",v,d,M);E&&f(k)}return k}}}}function o(t,e){var i=t*w+e;return(i-1)/i}var r=i(1),s=i(3),l=i(48),u=i(94),c=i(347),h=i(95),d=i(11),f=i(19),p=i(426),g=r.bind,m=s.Group,v=s.Rect,y=r.each,x=3,_=["label","normal"],b=["label","emphasis"],w=10,S=1,M=2;t.exports=i(2).extendChartView({type:"treemap",init:function(t,e){this._containerGroup,this._storage=n(),this._oldTree,this._breadcrumb,this._controller,this._state="ready",this._mayClick},render:function(t,e,i,n){var a=e.findComponents({mainType:"series",subType:"treemap",query:n});if(!(r.indexOf(a,t)<0)){this.seriesModel=t,this.api=i,this.ecModel=e;var o=u.retrieveTargetInfo(n,t),s=n&&n.type,l=t.layoutInfo,c=!this._oldTree,h=this._storage,d="treemapRootToNode"===s&&o&&h?{rootNodeGroup:h.nodeGroup[o.node.getRawIndex()],direction:n.direction}:null,f=this._giveContainerGroup(l),p=this._doRender(f,t,d);c||s&&"treemapZoomToNode"!==s&&"treemapRootToNode"!==s?p.renderFinally():this._doAnimation(f,p,t,d),this._resetController(i),this._renderBreadcrumb(t,i,o)}},_giveContainerGroup:function(t){var e=this._containerGroup;return e||(e=this._containerGroup=new m,this._initEvents(e),this.group.add(e)),e.attr("position",[t.x,t.y]),e},_doRender:function(t,e,i){function o(t,e,i,n,a){function s(t){return t.getId()}function u(r,s){var l=null!=r?t[r]:null,u=null!=s?e[s]:null,c=m(l,u,i,a);c&&o(l&&l.viewChildren||[],u&&u.viewChildren||[],c,n,a+1)}n?(e=t,y(t,function(t,e){!t.isRemoved()&&u(e,e)})):new l(e,t,s,s).add(u).update(u).remove(r.curry(u,null)).execute()}function s(t){var e=n();return t&&y(t,function(t,i){var n=e[i];y(t,function(t){t&&(n.push(t),t.__tmWillDelete=1)})}),e}function u(){y(v,function(t){y(t,function(t){t.parent&&t.parent.remove(t)})}),y(g,function(t){t.invisible=!0,t.dirty()})}var c=e.getData().tree,h=this._oldTree,d=n(),f=n(),p=this._storage,g=[],m=r.curry(a,e,f,p,i,d,g);o(c.root?[c.root]:[],h&&h.root?[h.root]:[],t,c===h||!h,0);var v=s(p);return this._oldTree=c,this._storage=f,{lastsForAnimation:d,willDeleteEls:v,renderFinally:u}},_doAnimation:function(t,e,i,n){if(i.get("animation")){var a=i.get("animationDurationUpdate"),o=i.get("animationEasing"),s=p.createWrap();y(e.willDeleteEls,function(t,e){y(t,function(t,i){if(!t.invisible){var r,l=t.parent;if(n&&"drillDown"===n.direction)r=l===n.rootNodeGroup?{shape:{x:0,y:0,width:l.__tmNodeWidth,height:l.__tmNodeHeight},style:{opacity:0}}:{style:{opacity:0}};else{var u=0,c=0;l.__tmWillDelete||(u=l.__tmNodeWidth/2,c=l.__tmNodeHeight/2),r="nodeGroup"===e?{position:[u,c],style:{opacity:0}}:{shape:{x:u,y:c,width:0,height:0},style:{opacity:0}}}r&&s.add(t,r,a,o)}})}),y(this._storage,function(t,i){y(t,function(t,n){var l=e.lastsForAnimation[i][n],u={};l&&("nodeGroup"===i?l.old&&(u.position=t.position.slice(),t.attr("position",l.old)):(l.old&&(u.shape=r.extend({},t.shape),t.setShape(l.old)),l.fadein?(t.setStyle("opacity",0),u.style={opacity:1}):1!==t.style.opacity&&(u.style={opacity:1})),s.add(t,u,a,o))})},this),this._state="animating",s.done(g(function(){this._state="ready",e.renderFinally()},this)).start()}},_resetController:function(t){var e=this._controller;e||(e=this._controller=new h(t.getZr()),e.enable(this.seriesModel.get("roam")),e.on("pan",g(this._onPan,this)),e.on("zoom",g(this._onZoom,this)));var i=new d(0,0,t.getWidth(),t.getHeight());e.setPointerChecker(function(t,e,n){return i.contain(e,n)})},_clearController:function(){var t=this._controller;t&&(t.dispose(),t=null)},_onPan:function(t,e){if(this._mayClick=!1,"animating"!==this._state&&(Math.abs(t)>x||Math.abs(e)>x)){var i=this.seriesModel.getData().tree.root;if(!i)return;var n=i.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t,y:n.y+e,width:n.width,height:n.height}})}},_onZoom:function(t,e,i){if(this._mayClick=!1,"animating"!==this._state){var n=this.seriesModel.getData().tree.root;if(!n)return;var a=n.getLayout();if(!a)return;var o=new d(a.x,a.y,a.width,a.height),r=this.seriesModel.layoutInfo;e-=r.x,i-=r.y;var s=f.create();f.translate(s,s,[-e,-i]),f.scale(s,s,[t,t]),f.translate(s,s,[e,i]),o.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},_initEvents:function(t){function e(t){var e=this.seriesModel.get("nodeClick",!0);if(e){var i=this.findTarget(t.offsetX,t.offsetY);if(i){var n=i.node;if(n.getLayout().isLeafRoot)this._rootToNode(i);else if("zoomToNode"===e)this._zoomToNode(i);else if("link"===e){
+var a=n.hostTree.data.getItemModel(n.dataIndex),o=a.get("link",!0),r=a.get("target",!0)||"blank";o&&window.open(o,r)}}}}t.on("mousedown",function(t){"ready"===this._state&&(this._mayClick=!0)},this),t.on("mouseup",function(t){this._mayClick&&(this._mayClick=!1,"ready"===this._state&&e.call(this,t))},this)},_renderBreadcrumb:function(t,e,i){function n(e){"animating"!==this._state&&(u.aboveViewRoot(t.getViewRoot(),e)?this._rootToNode({node:e}):this._zoomToNode({node:e}))}i||(i=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2),i||(i={node:t.getData().tree.root})),(this._breadcrumb||(this._breadcrumb=new c(this.group))).render(t,e,i.node,g(n,this))},remove:function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage=n(),this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},dispose:function(){this._clearController()},_zoomToNode:function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},_rootToNode:function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},findTarget:function(t,e){var i,n=this.seriesModel.getViewRoot();return n.eachNode({attr:"viewChildren",order:"preorder"},function(n){var a=this._storage.background[n.getRawIndex()];if(a){var o=a.transformCoordToLocal(t,e),r=a.shape;if(!(r.x<=o[0]&&o[0]<=r.x+r.width&&r.y<=o[1]&&o[1]<=r.y+r.height))return!1;i={node:n,offsetX:o[0],offsetY:o[1]}}},this),i}})},function(t,e,i){for(var n=i(2),a=i(94),o=function(){},r=["treemapZoomToNode","treemapRender","treemapMove"],s=0;s<r.length;s++)n.registerAction({type:r[s],update:"updateView"},o);n.registerAction({type:"treemapRootToNode",update:"updateView"},function(t,e){function i(e,i){var n=a.retrieveTargetInfo(t,e);if(n){var o=e.getViewRoot();o&&(t.direction=a.aboveViewRoot(o,n.node)?"rollUp":"drillDown"),e.resetViewRoot(n.node)}}e.eachComponent({mainType:"series",subType:"treemap",query:t},i)})},function(t,e,i){function n(t,e,i){var n={mainType:"series",subType:"treemap",query:i};t.eachComponent(n,function(t){var n=e.getWidth(),o=e.getHeight(),r=t.option,s=m.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),l=r.size||[],u=b(w(s.width,l[0]),n),c=b(w(s.height,l[1]),o),g=i&&i.type,x=v.retrieveTargetInfo(i,t),_="treemapRender"===g||"treemapMove"===g?i.rootRect:null,M=t.getViewRoot(),I=v.getPathToRoot(M);if("treemapMove"!==g){var T="treemapZoomToNode"===g?h(t,x,M,u,c):_?[_.width,_.height]:[u,c],A=r.sort;A&&"asc"!==A&&"desc"!==A&&(A="desc");var C={squareRatio:r.squareRatio,sort:A,leafDepth:r.leafDepth};M.hostTree.clearLayouts();var L={x:0,y:0,width:T[0],height:T[1],area:T[0]*T[1]};M.setLayout(L),a(M,C,!1,0);var L=M.getLayout();S(I,function(t,e){var i=(I[e+1]||M).getValue();t.setLayout(p.extend({dataExtent:[i,i],borderWidth:0},L))})}var D=t.getData().tree.root;D.setLayout(d(s,_,x),!0),t.setLayoutInfo(s),f(D,new y((-s.x),(-s.y),n,o),I,M,0)})}function a(t,e,i,n){var r,s;if(!t.isRemoved()){var l=t.getLayout();r=l.width,s=l.height;var h=t.getModel("itemStyle.normal"),d=h.get("borderWidth"),f=h.get("gapWidth")/2,p=d-f,g=t.getModel();t.setLayout({borderWidth:d},!0),r=x(r-2*p,0),s=x(s-2*p,0);var m=r*s,v=o(t,g,m,e,i,n);if(v.length){var y={x:p,y:p,width:r,height:s},b=_(r,s),w=1/0,S=[];S.area=0;for(var M=0,I=v.length;M<I;){var T=v[M];S.push(T),S.area+=T.getLayout().area;var A=u(S,b,e.squareRatio);A<=w?(M++,w=A):(S.area-=S.pop().getLayout().area,c(S,b,y,f,!1),b=_(y.width,y.height),S.length=S.area=0,w=1/0)}if(S.length&&c(S,b,y,f,!0),!i){var C=g.get("childrenVisibleMin");null!=C&&m<C&&(i=!0)}for(var M=0,I=v.length;M<I;M++)a(v[M],e,i,n+1)}}}function o(t,e,i,n,a,o){var u=t.children||[],c=n.sort;"asc"!==c&&"desc"!==c&&(c=null);var h=null!=n.leafDepth&&n.leafDepth<=o;if(a&&!h)return t.viewChildren=[];u=p.filter(u,function(t){return!t.isRemoved()}),s(u,c);var d=l(e,u,c);if(0===d.sum)return t.viewChildren=[];if(d.sum=r(e,i,d.sum,c,u),0===d.sum)return t.viewChildren=[];for(var f=0,g=u.length;f<g;f++){var m=u[f].getValue()/d.sum*i;u[f].setLayout({area:m})}return h&&(u.length&&t.setLayout({isLeafRoot:!0},!0),u.length=0),t.viewChildren=u,t.setLayout({dataExtent:d.dataExtent},!0),u}function r(t,e,i,n,a){if(!n)return i;for(var o=t.get("visibleMin"),r=a.length,s=r,l=r-1;l>=0;l--){var u=a["asc"===n?r-l-1:l].getValue();u/i*e<o&&(s=l,i-=u)}return"asc"===n?a.splice(0,r-s):a.splice(s,r-s),i}function s(t,e){return e&&t.sort(function(t,i){var n="asc"===e?t.getValue()-i.getValue():i.getValue()-t.getValue();return 0===n?"asc"===e?t.dataIndex-i.dataIndex:i.dataIndex-t.dataIndex:n}),t}function l(t,e,i){for(var n=0,a=0,o=e.length;a<o;a++)n+=e[a].getValue();var r,s=t.get("visualDimension");if(e&&e.length)if("value"===s&&i)r=[e[e.length-1].getValue(),e[0].getValue()],"asc"===i&&r.reverse();else{var r=[1/0,-(1/0)];S(e,function(t){var e=t.getValue(s);e<r[0]&&(r[0]=e),e>r[1]&&(r[1]=e)})}else r=[NaN,NaN];return{sum:n,dataExtent:r}}function u(t,e,i){for(var n,a=0,o=1/0,r=0,s=t.length;r<s;r++)n=t[r].getLayout().area,n&&(n<o&&(o=n),n>a&&(a=n));var l=t.area*t.area,u=e*e*i;return l?x(u*a/l,l/(u*o)):1/0}function c(t,e,i,n,a){var o=e===i.width?0:1,r=1-o,s=["x","y"],l=["width","height"],u=i[s[o]],c=e?t.area/e:0;(a||c>i[l[r]])&&(c=i[l[r]]);for(var h=0,d=t.length;h<d;h++){var f=t[h],p={},g=c?f.getLayout().area/c:0,m=p[l[r]]=x(c-2*n,0),v=i[s[o]]+i[l[o]]-u,y=h===d-1||v<g?v:g,b=p[l[o]]=x(y-2*n,0);p[s[r]]=i[s[r]]+_(n,m/2),p[s[o]]=u+_(n,b/2),u+=y,f.setLayout(p,!0)}i[s[r]]+=c,i[l[r]]-=c}function h(t,e,i,n,a){var o=(e||{}).node,r=[n,a];if(!o||o===i)return r;for(var s,l=n*a,u=l*t.option.zoomToNodeRatio;s=o.parentNode;){for(var c=0,h=s.children,d=0,f=h.length;d<f;d++)c+=h[d].getValue();var p=o.getValue();if(0===p)return r;u*=c/p;var m=s.getModel("itemStyle.normal").get("borderWidth");isFinite(m)&&(u+=4*m*m+4*m*Math.pow(u,.5)),u>g.MAX_SAFE_INTEGER&&(u=g.MAX_SAFE_INTEGER),o=s}u<l&&(u=l);var v=Math.pow(u/l,.5);return[n*v,a*v]}function d(t,e,i){if(e)return{x:e.x,y:e.y};var n={x:0,y:0};if(!i)return n;var a=i.node,o=a.getLayout();if(!o)return n;for(var r=[o.width/2,o.height/2],s=a;s;){var l=s.getLayout();r[0]+=l.x,r[1]+=l.y,s=s.parentNode}return{x:t.width/2-r[0],y:t.height/2-r[1]}}function f(t,e,i,n,a){var o=t.getLayout(),r=i[a],s=r&&r===t;if(!(r&&!s||a===i.length&&t!==n)){t.setLayout({isInView:!0,invisible:!s&&!e.intersect(o),isAboveViewRoot:s},!0);var l=new y(e.x-o.x,e.y-o.y,e.width,e.height);S(t.viewChildren||[],function(t){f(t,l,i,n,a+1)})}}var p=i(1),g=i(4),m=i(12),v=i(94),y=i(11),v=i(94),x=Math.max,_=Math.min,b=g.parsePercent,w=p.retrieve,S=p.each;t.exports=n},function(t,e,i){function n(t,e,i,s,u,h){var d=t.getModel(),p=t.getLayout();if(p&&!p.invisible&&p.isInView){var m,v=t.getModel(g),y=i[t.depth],x=a(v,e,y,s),_=v.get("borderColor"),b=v.get("borderColorSaturation");null!=b&&(m=o(x,t),_=r(b,m)),t.setVisual("borderColor",_);var w=t.viewChildren;if(w&&w.length){var S=l(t,d,p,v,x,w);f.each(w,function(t,e){if(t.depth>=u.length||t===u[t.depth]){var a=c(d,x,t,e,S,h);n(t,a,i,s,u,h)}})}else m=o(x,t),t.setVisual("color",m)}}function a(t,e,i,n){var a=f.extend({},e);return f.each(["color","colorAlpha","colorSaturation"],function(o){var r=t.get(o,!0);null==r&&i&&(r=i[o]),null==r&&(r=e[o]),null==r&&(r=n.get(o)),null!=r&&(a[o]=r)}),a}function o(t){var e=s(t,"color");if(e){var i=s(t,"colorAlpha"),n=s(t,"colorSaturation");return n&&(e=d.modifyHSL(e,null,null,n)),i&&(e=d.modifyAlpha(e,i)),e}}function r(t,e){return null!=e?d.modifyHSL(e,null,null,t):null}function s(t,e){var i=t[e];if(null!=i&&"none"!==i)return i}function l(t,e,i,n,a,o){if(o&&o.length){var r=u(e,"color")||null!=a.color&&"none"!==a.color&&(u(e,"colorAlpha")||u(e,"colorSaturation"));if(r){var s=e.get("visualMin"),l=e.get("visualMax"),c=i.dataExtent.slice();null!=s&&s<c[0]&&(c[0]=s),null!=l&&l>c[1]&&(c[1]=l);var d=e.get("colorMappingBy"),f={type:r.name,dataExtent:c,visual:r.range};"color"!==f.type||"index"!==d&&"id"!==d?f.mappingMethod="linear":(f.mappingMethod="category",f.loop=!0);var p=new h(f);return p.__drColorMappingBy=d,p}}}function u(t,e){var i=t.get(e);return p(i)&&i.length?{name:e,range:i}:null}function c(t,e,i,n,a,o){var r=f.extend({},e);if(a){var s=a.type,l="color"===s&&a.__drColorMappingBy,u="index"===l?n:"id"===l?o.mapIdToIndex(i.getId()):i.getValue(t.get("visualDimension"));r[s]=a.mapValueToVisual(u)}return r}var h=i(83),d=i(22),f=i(1),p=f.isArray,g="itemStyle.normal";t.exports=function(t,e,i){var a={mainType:"series",subType:"treemap",query:i};t.eachComponent(a,function(t){var e=t.getData().tree,i=e.root,a=t.getModel(g);if(!i.isRemoved()){var o=f.map(e.levelModels,function(t){return t?t.get(g):null});n(i,{},o,a,t.getViewRoot().getAncestors(),t)}})}},function(t,e,i){"use strict";i(236),i(354)},function(t,e,i){"use strict";function n(t,e,i,n){var a=t.coordToPoint([e,n]),o=t.coordToPoint([i,n]);return{x1:a[0],y1:a[1],x2:o[0],y2:o[1]}}var a=i(1),o=i(3),r=i(10),s=["axisLine","axisLabel","axisTick","splitLine","splitArea"];i(41).extend({type:"angleAxis",axisPointerClass:"PolarAxisPointer",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=t.axis,n=i.polar,o=n.getRadiusAxis().getExtent(),r=i.getTicksCoords();"category"!==i.type&&r.pop(),a.each(s,function(e){!t.get(e+".show")||i.scale.isBlank()&&"axisLine"!==e||this["_"+e](t,n,r,o)},this)}},_axisLine:function(t,e,i,n){var a=t.getModel("axisLine.lineStyle"),r=new o.Circle({shape:{cx:e.cx,cy:e.cy,r:n[1]},style:a.getLineStyle(),z2:1,silent:!0});r.style.fill=null,this.group.add(r)},_axisTick:function(t,e,i,r){var s=t.getModel("axisTick"),l=(s.get("inside")?-1:1)*s.get("length"),u=a.map(i,function(t){return new o.Line({shape:n(e,r[1],r[1]+l,t)})});this.group.add(o.mergePath(u,{style:a.defaults(s.getModel("lineStyle").getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")})}))},_axisLabel:function(t,e,i,n){for(var a=t.axis,s=t.get("data"),l=t.getModel("axisLabel"),u=l.getModel("textStyle"),c=t.getFormattedLabels(),h=l.get("margin"),d=a.getLabelsCoords(),f=0;f<i.length;f++){var p=n[1],g=e.coordToPoint([p+h,d[f]]),m=e.cx,v=e.cy,y=Math.abs(g[0]-m)/p<.3?"center":g[0]>m?"left":"right",x=Math.abs(g[1]-v)/p<.3?"middle":g[1]>v?"top":"bottom",_=u;s&&s[f]&&s[f].textStyle&&(_=new r(s[f].textStyle,u)),this.group.add(new o.Text({style:{x:g[0],y:g[1],fill:_.getTextColor()||t.get("axisLine.lineStyle.color"),text:c[f],textAlign:y,textVerticalAlign:x,textFont:_.getFont()},silent:!0}))}},_splitLine:function(t,e,i,r){var s=t.getModel("splitLine"),l=s.getModel("lineStyle"),u=l.get("color"),c=0;u=u instanceof Array?u:[u];for(var h=[],d=0;d<i.length;d++){var f=c++%u.length;h[f]=h[f]||[],h[f].push(new o.Line({shape:n(e,r[0],r[1],i[d])}))}for(var d=0;d<h.length;d++)this.group.add(o.mergePath(h[d],{style:a.defaults({stroke:u[d%u.length]},l.getLineStyle()),silent:!0,z:t.get("z")}))},_splitArea:function(t,e,i,n){var r=t.getModel("splitArea"),s=r.getModel("areaStyle"),l=s.get("color"),u=0;l=l instanceof Array?l:[l];for(var c=[],h=Math.PI/180,d=-i[0]*h,f=Math.min(n[0],n[1]),p=Math.max(n[0],n[1]),g=t.get("clockwise"),m=1;m<i.length;m++){var v=u++%l.length;c[v]=c[v]||[],c[v].push(new o.Sector({shape:{cx:e.cx,cy:e.cy,r0:f,r:p,startAngle:d,endAngle:-i[m]*h,clockwise:g},silent:!0})),d=-i[m]*h}for(var m=0;m<c.length;m++)this.group.add(o.mergePath(c[m],{style:a.defaults({fill:l[m%l.length]},s.getAreaStyle()),silent:!0}))}})},function(t,e,i){function n(t,e,i){return i&&"axisAreaSelect"===i.type&&e.findComponents({mainType:"parallelAxis",query:i})[0]===t}function a(t){var e=t.axis;return r.map(t.activeIntervals,function(t){return{brushType:"lineX",panelId:"pl",range:[e.dataToCoord(t[0],!0),e.dataToCoord(t[1],!0)]}})}function o(t,e){return e.getComponent("parallel",t.get("parallelIndex"))}var r=i(1),s=i(40),l=i(127),u=i(185),c=i(3),h=["axisLine","axisLabel","axisTick","axisName"],d=i(2).extendComponentView({type:"parallelAxis",init:function(t,e){d.superApply(this,"init",arguments),(this._brushController=new l(e.getZr())).on("brush",r.bind(this._onBrush,this))},render:function(t,e,i,a){if(!n(t,e,a)){this.axisModel=t,this.api=i,this.group.removeAll();var l=this._axisGroup;if(this._axisGroup=new c.Group,this.group.add(this._axisGroup),t.get("show")){var u=o(t,e),d=u.coordinateSystem,f=t.getAreaSelectStyle(),p=f.width,g=t.axis.dim,m=d.getAxisLayout(g),v=r.extend({strokeContainThreshold:p},m),y=new s(t,v);r.each(h,y.add,y),this._axisGroup.add(y.getGroup()),this._refreshBrushController(v,f,t,u,p,i);var x=a&&a.animation===!1?null:t;c.groupTransition(l,this._axisGroup,x)}}},updateVisual:function(t,e,i,n){this._brushController&&this._brushController.updateCovers(a(t))},_refreshBrushController:function(t,e,i,n,o,r){var s=i.axis.getExtent(),l=s[1]-s[0],h=Math.min(30,.1*Math.abs(l)),d=c.BoundingRect.create({x:s[0],y:-o/2,width:l,height:o});d.x-=h,d.width+=2*h,this._brushController.mount({enableGlobalPan:!0,rotation:t.rotation,position:t.position}).setPanels([{panelId:"pl",clipPath:u.makeRectPanelClipPath(d),isTargetByCursor:u.makeRectIsTargetByCursor(d,r,n),getLinearBrushOtherExtent:u.makeLinearBrushOtherExtent(d,0)}]).enableBrush({brushType:"lineX",brushStyle:e,removeOnClick:!0}).updateCovers(a(i))},_onBrush:function(t,e){var i=this.axisModel,n=i.axis,a=r.map(t,function(t){return[n.coordToData(t.range[0],!0),n.coordToData(t.range[1],!0)]});(!i.option.realtime===e.isEnd||e.removeOnClick)&&this.api.dispatchAction({type:"axisAreaSelect",parallelAxisId:i.id,intervals:a})},dispose:function(){this._brushController.dispose()}});t.exports=d},function(t,e,i){"use strict";function n(t,e,i){return{position:[t.cx,t.cy],rotation:i/180*Math.PI,labelDirection:-1,tickDirection:-1,nameDirection:1,labelRotate:e.getModel("axisLabel").get("rotate"),z2:1}}var a=i(1),o=i(3),r=i(40),s=["axisLine","axisLabel","axisTick","axisName"],l=["splitLine","splitArea"];i(41).extend({type:"radiusAxis",axisPointerClass:"PolarAxisPointer",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=t.axis,o=i.polar,u=o.getAngleAxis(),c=i.getTicksCoords(),h=u.getExtent()[0],d=i.getExtent(),f=n(o,t,h),p=new r(t,f);a.each(s,p.add,p),this.group.add(p.getGroup()),a.each(l,function(e){t.get(e+".show")&&!i.scale.isBlank()&&this["_"+e](t,o,h,d,c)},this)}},_splitLine:function(t,e,i,n,r){var s=t.getModel("splitLine"),l=s.getModel("lineStyle"),u=l.get("color"),c=0;u=u instanceof Array?u:[u];for(var h=[],d=0;d<r.length;d++){var f=c++%u.length;h[f]=h[f]||[],h[f].push(new o.Circle({shape:{cx:e.cx,cy:e.cy,r:r[d]},silent:!0}))}for(var d=0;d<h.length;d++)this.group.add(o.mergePath(h[d],{style:a.defaults({stroke:u[d%u.length],fill:null},l.getLineStyle()),silent:!0}))},_splitArea:function(t,e,i,n,r){var s=t.getModel("splitArea"),l=s.getModel("areaStyle"),u=l.get("color"),c=0;u=u instanceof Array?u:[u];for(var h=[],d=r[0],f=1;f<r.length;f++){var p=c++%u.length;h[p]=h[p]||[],h[p].push(new o.Sector({shape:{cx:e.cx,cy:e.cy,r0:d,r:r[f],startAngle:0,endAngle:2*Math.PI},silent:!0})),d=r[f]}for(var f=0;f<h.length;f++)this.group.add(o.mergePath(h[f],{style:a.defaults({fill:u[f%u.length]},l.getAreaStyle()),silent:!0}))}})},function(t,e,i){var n=i(40),a=i(1),o=i(3),r=i(248),s=n.getInterval,l=n.ifIgnoreOnTick,u=["axisLine","axisLabel","axisTick","axisName"],c="splitLine",h=i(41).extend({type:"singleAxis",axisPointerClass:"SingleAxisPointer",render:function(t,e,i,o){var s=this.group;s.removeAll();var l=r.layout(t),d=new n(t,l);a.each(u,d.add,d),s.add(d.getGroup()),t.get(c+".show")&&this["_"+c](t,l.labelInterval),h.superCall(this,"render",t,e,i,o)},_splitLine:function(t,e){var i=t.axis;if(!i.scale.isBlank()){var n=t.getModel("splitLine"),a=n.getModel("lineStyle"),r=a.get("width"),u=a.get("color"),c=s(n,e);u=u instanceof Array?u:[u];for(var h=t.coordinateSystem.getRect(),d=i.isHorizontal(),f=[],p=0,g=i.getTicksCoords(),m=[],v=[],y=0;y<g.length;++y)if(!l(i,y,c)){var x=i.toGlobalCoord(g[y]);d?(m[0]=x,m[1]=h.y,v[0]=x,v[1]=h.y+h.height):(m[0]=h.x,m[1]=x,v[0]=h.x+h.width,v[1]=x);var _=p++%u.length;f[_]=f[_]||[],f[_].push(new o.Line(o.subPixelOptimizeLine({shape:{x1:m[0],y1:m[1],x2:v[0],y2:v[1]},style:{lineWidth:r},silent:!0})))}for(var y=0;y<f.length;++y)this.group.add(o.mergePath(f[y],{style:{stroke:u[y%u.length],lineDash:a.getLineDash(r),lineWidth:r},silent:!0}))}}});t.exports=h},function(t,e,i){var n=i(2),a={type:"axisAreaSelect",event:"axisAreaSelected",update:"updateVisual"};n.registerAction(a,function(t,e){e.eachComponent({mainType:"parallelAxis",query:t},function(e){e.axis.model.setActiveIntervals(t.intervals)})}),n.registerAction("parallelAxisExpand",function(t,e){e.eachComponent({mainType:"parallel",query:t},function(e){e.setAxisExpand(t)})})},function(t,e,i){"use strict";function n(t,e,i,n,a){var o=e.axis,s=o.dataToCoord(t),c=n.getAngleAxis().getExtent()[0];c=c/180*Math.PI;var h,d,f,p=n.getRadiusAxis().getExtent();if("radius"===o.dim){var g=l.create();l.rotate(g,g,c),l.translate(g,g,[n.cx,n.cy]),h=r.applyTransform([s,-a],g);var m=e.getModel("axisLabel").get("rotate")||0,v=u.innerTextLayout(c,m*Math.PI/180,-1);d=v.textAlign,f=v.textVerticalAlign}else{var y=p[1];h=n.coordToPoint([y+a,s]);var x=n.cx,_=n.cy;d=Math.abs(h[0]-x)/y<.3?"center":h[0]>x?"left":"right",f=Math.abs(h[1]-_)/y<.3?"middle":h[1]>_?"top":"bottom"}return{position:h,align:d,verticalAlign:f}}var a=i(7),o=i(119),r=i(3),s=i(76),l=i(19),u=i(40),c=i(41),h=o.extend({makeElOption:function(t,e,i,o,r){var l=i.axis;"angle"===l.dim&&(this.animationThreshold=Math.PI/18);var u,c=l.polar,h=c.getOtherAxis(l),f=h.getExtent();u=l["dataTo"+a.capitalFirst(l.dim)](e);var p=o.get("type");if(p&&"none"!==p){var g=s.buildElStyle(o),m=d[p](l,c,u,f,g);m.style=g,t.graphicKey=m.type,t.pointer=m}var v=o.get("label.margin"),y=n(e,i,o,c,v);s.buildLabelElOption(t,i,o,r,y)}}),d={line:function(t,e,i,n,a){return"angle"===t.dim?{type:"Line",shape:s.makeLineShape(e.coordToPoint([n[0],i]),e.coordToPoint([n[1],i]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:i}}},shadow:function(t,e,i,n,a){var o=t.getBandWidth(),r=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:s.makeSectorShape(e.cx,e.cy,n[0],n[1],(-i-o/2)*r,(-i+o/2)*r)}:{type:"Sector",shape:s.makeSectorShape(e.cx,e.cy,i-o/2,i+o/2,0,2*Math.PI)}}};c.registerAxisPointerClass("PolarAxisPointer",h),t.exports=h},function(t,e,i){"use strict";function n(t){return t.isHorizontal()?0:1}function a(t,e){var i=t.getRect();return[i[c[e]],i[c[e]]+i[h[e]]]}var o=i(3),r=i(119),s=i(76),l=i(248),u=i(41),c=["x","y"],h=["width","height"],d=r.extend({makeElOption:function(t,e,i,o,r){var u=i.axis,c=u.coordinateSystem,h=a(c,1-n(u)),d=c.dataToPoint(e)[0],p=o.get("type");if(p&&"none"!==p){var g=s.buildElStyle(o),m=f[p](u,d,h,g);m.style=g,t.graphicKey=m.type,t.pointer=m}var v=l.layout(i);s.buildCartesianSingleLabelElOption(e,t,v,i,o,r)},getHandleTransform:function(t,e,i){var n=l.layout(e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:s.getTransformedPosition(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,o){var r=i.axis,s=r.coordinateSystem,l=n(r),u=a(s,l),c=t.position;c[l]+=e[l],c[l]=Math.min(u[1],c[l]),c[l]=Math.max(u[0],c[l]);var h=a(s,1-l),d=(h[1]+h[0])/2,f=[d,d];return f[l]=c[l],{position:c,rotation:t.rotation,cursorPoint:f,tooltipOption:{verticalAlign:"middle"}}}}),f={line:function(t,e,i,a){var r=s.makeLineShape([e,i[0]],[e,i[1]],n(t));return o.subPixelOptimizeLine({shape:r,style:a}),{type:"Line",shape:r}},shadow:function(t,e,i,a){var o=t.getBandWidth(),r=i[1]-i[0];return{type:"Rect",shape:s.makeRectShape([e-o/2,i[0]],[o,r],n(t))}}};u.registerAxisPointerClass("SingleAxisPointer",d),t.exports=d},function(t,e,i){i(2).registerPreprocessor(i(365)),i(367),i(362),i(363),i(364),i(386)},function(t,e,i){function n(t,e){return o.merge({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new s(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var a=i(2),o=i(1),r=i(187),s=i(10),l=["#ddd"],u=a.extendComponentModel({type:"brush",dependencies:["geo","grid","xAxis","yAxis","parallel","series"],defaultOption:{toolbox:null,brushLink:null,seriesIndex:"all",geoIndex:null,xAxisIndex:null,yAxisIndex:null,brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(120,140,180,0.3)",borderColor:"rgba(120,140,180,0.8)"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},areas:[],brushType:null,brushOption:{},coordInfoList:[],optionUpdated:function(t,e){var i=this.option;!e&&r.replaceVisualOption(i,t,["inBrush","outOfBrush"]),i.inBrush=i.inBrush||{},i.outOfBrush=i.outOfBrush||{color:l}},setAreas:function(t){t&&(this.areas=o.map(t,function(t){return n(this.option,t)},this))},setBrushOption:function(t){this.brushOption=n(this.option,t),this.brushType=this.brushOption.brushType}});t.exports=u},function(t,e,i){function n(t,e,i,n){(!n||n.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(i)).enableBrush(t.brushOption).updateCovers(t.areas.slice())}var a=i(1),o=i(127),r=i(2);t.exports=r.extendComponentView({type:"brush",init:function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new o(e.getZr())).on("brush",a.bind(this._onBrush,this)).mount()},render:function(t){return this.model=t,n.apply(this,arguments)},updateView:n,updateLayout:n,updateVisual:n,dispose:function(){this._brushController.dispose()},_onBrush:function(t,e){var i=this.model.id;this.model.brushTargetManager.setOutputRanges(t,this.ecModel),(!e.isEnd||e.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:i,areas:a.clone(t),$from:i})}})},function(t,e,i){var n=i(2);n.registerAction({type:"brush",event:"brush",update:"updateView"},function(t,e){e.eachComponent({mainType:"brush",query:t},function(e){e.setAreas(t.areas)})}),n.registerAction({type:"brushSelect",event:"brushSelected",update:"none"},function(){})},function(t,e,i){function n(t){var e={};a.each(t,function(t){e[t]=1}),t.length=0,a.each(e,function(e,i){t.push(i)})}var a=i(1),o=["rect","polygon","keep","clear"];t.exports=function(t,e){var i=t&&t.brush;if(a.isArray(i)||(i=i?[i]:[]),i.length){var r=[];a.each(i,function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(r=r.concat(e))});var s=t&&t.toolbox;a.isArray(s)&&(s=s[0]),s||(s={feature:{}},t.toolbox=[s]);var l=s.feature||(s.feature={}),u=l.brush||(l.brush={}),c=u.type||(u.type=[]);c.push.apply(c,r),n(c),e&&!c.length&&c.push.apply(c,o)}}},function(t,e,i){function n(t){var e=["x","y"],i=["width","height"];return{point:function(e,i,n){var o=n.range,r=e[t];return a(r,o)},rect:function(n,o,r){var s=r.range,l=[n[e[t]],n[e[t]]+n[i[t]]];return l[1]<l[0]&&l.reverse(),a(l[0],s)||a(l[1],s)||a(s[0],l)||a(s[1],l)}}}function a(t,e){return e[0]<=t&&t<=e[1]}function o(t,e,i,n,a){for(var o=0,s=a[a.length-1];o<a.length;o++){var l=a[o];if(r(t,e,i,n,l[0],l[1],s[0],s[1]))return!0;s=l}}function r(t,e,i,n,a,o,r,u){var c=l(i-t,a-r,n-e,o-u);if(s(c))return!1;var h=l(a-t,a-r,o-e,o-u)/c;if(h<0||h>1)return!1;var d=l(i-t,a-t,n-e,o-e)/c;return!(d<0||d>1)}function s(t){return t<=1e-6&&t>=-1e-6}function l(t,e,i,n){return t*n-e*i}var u=i(267).contain,c=i(11),h={lineX:n(0),lineY:n(1),rect:{point:function(t,e,i){return i.boundingRect.contain(t[0],t[1])},rect:function(t,e,i){return i.boundingRect.intersect(t)}},polygon:{point:function(t,e,i){return i.boundingRect.contain(t[0],t[1])&&u(i.range,t[0],t[1])},rect:function(t,e,i){var n=i.range;if(n.length<=1)return!1;var a=t.x,r=t.y,s=t.width,l=t.height,h=n[0];return!!(u(n,a,r)||u(n,a+s,r)||u(n,a,r+l)||u(n,a+s,r+l)||c.create(t).contain(h[0],h[1])||o(a,r,a+s,r,n)||o(a,r,a,r+l,n)||o(a+s,r,a+s,r+l,n)||o(a,r+l,a+s,r+l,n))||void 0}}};t.exports=h},function(t,e,i){function n(t,e,i,n,o){if(o){var r=t.getZr();if(!r[x]){r[y]||(r[y]=a);var s=g.createOrUpdate(r,y,i,e);s(t,n)}}}function a(t,e){if(!t.isDisposed()){var i=t.getZr();i[x]=!0,t.dispatchAction({type:"brushSelect",batch:e}),i[x]=!1}}function o(t,e,i,n){for(var a=0,o=e.length;a<o;a++){var r=e[a];if(t[r.brushType](n,i,r.selectors,r))return!0}}function r(t){var e=t.brushSelector;if(d.isString(e)){var i=[];return d.each(p,function(t,n){i[n]=function(i,n,a,o){var r=n.getItemLayout(i);return t[e](r,a,o)}}),i}if(d.isFunction(e)){var n={};return d.each(p,function(t,i){n[i]=e}),n}return e}function s(t,e){var i=t.option.seriesIndex;return null!=i&&"all"!==i&&(d.isArray(i)?d.indexOf(i,e)<0:e!==i)}function l(t){var e=t.selectors={};return d.each(p[t.brushType],function(i,n){e[n]=function(n){return i(n,e,t)}}),t}function u(t){return new f(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var c=i(2),h=i(187),d=i(1),f=i(11),p=i(366),g=i(37),m=i(184),v=["inBrush","outOfBrush"],y="__ecBrushSelect",x="__ecInBrushSelectEvent",_=c.PRIORITY.VISUAL.BRUSH;c.registerLayout(_,function(t,e,i){t.eachComponent({mainType:"brush"},function(e){i&&"takeGlobalCursor"===i.type&&e.setBrushOption("brush"===i.key?i.brushOption:{brushType:!1});var n=e.brushTargetManager=new m(e.option,t);n.setInputRanges(e.areas,t)})}),c.registerVisual(_,function(t,e,i){var a,u,c=[];t.eachComponent({mainType:"brush"},function(e,i){function n(t){return"all"===x||_[t]}function f(t){return!!t.length}function p(t,e){var i=t.coordinateSystem;M|=i.hasAxisBrushed(),n(e)&&i.eachActiveState(t.getData(),function(t,e){"active"===t&&(w[e]=1)})}function g(i,a,l){var u=r(i);if(u&&!s(e,a)&&(d.each(I,function(n){u[n.brushType]&&e.brushTargetManager.controlSeries(n,i,t)&&l.push(n),M|=f(l)}),n(a)&&f(l))){var c=i.getData();c.each(function(t){o(u,l,c,t)&&(w[t]=1)})}}var m={brushId:e.id,brushIndex:i,brushName:e.name,areas:d.clone(e.areas),selected:[]};c.push(m);var y=e.option,x=y.brushLink,_=[],w=[],S=[],M=0;i||(a=y.throttleType,u=y.throttleDelay);var I=d.map(e.areas,function(t){return l(d.defaults({boundingRect:b[t.brushType](t)},t))}),T=h.createVisualMappings(e.option,v,function(t){t.mappingMethod="fixed"});d.isArray(x)&&d.each(x,function(t){_[t]=1}),t.eachSeries(function(t,e){var i=S[e]=[];"parallel"===t.subType?p(t,e,i):g(t,e,i)}),t.eachSeries(function(t,e){var i={seriesId:t.id,seriesIndex:e,seriesName:t.name,dataIndex:[]};m.selected.push(i);var a=r(t),s=S[e],l=t.getData(),u=n(e)?function(t){return w[t]?(i.dataIndex.push(l.getRawIndex(t)),"inBrush"):"outOfBrush"}:function(t){return o(a,s,l,t)?(i.dataIndex.push(l.getRawIndex(t)),"inBrush"):"outOfBrush"};(n(e)?M:f(s))&&h.applyVisual(v,T,l,u)})}),n(e,a,u,c,i)});var b={lineX:d.noop,lineY:d.noop,rect:function(t){return u(t.range)},polygon:function(t){for(var e,i=t.range,n=0,a=i.length;n<a;n++){e=e||[[1/0,-(1/0)],[1/0,-(1/0)]];var o=i[n];o[0]<e[0][0]&&(e[0][0]=o[0]),o[0]>e[0][1]&&(e[0][1]=o[0]),o[1]<e[1][0]&&(e[1][0]=o[1]),o[1]>e[1][1]&&(e[1][1]=o[1])}return e&&u(e)}}},function(t,e,i){"use strict";i(394),i(395),i(369)},function(t,e,i){"use strict";var n=i(1),a=i(3),o=i(7),r=i(4),s={EN:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],CN:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},l={EN:["S","M","T","W","T","F","S"],CN:["日","一","二","三","四","五","六"]};t.exports=i(2).extendComponentView({type:"calendar",_tlpoints:null,_blpoints:null,_firstDayOfMonth:null,_firstDayPoints:null,render:function(t,e,i){var n=this.group;n.removeAll();var a=t.coordinateSystem,o=a.getRangeInfo(),r=a.getOrient();this._renderDayRect(t,o,n),this._renderLines(t,o,r,n),this._renderYearText(t,o,r,n),this._renderMonthText(t,r,n),this._renderWeekText(t,o,r,n)},_renderDayRect:function(t,e,i){for(var n=t.coordinateSystem,o=t.getModel("itemStyle.normal").getItemStyle(),r=n.getCellWidth(),s=n.getCellHeight(),l=e.start.time;l<=e.end.time;l=n.getNextNDay(l,1).time){var u=n.dataToRect([l],!1).tl,c=new a.Rect({shape:{x:u[0],y:u[1],width:r,height:s},style:o});i.add(c)}},_renderLines:function(t,e,i,n){function a(e){o._firstDayOfMonth.push(r.getDateInfo(e)),o._firstDayPoints.push(r.dataToRect([e],!1).tl);var a=o._getLinePointsOfOneWeek(t,e,i);o._tlpoints.push(a[0]),o._blpoints.push(a[a.length-1]),l&&o._drawSplitline(a,s,n)}var o=this,r=t.coordinateSystem,s=t.getModel("splitLine.lineStyle").getLineStyle(),l=t.get("splitLine.show"),u=s.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var c=e.start,h=0;c.time<=e.end.time;h++){a(c.formatedDate),0===h&&(c=r.getDateInfo(e.start.y+"-"+e.start.m));var d=c.date;d.setMonth(d.getMonth()+1),c=r.getDateInfo(d)}a(r.getNextNDay(e.end.time,1).formatedDate),l&&this._drawSplitline(o._getEdgesPoints(o._tlpoints,u,i),s,n),l&&this._drawSplitline(o._getEdgesPoints(o._blpoints,u,i),s,n)},_getEdgesPoints:function(t,e,i){var n=[t[0].slice(),t[t.length-1].slice()],a="horizontal"===i?0:1;return n[0][a]=n[0][a]-e/2,n[1][a]=n[1][a]+e/2,n},_drawSplitline:function(t,e,i){var n=new a.Polyline({z2:20,shape:{points:t},style:e});i.add(n)},_getLinePointsOfOneWeek:function(t,e,i){var n=t.coordinateSystem;e=n.getDateInfo(e);for(var a=[],o=0;o<7;o++){var r=n.getNextNDay(e.time,o),s=n.dataToRect([r.time],!1);a[2*r.day]=s.tl,a[2*r.day+1]=s["horizontal"===i?"bl":"tr"]}return a},_formatterLabel:function(t,e){return"string"==typeof t&&t?o.formatTplSimple(t,e):"function"==typeof t?t(e):e.nameMap},_yearTextPositionControl:function(t,e,i,n){t=t.slice();var a=["center","bottom"];"top"===i&&(t[1]-=n),"bottom"===i&&(t[1]+=n,a=["center","top"]),"left"===i&&(t[0]-=n),"right"===i&&(t[0]+=n,a=["center","top"]);var o=0;return"left"!==i&&"right"!==i||(o=Math.PI/2),{rotation:o,origin:t,style:{x:t[0],y:t[1],textAlign:a[0],textVerticalAlign:a[1]}}},_renderYearText:function(t,e,i,o){var r=t.getModel("yearLabel");if(r.get("show")){var s=t.getModel("yearLabel.textStyle"),l=r.get("margin"),u=r.get("position");u||(u="horizontal"!==i?"top":"left");var c=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],h=(c[0][0]+c[1][0])/2,d=(c[0][1]+c[1][1])/2,f="horizontal"===i?0:1,p={top:[h,c[f][1]],bottom:[h,c[1-f][1]],left:[c[1-f][0],d],right:[c[f][0],d]},g=e.start.y;+e.end.y>+e.start.y&&(g=g+"-"+e.end.y);var m=r.get("formatter"),v={start:e.start.y,end:e.end.y,nameMap:g},y=this._formatterLabel(m,v),x=new a.Text(n.merge({z2:30,style:{text:y,font:s.getFont(),fill:s.getTextColor()}},this._yearTextPositionControl(p[u],i,u,l)));o.add(x)}},_monthTextPositionControl:function(t,e,i,n,a){var o="left",r="top",s=t[0],l=t[1];return"horizontal"===i?(l+=a,e&&(o="center"),"start"===n&&(r="bottom")):(s+=a,e&&(r="middle"),"start"===n&&(o="right")),{x:s,y:l,textAlign:o,textVerticalAlign:r}},_renderMonthText:function(t,e,i){var o=t.getModel("monthLabel");if(o.get("show")){var r=t.getModel("monthLabel.textStyle"),l=o.get("nameMap"),u=o.get("margin"),c=o.get("position"),h=o.get("align"),d=[this._tlpoints,this._blpoints];n.isString(l)&&(l=s[l.toUpperCase()]||[]);var f="start"===c?0:1,p="horizontal"===e?0:1;u="start"===c?-u:u;for(var g="center"===h,m=0;m<d[f].length-1;m++){var v=d[f][m].slice(),y=this._firstDayOfMonth[m];if(g){var x=this._firstDayPoints[m];v[p]=(x[p]+d[0][m+1][p])/2}var _=o.get("formatter"),b=l[+y.m-1],w={yyyy:y.y,yy:(y.y+"").slice(2),MM:y.m,M:+y.m,nameMap:b},S=this._formatterLabel(_,w),M=new a.Text({z2:30,style:n.extend({text:S,font:r.getFont(),fill:r.getTextColor()},this._monthTextPositionControl(v,g,e,c,u))});i.add(M)}}},_weekTextPositionControl:function(t,e,i,n,a){var o="center",r="middle",s=t[0],l=t[1],u="start"===i;return"horizontal"===e?(s=s+n+(u?1:-1)*a[0]/2,o=u?"right":"left"):(l=l+n+(u?1:-1)*a[1]/2,r=u?"bottom":"top"),{x:s,y:l,textAlign:o,textVerticalAlign:r}},_renderWeekText:function(t,e,i,o){var s=t.getModel("dayLabel");if(s.get("show")){var u=t.coordinateSystem,c=t.getModel("dayLabel.textStyle"),h=s.get("position"),d=s.get("nameMap"),f=s.get("margin"),p=u.getFirstDayOfWeek();n.isString(d)&&(d=l[d.toUpperCase()]||[]);var g=u.getNextNDay(e.end.time,7-e.lweek).time,m=[u.getCellWidth(),u.getCellHeight()];f=r.parsePercent(f,m["horizontal"===i?0:1]),"start"===h&&(g=u.getNextNDay(e.start.time,-(7+e.fweek)).time,f=-f);for(var v=0;v<7;v++){var y=u.getNextNDay(g,v),x=u.dataToRect([y.time],!1).center,_=v;_=Math.abs((v+p)%7);var b=new a.Text({z2:30,style:n.extend({text:d[_],font:c.getFont(),
+fill:c.getTextColor()},this._weekTextPositionControl(x,i,h,f,m))});o.add(b)}}}})},function(t,e,i){function n(t,e){e.update="updateView",a.registerAction(e,function(e,i){var n={};return i.eachComponent({mainType:"geo",query:e},function(i){i[t](e.name);var a=i.coordinateSystem;o.each(a.regions,function(t){n[t.name]=i.isSelected(t.name)||!1})}),{selected:n,name:e.name}})}i(399),i(186),i(371),i(240);var a=i(2),o=i(1);n("toggleSelected",{type:"geoToggleSelect",event:"geoselectchanged"}),n("select",{type:"geoSelect",event:"geoselected"}),n("unSelect",{type:"geoUnSelect",event:"geounselected"})},function(t,e,i){"use strict";var n=i(249);t.exports=i(2).extendComponentView({type:"geo",init:function(t,e){var i=new n(e,(!0));this._mapDraw=i,this.group.add(i.group)},render:function(t,e,i,n){if(!n||"geoToggleSelect"!==n.type||n.from!==this.uid){var a=this._mapDraw;t.get("show")?a.draw(t,e,i,this,n):this._mapDraw.group.removeAll(),this.group.silent=t.get("silent")}},dispose:function(){this._mapDraw&&this._mapDraw.remove()}})},function(t,e,i){i(263),i(358),i(355)},function(t,e,i){"use strict";var n=i(1);i(236),i(353),i(376),i(55),i(359),i(2).registerLayout(n.curry(i(425),"bar")),i(2).extendComponentView({type:"polar"})},function(t,e,i){i(416),i(417),i(375)},function(t,e,i){var n=i(40),a=i(1),o=i(3),r=["axisLine","axisLabel","axisTick","axisName"];t.exports=i(2).extendComponentView({type:"radar",render:function(t,e,i){var n=this.group;n.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},_buildAxes:function(t){var e=t.coordinateSystem,i=e.getIndicatorAxes(),o=a.map(i,function(t){var i=new n(t.model,{position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1});return i});a.each(o,function(t){a.each(r,t.add,t),this.group.add(t.getGroup())},this)},_buildSplitLineAndArea:function(t){function e(t,e,i){var n=i%e.length;return t[n]=t[n]||[],n}var i=t.coordinateSystem,n=i.getIndicatorAxes();if(n.length){var r=t.get("shape"),s=t.getModel("splitLine"),l=t.getModel("splitArea"),u=s.getModel("lineStyle"),c=l.getModel("areaStyle"),h=s.get("show"),d=l.get("show"),f=u.get("color"),p=c.get("color");f=a.isArray(f)?f:[f],p=a.isArray(p)?p:[p];var g=[],m=[];if("circle"===r)for(var v=n[0].getTicksCoords(),y=i.cx,x=i.cy,_=0;_<v.length;_++){if(h){var b=e(g,f,_);g[b].push(new o.Circle({shape:{cx:y,cy:x,r:v[_]}}))}if(d&&_<v.length-1){var b=e(m,p,_);m[b].push(new o.Ring({shape:{cx:y,cy:x,r0:v[_],r:v[_+1]}}))}}else for(var w=-1,S=a.map(n,function(t,e){var n=t.getTicksCoords();return w=Math.max(n.length-1,w),a.map(n,function(t){return i.coordToPoint(t,e)})}),M=[],_=0;_<=w;_++){for(var I=[],T=0;T<n.length;T++)I.push(S[T][_]);if(I[0]&&I.push(I[0].slice()),h){var b=e(g,f,_);g[b].push(new o.Polyline({shape:{points:I}}))}if(d&&M){var b=e(m,p,_-1);m[b].push(new o.Polygon({shape:{points:I.concat(M)}}))}M=I.slice().reverse()}var A=u.getLineStyle(),C=c.getAreaStyle();a.each(m,function(t,e){this.group.add(o.mergePath(t,{style:a.defaults({stroke:"none",fill:p[e%p.length]},C),silent:!0}))},this),a.each(g,function(t,e){this.group.add(o.mergePath(t,{style:a.defaults({fill:"none",stroke:f[e%f.length]},A),silent:!0}))},this)}}})},function(t,e,i){i(236),i(356)},function(t,e,i){var n=i(2);n.registerPreprocessor(i(383)),i(385),i(384),i(378),i(379)},function(t,e,i){var n=i(381),a=i(1),o=i(5),r=n.extend({type:"timeline.slider",defaultOption:{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"emptyCircle",symbolSize:10,lineStyle:{show:!0,width:2,color:"#304654"},label:{position:"auto",normal:{show:!0,interval:"auto",rotate:0,textStyle:{color:"#304654"}},emphasis:{show:!0,textStyle:{color:"#c23531"}}},itemStyle:{normal:{color:"#304654",borderWidth:1},emphasis:{color:"#c23531"}},checkpointStyle:{symbol:"circle",symbolSize:13,color:"#c23531",borderWidth:5,borderColor:"rgba(194,53,49, 0.5)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:22,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z",prevIcon:"path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z",normal:{color:"#304654",borderColor:"#304654",borderWidth:1},emphasis:{color:"#c23531",borderColor:"#c23531",borderWidth:2}},data:[]}});a.mixin(r,o.dataFormatMixin),t.exports=r},function(t,e,i){function n(t,e){return u.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}function a(t,e,i,n){var a=l.makePath(t.get(e).replace(/^path:\/\//,""),s.clone(n||{}),new p(i[0],i[1],i[2],i[3]),"center");return a}function o(t,e,i,n,a,o){var r=e.get("color");if(a)a.setColor(r),i.add(a),o&&o.onUpdate(a);else{var l=t.get("symbol");a=d.createSymbol(l,-1,-1,2,2,r),a.setStyle("strokeNoScale",!0),i.add(a),o&&o.onCreate(a)}var u=e.getItemStyle(["color","symbol","symbolSize"]);a.setStyle(u),n=s.merge({rectHover:!0,z2:100},n,!0);var c=t.get("symbolSize");c=c instanceof Array?c.slice():[+c,+c],c[0]/=2,c[1]/=2,n.scale=c;var h=t.get("symbolOffset");if(h){var f=n.position=n.position||[0,0];f[0]+=m.parsePercent(h[0],c[0]),f[1]+=m.parsePercent(h[1],c[1])}var p=t.get("symbolRotate");return n.rotation=(p||0)*Math.PI/180||0,a.attr(n),a.updateTransform(),a}function r(t,e,i,n,a){if(!t.dragging){var o=n.getModel("checkpointStyle"),r=i.dataToCoord(n.getData().get(["value"],e));a||!o.get("animation",!0)?t.attr({position:[r,0]}):(t.stopAnimation(!0),t.animateTo({position:[r,0]},o.get("animationDuration",!0),o.get("animationEasing",!0)))}}var s=i(1),l=i(3),u=i(12),c=i(382),h=i(380),d=i(24),f=i(18),p=i(11),g=i(19),m=i(4),v=i(7),y=v.encodeHTML,x=s.bind,_=s.each,b=Math.PI;t.exports=c.extend({type:"timeline.slider",init:function(t,e){this.api=e,this._axis,this._viewRect,this._timer,this._currentPointer,this._mainGroup,this._labelGroup},render:function(t,e,i,n){if(this.model=t,this.api=i,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var a=this._layout(t,i),o=this._createGroup("mainGroup"),r=this._createGroup("labelGroup"),s=this._axis=this._createAxis(a,t);t.formatTooltip=function(t){return y(s.scale.getLabel(t))},_(["AxisLine","AxisTick","Control","CurrentPointer"],function(e){this["_render"+e](a,o,s,t)},this),this._renderAxisLabel(a,r,s,t),this._position(a,t)}this._doPlayStop()},remove:function(){this._clearTimer(),this.group.removeAll()},dispose:function(){this._clearTimer()},_layout:function(t,e){var i=t.get("label.normal.position"),a=t.get("orient"),o=n(t,e);null==i||"auto"===i?i="horizontal"===a?o.y+o.height/2<e.getHeight()/2?"-":"+":o.x+o.width/2<e.getWidth()/2?"+":"-":isNaN(i)&&(i={horizontal:{top:"-",bottom:"+"},vertical:{left:"-",right:"+"}}[a][i]);var r={horizontal:"center",vertical:i>=0||"+"===i?"left":"right"},s={horizontal:i>=0||"+"===i?"top":"bottom",vertical:"middle"},l={horizontal:0,vertical:b/2},u="vertical"===a?o.height:o.width,c=t.getModel("controlStyle"),h=c.get("show"),d=h?c.get("itemSize"):0,f=h?c.get("itemGap"):0,p=d+f,g=t.get("label.normal.rotate")||0;g=g*b/180;var m,v,y,x,_=c.get("position",!0),h=c.get("show",!0),w=h&&c.get("showPlayBtn",!0),S=h&&c.get("showPrevBtn",!0),M=h&&c.get("showNextBtn",!0),I=0,T=u;return"left"===_||"bottom"===_?(w&&(m=[0,0],I+=p),S&&(v=[I,0],I+=p),M&&(y=[T-d,0],T-=p)):(w&&(m=[T-d,0],T-=p),S&&(v=[0,0],I+=p),M&&(y=[T-d,0],T-=p)),x=[I,T],t.get("inverse")&&x.reverse(),{viewRect:o,mainLength:u,orient:a,rotation:l[a],labelRotation:g,labelPosOpt:i,labelAlign:r[a],labelBaseline:s[a],playPosition:m,prevBtnPosition:v,nextBtnPosition:y,axisExtent:x,controlSize:d,controlGap:f}},_position:function(t,e){function i(t){var e=t.position;t.origin=[h[0][0]-e[0],h[1][0]-e[1]]}function n(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function a(t,e,i,n,a){t[n]+=i[n][a]-e[n][a]}var o=this._mainGroup,r=this._labelGroup,s=t.viewRect;if("vertical"===t.orient){var l=g.create(),u=s.x,c=s.y+s.height;g.translate(l,l,[-u,-c]),g.rotate(l,l,-b/2),g.translate(l,l,[u,c]),s=s.clone(),s.applyTransform(l)}var h=n(s),d=n(o.getBoundingRect()),f=n(r.getBoundingRect()),p=o.position,m=r.position;m[0]=p[0]=h[0][0];var v=t.labelPosOpt;if(isNaN(v)){var y="+"===v?0:1;a(p,d,h,1,y),a(m,f,h,1,1-y)}else{var y=v>=0?0:1;a(p,d,h,1,y),m[1]=p[1]+v}o.attr("position",p),r.attr("position",m),o.rotation=r.rotation=t.rotation,i(o),i(r)},_createAxis:function(t,e){var i=e.getData(),n=e.get("axisType"),a=f.createScaleByModel(e,n),o=i.getDataExtent("value");a.setExtent(o[0],o[1]),this._customizeScale(a,i),a.niceTicks();var r=new h("value",a,t.axisExtent,n);return r.model=e,r},_customizeScale:function(t,e){t.getTicks=function(){return e.mapArray(["value"],function(t){return t})},t.getTicksLabels=function(){return s.map(this.getTicks(),t.getLabel,t)}},_createGroup:function(t){var e=this["_"+t]=new l.Group;return this.group.add(e),e},_renderAxisLine:function(t,e,i,n){var a=i.getExtent();n.get("lineStyle.show")&&e.add(new l.Line({shape:{x1:a[0],y1:0,x2:a[1],y2:0},style:s.extend({lineCap:"round"},n.getModel("lineStyle").getLineStyle()),silent:!0,z2:1}))},_renderAxisTick:function(t,e,i,n){var a=n.getData(),r=i.scale.getTicks();_(r,function(t,r){var s=i.dataToCoord(t),u=a.getItemModel(r),c=u.getModel("itemStyle.normal"),h=u.getModel("itemStyle.emphasis"),d={position:[s,0],onclick:x(this._changeTimeline,this,r)},f=o(u,c,e,d);l.setHoverStyle(f,h.getItemStyle()),u.get("tooltip")?(f.dataIndex=r,f.dataModel=n):f.dataIndex=f.dataModel=null},this)},_renderAxisLabel:function(t,e,i,n){var a=n.getModel("label.normal");if(a.get("show")){var o=n.getData(),r=i.scale.getTicks(),s=f.getFormattedLabels(i,a.get("formatter")),u=i.getLabelInterval();_(r,function(n,a){if(!i.isLabelIgnored(a,u)){var r=o.getItemModel(a),c=r.getModel("label.normal.textStyle"),h=r.getModel("label.emphasis.textStyle"),d=i.dataToCoord(n),f=new l.Text({style:{text:s[a],textAlign:t.labelAlign,textVerticalAlign:t.labelBaseline,textFont:c.getFont(),fill:c.getTextColor()},position:[d,0],rotation:t.labelRotation-t.rotation,onclick:x(this._changeTimeline,this,a),silent:!1});e.add(f),l.setHoverStyle(f,h.getItemStyle())}},this)}},_renderControl:function(t,e,i,n){function o(t,i,o,d){if(t){var f={position:t,origin:[r/2,0],rotation:d?-s:0,rectHover:!0,style:u,onclick:o},p=a(n,i,h,f);e.add(p),l.setHoverStyle(p,c)}}var r=t.controlSize,s=t.rotation,u=n.getModel("controlStyle.normal").getItemStyle(),c=n.getModel("controlStyle.emphasis").getItemStyle(),h=[0,-r/2,r,r],d=n.getPlayState(),f=n.get("inverse",!0);o(t.nextBtnPosition,"controlStyle.nextIcon",x(this._changeTimeline,this,f?"-":"+")),o(t.prevBtnPosition,"controlStyle.prevIcon",x(this._changeTimeline,this,f?"+":"-")),o(t.playPosition,"controlStyle."+(d?"stopIcon":"playIcon"),x(this._handlePlayClick,this,!d),!0)},_renderCurrentPointer:function(t,e,i,n){var a=n.getData(),s=n.getCurrentIndex(),l=a.getItemModel(s).getModel("checkpointStyle"),u=this,c={onCreate:function(t){t.draggable=!0,t.drift=x(u._handlePointerDrag,u),t.ondragend=x(u._handlePointerDragend,u),r(t,s,i,n,!0)},onUpdate:function(t){r(t,s,i,n)}};this._currentPointer=o(l,l,this._mainGroup,{},this._currentPointer,c)},_handlePlayClick:function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},_handlePointerDrag:function(t,e,i){this._clearTimer(),this._pointerChangeTimeline([i.offsetX,i.offsetY])},_handlePointerDragend:function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},_pointerChangeTimeline:function(t,e){var i=this._toAxisCoord(t)[0],n=this._axis,a=m.asc(n.getExtent().slice());i>a[1]&&(i=a[1]),i<a[0]&&(i=a[0]),this._currentPointer.position[0]=i,this._currentPointer.dirty();var o=this._findNearestTick(i),r=this.model;(e||o!==r.getCurrentIndex()&&r.get("realtime"))&&this._changeTimeline(o)},_doPlayStop:function(){function t(){var t=this.model;this._changeTimeline(t.getCurrentIndex()+(t.get("rewind",!0)?-1:1))}this._clearTimer(),this.model.getPlayState()&&(this._timer=setTimeout(x(t,this),this.model.get("playInterval")))},_toAxisCoord:function(t){var e=this._mainGroup.getLocalTransform();return l.applyTransform(t,e,!0)},_findNearestTick:function(t){var e,i=this.model.getData(),n=1/0,a=this._axis;return i.each(["value"],function(i,o){var r=a.dataToCoord(i),s=Math.abs(r-t);s<n&&(n=s,e=o)}),e},_clearTimer:function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},_changeTimeline:function(t){var e=this.model.getCurrentIndex();"+"===t?t=e+1:"-"===t&&(t=e-1),this.api.dispatchAction({type:"timelineChange",currentIndex:t,from:this.uid})}})},function(t,e,i){var n=i(1),a=i(33),o=i(18),r=function(t,e,i,n){a.call(this,t,e,i),this.type=n||"value",this._autoLabelInterval,this.model=null};r.prototype={constructor:r,getLabelInterval:function(){var t=this.model,e=t.getModel("label.normal"),i=e.get("interval");if(null!=i&&"auto"!=i)return i;var i=this._autoLabelInterval;return i||(i=this._autoLabelInterval=o.getAxisLabelInterval(n.map(this.scale.getTicks(),this.dataToCoord,this),o.getFormattedLabels(this,e.get("formatter")),e.getModel("textStyle").getFont(),"horizontal"===t.get("orient"))),i},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}}},n.inherits(r,a),t.exports=r},function(t,e,i){var n=i(13),a=i(14),o=i(1),r=i(5),s=n.extend({type:"timeline",layoutMode:"box",defaultOption:{zlevel:0,z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{normal:{},emphasis:{}},label:{normal:{textStyle:{color:"#000"}},emphasis:{}},data:[]},init:function(t,e,i){this._data,this._names,this.mergeDefaultAndTheme(t,i),this._initData()},mergeOption:function(t){s.superApply(this,"mergeOption",arguments),this._initData()},setCurrentIndex:function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},getCurrentIndex:function(){return this.option.currentIndex},isIndexMax:function(){return this.getCurrentIndex()>=this._data.count()-1},setPlayState:function(t){this.option.autoPlay=!!t},getPlayState:function(){return!!this.option.autoPlay},_initData:function(){var t=this.option,e=t.data||[],i=t.axisType,n=this._names=[];if("category"===i){var s=[];o.each(e,function(t,e){var i,a=r.getDataItemValue(t);o.isObject(t)?(i=o.clone(t),i.value=e):i=e,s.push(i),o.isString(a)||null!=a&&!isNaN(a)||(a=""),n.push(a+"")}),e=s}var l={category:"ordinal",time:"time"}[i]||"number",u=this._data=new a([{name:"value",type:l}],this);u.initData(e,n)},getData:function(){return this._data},getCategories:function(){if("category"===this.get("axisType"))return this._names.slice()}});t.exports=s},function(t,e,i){var n=i(65);t.exports=n.extend({type:"timeline"})},function(t,e,i){function n(t){var e=t.type,i={number:"value",time:"time"};if(i[e]&&(t.axisType=i[e],delete t.type),a(t),o(t,"controlPosition")){var n=t.controlStyle||(t.controlStyle={});o(n,"position")||(n.position=t.controlPosition),"none"!==n.position||o(n,"show")||(n.show=!1,delete n.position),delete t.controlPosition}r.each(t.data||[],function(t){r.isObject(t)&&!r.isArray(t)&&(!o(t,"value")&&o(t,"name")&&(t.value=t.name),a(t))})}function a(t){var e=t.itemStyle||(t.itemStyle={}),i=e.emphasis||(e.emphasis={}),n=t.label||t.label||{},a=n.normal||(n.normal={}),s={normal:1,emphasis:1};r.each(n,function(t,e){s[e]||o(a,e)||(a[e]=t)}),i.label&&!o(n,"emphasis")&&(n.emphasis=i.label,delete i.label)}function o(t,e){return t.hasOwnProperty(e)}var r=i(1);t.exports=function(t){var e=t&&t.timeline;r.isArray(e)||(e=e?[e]:[]),r.each(e,function(t){t&&n(t)})}},function(t,e,i){var n=i(2),a=i(1);n.registerAction({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},function(t,e){var i=e.getComponent("timeline");return i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get("loop",!0)&&i.isIndexMax()&&i.setPlayState(!1)),e.resetOption("timeline"),a.defaults({currentIndex:i.option.currentIndex},t)}),n.registerAction({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},function(t,e){var i=e.getComponent("timeline");i&&null!=t.playState&&i.setPlayState(t.playState)})},function(t,e,i){i(13).registerSubTypeDefaulter("timeline",function(){return"slider"})},function(t,e,i){"use strict";function n(t,e,i){this.model=t,this.ecModel=e,this.api=i,this._brushType,this._brushMode}var a=i(29),o=i(1);n.defaultOption={show:!0,type:["rect","polygon","lineX","lineY","keep","clear"],icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}};var r=n.prototype;r.render=r.updateView=r.updateLayout=function(t,e,i){var n,a,r;e.eachComponent({mainType:"brush"},function(t){n=t.brushType,a=t.brushOption.brushMode||"single",r|=t.areas.length}),this._brushType=n,this._brushMode=a,o.each(t.get("type",!0),function(e){t.setIconStatus(e,("keep"===e?"multiple"===a:"clear"===e?r:e===n)?"emphasis":"normal")})},r.getIcons=function(){var t=this.model,e=t.get("icon",!0),i={};return o.each(t.get("type",!0),function(t){e[t]&&(i[t]=e[t])}),i},r.onclick=function(t,e,i){var e=this.api,n=this._brushType,a=this._brushMode;"clear"===i?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===i?n:n!==i&&i,brushMode:"keep"===i?"multiple"===a?"single":"multiple":a}})},a.register("brush",n),t.exports=n},function(t,e,i){i(392),i(393)},function(t,e,i){function n(t,e,i){if(i[0]===i[1])return i.slice();for(var n=200,a=(i[1]-i[0])/n,o=i[0],r=[],s=0;s<=n&&o<i[1];s++)r.push(o),o+=a;return r.push(i[1]),r}var a=i(253),o=i(1),r=i(4),s=[20,140],l=a.extend({type:"visualMap.continuous",defaultOption:{align:"auto",calculable:!1,range:null,realtime:!0,itemHeight:null,itemWidth:null,hoverLink:!0,hoverLinkDataSize:null,hoverLinkOnHandle:!0},optionUpdated:function(t,e){l.superApply(this,"optionUpdated",arguments),this.resetTargetSeries(),this.resetExtent(),this.resetVisual(function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()}),this._resetRange()},resetItemSize:function(){l.superApply(this,"resetItemSize",arguments);var t=this.itemSize;"horizontal"===this._orient&&t.reverse(),(null==t[0]||isNaN(t[0]))&&(t[0]=s[0]),(null==t[1]||isNaN(t[1]))&&(t[1]=s[1])},_resetRange:function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):o.isArray(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},completeVisualOption:function(){a.prototype.completeVisualOption.apply(this,arguments),o.each(this.stateList,function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=0)},this)},setSelected:function(t){this.option.range=t.slice(),this._resetRange()},getSelected:function(){var t=this.getExtent(),e=r.asc((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]<t[0]&&(e[0]=t[0]),e[1]<t[0]&&(e[1]=t[0]),e},getValueState:function(t){var e=this.option.range,i=this.getExtent();return(e[0]<=i[0]||e[0]<=t)&&(e[1]>=i[1]||t<=e[1])?"inRange":"outOfRange"},findTargetDataIndices:function(t){var e=[];return this.eachTargetSeries(function(i){var n=[],a=i.getData();a.each(this.getDataDimension(a),function(e,i){t[0]<=e&&e<=t[1]&&n.push(i)},!0,this),e.push({seriesId:i.id,dataIndex:n})},this),e},getVisualMeta:function(t){function e(e,i){o.push({value:e,color:t(e,i)})}for(var i=n(this,"outOfRange",this.getExtent()),a=n(this,"inRange",this.option.range.slice()),o=[],r=0,s=0,l=a.length,u=i.length;s<u&&(!a.length||i[s]<=a[0]);s++)i[s]<a[r]&&e(i[s],"outOfRange");for(var c=1;r<l;r++,c=0)c&&o.length&&e(a[r],"outOfRange"),e(a[r],"inRange");for(var c=1;s<u;s++)(!a.length||a[a.length-1]<i[s])&&(c&&(o.length&&e(o[o.length-1].value,"outOfRange"),c=0),e(i[s],"outOfRange"));var h=o.length;return{stops:o,outerColors:[h?o[0].color:"transparent",h?o[h-1].color:"transparent"]}}});t.exports=l},function(t,e,i){function n(t,e,i,n){return new u.Polygon({shape:{points:t},draggable:!!i,cursor:e,drift:i,onmousemove:function(t){m.stop(t.event)},ondragend:n})}function a(t,e){return 0===t?[[0,0],[e,0],[e,-e]]:[[0,0],[e,0],[e,e]]}function o(t,e,i,n){return t?[[0,-x(e,_(i,0))],[w,0],[0,x(e,_(n-i,0))]]:[[0,0],[5,-5],[5,5]]}function r(t,e,i){var n=b/2,a=t.get("hoverLinkDataSize");return a&&(n=v(a,e,i,!0)/2),n}function s(t){return!t.get("realtime")&&t.get("hoverLinkOnHandle")}var l=i(254),u=i(3),c=i(1),h=i(4),d=i(56),f=i(100),p=i(255),g=i(5),m=i(21),v=h.linearMap,y=c.each,x=Math.min,_=Math.max,b=12,w=6,S=l.extend({type:"visualMap.continuous",init:function(){S.superApply(this,"init",arguments),this._shapes={},this._dataInterval=[],this._handleEnds=[],this._orient,this._useHandle,this._hoverLinkDataIndices=[],this._dragging,this._hovering},doRender:function(t,e,i,n){n&&"selectDataRange"===n.type&&n.from===this.uid||this._buildView()},_buildView:function(){this.group.removeAll();var t=this.visualMapModel,e=this.group;this._orient=t.get("orient"),this._useHandle=t.get("calculable"),this._resetInterval(),this._renderBar(e);var i=t.get("text");this._renderEndsText(e,i,0),this._renderEndsText(e,i,1),this._updateView(!0),this.renderBackground(e),this._updateView(),this._enableHoverLinkToSeries(),this._enableHoverLinkFromSeries(),this.positionGroup(e)},_renderEndsText:function(t,e,i){if(e){var n=e[1-i];n=null!=n?n+"":"";var a=this.visualMapModel,o=a.get("textGap"),r=a.itemSize,s=this._shapes.barGroup,l=this._applyTransform([r[0]/2,0===i?-o:r[1]+o],s),c=this._applyTransform(0===i?"bottom":"top",s),h=this._orient,d=this.visualMapModel.textStyleModel;this.group.add(new u.Text({style:{x:l[0],y:l[1],textVerticalAlign:"horizontal"===h?"middle":c,textAlign:"horizontal"===h?c:"center",text:n,textFont:d.getFont(),fill:d.getTextColor()}}))}},_renderBar:function(t){var e=this.visualMapModel,i=this._shapes,a=e.itemSize,o=this._orient,r=this._useHandle,s=p.getItemAlign(e,this.api,a),l=i.barGroup=this._createBarGroup(s);l.add(i.outOfRange=n()),l.add(i.inRange=n(null,r?"move":null,c.bind(this._dragHandle,this,"all",!1),c.bind(this._dragHandle,this,"all",!0)));var u=e.textStyleModel.getTextRect("国"),h=_(u.width,u.height);r&&(i.handleThumbs=[],i.handleLabels=[],i.handleLabelPoints=[],this._createHandle(l,0,a,h,o,s),this._createHandle(l,1,a,h,o,s)),this._createIndicator(l,a,h,o),t.add(l)},_createHandle:function(t,e,i,o,r){var s=c.bind(this._dragHandle,this,e,!1),l=c.bind(this._dragHandle,this,e,!0),h=n(a(e,o),"move",s,l);h.position[0]=i[0],t.add(h);var d=this.visualMapModel.textStyleModel,f=new u.Text({draggable:!0,drift:s,onmousemove:function(t){m.stop(t.event)},ondragend:l,style:{x:0,y:0,text:"",textFont:d.getFont(),fill:d.getTextColor()}});this.group.add(f);var p=["horizontal"===r?o/2:1.5*o,"horizontal"===r?0===e?-(1.5*o):1.5*o:0===e?-o/2:o/2],g=this._shapes;g.handleThumbs[e]=h,g.handleLabelPoints[e]=p,g.handleLabels[e]=f},_createIndicator:function(t,e,i,a){var o=n([[0,0]],"move");o.position[0]=e[0],o.attr({invisible:!0,silent:!0}),t.add(o);var r=this.visualMapModel.textStyleModel,s=new u.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textFont:r.getFont(),fill:r.getTextColor()}});this.group.add(s);var l=["horizontal"===a?i/2:w+3,0],c=this._shapes;c.indicator=o,c.indicatorLabel=s,c.indicatorLabelPoint=l},_dragHandle:function(t,e,i,n){if(this._useHandle){if(this._dragging=!e,!e){var a=this._applyTransform([i,n],this._shapes.barGroup,!0);this._updateInterval(t,a[1]),this._updateView()}e===!this.visualMapModel.get("realtime")&&this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:this._dataInterval.slice()}),e?!this._hovering&&this._clearHoverLinkToSeries():s(this.visualMapModel)&&this._doHoverLinkToSeries(this._handleEnds[t],!1)}},_resetInterval:function(){var t=this.visualMapModel,e=this._dataInterval=t.getSelected(),i=t.getExtent(),n=[0,t.itemSize[1]];this._handleEnds=[v(e[0],i,n,!0),v(e[1],i,n,!0)]},_updateInterval:function(t,e){e=e||0;var i=this.visualMapModel,n=this._handleEnds,a=[0,i.itemSize[1]];d(e,n,a,t,0);var o=i.getExtent();this._dataInterval=[v(n[0],a,o,!0),v(n[1],a,o,!0)]},_updateView:function(t){var e=this.visualMapModel,i=e.getExtent(),n=this._shapes,a=[0,e.itemSize[1]],o=t?a:this._handleEnds,r=this._createBarVisual(this._dataInterval,i,o,"inRange"),s=this._createBarVisual(i,i,a,"outOfRange");n.inRange.setStyle({fill:r.barColor,opacity:r.opacity}).setShape("points",r.barPoints),n.outOfRange.setStyle({fill:s.barColor,opacity:s.opacity}).setShape("points",s.barPoints),this._updateHandle(o,r)},_createBarVisual:function(t,e,i,n){var a={forceState:n,convertOpacityToAlpha:!0},o=this._makeColorGradient(t,a),r=[this.getControllerVisual(t[0],"symbolSize",a),this.getControllerVisual(t[1],"symbolSize",a)],s=this._createBarPoints(i,r);return{barColor:new f(0,0,0,1,o),barPoints:s,handlesColor:[o[0].color,o[o.length-1].color]}},_makeColorGradient:function(t,e){var i=100,n=[],a=(t[1]-t[0])/i;n.push({color:this.getControllerVisual(t[0],"color",e),offset:0});for(var o=1;o<i;o++){var r=t[0]+a*o;if(r>t[1])break;n.push({color:this.getControllerVisual(r,"color",e),offset:o/i})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},_createBarPoints:function(t,e){var i=this.visualMapModel.itemSize;return[[i[0]-e[0],t[0]],[i[0],t[0]],[i[0],t[1]],[i[0]-e[1],t[1]]]},_createBarGroup:function(t){var e=this._orient,i=this.visualMapModel.get("inverse");return new u.Group("horizontal"!==e||i?"horizontal"===e&&i?{scale:"bottom"===t?[-1,1]:[1,1],rotation:-Math.PI/2}:"vertical"!==e||i?{scale:"left"===t?[1,1]:[-1,1]}:{scale:"left"===t?[1,-1]:[-1,-1]}:{scale:"bottom"===t?[1,1]:[-1,1],rotation:Math.PI/2})},_updateHandle:function(t,e){if(this._useHandle){var i=this._shapes,n=this.visualMapModel,a=i.handleThumbs,o=i.handleLabels;y([0,1],function(r){var s=a[r];s.setStyle("fill",e.handlesColor[r]),s.position[1]=t[r];var l=u.applyTransform(i.handleLabelPoints[r],u.getTransform(s,this.group));o[r].setStyle({x:l[0],y:l[1],text:n.formatValueText(this._dataInterval[r]),textVerticalAlign:"middle",textAlign:this._applyTransform("horizontal"===this._orient?0===r?"bottom":"top":"left",i.barGroup)})},this)}},_showIndicator:function(t,e,i,n){var a=this.visualMapModel,r=a.getExtent(),s=a.itemSize,l=[0,s[1]],c=v(t,r,l,!0),h=this._shapes,d=h.indicator;if(d){d.position[1]=c,d.attr("invisible",!1),d.setShape("points",o(!!i,n,c,s[1]));var f={convertOpacityToAlpha:!0},p=this.getControllerVisual(t,"color",f);d.setStyle("fill",p);var g=u.applyTransform(h.indicatorLabelPoint,u.getTransform(d,this.group)),m=h.indicatorLabel;m.attr("invisible",!1);var y=this._applyTransform("left",h.barGroup),x=this._orient;m.setStyle({text:(i?i:"")+a.formatValueText(e),textVerticalAlign:"horizontal"===x?y:"middle",textAlign:"horizontal"===x?"center":y,x:g[0],y:g[1]})}},_enableHoverLinkToSeries:function(){var t=this;this._shapes.barGroup.on("mousemove",function(e){if(t._hovering=!0,!t._dragging){var i=t.visualMapModel.itemSize,n=t._applyTransform([e.offsetX,e.offsetY],t._shapes.barGroup,!0,!0);n[1]=x(_(0,n[1]),i[1]),t._doHoverLinkToSeries(n[1],0<=n[0]&&n[0]<=i[0])}}).on("mouseout",function(){t._hovering=!1,!t._dragging&&t._clearHoverLinkToSeries()})},_enableHoverLinkFromSeries:function(){var t=this.api.getZr();this.visualMapModel.option.hoverLink?(t.on("mouseover",this._hoverLinkFromSeriesMouseOver,this),t.on("mouseout",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},_doHoverLinkToSeries:function(t,e){var i=this.visualMapModel,n=i.itemSize;if(i.option.hoverLink){var a=[0,n[1]],o=i.getExtent();t=x(_(a[0],t),a[1]);var l=r(i,o,a),u=[t-l,t+l],c=v(t,a,o,!0),h=[v(u[0],a,o,!0),v(u[1],a,o,!0)];u[0]<a[0]&&(h[0]=-(1/0)),u[1]>a[1]&&(h[1]=1/0),e&&(h[0]===-(1/0)?this._showIndicator(c,h[1],"< ",l):h[1]===1/0?this._showIndicator(c,h[0],"> ",l):this._showIndicator(c,c,"≈ ",l));var d=this._hoverLinkDataIndices,f=[];(e||s(i))&&(f=this._hoverLinkDataIndices=i.findTargetDataIndices(h));var m=g.compressBatches(d,f);this._dispatchHighDown("downplay",p.convertDataIndex(m[0])),this._dispatchHighDown("highlight",p.convertDataIndex(m[1]))}},_hoverLinkFromSeriesMouseOver:function(t){var e=t.target,i=this.visualMapModel;if(e&&null!=e.dataIndex){var n=this.ecModel.getSeriesByIndex(e.seriesIndex);if(i.isTargetSeries(n)){var a=n.getData(e.dataType),o=a.getDimension(i.getDataDimension(a)),r=a.get(o,e.dataIndex,!0);isNaN(r)||this._showIndicator(r,r)}}},_hideIndicator:function(){var t=this._shapes;t.indicator&&t.indicator.attr("invisible",!0),t.indicatorLabel&&t.indicatorLabel.attr("invisible",!0)},_clearHoverLinkToSeries:function(){this._hideIndicator();var t=this._hoverLinkDataIndices;this._dispatchHighDown("downplay",p.convertDataIndex(t)),t.length=0},_clearHoverLinkFromSeries:function(){this._hideIndicator();var t=this.api.getZr();t.off("mouseover",this._hoverLinkFromSeriesMouseOver),t.off("mouseout",this._hideIndicator)},_applyTransform:function(t,e,i,n){var a=u.getTransform(e,n?null:this.group);return u[c.isArray(t)?"applyTransform":"transformDirection"](t,a,i)},_dispatchHighDown:function(t,e){
+e&&e.length&&this.api.dispatchAction({type:t,batch:e})},dispose:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},remove:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()}});t.exports=S},function(t,e,i){function n(t,e){var i=t.inverse;("vertical"===t.orient?!i:i)&&e.reverse()}var a=i(253),o=i(1),r=i(83),s=i(266),l=i(4).reformIntervals,u=a.extend({type:"visualMap.piecewise",defaultOption:{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieceList:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0,showLabel:null},optionUpdated:function(t,e){u.superApply(this,"optionUpdated",arguments),this._pieceList=[],this.resetTargetSeries(),this.resetExtent();var i=this._mode=this._determineMode();c[this._mode].call(this),this._resetSelected(t,e);var n=this.option.categories;this.resetVisual(function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=o.clone(n)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=o.map(this._pieceList,function(t){var t=o.clone(t);return"inRange"!==e&&(t.visual=null),t}))})},completeVisualOption:function(){function t(t,e,i){return t&&t[e]&&(o.isObject(t[e])?t[e].hasOwnProperty(i):t[e]===i)}var e=this.option,i={},n=r.listVisualTypes(),l=this.isCategory();o.each(e.pieces,function(t){o.each(n,function(e){t.hasOwnProperty(e)&&(i[e]=1)})}),o.each(i,function(i,n){var a=0;o.each(this.stateList,function(i){a|=t(e,i,n)||t(e.target,i,n)},this),!a&&o.each(this.stateList,function(t){(e[t]||(e[t]={}))[n]=s.get(n,"inRange"===t?"active":"inactive",l)})},this),a.prototype.completeVisualOption.apply(this,arguments)},_resetSelected:function(t,e){var i=this.option,n=this._pieceList,a=(e?i:t).selected||{};if(i.selected=a,o.each(n,function(t,e){var i=this.getSelectedMapKey(t);a.hasOwnProperty(i)||(a[i]=!0)},this),"single"===i.selectedMode){var r=!1;o.each(n,function(t,e){var i=this.getSelectedMapKey(t);a[i]&&(r?a[i]=!1:r=!0)},this)}},getSelectedMapKey:function(t){return"categories"===this._mode?t.value+"":t.index+""},getPieceList:function(){return this._pieceList},_determineMode:function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},setSelected:function(t){this.option.selected=o.clone(t)},getValueState:function(t){var e=r.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},findTargetDataIndices:function(t){var e=[];return this.eachTargetSeries(function(i){var n=[],a=i.getData();a.each(this.getDataDimension(a),function(e,i){var a=r.findPieceIndex(e,this._pieceList);a===t&&n.push(i)},!0,this),e.push({seriesId:i.id,dataIndex:n})},this),e},getRepresentValue:function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var i=t.interval||[];e=i[0]===-(1/0)&&i[1]===1/0?0:(i[0]+i[1])/2}return e},getVisualMeta:function(t){function e(e,o){var r=a.getRepresentValue({interval:e});o||(o=a.getValueState(r));var s=t(r,o);e[0]===-(1/0)?n[0]=s:e[1]===1/0?n[1]=s:i.push({value:e[0],color:s},{value:e[1],color:s})}if(!this.isCategory()){var i=[],n=[],a=this,r=this._pieceList.slice();if(r.length){var s=r[0].interval[0];s!==-(1/0)&&r.unshift({interval:[-(1/0),s]}),s=r[r.length-1].interval[1],s!==1/0&&r.push({interval:[s,1/0]})}else r.push({interval:[-(1/0),1/0]});var l=-(1/0);return o.each(r,function(t){var i=t.interval;i&&(i[0]>l&&e([l,i[0]],"outOfRange"),e(i.slice()),l=i[1])},this),{stops:i,outerColors:n}}}}),c={splitNumber:function(){var t=this.option,e=this._pieceList,i=t.precision,n=this.getExtent(),a=t.splitNumber;a=Math.max(parseInt(a,10),1),t.splitNumber=a;for(var r=(n[1]-n[0])/a;+r.toFixed(i)!==r&&i<5;)i++;t.precision=i,r=+r.toFixed(i);var s=0;t.minOpen&&e.push({index:s++,interval:[-(1/0),n[0]],close:[0,0]});for(var u=n[0],c=s+a;s<c;u+=r){var h=s===a-1?n[1]:u+r;e.push({index:s++,interval:[u,h],close:[1,1]})}t.maxOpen&&e.push({index:s++,interval:[n[1],1/0],close:[0,0]}),l(e),o.each(e,function(t){t.text=this.formatValueText(t.interval)},this)},categories:function(){var t=this.option;o.each(t.categories,function(t){this._pieceList.push({text:this.formatValueText(t,!0),value:t})},this),n(t,this._pieceList)},pieces:function(){var t=this.option,e=this._pieceList;o.each(t.pieces,function(t,i){o.isObject(t)||(t={value:t});var n={text:"",index:i};if(null!=t.label&&(n.text=t.label),t.hasOwnProperty("value")){var a=n.value=t.value;n.interval=[a,a],n.close=[1,1]}else{for(var s=n.interval=[],l=n.close=[0,0],u=[1,0,1],c=[-(1/0),1/0],h=[],d=0;d<2;d++){for(var f=[["gte","gt","min"],["lte","lt","max"]][d],p=0;p<3&&null==s[d];p++)s[d]=t[f[p]],l[d]=u[p],h[d]=2===p;null==s[d]&&(s[d]=c[d])}h[0]&&s[1]===1/0&&(l[0]=0),h[1]&&s[0]===-(1/0)&&(l[1]=0),s[0]===s[1]&&l[0]&&l[1]&&(n.value=s[0])}n.visual=r.retrieveVisuals(t),e.push(n)},this),n(t,e),l(e),o.each(e,function(t){var e=t.close,i=[["<","≤"][e[1]],[">","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,i)},this)}};t.exports=u},function(t,e,i){var n=i(254),a=i(1),o=i(3),r=i(24),s=i(12),l=i(255),u=n.extend({type:"visualMap.piecewise",doRender:function(){function t(t){var r=t.piece,s=new o.Group;s.onclick=a.bind(this._onItemClick,this,r),this._enableHoverLink(s,t.indexInModelPieceList);var d=i.getRepresentValue(r);if(this._createItemSymbol(s,d,[0,0,h[0],h[1]]),p){var f=this.visualMapModel.getValueState(d);s.add(new o.Text({style:{x:"right"===c?-n:h[0]+n,y:h[1]/2,text:r.text,textVerticalAlign:"middle",textAlign:c,textFont:l,fill:u,opacity:"outOfRange"===f?.5:1}}))}e.add(s)}var e=this.group;e.removeAll();var i=this.visualMapModel,n=i.get("textGap"),r=i.textStyleModel,l=r.getFont(),u=r.getTextColor(),c=this._getItemAlign(),h=i.itemSize,d=this._getViewData(),f=d.endsText,p=a.retrieve(i.get("showLabel",!0),!f);f&&this._renderEndsText(e,f[0],h,p,c),a.each(d.viewPieceList,t,this),f&&this._renderEndsText(e,f[1],h,p,c),s.box(i.get("orient"),e,i.get("itemGap")),this.renderBackground(e),this.positionGroup(e)},_enableHoverLink:function(t,e){function i(t){var i=this.visualMapModel;i.option.hoverLink&&this.api.dispatchAction({type:t,batch:l.convertDataIndex(i.findTargetDataIndices(e))})}t.on("mouseover",a.bind(i,this,"highlight")).on("mouseout",a.bind(i,this,"downplay"))},_getItemAlign:function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return l.getItemAlign(t,this.api,t.itemSize);var i=e.align;return i&&"auto"!==i||(i="left"),i},_renderEndsText:function(t,e,i,n,a){if(e){var r=new o.Group,s=this.visualMapModel.textStyleModel;r.add(new o.Text({style:{x:n?"right"===a?i[0]:0:i[0]/2,y:i[1]/2,textVerticalAlign:"middle",textAlign:n?a:"center",text:e,textFont:s.getFont(),fill:s.getTextColor()}})),t.add(r)}},_getViewData:function(){var t=this.visualMapModel,e=a.map(t.getPieceList(),function(t,e){return{piece:t,indexInModelPieceList:e}}),i=t.get("text"),n=t.get("orient"),o=t.get("inverse");return("horizontal"===n?o:!o)?e.reverse():i&&(i=i.slice().reverse()),{viewPieceList:e,endsText:i}},_createItemSymbol:function(t,e,i){t.add(r.createSymbol(this.getControllerVisual(e,"symbol"),i[0],i[1],i[2],i[3],this.getControllerVisual(e,"color")))},_onItemClick:function(t){var e=this.visualMapModel,i=e.option,n=a.clone(i.selected),o=e.getSelectedMapKey(t);"single"===i.selectedMode?(n[o]=!0,a.each(n,function(t,e){n[e]=e===o})):n[o]=!n[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:n})}});t.exports=u},function(t,e,i){i(2).registerPreprocessor(i(256)),i(257),i(258),i(388),i(389),i(259)},function(t,e,i){i(2).registerPreprocessor(i(256)),i(257),i(258),i(390),i(391),i(259)},function(t,e,i){"use strict";function n(t,e,i){this._model=t}function a(t,e,i,n){var a=i.calendarModel,o=i.seriesModel,r=a?a.coordinateSystem:o?o.coordinateSystem:null;return r===this?r[t](n):null}var o=i(12),r=i(4),s=i(1),l=864e5;n.prototype={constructor:n,type:"calendar",dimensions:["time","value"],getDimensionsInfo:function(){return[{name:"time",type:"time"}]},getRangeInfo:function(){return this._rangeInfo},getModel:function(){return this._model},getRect:function(){return this._rect},getCellWidth:function(){return this._sw},getCellHeight:function(){return this._sh},getOrient:function(){return this._orient},getFirstDayOfWeek:function(){return this._firstDayOfWeek},getDateInfo:function(t){t=r.parseDate(t);var e=t.getFullYear(),i=t.getMonth()+1;i=i<10?"0"+i:i;var n=t.getDate();n=n<10?"0"+n:n;var a=t.getDay();return a=Math.abs((a+7-this.getFirstDayOfWeek())%7),{y:e,m:i,d:n,day:a,time:t.getTime(),formatedDate:e+"-"+i+"-"+n,date:t}},getNextNDay:function(t,e){if(e=e||0,0===e)return this.getDateInfo(t);var i=this.getDateInfo(t).time;return this.getDateInfo(i+l*e)},update:function(t,e){function i(t,e){return null!=t[e]&&"auto"!==t[e]}this._firstDayOfWeek=this._model.getModel("dayLabel").get("firstDay"),this._orient=this._model.get("orient"),this._lineWidth=this._model.getModel("itemStyle.normal").getItemStyle().lineWidth||0,this._rangeInfo=this._getRangeInfo(this._initRangeOption());var n=this._rangeInfo.weeks||1,a=["width","height"],r=this._model.get("cellSize").slice(),l=this._model.getBoxLayoutParams(),u="horizontal"===this._orient?[n,7]:[7,n];s.each([0,1],function(t){i(r,t)&&(l[a[t]]=r[t]*u[t])});var c={width:e.getWidth(),height:e.getHeight()},h=this._rect=o.getLayoutRect(l,c);s.each([0,1],function(t){i(r,t)||(r[t]=h[a[t]]/u[t])}),this._sw=r[0],this._sh=r[1]},dataToPoint:function(t,e){s.isArray(t)&&(t=t[0]),null==e&&(e=!0);var i=this.getDateInfo(t),n=this._rangeInfo,a=i.formatedDate;if(e&&!(i.time>=n.start.time&&i.time<=n.end.time))return[NaN,NaN];var o=i.day,r=this._getRangeInfo([n.start.time,a]).weeks;return"vertical"===this._orient?[this._rect.x+o*this._sw+this._sw/2,this._rect.y+(r-1)*this._sh+this._sh/2]:[this._rect.x+(r-1)*this._sw+this._sw/2,this._rect.y+o*this._sh+this._sh/2]},pointToData:function(t){var e=this.pointToDate(t);return e&&e.time},dataToRect:function(t,e){var i=this.dataToPoint(t,e);return{contentShape:{x:i[0]-(this._sw-this._lineWidth)/2,y:i[1]-(this._sh-this._lineWidth)/2,width:this._sw-this._lineWidth,height:this._sh-this._lineWidth},center:i,tl:[i[0]-this._sw/2,i[1]-this._sh/2],tr:[i[0]+this._sw/2,i[1]-this._sh/2],br:[i[0]+this._sw/2,i[1]+this._sh/2],bl:[i[0]-this._sw/2,i[1]+this._sh/2]}},pointToDate:function(t){var e=Math.floor((t[0]-this._rect.x)/this._sw)+1,i=Math.floor((t[1]-this._rect.y)/this._sh)+1,n=this._rangeInfo.range;return"vertical"===this._orient?this._getDateByWeeksAndDay(i,e-1,n):this._getDateByWeeksAndDay(e,i-1,n)},convertToPixel:s.curry(a,"dataToPoint"),convertFromPixel:s.curry(a,"pointToData"),_initRangeOption:function(){var t=this._model.get("range"),e=t;if(s.isArray(e)&&1===e.length&&(e=e[0]),/^\d{4}$/.test(e)&&(t=[e+"-01-01",e+"-12-31"]),/^\d{4}[\/|-]\d{1,2}$/.test(e)){var i=this.getDateInfo(e),n=i.date;n.setMonth(n.getMonth()+1);var a=this.getNextNDay(n,-1);t=[i.formatedDate,a.formatedDate]}/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(e)&&(t=[e,e]);var o=this._getRangeInfo(t);return o.start.time>o.end.time&&t.reverse(),t},_getRangeInfo:function(t){var e=this.getDateInfo(t[0]),i=this.getDateInfo(t[1]),n=Math.floor(i.time/l)-Math.floor(e.time/l)+1,a=Math.floor((n+e.day+6)/7);return{range:[e.formatedDate,i.formatedDate],start:e,end:i,allDay:n,weeks:a,fweek:e.day,lweek:i.day}},_getDateByWeeksAndDay:function(t,e,i){var n=this._getRangeInfo(i);if(t>n.weeks||0===t&&e<n.fweek||t===n.weeks&&e>n.lweek)return!1;var a=7*(t-1)-n.fweek+e,o=n.start.time+a*l;return this.getDateInfo(o)}},n.dimensions=n.prototype.dimensions,n.getDimensionsInfo=n.prototype.getDimensionsInfo,n.create=function(t,e){var i=[];return t.eachComponent("calendar",function(a){var o=new n(a,t,e);i.push(o),a.coordinateSystem=o}),t.eachSeries(function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])}),i},i(26).register("calendar",n),t.exports=n},function(t,e,i){"use strict";function n(t,e){var i=t.cellSize;o.isArray(i)?1===i.length&&(i[1]=i[0]):i=t.cellSize=[i,i];var n=o.map([0,1],function(t){return r.sizeCalculable(e,t)&&(i[t]="auto"),null!=i[t]&&"auto"!==i[t]});r.mergeLayoutParam(t,e,{type:"box",ignoreSize:n})}var a=i(13),o=i(1),r=i(12),s=a.extend({type:"calendar",coordinateSystem:null,defaultOption:{zlevel:0,z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{normal:{color:"#fff",borderWidth:1,borderColor:"#ccc"}},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",nameMap:"en",textStyle:{color:"#000"}},monthLabel:{show:!0,position:"start",margin:5,align:"center",nameMap:"en",formatter:null,textStyle:{color:"#000"}},yearLabel:{show:!0,position:null,margin:30,formatter:null,textStyle:{color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}}},init:function(t,e,i,a){var o=r.getLayoutParams(t);s.superApply(this,"init",arguments),n(t,o)},mergeOption:function(t,e){s.superApply(this,"mergeOption",arguments),n(this.option,t)}});t.exports=s},function(t,e,i){function n(t){var e=t.getRect(),i=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:i.start,end:i.end,weeks:i.weeks,dayCount:i.allDay}},api:{coord:a.bind(t.dataToPoint,t)}}}var a=i(1);t.exports=n},function(t,e,i){function n(t,e){return e=e||[0,0],o.map(["x","y"],function(i,n){var a=this.getAxis(i),o=e[n],r=t[n]/2;return"category"===a.type?a.getBandWidth():Math.abs(a.dataToCoord(o-r)-a.dataToCoord(o+r))},this)}function a(t){var e=t.grid.getRect();return{coordSys:{type:"cartesian2d",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:o.bind(t.dataToPoint,t),size:o.bind(n,t)}}}var o=i(1);t.exports=a},function(t,e,i){function n(t,e,i,n,a){l.call(this,t),this.map=e,this._nameCoordMap=r.createHashMap(),this.loadGeoJson(i,n,a)}function a(t,e,i,n){var a=i.geoModel,o=i.seriesModel,r=a?a.coordinateSystem:o?o.coordinateSystem||(o.getReferringComponents("geo")[0]||{}).coordinateSystem:null;return r===this?r[t](n):null}var o=i(262),r=i(1),s=i(11),l=i(260),u=[i(401),i(402),i(400)];n.prototype={constructor:n,type:"geo",dimensions:["lng","lat"],containCoord:function(t){for(var e=this.regions,i=0;i<e.length;i++)if(e[i].contain(t))return!0;return!1},loadGeoJson:function(t,e,i){try{this.regions=t?o(t):[]}catch(n){throw"Invalid geoJson format\n"+n.message}e=e||{},i=i||{};for(var a=this.regions,s=r.createHashMap(),l=0;l<a.length;l++){var c=a[l].name;c=i.hasOwnProperty(c)?i[c]:c,a[l].name=c,s.set(c,a[l]),this.addGeoCoord(c,a[l].center);var h=e[c];h&&a[l].transformTo(h.left,h.top,h.width,h.height)}this._regionsMap=s,this._rect=null,r.each(u,function(t){t(this)},this)},transformTo:function(t,e,i,n){var a=this.getBoundingRect();a=a.clone(),a.y=-a.y-a.height;var o=this._viewTransform;o.transform=a.calculateTransform(new s(t,e,i,n)),o.decomposeTransform();var r=o.scale;r[1]=-r[1],o.updateTransform(),this._updateTransform()},getRegion:function(t){return this._regionsMap.get(t)},getRegionByCoord:function(t){for(var e=this.regions,i=0;i<e.length;i++)if(e[i].contain(t))return e[i]},addGeoCoord:function(t,e){this._nameCoordMap.set(t,e)},getGeoCoord:function(t){return this._nameCoordMap.get(t)},getBoundingRect:function(){if(this._rect)return this._rect;for(var t,e=this.regions,i=0;i<e.length;i++){var n=e[i].getBoundingRect();t=t||n.clone(),t.union(n)}return this._rect=t||new s(0,0,0,0)},dataToPoints:function(t){var e=[];return t.mapArray(["lng","lat"],function(t,i){return e[0]=t,e[1]=i,this.dataToPoint(e)},this)},dataToPoint:function(t){if("string"==typeof t&&(t=this.getGeoCoord(t)),t)return l.prototype.dataToPoint.call(this,t)},convertToPixel:r.curry(a,"dataToPoint"),convertFromPixel:r.curry(a,"pointToData")},r.mixin(n,l),t.exports=n},function(t,e,i){"use strict";var n=i(5),a=i(13),o=i(10),r=i(1),s=i(78),l=i(186),u=a.extend({type:"geo",coordinateSystem:null,layoutMode:"box",init:function(t){a.prototype.init.apply(this,arguments),n.defaultEmphasis(t.label,["position","show","textStyle","distance","formatter"])},optionUpdated:function(){var t=this.option,e=this;t.regions=l.getFilledRegions(t.regions,t.map),this._optionModelMap=r.reduce(t.regions||[],function(t,i){return i.name&&t.set(i.name,new o(i,e)),t},r.createHashMap()),this.updateSelectedMap(t.regions)},defaultOption:{zlevel:0,z:0,show:!0,left:"center",top:"center",aspectScale:.75,silent:!1,map:"",boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{normal:{show:!1,textStyle:{color:"#000"}},emphasis:{show:!0,textStyle:{color:"rgb(100,0,0)"}}},itemStyle:{normal:{borderWidth:.5,borderColor:"#444",color:"#eee"},emphasis:{color:"rgba(255,215,0,0.8)"}},regions:[]},getRegionModel:function(t){return this._optionModelMap.get(t)||new o(null,this,this.ecModel)},getFormattedLabel:function(t,e){var i=this.getRegionModel(t),n=i.get("label."+e+".formatter"),a={name:t};if("function"==typeof n)return a.status=e,n(a);if("string"==typeof n){var o=a.seriesName;return n.replace("{a}",null!=o?o:"")}},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t}});r.mixin(u,s),t.exports=u},function(t,e,i){var n=i(1),a={Russia:[100,60],"United States":[-99,38],"United States of America":[-99,38]};t.exports=function(t){n.each(t.regions,function(t){var e=a[t.name];if(e){var i=t.center;i[0]=e[0],i[1]=e[1]}})}},function(t,e,i){for(var n=i(261),a=i(1),o=[126,25],r=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],s=0;s<r.length;s++)for(var l=0;l<r[s].length;l++)r[s][l][0]/=10.5,r[s][l][1]/=-14,r[s][l][0]+=o[0],r[s][l][1]+=o[1];t.exports=function(t){"china"===t.map&&t.regions.push(new n("南海诸岛",a.map(r,function(t){return{type:"polygon",exterior:t}}),o))}},function(t,e,i){var n=i(1),a={"南海诸岛":[32,80],"广东":[0,-10],"香港":[10,5],"澳门":[-10,10],"天津":[5,5]};t.exports=function(t){n.each(t.regions,function(t){var e=a[t.name];if(e){var i=t.center;i[0]+=e[0]/10.5,i[1]+=-e[1]/14}})}},function(t,e,i){function n(t,e){return e=e||[0,0],o.map([0,1],function(i){var n=e[i],a=t[i]/2,o=[],r=[];return o[i]=n-a,r[i]=n+a,o[1-i]=r[1-i]=e[1-i],Math.abs(this.dataToPoint(o)[i]-this.dataToPoint(r)[i])},this)}function a(t){var e=t.getBoundingRect();return{coordSys:{type:"geo",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:o.bind(t.dataToPoint,t),size:o.bind(n,t)}}}var o=i(1);t.exports=a},function(t,e,i){function n(t,e){return e.type||(e.data?"category":"value")}var a=i(13),o=i(1),r=i(31),s=i(59),l=i(4),u=a.extend({type:"baseParallelAxis",axis:null,activeIntervals:[],getAreaSelectStyle:function(){return r([["fill","color"],["lineWidth","borderWidth"],["stroke","borderColor"],["width","width"],["opacity","opacity"]]).call(this.getModel("areaSelectStyle"))},setActiveIntervals:function(t){var e=this.activeIntervals=o.clone(t);if(e)for(var i=e.length-1;i>=0;i--)l.asc(e[i])},getActiveState:function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t)return"inactive";for(var i=0,n=e.length;i<n;i++)if(e[i][0]<=t&&t<=e[i][1])return"active";return"inactive"}}),c={type:"value",dim:null,areaSelectStyle:{width:20,borderWidth:1,borderColor:"rgba(160,197,232)",color:"rgba(160,197,232)",opacity:.3},realtime:!0,z:10};o.merge(u.prototype,i(42)),s("parallel",u,n,c),t.exports=u},function(t,e,i){function n(t,e,i){this._axesMap=u.createHashMap(),this._axesLayout={},this.dimensions=t.dimensions,this._rect,this._model=t,this._init(t,e,i)}function a(t,e){return m(v(t,e[0]),e[1])}function o(t,e){var i=e.layoutLength/(e.axisCount-1);return{position:i*t,axisNameAvailableWidth:i,axisLabelShow:!0}}function r(t,e){var i,n,a=e.layoutLength,o=e.axisExpandWidth,r=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,c=!1;return t<l[0]?(i=t*s,n=s):t<=l[1]?(i=e.axisExpandWindow0Pos+t*o-e.axisExpandWindow[0],u=o,c=!0):(i=a-(r-1-t)*s,n=s),{position:i,axisNameAvailableWidth:u,axisLabelShow:c,nameTruncateMaxWidth:n}}var s=i(12),l=i(18),u=i(1),c=i(406),h=i(3),d=i(19),f=i(4),p=i(56),g=u.each,m=Math.min,v=Math.max,y=Math.floor,x=Math.ceil,_=f.round,b=Math.PI;n.prototype={type:"parallel",constructor:n,_init:function(t,e,i){var n=t.dimensions,a=t.parallelAxisIndex;g(n,function(t,i){var n=a[i],o=e.getComponent("parallelAxis",n),r=this._axesMap.set(t,new c(t,l.createScaleByModel(o),[0,0],o.get("type"),n)),s="category"===r.type;r.onBand=s&&o.get("boundaryGap"),r.inverse=o.get("inverse"),o.axis=r,r.model=o,r.coordinateSystem=o.coordinateSystem=this},this)},update:function(t,e){this._updateAxesFromSeries(this._model,t)},containPoint:function(t){var e=this._makeLayoutInfo(),i=e.axisBase,n=e.layoutBase,a=e.pixelDimIndex,o=t[1-a],r=t[a];return o>=i&&o<=i+e.axisLength&&r>=n&&r<=n+e.layoutLength},_updateAxesFromSeries:function(t,e){e.eachSeries(function(i){if(t.contains(i,e)){var n=i.getData();g(this.dimensions,function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(n,t),l.niceScaleExtent(e.scale,e.model)},this)}},this)},resize:function(t,e){this._rect=s.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},getRect:function(){return this._rect},_makeLayoutInfo:function(){var t,e=this._model,i=this._rect,n=["x","y"],o=["width","height"],r=e.get("layout"),s="horizontal"===r?0:1,l=i[o[s]],u=[0,l],c=this.dimensions.length,h=a(e.get("axisExpandWidth"),u),d=a(e.get("axisExpandCount")||0,[0,c]),f=e.get("axisExpandable")&&c>3&&c>d&&d>1&&h>0&&l>0,p=e.get("axisExpandWindow");if(p)t=a(p[1]-p[0],u),p[1]=p[0]+t;else{t=a(h*(d-1),u);var g=e.get("axisExpandCenter")||y(c/2);p=[h*g-t/2],p[1]=p[0]+t}var m=(l-t)/(c-d);m<3&&(m=0);var v=[y(_(p[0]/h,1))+1,x(_(p[1]/h,1))-1],b=m/h*p[0];return{layout:r,pixelDimIndex:s,layoutBase:i[n[s]],layoutLength:l,axisBase:i[n[1-s]],axisLength:i[o[1-s]],axisExpandable:f,axisExpandWidth:h,axisCollapseWidth:m,axisExpandWindow:p,axisCount:c,winInnerIndices:v,axisExpandWindow0Pos:b}},_layoutAxes:function(){var t=this._rect,e=this._axesMap,i=this.dimensions,n=this._makeLayoutInfo(),a=n.layout;e.each(function(t){var e=[0,n.axisLength],i=t.inverse?1:0;t.setExtent(e[i],e[1-i])}),g(i,function(i,s){var l=(n.axisExpandable?r:o)(s,n),u={horizontal:{x:l.position,y:n.axisLength},vertical:{x:0,y:l.position}},c={horizontal:b/2,vertical:0},h=[u[a].x+t.x,u[a].y+t.y],f=c[a],p=d.create();d.rotate(p,p,f),d.translate(p,p,h),this._axesLayout[i]={position:h,rotation:f,transform:p,axisNameAvailableWidth:l.axisNameAvailableWidth,axisLabelShow:l.axisLabelShow,nameTruncateMaxWidth:l.nameTruncateMaxWidth,tickDirection:1,labelDirection:1,labelInterval:e.get(i).getLabelInterval()}},this)},getAxis:function(t){return this._axesMap.get(t)},dataToPoint:function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},eachActiveState:function(t,e,i){for(var n=this.dimensions,a=this._axesMap,o=this.hasAxisBrushed(),r=0,s=t.count();r<s;r++){var l,u=t.getValues(n,r);if(o){l="active";for(var c=0,h=n.length;c<h;c++){var d=n[c],f=a.get(d).model.getActiveState(u[c],c);if("inactive"===f){l="inactive";break}}}else l="normal";e.call(i,l,r)}},hasAxisBrushed:function(){for(var t=this.dimensions,e=this._axesMap,i=!1,n=0,a=t.length;n<a;n++)"normal"!==e.get(t[n]).model.getActiveState()&&(i=!0);return i},axisCoordToPoint:function(t,e){var i=this._axesLayout[e];return h.applyTransform([t,0],i.transform)},getAxisLayout:function(t){return u.clone(this._axesLayout[t])},getSlidedAxisExpandWindow:function(t){var e=this._makeLayoutInfo(),i=e.pixelDimIndex,n=e.axisExpandWindow.slice(),a=n[1]-n[0],o=[0,e.axisExpandWidth*(e.axisCount-1)];if(!this.containPoint(t))return{behavior:"none",axisExpandWindow:n};var r,s=t[i]-e.layoutBase-e.axisExpandWindow0Pos,l="slide",u=e.axisCollapseWidth,c=this._model.get("axisExpandSlideTriggerArea"),h=null!=c[0];if(u)h&&u&&s<a*c[0]?(l="jump",r=s-a*c[2]):h&&u&&s>a*(1-c[0])?(l="jump",r=s-a*(1-c[2])):(r=s-a*c[1])>=0&&(r=s-a*(1-c[1]))<=0&&(r=0),r*=e.axisExpandWidth/u,r?p(r,n,o,"all"):l="none";else{var a=n[1]-n[0],d=o[1]*s/a;n=[v(0,d-a/2)],n[1]=m(o[1],n[0]+a),n[0]=n[1]-a}return{axisExpandWindow:n,behavior:l}}},t.exports=n},function(t,e,i){var n=i(1),a=i(33),o=function(t,e,i,n,o){a.call(this,t,e,i),this.type=n||"value",this.axisIndex=o};o.prototype={constructor:o,model:null},n.inherits(o,a),t.exports=o},function(t,e,i){var n=i(1),a=i(13);i(404),a.extend({type:"parallel",dependencies:["parallelAxis"],coordinateSystem:null,dimensions:null,parallelAxisIndex:null,layoutMode:"box",defaultOption:{zlevel:0,z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},init:function(){a.prototype.init.apply(this,arguments),this.mergeOption({})},mergeOption:function(t){var e=this.option;t&&n.merge(e,t,!0),this._initDimensions()},contains:function(t,e){var i=t.get("parallelIndex");return null!=i&&e.getComponent("parallel",i)===this},setAxisExpand:function(t){n.each(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])},this)},_initDimensions:function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[],i=n.filter(this.dependentModels.parallelAxis,function(t){return t.get("parallelIndex")===this.componentIndex});n.each(i,function(i){t.push("dim"+i.get("dim")),e.push(i.componentIndex)})}})},function(t,e,i){function n(t){if(!t.parallel){var e=!1;o.each(t.series,function(t){t&&"parallel"===t.type&&(e=!0)}),e&&(t.parallel=[{}])}}function a(t){var e=r.normalizeToArray(t.parallelAxis);o.each(e,function(e){if(o.isObject(e)){var i=e.parallelIndex||0,n=r.normalizeToArray(t.parallel)[i];n&&n.parallelAxisDefault&&o.merge(e,n.parallelAxisDefault,!1)}})}var o=i(1),r=i(5);t.exports=function(t){n(t),a(t)}},function(t,e,i){"use strict";function n(t,e){e=e||[0,360],o.call(this,"angle",t,e),this.type="category"}var a=i(1),o=i(33);n.prototype={constructor:n,pointToData:function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},dataToAngle:o.prototype.dataToCoord,angleToData:o.prototype.coordToData},a.inherits(n,o),t.exports=n},function(t,e,i){"use strict";function n(t,e){return e.type||(e.data?"category":"value")}var a=i(1),o=i(13),r=i(59),s=o.extend({type:"polarAxis",axis:null,getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"polar",index:this.option.polarIndex,id:this.option.polarId})[0]}});a.merge(s.prototype,i(42));var l={angle:{startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:!1}},radius:{splitNumber:5}};r("angle",s,n,l.angle),r("radius",s,n,l.radius)},function(t,e,i){"use strict";var n=i(413),a=i(409),o=function(t){this.name=t||"",this.cx=0,this.cy=0,this._radiusAxis=new n,this._angleAxis=new a,this._radiusAxis.polar=this._angleAxis.polar=this};o.prototype={type:"polar",axisPointerEnabled:!0,constructor:o,dimensions:["radius","angle"],model:null,containPoint:function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},containData:function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},getAxis:function(t){return this["_"+t+"Axis"]},getAxes:function(){return[this._radiusAxis,this._angleAxis]},getAxesByScale:function(t){var e=[],i=this._angleAxis,n=this._radiusAxis;return i.scale.type===t&&e.push(i),n.scale.type===t&&e.push(n),e},getAngleAxis:function(){return this._angleAxis},getRadiusAxis:function(){return this._radiusAxis},getOtherAxis:function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},getTooltipAxes:function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},dataToPoints:function(t){return t.mapArray(this.dimensions,function(t,e){return this.dataToPoint([t,e])},!0,this)},dataToPoint:function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},pointToData:function(t,e){var i=this.pointToCoord(t);return[this._radiusAxis.radiusToData(i[0],e),this._angleAxis.angleToData(i[1],e)]},pointToCoord:function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=this.getAngleAxis(),a=n.getExtent(),o=Math.min(a[0],a[1]),r=Math.max(a[0],a[1]);n.inverse?o=r-360:r=o+360;var s=Math.sqrt(e*e+i*i);e/=s,i/=s;for(var l=Math.atan2(-i,e)/Math.PI*180,u=l<o?1:-1;l<o||l>r;)l+=360*u;return[s,l]},coordToPoint:function(t){var e=t[0],i=t[1]/180*Math.PI,n=Math.cos(i)*e+this.cx,a=-Math.sin(i)*e+this.cy;return[n,a]}},t.exports=o},function(t,e,i){"use strict";i(410),i(2).extendComponentModel({type:"polar",dependencies:["polarAxis","angleAxis"],coordinateSystem:null,findAxisModel:function(t){var e,i=this.ecModel;return i.eachComponent(t,function(t){t.getCoordSysModel()===this&&(e=t)},this),e},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"80%"}})},function(t,e,i){"use strict";function n(t,e){o.call(this,"radius",t,e),this.type="category"}var a=i(1),o=i(33);n.prototype={constructor:n,pointToData:function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},dataToRadius:o.prototype.dataToCoord,radiusToData:o.prototype.coordToData},a.inherits(n,o),t.exports=n},function(t,e,i){function n(t,e){return o.map(["Radius","Angle"],function(i,n){var a=this["get"+i+"Axis"](),o=e[n],r=t[n]/2,s="dataTo"+i,l="category"===a.type?a.getBandWidth():Math.abs(a[s](o-r)-a[s](o+r));return"Angle"===i&&(l=l*Math.PI/180),l},this)}function a(t){var e=t.getRadiusAxis(),i=t.getAngleAxis(),a=e.getExtent();return a[0]>a[1]&&a.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:a[1],r0:a[0]},api:{coord:o.bind(function(n){var a=e.dataToRadius(n[0]),o=i.dataToAngle(n[1]),r=t.coordToPoint([a,o]);return r.push(a,o*Math.PI/180),r}),size:o.bind(n,t)}}}var o=i(1);t.exports=a},function(t,e,i){function n(t,e,i){o.call(this,t,e,i),this.type="value",this.angle=0,this.name="",this.model}var a=i(1),o=i(33);a.inherits(n,o),t.exports=n},function(t,e,i){function n(t,e,i){this._model=t,this.dimensions=[],this._indicatorAxes=a.map(t.getIndicatorModels(),function(t,e){var i="indicator_"+e,n=new o(i,new r);return n.name=t.get("name"),n.model=t,t.axis=n,this.dimensions.push(i),n},this),this.resize(t,i),this.cx,this.cy,this.r,this.startAngle}var a=i(1),o=i(415),r=i(43),s=i(4),l=i(18);n.prototype.getIndicatorAxes=function(){return this._indicatorAxes},n.prototype.dataToPoint=function(t,e){var i=this._indicatorAxes[e];return this.coordToPoint(i.dataToCoord(t),e)},n.prototype.coordToPoint=function(t,e){var i=this._indicatorAxes[e],n=i.angle,a=this.cx+t*Math.cos(n),o=this.cy-t*Math.sin(n);return[a,o]},n.prototype.pointToData=function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=Math.sqrt(e*e+i*i);e/=n,i/=n;for(var a,o=Math.atan2(-i,e),r=1/0,s=-1,l=0;l<this._indicatorAxes.length;l++){var u=this._indicatorAxes[l],c=Math.abs(o-u.angle);c<r&&(a=u,s=l,r=c)}return[s,+(a&&a.coodToData(n))]},n.prototype.resize=function(t,e){var i=t.get("center"),n=e.getWidth(),o=e.getHeight(),r=Math.min(n,o)/2;this.cx=s.parsePercent(i[0],n),this.cy=s.parsePercent(i[1],o),this.startAngle=t.get("startAngle")*Math.PI/180,this.r=s.parsePercent(t.get("radius"),r),a.each(this._indicatorAxes,function(t,e){t.setExtent(0,this.r);var i=this.startAngle+e*Math.PI*2/this._indicatorAxes.length;
+i=Math.atan2(Math.sin(i),Math.cos(i)),t.angle=i},this)},n.prototype.update=function(t,e){function i(t){var e=Math.pow(10,Math.floor(Math.log(t)/Math.LN10)),i=t/e;return 2===i?i=5:i*=2,i*e}var n=this._indicatorAxes,o=this._model;a.each(n,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeriesByType("radar",function(e,i){if("radar"===e.get("coordinateSystem")&&t.getComponent("radar",e.get("radarIndex"))===o){var r=e.getData();a.each(n,function(t){t.scale.unionExtentFromData(r,t.dim)})}},this);var r=o.get("splitNumber");a.each(n,function(t,e){var n=l.getScaleExtent(t.scale,t.model);l.niceScaleExtent(t.scale,t.model);var a=t.model,o=t.scale,u=a.getMin(),c=a.getMax(),h=o.getInterval();if(null!=u&&null!=c)o.setInterval((c-u)/r);else if(null!=u){var d;do d=u+h*r,o.setExtent(+u,d),o.setInterval(h),h=i(h);while(d<n[1]&&isFinite(d)&&isFinite(n[1]))}else if(null!=c){var f;do f=c-h*r,o.setExtent(f,+c),o.setInterval(h),h=i(h);while(f>n[0]&&isFinite(f)&&isFinite(n[0]))}else{var p=o.getTicks().length-1;p>r&&(h=i(h));var g=Math.round((n[0]+n[1])/2/h)*h,m=Math.round(r/2);o.setExtent(s.round(g-m*h),s.round(g+(r-m)*h)),o.setInterval(h)}})},n.dimensions=[],n.create=function(t,e){var i=[];return t.eachComponent("radar",function(a){var o=new n(a,t,e);i.push(o),a.coordinateSystem=o}),t.eachSeriesByType("radar",function(t){"radar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("radarIndex")||0])}),i},i(26).register("radar",n),t.exports=n},function(t,e,i){function n(t,e){return s.defaults({show:e},t)}var a=i(96),o=a.valueAxis,r=i(10),s=i(1),l=i(42),u=i(2).extendComponentModel({type:"radar",optionUpdated:function(){var t=this.get("boundaryGap"),e=this.get("splitNumber"),i=this.get("scale"),n=this.get("axisLine"),a=this.get("axisTick"),o=this.get("axisLabel"),u=this.get("name.textStyle"),c=this.get("name.show"),h=this.get("name.formatter"),d=this.get("nameGap"),f=this.get("triggerEvent"),p=s.map(this.get("indicator")||[],function(p){if(null!=p.max&&p.max>0&&!p.min?p.min=0:null!=p.min&&p.min<0&&!p.max&&(p.max=0),p=s.merge(s.clone(p),{boundaryGap:t,splitNumber:e,scale:i,axisLine:n,axisTick:a,axisLabel:o,name:p.text,nameLocation:"end",nameGap:d,nameTextStyle:u,triggerEvent:f},!1),c||(p.name=""),"string"==typeof h){var g=p.name;p.name=h.replace("{value}",null!=g?g:"")}else"function"==typeof h&&(p.name=h(p.name,p));var m=s.extend(new r(p,null,this.ecModel),l);return m.mainType="radar",m.componentIndex=this.componentIndex,m},this);this.getIndicatorModels=function(){return p}},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"75%",startAngle:90,name:{show:!0},boundaryGap:[0,0],splitNumber:5,nameGap:15,scale:!1,shape:"polygon",axisLine:s.merge({lineStyle:{color:"#bbb"}},o.axisLine),axisLabel:n(o.axisLabel,!1),axisTick:n(o.axisTick,!1),splitLine:n(o.splitLine,!0),splitArea:n(o.splitArea,!0),indicator:[]}});t.exports=u},function(t,e,i){function n(t,e){return e.type||(e.data?"category":"value")}var a=i(13),o=i(59),r=i(1),s=a.extend({type:"singleAxis",layoutMode:"box",axis:null,coordinateSystem:null,getCoordSysModel:function(){return this}}),l={left:"5%",top:"5%",right:"5%",bottom:"5%",type:"value",position:"bottom",orient:"horizontal",axisLine:{show:!0,lineStyle:{width:2,type:"solid"}},tooltip:{show:!0},axisTick:{show:!0,length:6,lineStyle:{width:2}},axisLabel:{show:!0,interval:"auto"},splitLine:{show:!0,lineStyle:{type:"dashed",opacity:.2}}};r.merge(s.prototype,i(42)),o("single",s,n,l),t.exports=s},function(t,e,i){function n(t,e,i){this.dimension="single",this.dimensions=["single"],this._axis=null,this._rect,this._init(t,e,i),this.model=t}var a=i(420),o=i(18),r=i(12);n.prototype={type:"singleAxis",axisPointerEnabled:!0,constructor:n,_init:function(t,e,i){var n=this.dimension,r=new a(n,o.createScaleByModel(t),[0,0],t.get("type"),t.get("position")),s="category"===r.type;r.onBand=s&&t.get("boundaryGap"),r.inverse=t.get("inverse"),r.orient=t.get("orient"),t.axis=r,r.model=t,r.coordinateSystem=this,this._axis=r},update:function(t,e){t.eachSeries(function(t){if(t.coordinateSystem===this){var e=t.getData(),i=this.dimension;this._axis.scale.unionExtentFromData(e,t.coordDimToDataDim(i)),o.niceScaleExtent(this._axis.scale,this._axis.model)}},this)},resize:function(t,e){this._rect=r.getLayoutRect({left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")},{width:e.getWidth(),height:e.getHeight()}),this._adjustAxis()},getRect:function(){return this._rect},_adjustAxis:function(){var t=this._rect,e=this._axis,i=e.isHorizontal(),n=i?[0,t.width]:[0,t.height],a=e.reverse?1:0;e.setExtent(n[a],n[1-a]),this._updateAxisTransform(e,i?t.x:t.y)},_updateAxisTransform:function(t,e){var i=t.getExtent(),n=i[0]+i[1],a=t.isHorizontal();t.toGlobalCoord=a?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord=a?function(t){return t-e}:function(t){return n-t+e}},getAxis:function(){return this._axis},getBaseAxis:function(){return this._axis},getAxes:function(){return[this._axis]},getTooltipAxes:function(){return{baseAxes:[this.getAxis()]}},containPoint:function(t){var e=this.getRect(),i=this.getAxis(),n=i.orient;return"horizontal"===n?i.contain(i.toLocalCoord(t[0]))&&t[1]>=e.y&&t[1]<=e.y+e.height:i.contain(i.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},pointToData:function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},dataToPoint:function(t){var e=this.getAxis(),i=this.getRect(),n=[],a="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),n[a]=e.toGlobalCoord(e.dataToCoord(+t)),n[1-a]=0===a?i.y+i.height/2:i.x+i.width/2,n}},t.exports=n},function(t,e,i){var n=i(1),a=i(33),o=function(t,e,i,n,o){a.call(this,t,e,i),this.type=n||"value",this.position=o||"bottom",this.orient=null,this._labelInterval=null};o.prototype={constructor:o,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},pointToData:function(t,e){return this.coordinateSystem.pointToData(t,e)[0]},toGlobalCoord:null,toLocalCoord:null},n.inherits(o,a),t.exports=o},function(t,e,i){function n(t,e){var i=this.getAxis(),n=e instanceof Array?e[0]:e,a=(t instanceof Array?t[0]:t)/2;return"category"===i.type?i.getBandWidth():Math.abs(i.dataToCoord(n-a)-i.dataToCoord(n+a))}function a(t){var e=t.getRect();return{coordSys:{type:"singleAxis",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:o.bind(t.dataToPoint,t),size:o.bind(n,t)}}}var o=i(1);t.exports=a},function(t,e,i){function n(t,e){var i=[];return t.eachComponent("singleAxis",function(n,o){var r=new a(n,t,e);r.name="single_"+o,r.resize(n,e),n.coordinateSystem=r,i.push(r)}),t.eachSeries(function(e){if("singleAxis"===e.get("coordinateSystem")){var i=t.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0];e.coordinateSystem=i&&i.coordinateSystem}}),i}var a=i(419);i(26).register("single",{create:n,dimensions:a.prototype.dimensions})},function(t,e,i){"use strict";function n(t){return"_EC_"+t}function a(t,e){this.id=null==t?"":t,this.inEdges=[],this.outEdges=[],this.edges=[],this.hostGraph,this.dataIndex=null==e?-1:e}function o(t,e,i){this.node1=t,this.node2=e,this.dataIndex=null==i?-1:i}var r=i(1),s=function(t){this._directed=t||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this.data,this.edgeData},l=s.prototype;l.type="graph",l.isDirected=function(){return this._directed},l.addNode=function(t,e){t=t||""+e;var i=this._nodesMap;if(!i[n(t)]){var o=new a(t,e);return o.hostGraph=this,this.nodes.push(o),i[n(t)]=o,o}},l.getNodeByIndex=function(t){var e=this.data.getRawIndex(t);return this.nodes[e]},l.getNodeById=function(t){return this._nodesMap[n(t)]},l.addEdge=function(t,e,i){var r=this._nodesMap,s=this._edgesMap;if("number"==typeof t&&(t=this.nodes[t]),"number"==typeof e&&(e=this.nodes[e]),t instanceof a||(t=r[n(t)]),e instanceof a||(e=r[n(e)]),t&&e){var l=t.id+"-"+e.id;if(!s[l]){var u=new o(t,e,i);return u.hostGraph=this,this._directed&&(t.outEdges.push(u),e.inEdges.push(u)),t.edges.push(u),t!==e&&e.edges.push(u),this.edges.push(u),s[l]=u,u}}},l.getEdgeByIndex=function(t){var e=this.edgeData.getRawIndex(t);return this.edges[e]},l.getEdge=function(t,e){t instanceof a&&(t=t.id),e instanceof a&&(e=e.id);var i=this._edgesMap;return this._directed?i[t+"-"+e]:i[t+"-"+e]||i[e+"-"+t]},l.eachNode=function(t,e){for(var i=this.nodes,n=i.length,a=0;a<n;a++)i[a].dataIndex>=0&&t.call(e,i[a],a)},l.eachEdge=function(t,e){for(var i=this.edges,n=i.length,a=0;a<n;a++)i[a].dataIndex>=0&&i[a].node1.dataIndex>=0&&i[a].node2.dataIndex>=0&&t.call(e,i[a],a)},l.breadthFirstTraverse=function(t,e,i,o){if(e instanceof a||(e=this._nodesMap[n(e)]),e){for(var r="out"===i?"outEdges":"in"===i?"inEdges":"edges",s=0;s<this.nodes.length;s++)this.nodes[s].__visited=!1;if(!t.call(o,e,null))for(var l=[e];l.length;)for(var u=l.shift(),c=u[r],s=0;s<c.length;s++){var h=c[s],d=h.node1===u?h.node2:h.node1;if(!d.__visited){if(t.call(o,d,u))return;l.push(d),d.__visited=!0}}}},l.update=function(){for(var t=this.data,e=this.edgeData,i=this.nodes,n=this.edges,a=0,o=i.length;a<o;a++)i[a].dataIndex=-1;for(var a=0,o=t.count();a<o;a++)i[t.getRawIndex(a)].dataIndex=a;e.filterSelf(function(t){var i=n[e.getRawIndex(t)];return i.node1.dataIndex>=0&&i.node2.dataIndex>=0});for(var a=0,o=n.length;a<o;a++)n[a].dataIndex=-1;for(var a=0,o=e.count();a<o;a++)n[e.getRawIndex(a)].dataIndex=a},l.clone=function(){for(var t=new s(this._directed),e=this.nodes,i=this.edges,n=0;n<e.length;n++)t.addNode(e[n].id,e[n].dataIndex);for(var n=0;n<i.length;n++){var a=i[n];t.addEdge(a.node1.id,a.node2.id,a.dataIndex)}return t},a.prototype={constructor:a,degree:function(){return this.edges.length},inDegree:function(){return this.inEdges.length},outDegree:function(){return this.outEdges.length},getModel:function(t){if(!(this.dataIndex<0)){var e=this.hostGraph,i=e.data.getItemModel(this.dataIndex);return i.getModel(t)}}},o.prototype.getModel=function(t){if(!(this.dataIndex<0)){var e=this.hostGraph,i=e.edgeData.getItemModel(this.dataIndex);return i.getModel(t)}};var u=function(t,e){return{getValue:function(i){var n=this[t][e];return n.get(n.getDimension(i||"value"),this.dataIndex)},setVisual:function(i,n){this.dataIndex>=0&&this[t][e].setItemVisual(this.dataIndex,i,n)},getVisual:function(i,n){return this[t][e].getItemVisual(this.dataIndex,i,n)},setLayout:function(i,n){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,i,n)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}};r.mixin(a,u("hostGraph","data")),r.mixin(o,u("hostGraph","edgeData")),s.Node=a,s.Edge=o,t.exports=s},function(t,e,i){function n(t,e){this.root,this.data,this._nodes=[],this.hostModel=t,this.levelModels=o.map(e||[],function(e){return new r(e,t,t.ecModel)})}function a(t,e){var i=e.children;t.parentNode!==e&&(i.push(t),t.parentNode=e)}var o=i(1),r=i(10),s=i(14),l=i(264),u=i(25),c=function(t,e){this.name=t||"",this.depth=0,this.height=0,this.parentNode=null,this.dataIndex=-1,this.children=[],this.viewChildren=[],this.hostTree=e};c.prototype={constructor:c,isRemoved:function(){return this.dataIndex<0},eachNode:function(t,e,i){"function"==typeof t&&(i=e,e=t,t=null),t=t||{},o.isString(t)&&(t={order:t});var n,a=t.order||"preorder",r=this[t.attr||"children"];"preorder"===a&&(n=e.call(i,this));for(var s=0;!n&&s<r.length;s++)r[s].eachNode(t,e,i);"postorder"===a&&e.call(i,this)},updateDepthAndHeight:function(t){var e=0;this.depth=t;for(var i=0;i<this.children.length;i++){var n=this.children[i];n.updateDepthAndHeight(t+1),n.height>e&&(e=n.height)}this.height=e+1},getNodeById:function(t){if(this.getId()===t)return this;for(var e=0,i=this.children,n=i.length;e<n;e++){var a=i[e].getNodeById(t);if(a)return a}},contains:function(t){if(t===this)return!0;for(var e=0,i=this.children,n=i.length;e<n;e++){var a=i[e].contains(t);if(a)return a}},getAncestors:function(t){for(var e=[],i=t?this:this.parentNode;i;)e.push(i),i=i.parentNode;return e.reverse(),e},getValue:function(t){var e=this.hostTree.data;return e.get(e.getDimension(t||"value"),this.dataIndex)},setLayout:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},getLayout:function(){return this.hostTree.data.getItemLayout(this.dataIndex)},getModel:function(t){if(!(this.dataIndex<0)){var e=this.hostTree,i=e.data.getItemModel(this.dataIndex),n=this.getLevelModel();return i.getModel(t,(n||e.hostModel).getModel(t))}},getLevelModel:function(){return(this.hostTree.levelModels||[])[this.depth]},setVisual:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},getVisual:function(t,e){return this.hostTree.data.getItemVisual(this.dataIndex,t,e)},getRawIndex:function(){return this.hostTree.data.getRawIndex(this.dataIndex)},getId:function(){return this.hostTree.data.getId(this.dataIndex)}},n.prototype={constructor:n,type:"tree",eachNode:function(t,e,i){this.root.eachNode(t,e,i)},getNodeByDataIndex:function(t){var e=this.data.getRawIndex(t);return this._nodes[e]},getNodeByName:function(t){return this.root.getNodeByName(t)},update:function(){for(var t=this.data,e=this._nodes,i=0,n=e.length;i<n;i++)e[i].dataIndex=-1;for(var i=0,n=t.count();i<n;i++)e[t.getRawIndex(i)].dataIndex=i},clearLayouts:function(){this.data.clearItemLayouts()}},n.createTree=function(t,e,i){function r(t,e){var i=t.value;f=Math.max(f,o.isArray(i)?i.length:1),d.push(t);var n=new c(t.name,h);e?a(n,e):h.root=n,h._nodes.push(n);var s=t.children;if(s)for(var l=0;l<s.length;l++)r(s[l],n)}var h=new n(e,i),d=[],f=1;r(t),h.root.updateDepthAndHeight(0);var p=u([{name:"value"}],d,{dimCount:f}),g=new s(p,e);return g.initData(d),l({mainData:g,struct:h,structAttr:"tree"}),h.update(),h},t.exports=n},function(t,e,i){"use strict";function n(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}function a(t){return t.dim}function o(t,e,i){var o=i.getWidth(),u=i.getHeight(),c={},h={},d=r(s.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"polar"===t.coordinateSystem.type}));e.eachSeriesByType(t,function(t){if("polar"===t.coordinateSystem.type){var e=t.getData(),i=t.coordinateSystem,r=i.getAngleAxis(),s=i.getBaseAxis(),f=n(t),p=d[a(s)][f],g=p.offset,m=p.width,v=i.getOtherAxis(s),y=t.get("center")||["50%","50%"],x=l(y[0],o),_=l(y[1],u),b=t.get("barMinHeight")||0,w=t.get("barMinAngle")||0,S=v.getExtent()[0],M=v.model.get("max"),I=v.model.get("min"),T=i.dataToPoints(e);c[f]=c[f]||[],h[f]=h[f]||[],e.each(v.dim,function(t,n){if(!isNaN(t)){c[f][n]||(c[f][n]={p:S,n:S},h[f][n]={p:S,n:S});var a,o,s,l,u=t>=0?"p":"n",d=i.pointToCoord(T[n]),p=h[f][n][u];if("radius"===v.dim)a=p,o=d[0],s=(-d[1]+g)*Math.PI/180,l=s+m*Math.PI/180,Math.abs(o)<b&&(o=a+(o<0?-1:1)*b),h[f][n][u]=o;else{a=d[0]+g,o=a+m,null!=M&&(t=Math.min(t,M)),null!=I&&(t=Math.max(t,I));var y=r.dataToAngle(t);Math.abs(y-p)<w&&(y=p-(t<0?-1:1)*w),s=-p*Math.PI/180,l=-y*Math.PI/180;var A=r.getExtent(),C=y;C===A[0]&&t>0?C=A[1]:C===A[1]&&t<0&&(C=A[0]),h[f][n][u]=C}e.setItemLayout(n,{cx:x,cy:_,r0:a,r:o,startAngle:s,endAngle:l})}},!0)}},this)}function r(t,e){var i={};s.each(t,function(t,e){var o=t.getData(),r=t.coordinateSystem,s=r.getBaseAxis(),u=s.getExtent(),c="category"===s.type?s.getBandWidth():Math.abs(u[1]-u[0])/o.count(),h=i[a(s)]||{bandWidth:c,remainedWidth:c,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},d=h.stacks;i[a(s)]=h;var f=n(t);d[f]||h.autoWidthCount++,d[f]=d[f]||{width:0,maxWidth:0};var p=l(t.get("barWidth"),c),g=l(t.get("barMaxWidth"),c),m=t.get("barGap"),v=t.get("barCategoryGap");p&&!d[f].width&&(p=Math.min(h.remainedWidth,p),d[f].width=p,h.remainedWidth-=p),g&&(d[f].maxWidth=g),null!=m&&(h.gap=m),null!=v&&(h.categoryGap=v)});var o={};return s.each(i,function(t,e){o[e]={};var i=t.stacks,n=t.bandWidth,a=l(t.categoryGap,n),r=l(t.gap,1),u=t.remainedWidth,c=t.autoWidthCount,h=(u-a)/(c+(c-1)*r);h=Math.max(h,0),s.each(i,function(t,e){var i=t.maxWidth;i&&i<h&&(i=Math.min(i,u),t.width&&(i=Math.min(i,t.width)),u-=i,t.width=i,c--)}),h=(u-a)/(c+(c-1)*r),h=Math.max(h,0);var d,f=0;s.each(i,function(t,e){t.width||(t.width=h),d=t,f+=t.width*(1+r)}),d&&(f-=d.width*r);var p=-f/2;s.each(i,function(t,i){o[e][i]=o[e][i]||{offset:p,width:t.width},p+=t.width*(1+r)})}),o}var s=i(1),l=i(4).parsePercent;t.exports=o},function(t,e,i){function n(){var t,e=[],i={};return{add:function(t,n,o,r,s){return a.isString(r)&&(s=r,r=0),!i[t.id]&&(i[t.id]=1,e.push({el:t,target:n,time:o,delay:r,easing:s}),!0)},done:function(e){return t=e,this},start:function(){function n(){a--,a||(e.length=0,i={},t&&t())}for(var a=e.length,o=0,r=e.length;o<r;o++){var s=e[o];s.el.animateTo(s.target,s.time,s.delay,s.easing,n)}return this}}}var a=i(1);t.exports={createWrap:n}}])});
\ No newline at end of file
diff --git a/dist/echarts.simple.js b/dist/echarts.simple.js
index ac8adda..16ecf8e 100644
--- a/dist/echarts.simple.js
+++ b/dist/echarts.simple.js
@@ -62,7 +62,7 @@
 	__webpack_require__(113);
 	__webpack_require__(139);
 	__webpack_require__(146);
-	__webpack_require__(123);
+	__webpack_require__(124);
 
 /***/ },
 /* 1 */
@@ -100,23 +100,23 @@
 	    var env = __webpack_require__(2);
 
 	    var GlobalModel = __webpack_require__(3);
-	    var ExtensionAPI = __webpack_require__(25);
-	    var CoordinateSystemManager = __webpack_require__(26);
-	    var OptionManager = __webpack_require__(27);
+	    var ExtensionAPI = __webpack_require__(75);
+	    var CoordinateSystemManager = __webpack_require__(76);
+	    var OptionManager = __webpack_require__(77);
 
-	    var ComponentModel = __webpack_require__(19);
-	    var SeriesModel = __webpack_require__(28);
+	    var ComponentModel = __webpack_require__(69);
+	    var SeriesModel = __webpack_require__(78);
 
-	    var ComponentView = __webpack_require__(29);
-	    var ChartView = __webpack_require__(43);
-	    var graphic = __webpack_require__(44);
+	    var ComponentView = __webpack_require__(79);
+	    var ChartView = __webpack_require__(80);
+	    var graphic = __webpack_require__(18);
 	    var modelUtil = __webpack_require__(5);
 	    var throttle = __webpack_require__(81);
 
 	    var zrender = __webpack_require__(82);
 	    var zrUtil = __webpack_require__(4);
-	    var colorTool = __webpack_require__(39);
-	    var Eventful = __webpack_require__(33);
+	    var colorTool = __webpack_require__(31);
+	    var Eventful = __webpack_require__(25);
 	    var timsort = __webpack_require__(86);
 
 	    var each = zrUtil.each;
@@ -346,14 +346,7 @@
 	            ecModel.init(null, null, theme, optionManager);
 	        }
 
-	        // FIXME
-	        // ugly
-	        this.__lastOnlyGraphic = !!(option && option.graphic);
-	        zrUtil.each(option, function (o, mainType) {
-	            mainType !== 'graphic' && (this.__lastOnlyGraphic = false);
-	        }, this);
-
-	        this._model.setOption(option, optionPreprocessorFuncs, this.__lastOnlyGraphic);
+	        this._model.setOption(option, optionPreprocessorFuncs);
 
 	        if (lazyUpdate) {
 	            this[OPTION_UPDATED] = {silent: silent};
@@ -879,21 +872,7 @@
 
 	            prepareView.call(this, 'chart', ecModel);
 
-	            // FIXME
-	            // ugly
-	            if (this.__lastOnlyGraphic) {
-	                each(this._componentsViews, function (componentView) {
-	                    var componentModel = componentView.__model;
-	                    if (componentModel && componentModel.mainType === 'graphic') {
-	                        componentView.render(componentModel, ecModel, this._api, payload);
-	                        updateZ(componentModel, componentView);
-	                    }
-	                }, this);
-	                this.__lastOnlyGraphic = false;
-	            }
-	            else {
-	                updateMethods.update.call(this, payload);
-	            }
+	            updateMethods.update.call(this, payload);
 	        }
 	    };
 
@@ -1210,7 +1189,7 @@
 	            }
 
 	            // Consider: id same and type changed.
-	            var viewId = model.id + '_' + model.type;
+	            var viewId = '_ec_' + model.id + '_' + model.type;
 	            var view = viewMap[viewId];
 	            if (!view) {
 	                var classType = parseClassType(model.type);
@@ -1276,7 +1255,8 @@
 	            var data = series.getData();
 	            if (stack && data.type === 'list') {
 	                var previousStack = stackedDataMap[stack];
-	                if (previousStack) {
+	                // Avoid conflict with Object.prototype
+	                if (stackedDataMap.hasOwnProperty(stack) && previousStack) {
 	                    data.stackedOn = previousStack;
 	                }
 	                stackedDataMap[stack] = data;
@@ -1598,6 +1578,7 @@
 	    var idBase = new Date() - 0;
 	    var groupIdBase = new Date() - 0;
 	    var DOM_ATTRIBUTE_KEY = '_echarts_instance_';
+
 	    /**
 	     * @alias module:echarts
 	     */
@@ -1605,9 +1586,9 @@
 	        /**
 	         * @type {number}
 	         */
-	        version: '3.5.4',
+	        version: '3.6.0',
 	        dependencies: {
-	            zrender: '3.4.4'
+	            zrender: '3.5.0'
 	        }
 	    };
 
@@ -1674,9 +1655,21 @@
 	                    + echarts.dependencies.zrender + '+'
 	                );
 	            }
+
 	            if (!dom) {
 	                throw new Error('Initialize failed: invalid dom.');
 	            }
+	        }
+
+	        var existInstance = echarts.getInstanceByDom(dom);
+	        if (existInstance) {
+	            if (true) {
+	                console.warn('There is a chart instance already initialized on the dom.');
+	            }
+	            return existInstance;
+	        }
+
+	        if (true) {
 	            if (zrUtil.isDom(dom)
 	                && dom.nodeName.toUpperCase() !== 'CANVAS'
 	                && (
@@ -1692,8 +1685,12 @@
 	        chart.id = 'ec_' + idBase++;
 	        instances[chart.id] = chart;
 
-	        dom.setAttribute &&
+	        if (dom.setAttribute) {
 	            dom.setAttribute(DOM_ATTRIBUTE_KEY, chart.id);
+	        }
+	        else {
+	            dom[DOM_ATTRIBUTE_KEY] = chart.id;
+	        }
 
 	        enableConnect(chart);
 
@@ -1741,12 +1738,13 @@
 	     * @param  {module:echarts~ECharts|HTMLDomElement|string} chart
 	     */
 	    echarts.dispose = function (chart) {
-	        if (zrUtil.isDom(chart)) {
-	            chart = echarts.getInstanceByDom(chart);
-	        }
-	        else if (typeof chart === 'string') {
+	        if (typeof chart === 'string') {
 	            chart = instances[chart];
 	        }
+	        else if (!(chart instanceof ECharts)){
+	            // Try to treat as dom
+	            chart = echarts.getInstanceByDom(chart);
+	        }
 	        if ((chart instanceof ECharts) && !chart.isDisposed()) {
 	            chart.dispose();
 	        }
@@ -1757,9 +1755,16 @@
 	     * @return {echarts~ECharts}
 	     */
 	    echarts.getInstanceByDom = function (dom) {
-	        var key = dom.getAttribute(DOM_ATTRIBUTE_KEY);
+	        var key;
+	        if (dom.getAttribute) {
+	            key = dom.getAttribute(DOM_ATTRIBUTE_KEY);
+	        }
+	        else {
+	            key = dom[DOM_ATTRIBUTE_KEY];
+	        }
 	        return instances[key];
 	    };
+
 	    /**
 	     * @param {string} key
 	     * @return {echarts~ECharts}
@@ -2012,13 +2017,13 @@
 
 	    echarts.Axis = __webpack_require__(100);
 
-	    echarts.graphic = __webpack_require__(44);
+	    echarts.graphic = __webpack_require__(18);
 	    echarts.number = __webpack_require__(7);
 	    echarts.format = __webpack_require__(6);
 	    echarts.throttle = throttle.throttle;
 	    echarts.matrix = __webpack_require__(11);
 	    echarts.vector = __webpack_require__(10);
-	    echarts.color = __webpack_require__(39);
+	    echarts.color = __webpack_require__(31);
 
 	    echarts.util = {};
 	    each([
@@ -2031,7 +2036,7 @@
 	        }
 	    );
 
-	    echarts.helper = __webpack_require__(101);
+	    echarts.helper = __webpack_require__(108);
 
 
 	    // PRIORITY
@@ -2221,9 +2226,9 @@
 	    var indexOf = zrUtil.indexOf;
 	    var isObject = zrUtil.isObject;
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 
-	    var globalDefault = __webpack_require__(23);
+	    var globalDefault = __webpack_require__(73);
 
 	    var OPTION_INNER_KEY = '\0_ec_inner';
 
@@ -2255,7 +2260,7 @@
 	            this._optionManager = optionManager;
 	        },
 
-	        setOption: function (option, optionPreprocessorFuncs, onlyGraphic) {
+	        setOption: function (option, optionPreprocessorFuncs) {
 	            zrUtil.assert(
 	                !(OPTION_INNER_KEY in option),
 	                'please use chart.getOption()'
@@ -2263,7 +2268,7 @@
 
 	            this._optionManager.setOption(option, optionPreprocessorFuncs);
 
-	            this.resetOption(null, onlyGraphic);
+	            this.resetOption(null);
 	        },
 
 	        /**
@@ -2273,7 +2278,7 @@
 	         *                      'media': only reset media query option
 	         * @return {boolean} Whether option changed.
 	         */
-	        resetOption: function (type, onlyGraphic) {
+	        resetOption: function (type) {
 	            var optionChanged = false;
 	            var optionManager = this._optionManager;
 
@@ -2284,11 +2289,7 @@
 	                    initBase.call(this, baseOption);
 	                }
 	                else {
-	                    // If only graphic, other series and component will not
-	                    // go through update process, data should not be restored.
-	                    // Otherwise grphic els mounted on data will be eliminated
-	                    // and downplay will not work.
-	                    !onlyGraphic && this.restoreData();
+	                    this.restoreData();
 	                    this.mergeOption(baseOption);
 	                }
 	                optionChanged = true;
@@ -2350,7 +2351,7 @@
 	                var newCptOptionList = modelUtil.normalizeToArray(newOption[mainType]);
 
 	                var mapResult = modelUtil.mappingToExists(
-	                    componentsMap[mainType], newCptOptionList
+	                    componentsMap.get(mainType), newCptOptionList
 	                );
 
 	                modelUtil.makeIdAndName(mapResult);
@@ -2369,7 +2370,7 @@
 	                );
 
 	                option[mainType] = [];
-	                componentsMap[mainType] = [];
+	                componentsMap.set(mainType, []);
 
 	                each(mapResult, function (resultItem, index) {
 	                    var componentModel = resultItem.exist;
@@ -2419,13 +2420,13 @@
 	                        }
 	                    }
 
-	                    componentsMap[mainType][index] = componentModel;
+	                    componentsMap.get(mainType)[index] = componentModel;
 	                    option[mainType][index] = componentModel.option;
 	                }, this);
 
 	                // Backup series for filtering.
 	                if (mainType === 'series') {
-	                    this._seriesIndices = createSeriesIndices(componentsMap.series);
+	                    this._seriesIndices = createSeriesIndices(componentsMap.get('series'));
 	                }
 	            }
 	        },
@@ -2469,7 +2470,7 @@
 	         * @return {module:echarts/model/Component}
 	         */
 	        getComponent: function (mainType, idx) {
-	            var list = this._componentsMap[mainType];
+	            var list = this._componentsMap.get(mainType);
 	            if (list) {
 	                return list[idx || 0];
 	            }
@@ -2495,7 +2496,7 @@
 	            var id = condition.id;
 	            var name = condition.name;
 
-	            var cpts = this._componentsMap[mainType];
+	            var cpts = this._componentsMap.get(mainType);
 
 	            if (!cpts || !cpts.length) {
 	                return [];
@@ -2570,7 +2571,7 @@
 	            var queryCond = getQueryCond(query);
 	            var result = queryCond
 	                ? this.queryComponents(queryCond)
-	                : this._componentsMap[mainType];
+	                : this._componentsMap.get(mainType);
 
 	            return doFilter(filterBySubType(result, condition));
 
@@ -2629,14 +2630,14 @@
 	            if (typeof mainType === 'function') {
 	                context = cb;
 	                cb = mainType;
-	                each(componentsMap, function (components, componentType) {
+	                componentsMap.each(function (components, componentType) {
 	                    each(components, function (component, index) {
 	                        cb.call(context, componentType, component, index);
 	                    });
 	                });
 	            }
 	            else if (zrUtil.isString(mainType)) {
-	                each(componentsMap[mainType], cb, context);
+	                each(componentsMap.get(mainType), cb, context);
 	            }
 	            else if (isObject(mainType)) {
 	                var queryResult = this.findComponents(mainType);
@@ -2649,7 +2650,7 @@
 	         * @return {Array.<module:echarts/model/Series>}
 	         */
 	        getSeriesByName: function (name) {
-	            var series = this._componentsMap.series;
+	            var series = this._componentsMap.get('series');
 	            return filter(series, function (oneSeries) {
 	                return oneSeries.name === name;
 	            });
@@ -2660,7 +2661,7 @@
 	         * @return {module:echarts/model/Series}
 	         */
 	        getSeriesByIndex: function (seriesIndex) {
-	            return this._componentsMap.series[seriesIndex];
+	            return this._componentsMap.get('series')[seriesIndex];
 	        },
 
 	        /**
@@ -2668,7 +2669,7 @@
 	         * @return {Array.<module:echarts/model/Series>}
 	         */
 	        getSeriesByType: function (subType) {
-	            var series = this._componentsMap.series;
+	            var series = this._componentsMap.get('series');
 	            return filter(series, function (oneSeries) {
 	                return oneSeries.subType === subType;
 	            });
@@ -2678,7 +2679,7 @@
 	         * @return {Array.<module:echarts/model/Series>}
 	         */
 	        getSeries: function () {
-	            return this._componentsMap.series.slice();
+	            return this._componentsMap.get('series').slice();
 	        },
 
 	        /**
@@ -2691,7 +2692,7 @@
 	        eachSeries: function (cb, context) {
 	            assertSeriesInitialized(this);
 	            each(this._seriesIndices, function (rawSeriesIndex) {
-	                var series = this._componentsMap.series[rawSeriesIndex];
+	                var series = this._componentsMap.get('series')[rawSeriesIndex];
 	                cb.call(context, series, rawSeriesIndex);
 	            }, this);
 	        },
@@ -2703,7 +2704,7 @@
 	         * @param {*} context
 	         */
 	        eachRawSeries: function (cb, context) {
-	            each(this._componentsMap.series, cb, context);
+	            each(this._componentsMap.get('series'), cb, context);
 	        },
 
 	        /**
@@ -2717,7 +2718,7 @@
 	        eachSeriesByType: function (subType, cb, context) {
 	            assertSeriesInitialized(this);
 	            each(this._seriesIndices, function (rawSeriesIndex) {
-	                var series = this._componentsMap.series[rawSeriesIndex];
+	                var series = this._componentsMap.get('series')[rawSeriesIndex];
 	                if (series.subType === subType) {
 	                    cb.call(context, series, rawSeriesIndex);
 	                }
@@ -2744,13 +2745,20 @@
 	        },
 
 	        /**
+	         * @return {Array.<number>}
+	         */
+	        getCurrentSeriesIndices: function () {
+	            return (this._seriesIndices || []).slice();
+	        },
+
+	        /**
 	         * @param {Function} cb
 	         * @param {*} context
 	         */
 	        filterSeries: function (cb, context) {
 	            assertSeriesInitialized(this);
 	            var filteredSeries = filter(
-	                this._componentsMap.series, cb, context
+	                this._componentsMap.get('series'), cb, context
 	            );
 	            this._seriesIndices = createSeriesIndices(filteredSeries);
 	        },
@@ -2758,10 +2766,10 @@
 	        restoreData: function () {
 	            var componentsMap = this._componentsMap;
 
-	            this._seriesIndices = createSeriesIndices(componentsMap.series);
+	            this._seriesIndices = createSeriesIndices(componentsMap.get('series'));
 
 	            var componentTypes = [];
-	            each(componentsMap, function (components, componentType) {
+	            componentsMap.each(function (components, componentType) {
 	                componentTypes.push(componentType);
 	            });
 
@@ -2769,7 +2777,7 @@
 	                componentTypes,
 	                ComponentModel.getAllClassMainTypes(),
 	                function (componentType, dependencies) {
-	                    each(componentsMap[componentType], function (component) {
+	                    each(componentsMap.get(componentType), function (component) {
 	                        component.restoreData();
 	                    });
 	                }
@@ -2813,7 +2821,7 @@
 	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
 	         * @private
 	         */
-	        this._componentsMap = {series: []};
+	        this._componentsMap = zrUtil.createHashMap({series: []});
 
 	        /**
 	         * Mapping between filtered series list and raw series list.
@@ -2843,7 +2851,7 @@
 
 	        var ret = {};
 	        each(types, function (type) {
-	            ret[type] = (componentsMap[type] || []).slice();
+	            ret[type] = (componentsMap.get(type) || []).slice();
 	        });
 
 	        return ret;
@@ -2894,12 +2902,12 @@
 	        // which make sure that their initialization is after series.
 	        if (true) {
 	            if (!ecModel._seriesIndices) {
-	                throw new Error('Series has not been initialized yet.');
+	                throw new Error('Option should contains series.');
 	            }
 	        }
 	    }
 
-	    zrUtil.mixin(GlobalModel, __webpack_require__(24));
+	    zrUtil.mixin(GlobalModel, __webpack_require__(74));
 
 	    module.exports = GlobalModel;
 
@@ -3420,9 +3428,12 @@
 
 	    /**
 	     * @constructor
+	     * @param {Object} obj Only apply `ownProperty`.
 	     */
 	    function HashMap(obj) {
-	        obj && extend(this, obj);
+	        obj && each(obj, function (value, key) {
+	            this.set(key, value);
+	        }, this);
 	    }
 
 	    // Add prefix to avoid conflict with Object.prototype.
@@ -3458,8 +3469,8 @@
 	        }
 	    };
 
-	    function createHashMap() {
-	        return new HashMap();
+	    function createHashMap(obj) {
+	        return new HashMap(obj);
 	    }
 
 	    var util = {
@@ -3650,6 +3661,7 @@
 	            var rawDataIndex = data.getRawIndex(dataIndex);
 	            var name = data.getName(dataIndex, true);
 	            var itemOpt = data.getRawDataItem(dataIndex);
+	            var color = data.getItemVisual(dataIndex, 'color');
 
 	            return {
 	                componentType: this.mainType,
@@ -3663,7 +3675,8 @@
 	                data: itemOpt,
 	                dataType: dataType,
 	                value: rawValue,
-	                color: data.getItemVisual(dataIndex, 'color'),
+	                color: color,
+	                marker: formatUtil.getTooltipMarker(color),
 
 	                // Param name list for mapping `a`, `b`, `c`, `d`, `e`
 	                $vars: ['seriesName', 'name', 'value']
@@ -3838,22 +3851,22 @@
 	        // to specify multi components (like series) by one name.
 
 	        // Ensure that each id is distinct.
-	        var idMap = {};
+	        var idMap = zrUtil.createHashMap();
 
 	        each(mapResult, function (item, index) {
 	            var existCpt = item.exist;
-	            existCpt && (idMap[existCpt.id] = item);
+	            existCpt && idMap.set(existCpt.id, item);
 	        });
 
 	        each(mapResult, function (item, index) {
 	            var opt = item.option;
 
 	            zrUtil.assert(
-	                !opt || opt.id == null || !idMap[opt.id] || idMap[opt.id] === item,
+	                !opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item,
 	                'id duplicates: ' + (opt && opt.id)
 	            );
 
-	            opt && opt.id != null && (idMap[opt.id] = item);
+	            opt && opt.id != null && idMap.set(opt.id, item);
 	            !item.keyInfo && (item.keyInfo = {});
 	        });
 
@@ -3893,10 +3906,10 @@
 	                do {
 	                    keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++;
 	                }
-	                while (idMap[keyInfo.id]);
+	                while (idMap.get(keyInfo.id));
 	            }
 
-	            idMap[keyInfo.id] = item;
+	            idMap.set(keyInfo.id, item);
 	        });
 	    };
 
@@ -4102,6 +4115,60 @@
 	        return result;
 	    };
 
+	    /**
+	     * @see {module:echarts/data/helper/completeDimensions}
+	     * @param {module:echarts/data/List} data
+	     * @param {string|number} dataDim
+	     * @return {string}
+	     */
+	    modelUtil.dataDimToCoordDim = function (data, dataDim) {
+	        var dimensions = data.dimensions;
+	        dataDim = data.getDimension(dataDim);
+	        for (var i = 0; i < dimensions.length; i++) {
+	            var dimItem = data.getDimensionInfo(dimensions[i]);
+	            if (dimItem.name === dataDim) {
+	                return dimItem.coordDim;
+	            }
+	        }
+	    };
+
+	    /**
+	     * @see {module:echarts/data/helper/completeDimensions}
+	     * @param {module:echarts/data/List} data
+	     * @param {string} coordDim
+	     * @return {Array.<string>} data dimensions on the coordDim.
+	     */
+	    modelUtil.coordDimToDataDim = function (data, coordDim) {
+	        var dataDim = [];
+	        each(data.dimensions, function (dimName) {
+	            var dimItem = data.getDimensionInfo(dimName);
+	            if (dimItem.coordDim === coordDim) {
+	                dataDim[dimItem.coordDimIndex] = dimItem.name;
+	            }
+	        });
+	        return dataDim;
+	    };
+
+	    /**
+	     * @see {module:echarts/data/helper/completeDimensions}
+	     * @param {module:echarts/data/List} data
+	     * @param {string} otherDim Can be `otherDims`
+	     *                        like 'label' or 'tooltip'.
+	     * @return {Array.<string>} data dimensions on the otherDim.
+	     */
+	    modelUtil.otherDimToDataDim = function (data, otherDim) {
+	        var dataDim = [];
+	        each(data.dimensions, function (dimName) {
+	            var dimItem = data.getDimensionInfo(dimName);
+	            var otherDims = dimItem.otherDims;
+	            var dimIndex = otherDims[otherDim];
+	            if (dimIndex != null && dimIndex !== false) {
+	                dataDim[dimIndex] = dimItem.name;
+	            }
+	        });
+	        return dataDim;
+	    };
+
 	    function has(obj, prop) {
 	        return obj && obj.hasOwnProperty(prop);
 	    }
@@ -4245,6 +4312,18 @@
 	        return tpl;
 	    };
 
+	    /**
+	     * @param {string} color
+	     * @param {string} [extraCssText]
+	     * @return {string}
+	     */
+	    formatUtil.getTooltipMarker = function (color, extraCssText) {
+	        return color
+	            ? '<span style="display:inline-block;margin-right:5px;'
+	                + 'border-radius:10px;width:9px;height:9px;background-color:'
+	                + formatUtil.encodeHTML(color) + ';' + (extraCssText || '') + '"></span>'
+	            : '';
+	    };
 
 	    /**
 	     * @param {string} str
@@ -5856,7 +5935,7 @@
 	    mixin(Model, __webpack_require__(14));
 	    mixin(Model, __webpack_require__(16));
 	    mixin(Model, __webpack_require__(17));
-	    mixin(Model, __webpack_require__(18));
+	    mixin(Model, __webpack_require__(68));
 
 	    module.exports = Model;
 
@@ -6232,10 +6311,7 @@
 	
 
 	    var textContain = __webpack_require__(8);
-
-	    function getShallow(model, path) {
-	        return model && model.getShallow(path);
-	    }
+	    var graphicUtil = __webpack_require__(18);
 
 	    module.exports = {
 	        /**
@@ -6253,15 +6329,12 @@
 	         * @return {string}
 	         */
 	        getFont: function () {
-	            var ecModel = this.ecModel;
-	            var gTextStyleModel = ecModel && ecModel.getModel('textStyle');
-	            return [
-	                // FIXME in node-canvas fontWeight is before fontStyle
-	                this.getShallow('fontStyle') || getShallow(gTextStyleModel, 'fontStyle'),
-	                this.getShallow('fontWeight') || getShallow(gTextStyleModel, 'fontWeight'),
-	                (this.getShallow('fontSize') || getShallow(gTextStyleModel, 'fontSize') || 12) + 'px',
-	                this.getShallow('fontFamily') || getShallow(gTextStyleModel, 'fontFamily') || 'sans-serif'
-	            ].join(' ');
+	            return graphicUtil.getFont({
+	                fontStyle: this.getShallow('fontStyle'),
+	                fontWeight: this.getShallow('fontWeight'),
+	                fontSize: this.getShallow('fontSize'),
+	                fontFamily: this.getShallow('fontFamily')
+	            }, this.ecModel);
 	        },
 
 	        getTextRect: function (text) {
@@ -6285,2254 +6358,2040 @@
 /* 18 */
 /***/ function(module, exports, __webpack_require__) {
 
-	
-	    var getItemStyle = __webpack_require__(15)(
-	        [
-	            ['fill', 'color'],
-	            ['stroke', 'borderColor'],
-	            ['lineWidth', 'borderWidth'],
-	            ['opacity'],
-	            ['shadowBlur'],
-	            ['shadowOffsetX'],
-	            ['shadowOffsetY'],
-	            ['shadowColor'],
-	            ['textPosition'],
-	            ['textAlign']
-	        ]
-	    );
-	    module.exports = {
-	        getItemStyle: function (excludes, includes) {
-	            var style = getItemStyle.call(this, excludes, includes);
-	            var lineDash = this.getBorderLineDash();
-	            lineDash && (style.lineDash = lineDash);
-	            return style;
-	        },
+	'use strict';
 
-	        getBorderLineDash: function () {
-	            var lineType = this.get('borderType');
-	            return (lineType === 'solid' || lineType == null) ? null
-	                : (lineType === 'dashed' ? [5, 5] : [1, 1]);
+
+	    var zrUtil = __webpack_require__(4);
+
+	    var pathTool = __webpack_require__(19);
+	    var Path = __webpack_require__(20);
+	    var colorTool = __webpack_require__(31);
+	    var matrix = __webpack_require__(11);
+	    var vector = __webpack_require__(10);
+	    var Transformable = __webpack_require__(26);
+	    var BoundingRect = __webpack_require__(9);
+
+	    var round = Math.round;
+	    var mathMax = Math.max;
+	    var mathMin = Math.min;
+
+	    var graphic = {};
+
+	    graphic.Group = __webpack_require__(48);
+
+	    graphic.Image = __webpack_require__(49);
+
+	    graphic.Text = __webpack_require__(50);
+
+	    graphic.Circle = __webpack_require__(51);
+
+	    graphic.Sector = __webpack_require__(52);
+
+	    graphic.Ring = __webpack_require__(53);
+
+	    graphic.Polygon = __webpack_require__(54);
+
+	    graphic.Polyline = __webpack_require__(58);
+
+	    graphic.Rect = __webpack_require__(59);
+
+	    graphic.Line = __webpack_require__(61);
+
+	    graphic.BezierCurve = __webpack_require__(62);
+
+	    graphic.Arc = __webpack_require__(63);
+
+	    graphic.CompoundPath = __webpack_require__(64);
+
+	    graphic.LinearGradient = __webpack_require__(65);
+
+	    graphic.RadialGradient = __webpack_require__(67);
+
+	    graphic.BoundingRect = BoundingRect;
+
+	    /**
+	     * Extend shape with parameters
+	     */
+	    graphic.extendShape = function (opts) {
+	        return Path.extend(opts);
+	    };
+
+	    /**
+	     * Extend path
+	     */
+	    graphic.extendPath = function (pathData, opts) {
+	        return pathTool.extendFromString(pathData, opts);
+	    };
+
+	    /**
+	     * Create a path element from path data string
+	     * @param {string} pathData
+	     * @param {Object} opts
+	     * @param {module:zrender/core/BoundingRect} rect
+	     * @param {string} [layout=cover] 'center' or 'cover'
+	     */
+	    graphic.makePath = function (pathData, opts, rect, layout) {
+	        var path = pathTool.createFromString(pathData, opts);
+	        var boundingRect = path.getBoundingRect();
+	        if (rect) {
+	            var aspect = boundingRect.width / boundingRect.height;
+
+	            if (layout === 'center') {
+	                // Set rect to center, keep width / height ratio.
+	                var width = rect.height * aspect;
+	                var height;
+	                if (width <= rect.width) {
+	                    height = rect.height;
+	                }
+	                else {
+	                    width = rect.width;
+	                    height = width / aspect;
+	                }
+	                var cx = rect.x + rect.width / 2;
+	                var cy = rect.y + rect.height / 2;
+
+	                rect.x = cx - width / 2;
+	                rect.y = cy - height / 2;
+	                rect.width = width;
+	                rect.height = height;
+	            }
+
+	            graphic.resizePath(path, rect);
+	        }
+	        return path;
+	    };
+
+	    graphic.mergePath = pathTool.mergePath,
+
+	    /**
+	     * Resize a path to fit the rect
+	     * @param {module:zrender/graphic/Path} path
+	     * @param {Object} rect
+	     */
+	    graphic.resizePath = function (path, rect) {
+	        if (!path.applyTransform) {
+	            return;
+	        }
+
+	        var pathRect = path.getBoundingRect();
+
+	        var m = pathRect.calculateTransform(rect);
+
+	        path.applyTransform(m);
+	    };
+
+	    /**
+	     * Sub pixel optimize line for canvas
+	     *
+	     * @param {Object} param
+	     * @param {Object} [param.shape]
+	     * @param {number} [param.shape.x1]
+	     * @param {number} [param.shape.y1]
+	     * @param {number} [param.shape.x2]
+	     * @param {number} [param.shape.y2]
+	     * @param {Object} [param.style]
+	     * @param {number} [param.style.lineWidth]
+	     * @return {Object} Modified param
+	     */
+	    graphic.subPixelOptimizeLine = function (param) {
+	        var subPixelOptimize = graphic.subPixelOptimize;
+	        var shape = param.shape;
+	        var lineWidth = param.style.lineWidth;
+
+	        if (round(shape.x1 * 2) === round(shape.x2 * 2)) {
+	            shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);
+	        }
+	        if (round(shape.y1 * 2) === round(shape.y2 * 2)) {
+	            shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);
+	        }
+	        return param;
+	    };
+
+	    /**
+	     * Sub pixel optimize rect for canvas
+	     *
+	     * @param {Object} param
+	     * @param {Object} [param.shape]
+	     * @param {number} [param.shape.x]
+	     * @param {number} [param.shape.y]
+	     * @param {number} [param.shape.width]
+	     * @param {number} [param.shape.height]
+	     * @param {Object} [param.style]
+	     * @param {number} [param.style.lineWidth]
+	     * @return {Object} Modified param
+	     */
+	    graphic.subPixelOptimizeRect = function (param) {
+	        var subPixelOptimize = graphic.subPixelOptimize;
+	        var shape = param.shape;
+	        var lineWidth = param.style.lineWidth;
+	        var originX = shape.x;
+	        var originY = shape.y;
+	        var originWidth = shape.width;
+	        var originHeight = shape.height;
+	        shape.x = subPixelOptimize(shape.x, lineWidth, true);
+	        shape.y = subPixelOptimize(shape.y, lineWidth, true);
+	        shape.width = Math.max(
+	            subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x,
+	            originWidth === 0 ? 0 : 1
+	        );
+	        shape.height = Math.max(
+	            subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y,
+	            originHeight === 0 ? 0 : 1
+	        );
+	        return param;
+	    };
+
+	    /**
+	     * Sub pixel optimize for canvas
+	     *
+	     * @param {number} position Coordinate, such as x, y
+	     * @param {number} lineWidth Should be nonnegative integer.
+	     * @param {boolean=} positiveOrNegative Default false (negative).
+	     * @return {number} Optimized position.
+	     */
+	    graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) {
+	        // Assure that (position + lineWidth / 2) is near integer edge,
+	        // otherwise line will be fuzzy in canvas.
+	        var doubledPosition = round(position * 2);
+	        return (doubledPosition + round(lineWidth)) % 2 === 0
+	            ? doubledPosition / 2
+	            : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;
+	    };
+
+	    function hasFillOrStroke(fillOrStroke) {
+	        return fillOrStroke != null && fillOrStroke != 'none';
+	    }
+
+	    function liftColor(color) {
+	        return typeof color === 'string' ? colorTool.lift(color, -0.1) : color;
+	    }
+
+	    /**
+	     * @private
+	     */
+	    function cacheElementStl(el) {
+	        if (el.__hoverStlDirty) {
+	            var stroke = el.style.stroke;
+	            var fill = el.style.fill;
+
+	            // Create hoverStyle on mouseover
+	            var hoverStyle = el.__hoverStl;
+	            hoverStyle.fill = hoverStyle.fill
+	                || (hasFillOrStroke(fill) ? liftColor(fill) : null);
+	            hoverStyle.stroke = hoverStyle.stroke
+	                || (hasFillOrStroke(stroke) ? liftColor(stroke) : null);
+
+	            var normalStyle = {};
+	            for (var name in hoverStyle) {
+	                if (hoverStyle.hasOwnProperty(name)) {
+	                    normalStyle[name] = el.style[name];
+	                }
+	            }
+
+	            el.__normalStl = normalStyle;
+
+	            el.__hoverStlDirty = false;
+	        }
+	    }
+
+	    /**
+	     * @private
+	     */
+	    function doSingleEnterHover(el) {
+	        if (el.__isHover) {
+	            return;
+	        }
+
+	        cacheElementStl(el);
+
+	        if (el.useHoverLayer) {
+	            el.__zr && el.__zr.addHover(el, el.__hoverStl);
+	        }
+	        else {
+	            el.setStyle(el.__hoverStl);
+	            el.z2 += 1;
+	        }
+
+	        el.__isHover = true;
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function doSingleLeaveHover(el) {
+	        if (!el.__isHover) {
+	            return;
+	        }
+
+	        var normalStl = el.__normalStl;
+	        if (el.useHoverLayer) {
+	            el.__zr && el.__zr.removeHover(el);
+	        }
+	        else {
+	            normalStl && el.setStyle(normalStl);
+	            el.z2 -= 1;
+	        }
+
+	        el.__isHover = false;
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function doEnterHover(el) {
+	        el.type === 'group'
+	            ? el.traverse(function (child) {
+	                if (child.type !== 'group') {
+	                    doSingleEnterHover(child);
+	                }
+	            })
+	            : doSingleEnterHover(el);
+	    }
+
+	    function doLeaveHover(el) {
+	        el.type === 'group'
+	            ? el.traverse(function (child) {
+	                if (child.type !== 'group') {
+	                    doSingleLeaveHover(child);
+	                }
+	            })
+	            : doSingleLeaveHover(el);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function setElementHoverStl(el, hoverStl) {
+	        // If element has sepcified hoverStyle, then use it instead of given hoverStyle
+	        // Often used when item group has a label element and it's hoverStyle is different
+	        el.__hoverStl = el.hoverStyle || hoverStl || {};
+	        el.__hoverStlDirty = true;
+
+	        if (el.__isHover) {
+	            cacheElementStl(el);
+	        }
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function onElementMouseOver(e) {
+	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
+	            return;
+	        }
+
+	        // Only if element is not in emphasis status
+	        !this.__isEmphasis && doEnterHover(this);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function onElementMouseOut(e) {
+	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
+	            return;
+	        }
+
+	        // Only if element is not in emphasis status
+	        !this.__isEmphasis && doLeaveHover(this);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function enterEmphasis() {
+	        this.__isEmphasis = true;
+	        doEnterHover(this);
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function leaveEmphasis() {
+	        this.__isEmphasis = false;
+	        doLeaveHover(this);
+	    }
+
+	    /**
+	     * Set hover style of element.
+	     * This method can be called repeatly without side-effects.
+	     * @param {module:zrender/Element} el
+	     * @param {Object} [hoverStyle]
+	     * @param {Object} [opt]
+	     * @param {boolean} [opt.hoverSilentOnTouch=false]
+	     *        In touch device, mouseover event will be trigger on touchstart event
+	     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
+	     *        conviniently use hoverStyle when tap on touch screen without additional
+	     *        code for compatibility.
+	     *        But if the chart/component has select feature, which usually also use
+	     *        hoverStyle, there might be conflict between 'select-highlight' and
+	     *        'hover-highlight' especially when roam is enabled (see geo for example).
+	     *        In this case, hoverSilentOnTouch should be used to disable hover-highlight
+	     *        on touch device.
+	     */
+	    graphic.setHoverStyle = function (el, hoverStyle, opt) {
+	        el.__hoverSilentOnTouch = opt && opt.hoverSilentOnTouch;
+
+	        el.type === 'group'
+	            ? el.traverse(function (child) {
+	                if (child.type !== 'group') {
+	                    setElementHoverStl(child, hoverStyle);
+	                }
+	            })
+	            : setElementHoverStl(el, hoverStyle);
+
+	        // Duplicated function will be auto-ignored, see Eventful.js.
+	        el.on('mouseover', onElementMouseOver)
+	          .on('mouseout', onElementMouseOut);
+
+	        // Emphasis, normal can be triggered manually
+	        el.on('emphasis', enterEmphasis)
+	          .on('normal', leaveEmphasis);
+	    };
+
+	    /**
+	     * Set text option in the style
+	     * @param {Object} textStyle
+	     * @param {module:echarts/model/Model} labelModel
+	     * @param {string} color
+	     */
+	    graphic.setText = function (textStyle, labelModel, color) {
+	        var labelPosition = labelModel.getShallow('position') || 'inside';
+	        var labelOffset = labelModel.getShallow('offset');
+	        var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color;
+	        var textStyleModel = labelModel.getModel('textStyle');
+	        zrUtil.extend(textStyle, {
+	            textDistance: labelModel.getShallow('distance') || 5,
+	            textFont: textStyleModel.getFont(),
+	            textPosition: labelPosition,
+	            textOffset: labelOffset,
+	            textFill: textStyleModel.getTextColor() || labelColor
+	        });
+	    };
+
+	    graphic.getFont = function (opt, ecModel) {
+	        var gTextStyleModel = ecModel && ecModel.getModel('textStyle');
+	        return [
+	            // FIXME in node-canvas fontWeight is before fontStyle
+	            opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '',
+	            opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '',
+	            (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px',
+	            opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'
+	        ].join(' ');
+	    };
+
+	    function animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {
+	        if (typeof dataIndex === 'function') {
+	            cb = dataIndex;
+	            dataIndex = null;
+	        }
+	        // Do not check 'animation' property directly here. Consider this case:
+	        // animation model is an `itemModel`, whose does not have `isAnimationEnabled`
+	        // but its parent model (`seriesModel`) does.
+	        var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();
+
+	        if (animationEnabled) {
+	            var postfix = isUpdate ? 'Update' : '';
+	            var duration = animatableModel.getShallow('animationDuration' + postfix);
+	            var animationEasing = animatableModel.getShallow('animationEasing' + postfix);
+	            var animationDelay = animatableModel.getShallow('animationDelay' + postfix);
+	            if (typeof animationDelay === 'function') {
+	                animationDelay = animationDelay(
+	                    dataIndex,
+	                    animatableModel.getAnimationDelayParams
+	                        ? animatableModel.getAnimationDelayParams(el, dataIndex)
+	                        : null
+	                );
+	            }
+	            if (typeof duration === 'function') {
+	                duration = duration(dataIndex);
+	            }
+
+	            duration > 0
+	                ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb)
+	                : (el.stopAnimation(), el.attr(props), cb && cb());
+	        }
+	        else {
+	            el.stopAnimation();
+	            el.attr(props);
+	            cb && cb();
+	        }
+	    }
+
+	    /**
+	     * Update graphic element properties with or without animation according to the configuration in series
+	     * @param {module:zrender/Element} el
+	     * @param {Object} props
+	     * @param {module:echarts/model/Model} [animatableModel]
+	     * @param {number} [dataIndex]
+	     * @param {Function} [cb]
+	     * @example
+	     *     graphic.updateProps(el, {
+	     *         position: [100, 100]
+	     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
+	     *     // Or
+	     *     graphic.updateProps(el, {
+	     *         position: [100, 100]
+	     *     }, seriesModel, function () { console.log('Animation done!'); });
+	     */
+	    graphic.updateProps = function (el, props, animatableModel, dataIndex, cb) {
+	        animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);
+	    };
+
+	    /**
+	     * Init graphic element properties with or without animation according to the configuration in series
+	     * @param {module:zrender/Element} el
+	     * @param {Object} props
+	     * @param {module:echarts/model/Model} [animatableModel]
+	     * @param {number} [dataIndex]
+	     * @param {Function} cb
+	     */
+	    graphic.initProps = function (el, props, animatableModel, dataIndex, cb) {
+	        animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);
+	    };
+
+	    /**
+	     * Get transform matrix of target (param target),
+	     * in coordinate of its ancestor (param ancestor)
+	     *
+	     * @param {module:zrender/mixin/Transformable} target
+	     * @param {module:zrender/mixin/Transformable} [ancestor]
+	     */
+	    graphic.getTransform = function (target, ancestor) {
+	        var mat = matrix.identity([]);
+
+	        while (target && target !== ancestor) {
+	            matrix.mul(mat, target.getLocalTransform(), mat);
+	            target = target.parent;
+	        }
+
+	        return mat;
+	    };
+
+	    /**
+	     * Apply transform to an vertex.
+	     * @param {Array.<number>} target [x, y]
+	     * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:
+	     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
+	     *      + {position, rotation, scale}, the same as `zrender/Transformable`.
+	     * @param {boolean=} invert Whether use invert matrix.
+	     * @return {Array.<number>} [x, y]
+	     */
+	    graphic.applyTransform = function (target, transform, invert) {
+	        if (transform && !zrUtil.isArrayLike(transform)) {
+	            transform = Transformable.getLocalTransform(transform);
+	        }
+
+	        if (invert) {
+	            transform = matrix.invert([], transform);
+	        }
+	        return vector.applyTransform([], target, transform);
+	    };
+
+	    /**
+	     * @param {string} direction 'left' 'right' 'top' 'bottom'
+	     * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]
+	     * @param {boolean=} invert Whether use invert matrix.
+	     * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'
+	     */
+	    graphic.transformDirection = function (direction, transform, invert) {
+
+	        // Pick a base, ensure that transform result will not be (0, 0).
+	        var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0)
+	            ? 1 : Math.abs(2 * transform[4] / transform[0]);
+	        var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0)
+	            ? 1 : Math.abs(2 * transform[4] / transform[2]);
+
+	        var vertex = [
+	            direction === 'left' ? -hBase : direction === 'right' ? hBase : 0,
+	            direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0
+	        ];
+
+	        vertex = graphic.applyTransform(vertex, transform, invert);
+
+	        return Math.abs(vertex[0]) > Math.abs(vertex[1])
+	            ? (vertex[0] > 0 ? 'right' : 'left')
+	            : (vertex[1] > 0 ? 'bottom' : 'top');
+	    };
+
+	    /**
+	     * Apply group transition animation from g1 to g2.
+	     * If no animatableModel, no animation.
+	     */
+	    graphic.groupTransition = function (g1, g2, animatableModel, cb) {
+	        if (!g1 || !g2) {
+	            return;
+	        }
+
+	        function getElMap(g) {
+	            var elMap = {};
+	            g.traverse(function (el) {
+	                if (!el.isGroup && el.anid) {
+	                    elMap[el.anid] = el;
+	                }
+	            });
+	            return elMap;
+	        }
+	        function getAnimatableProps(el) {
+	            var obj = {
+	                position: vector.clone(el.position),
+	                rotation: el.rotation
+	            };
+	            if (el.shape) {
+	                obj.shape = zrUtil.extend({}, el.shape);
+	            }
+	            return obj;
+	        }
+	        var elMap1 = getElMap(g1);
+
+	        g2.traverse(function (el) {
+	            if (!el.isGroup && el.anid) {
+	                var oldEl = elMap1[el.anid];
+	                if (oldEl) {
+	                    var newProp = getAnimatableProps(el);
+	                    el.attr(getAnimatableProps(oldEl));
+	                    graphic.updateProps(el, newProp, animatableModel, el.dataIndex);
+	                }
+	                // else {
+	                //     if (el.previousProps) {
+	                //         graphic.updateProps
+	                //     }
+	                // }
+	            }
+	        });
+	    };
+
+	    /**
+	     * @param {Array.<Array.<number>>} points Like: [[23, 44], [53, 66], ...]
+	     * @param {Object} rect {x, y, width, height}
+	     * @return {Array.<Array.<number>>} A new clipped points.
+	     */
+	    graphic.clipPointsByRect = function (points, rect) {
+	        return zrUtil.map(points, function (point) {
+	            var x = point[0];
+	            x = mathMax(x, rect.x);
+	            x = mathMin(x, rect.x + rect.width);
+	            var y = point[1];
+	            y = mathMax(y, rect.y);
+	            y = mathMin(y, rect.y + rect.height);
+	            return [x, y];
+	        });
+	    };
+
+	    /**
+	     * @param {Object} targetRect {x, y, width, height}
+	     * @param {Object} rect {x, y, width, height}
+	     * @return {Object} A new clipped rect. If rect size are negative, return undefined.
+	     */
+	    graphic.clipRectByRect = function (targetRect, rect) {
+	        var x = mathMax(targetRect.x, rect.x);
+	        var x2 = mathMin(targetRect.x + targetRect.width, rect.x + rect.width);
+	        var y = mathMax(targetRect.y, rect.y);
+	        var y2 = mathMin(targetRect.y + targetRect.height, rect.y + rect.height);
+
+	        if (x2 >= x && y2 >= y) {
+	            return {
+	                x: x,
+	                y: y,
+	                width: x2 - x,
+	                height: y2 - y
+	            };
 	        }
 	    };
 
+	    module.exports = graphic;
+
+
 
 /***/ },
 /* 19 */
 /***/ function(module, exports, __webpack_require__) {
 
-	/**
-	 * Component model
-	 *
-	 * @module echarts/model/Component
-	 */
+	
 
+	    var Path = __webpack_require__(20);
+	    var PathProxy = __webpack_require__(36);
+	    var transformPath = __webpack_require__(47);
 
-	    var Model = __webpack_require__(12);
-	    var zrUtil = __webpack_require__(4);
-	    var arrayPush = Array.prototype.push;
-	    var componentUtil = __webpack_require__(20);
-	    var clazzUtil = __webpack_require__(13);
-	    var layout = __webpack_require__(21);
+	    // command chars
+	    var cc = [
+	        'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z',
+	        'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'
+	    ];
 
-	    /**
-	     * @alias module:echarts/model/Component
-	     * @constructor
-	     * @param {Object} option
-	     * @param {module:echarts/model/Model} parentModel
-	     * @param {module:echarts/model/Model} ecModel
-	     */
-	    var ComponentModel = Model.extend({
+	    var mathSqrt = Math.sqrt;
+	    var mathSin = Math.sin;
+	    var mathCos = Math.cos;
+	    var PI = Math.PI;
 
-	        type: 'component',
+	    var vMag = function(v) {
+	        return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
+	    };
+	    var vRatio = function(u, v) {
+	        return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
+	    };
+	    var vAngle = function(u, v) {
+	        return (u[0] * v[1] < u[1] * v[0] ? -1 : 1)
+	                * Math.acos(vRatio(u, v));
+	    };
 
-	        /**
-	         * @readOnly
-	         * @type {string}
-	         */
-	        id: '',
+	    function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {
+	        var psi = psiDeg * (PI / 180.0);
+	        var xp = mathCos(psi) * (x1 - x2) / 2.0
+	                 + mathSin(psi) * (y1 - y2) / 2.0;
+	        var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0
+	                 + mathCos(psi) * (y1 - y2) / 2.0;
 
-	        /**
-	         * @readOnly
-	         */
-	        name: '',
+	        var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);
 
-	        /**
-	         * @readOnly
-	         * @type {string}
-	         */
-	        mainType: '',
-
-	        /**
-	         * @readOnly
-	         * @type {string}
-	         */
-	        subType: '',
-
-	        /**
-	         * @readOnly
-	         * @type {number}
-	         */
-	        componentIndex: 0,
-
-	        /**
-	         * @type {Object}
-	         * @protected
-	         */
-	        defaultOption: null,
-
-	        /**
-	         * @type {module:echarts/model/Global}
-	         * @readOnly
-	         */
-	        ecModel: null,
-
-	        /**
-	         * key: componentType
-	         * value:  Component model list, can not be null.
-	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
-	         * @readOnly
-	         */
-	        dependentModels: [],
-
-	        /**
-	         * @type {string}
-	         * @readOnly
-	         */
-	        uid: null,
-
-	        /**
-	         * Support merge layout params.
-	         * Only support 'box' now (left/right/top/bottom/width/height).
-	         * @type {string|Object} Object can be {ignoreSize: true}
-	         * @readOnly
-	         */
-	        layoutMode: null,
-
-	        $constructor: function (option, parentModel, ecModel, extraOpt) {
-	            Model.call(this, option, parentModel, ecModel, extraOpt);
-
-	            this.uid = componentUtil.getUID('componentModel');
-	        },
-
-
-	        init: function (option, parentModel, ecModel, extraOpt) {
-	            this.mergeDefaultAndTheme(option, ecModel);
-	        },
-
-	        mergeDefaultAndTheme: function (option, ecModel) {
-	            var layoutMode = this.layoutMode;
-	            var inputPositionParams = layoutMode
-	                ? layout.getLayoutParams(option) : {};
-
-	            var themeModel = ecModel.getTheme();
-	            zrUtil.merge(option, themeModel.get(this.mainType));
-	            zrUtil.merge(option, this.getDefaultOption());
-
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
-	            }
-	        },
-
-	        mergeOption: function (option, extraOpt) {
-	            zrUtil.merge(this.option, option, true);
-
-	            var layoutMode = this.layoutMode;
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(this.option, option, layoutMode);
-	            }
-	        },
-
-	        // Hooker after init or mergeOption
-	        optionUpdated: function (newCptOption, isInit) {},
-
-	        getDefaultOption: function () {
-	            if (!clazzUtil.hasOwn(this, '__defaultOption')) {
-	                var optList = [];
-	                var Class = this.constructor;
-	                while (Class) {
-	                    var opt = Class.prototype.defaultOption;
-	                    opt && optList.push(opt);
-	                    Class = Class.superClass;
-	                }
-
-	                var defaultOption = {};
-	                for (var i = optList.length - 1; i >= 0; i--) {
-	                    defaultOption = zrUtil.merge(defaultOption, optList[i], true);
-	                }
-	                clazzUtil.set(this, '__defaultOption', defaultOption);
-	            }
-	            return clazzUtil.get(this, '__defaultOption');
-	        },
-
-	        getReferringComponents: function (mainType) {
-	            return this.ecModel.queryComponents({
-	                mainType: mainType,
-	                index: this.get(mainType + 'Index', true),
-	                id: this.get(mainType + 'Id', true)
-	            });
+	        if (lambda > 1) {
+	            rx *= mathSqrt(lambda);
+	            ry *= mathSqrt(lambda);
 	        }
 
-	    });
+	        var f = (fa === fs ? -1 : 1)
+	            * mathSqrt((((rx * rx) * (ry * ry))
+	                    - ((rx * rx) * (yp * yp))
+	                    - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp)
+	                    + (ry * ry) * (xp * xp))
+	                ) || 0;
 
-	    // Reset ComponentModel.extend, add preConstruct.
-	    // clazzUtil.enableClassExtend(
-	    //     ComponentModel,
-	    //     function (option, parentModel, ecModel, extraOpt) {
-	    //         // Set dependentModels, componentIndex, name, id, mainType, subType.
-	    //         zrUtil.extend(this, extraOpt);
+	        var cxp = f * rx * yp / ry;
+	        var cyp = f * -ry * xp / rx;
 
-	    //         this.uid = componentUtil.getUID('componentModel');
+	        var cx = (x1 + x2) / 2.0
+	                 + mathCos(psi) * cxp
+	                 - mathSin(psi) * cyp;
+	        var cy = (y1 + y2) / 2.0
+	                + mathSin(psi) * cxp
+	                + mathCos(psi) * cyp;
 
-	    //         // this.setReadOnly([
-	    //         //     'type', 'id', 'uid', 'name', 'mainType', 'subType',
-	    //         //     'dependentModels', 'componentIndex'
-	    //         // ]);
-	    //     }
-	    // );
+	        var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]);
+	        var u = [ (xp - cxp) / rx, (yp - cyp) / ry ];
+	        var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ];
+	        var dTheta = vAngle(u, v);
 
-	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
-	    clazzUtil.enableClassManagement(
-	        ComponentModel, {registerWhenExtend: true}
-	    );
-	    componentUtil.enableSubTypeDefaulter(ComponentModel);
+	        if (vRatio(u, v) <= -1) {
+	            dTheta = PI;
+	        }
+	        if (vRatio(u, v) >= 1) {
+	            dTheta = 0;
+	        }
+	        if (fs === 0 && dTheta > 0) {
+	            dTheta = dTheta - 2 * PI;
+	        }
+	        if (fs === 1 && dTheta < 0) {
+	            dTheta = dTheta + 2 * PI;
+	        }
 
-	    // Add capability of ComponentModel.topologicalTravel.
-	    componentUtil.enableTopologicalTravel(ComponentModel, getDependencies);
-
-	    function getDependencies(componentType) {
-	        var deps = [];
-	        zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
-	            arrayPush.apply(deps, Clazz.prototype.dependencies || []);
-	        });
-	        // Ensure main type
-	        return zrUtil.map(deps, function (type) {
-	            return clazzUtil.parseClassType(type).main;
-	        });
+	        path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);
 	    }
 
-	    zrUtil.mixin(ComponentModel, __webpack_require__(22));
+	    function createPathProxyFromString(data) {
+	        if (!data) {
+	            return [];
+	        }
 
-	    module.exports = ComponentModel;
+	        // command string
+	        var cs = data.replace(/-/g, ' -')
+	            .replace(/  /g, ' ')
+	            .replace(/ /g, ',')
+	            .replace(/,,/g, ',');
+
+	        var n;
+	        // create pipes so that we can split the data
+	        for (n = 0; n < cc.length; n++) {
+	            cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
+	        }
+
+	        // create array
+	        var arr = cs.split('|');
+	        // init context point
+	        var cpx = 0;
+	        var cpy = 0;
+
+	        var path = new PathProxy();
+	        var CMD = PathProxy.CMD;
+
+	        var prevCmd;
+	        for (n = 1; n < arr.length; n++) {
+	            var str = arr[n];
+	            var c = str.charAt(0);
+	            var off = 0;
+	            var p = str.slice(1).replace(/e,-/g, 'e-').split(',');
+	            var cmd;
+
+	            if (p.length > 0 && p[0] === '') {
+	                p.shift();
+	            }
+
+	            for (var i = 0; i < p.length; i++) {
+	                p[i] = parseFloat(p[i]);
+	            }
+	            while (off < p.length && !isNaN(p[off])) {
+	                if (isNaN(p[0])) {
+	                    break;
+	                }
+	                var ctlPtx;
+	                var ctlPty;
+
+	                var rx;
+	                var ry;
+	                var psi;
+	                var fa;
+	                var fs;
+
+	                var x1 = cpx;
+	                var y1 = cpy;
+
+	                // convert l, H, h, V, and v to L
+	                switch (c) {
+	                    case 'l':
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'L':
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'm':
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.M;
+	                        path.addData(cmd, cpx, cpy);
+	                        c = 'l';
+	                        break;
+	                    case 'M':
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.M;
+	                        path.addData(cmd, cpx, cpy);
+	                        c = 'L';
+	                        break;
+	                    case 'h':
+	                        cpx += p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'H':
+	                        cpx = p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'v':
+	                        cpy += p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'V':
+	                        cpy = p[off++];
+	                        cmd = CMD.L;
+	                        path.addData(cmd, cpx, cpy);
+	                        break;
+	                    case 'C':
+	                        cmd = CMD.C;
+	                        path.addData(
+	                            cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]
+	                        );
+	                        cpx = p[off - 2];
+	                        cpy = p[off - 1];
+	                        break;
+	                    case 'c':
+	                        cmd = CMD.C;
+	                        path.addData(
+	                            cmd,
+	                            p[off++] + cpx, p[off++] + cpy,
+	                            p[off++] + cpx, p[off++] + cpy,
+	                            p[off++] + cpx, p[off++] + cpy
+	                        );
+	                        cpx += p[off - 2];
+	                        cpy += p[off - 1];
+	                        break;
+	                    case 'S':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.C) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cmd = CMD.C;
+	                        x1 = p[off++];
+	                        y1 = p[off++];
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
+	                        break;
+	                    case 's':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.C) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cmd = CMD.C;
+	                        x1 = cpx + p[off++];
+	                        y1 = cpy + p[off++];
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
+	                        break;
+	                    case 'Q':
+	                        x1 = p[off++];
+	                        y1 = p[off++];
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, x1, y1, cpx, cpy);
+	                        break;
+	                    case 'q':
+	                        x1 = p[off++] + cpx;
+	                        y1 = p[off++] + cpy;
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, x1, y1, cpx, cpy);
+	                        break;
+	                    case 'T':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.Q) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
+	                        break;
+	                    case 't':
+	                        ctlPtx = cpx;
+	                        ctlPty = cpy;
+	                        var len = path.len();
+	                        var pathData = path.data;
+	                        if (prevCmd === CMD.Q) {
+	                            ctlPtx += cpx - pathData[len - 4];
+	                            ctlPty += cpy - pathData[len - 3];
+	                        }
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.Q;
+	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
+	                        break;
+	                    case 'A':
+	                        rx = p[off++];
+	                        ry = p[off++];
+	                        psi = p[off++];
+	                        fa = p[off++];
+	                        fs = p[off++];
+
+	                        x1 = cpx, y1 = cpy;
+	                        cpx = p[off++];
+	                        cpy = p[off++];
+	                        cmd = CMD.A;
+	                        processArc(
+	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
+	                        );
+	                        break;
+	                    case 'a':
+	                        rx = p[off++];
+	                        ry = p[off++];
+	                        psi = p[off++];
+	                        fa = p[off++];
+	                        fs = p[off++];
+
+	                        x1 = cpx, y1 = cpy;
+	                        cpx += p[off++];
+	                        cpy += p[off++];
+	                        cmd = CMD.A;
+	                        processArc(
+	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
+	                        );
+	                        break;
+	                }
+	            }
+
+	            if (c === 'z' || c === 'Z') {
+	                cmd = CMD.Z;
+	                path.addData(cmd);
+	            }
+
+	            prevCmd = cmd;
+	        }
+
+	        path.toStatic();
+
+	        return path;
+	    }
+
+	    // TODO Optimize double memory cost problem
+	    function createPathOptions(str, opts) {
+	        var pathProxy = createPathProxyFromString(str);
+	        opts = opts || {};
+	        opts.buildPath = function (path) {
+	            if (path.setData) {
+	                path.setData(pathProxy.data);
+	                // Svg and vml renderer don't have context
+	                var ctx = path.getContext();
+	                if (ctx) {
+	                    path.rebuildPath(ctx);
+	                }
+	            }
+	            else {
+	                var ctx = path;
+	                pathProxy.rebuildPath(ctx);
+	            }
+	        };
+
+	        opts.applyTransform = function (m) {
+	            transformPath(pathProxy, m);
+
+	            this.dirty(true);
+	        };
+
+	        return opts;
+	    }
+
+	    module.exports = {
+	        /**
+	         * Create a Path object from path string data
+	         * http://www.w3.org/TR/SVG/paths.html#PathData
+	         * @param  {Object} opts Other options
+	         */
+	        createFromString: function (str, opts) {
+	            return new Path(createPathOptions(str, opts));
+	        },
+
+	        /**
+	         * Create a Path class from path string data
+	         * @param  {string} str
+	         * @param  {Object} opts Other options
+	         */
+	        extendFromString: function (str, opts) {
+	            return Path.extend(createPathOptions(str, opts));
+	        },
+
+	        /**
+	         * Merge multiple paths
+	         */
+	        // TODO Apply transform
+	        // TODO stroke dash
+	        // TODO Optimize double memory cost problem
+	        mergePath: function (pathEls, opts) {
+	            var pathList = [];
+	            var len = pathEls.length;
+	            for (var i = 0; i < len; i++) {
+	                var pathEl = pathEls[i];
+	                if (!pathEl.path) {
+	                    pathEl.createPathProxy();
+	                }
+	                if (pathEl.__dirtyPath) {
+	                    pathEl.buildPath(pathEl.path, pathEl.shape, true);
+	                }
+	                pathList.push(pathEl.path);
+	            }
+
+	            var pathBundle = new Path(opts);
+	            // Need path proxy.
+	            pathBundle.createPathProxy();
+	            pathBundle.buildPath = function (path) {
+	                path.appendPath(pathList);
+	                // Svg and vml renderer don't have context
+	                var ctx = path.getContext();
+	                if (ctx) {
+	                    path.rebuildPath(ctx);
+	                }
+	            };
+
+	            return pathBundle;
+	        }
+	    };
 
 
 /***/ },
 /* 20 */
 /***/ function(module, exports, __webpack_require__) {
 
-	
+	/**
+	 * Path element
+	 * @module zrender/graphic/Path
+	 */
 
+
+
+	    var Displayable = __webpack_require__(21);
 	    var zrUtil = __webpack_require__(4);
-	    var clazz = __webpack_require__(13);
+	    var PathProxy = __webpack_require__(36);
+	    var pathContain = __webpack_require__(39);
 
-	    var parseClassType = clazz.parseClassType;
+	    var Pattern = __webpack_require__(46);
+	    var getCanvasPattern = Pattern.prototype.getCanvasPattern;
 
-	    var base = 0;
+	    var abs = Math.abs;
 
-	    var componentUtil = {};
-
-	    var DELIMITER = '_';
-
+	    var pathProxyForDraw = new PathProxy(true);
 	    /**
-	     * @public
-	     * @param {string} type
-	     * @return {string}
+	     * @alias module:zrender/graphic/Path
+	     * @extends module:zrender/graphic/Displayable
+	     * @constructor
+	     * @param {Object} opts
 	     */
-	    componentUtil.getUID = function (type) {
-	        // Considering the case of crossing js context,
-	        // use Math.random to make id as unique as possible.
-	        return [(type || ''), base++, Math.random()].join(DELIMITER);
-	    };
-
-	    /**
-	     * @inner
-	     */
-	    componentUtil.enableSubTypeDefaulter = function (entity) {
-
-	        var subTypeDefaulters = {};
-
-	        entity.registerSubTypeDefaulter = function (componentType, defaulter) {
-	            componentType = parseClassType(componentType);
-	            subTypeDefaulters[componentType.main] = defaulter;
-	        };
-
-	        entity.determineSubType = function (componentType, option) {
-	            var type = option.type;
-	            if (!type) {
-	                var componentTypeMain = parseClassType(componentType).main;
-	                if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {
-	                    type = subTypeDefaulters[componentTypeMain](option);
-	                }
-	            }
-	            return type;
-	        };
-
-	        return entity;
-	    };
-
-	    /**
-	     * Topological travel on Activity Network (Activity On Vertices).
-	     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
-	     *
-	     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
-	     *
-	     * If there is circle dependencey, Error will be thrown.
-	     *
-	     */
-	    componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) {
+	    function Path(opts) {
+	        Displayable.call(this, opts);
 
 	        /**
-	         * @public
-	         * @param {Array.<string>} targetNameList Target Component type list.
-	         *                                           Can be ['aa', 'bb', 'aa.xx']
-	         * @param {Array.<string>} fullNameList By which we can build dependency graph.
-	         * @param {Function} callback Params: componentType, dependencies.
-	         * @param {Object} context Scope of callback.
+	         * @type {module:zrender/core/PathProxy}
+	         * @readOnly
 	         */
-	        entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {
-	            if (!targetNameList.length) {
-	                return;
-	            }
+	        this.path = null;
+	    }
 
-	            var result = makeDepndencyGraph(fullNameList);
-	            var graph = result.graph;
-	            var stack = result.noEntryList;
+	    Path.prototype = {
 
-	            var targetNameSet = {};
-	            zrUtil.each(targetNameList, function (name) {
-	                targetNameSet[name] = true;
-	            });
+	        constructor: Path,
 
-	            while (stack.length) {
-	                var currComponentType = stack.pop();
-	                var currVertex = graph[currComponentType];
-	                var isInTargetNameSet = !!targetNameSet[currComponentType];
-	                if (isInTargetNameSet) {
-	                    callback.call(context, currComponentType, currVertex.originalDeps.slice());
-	                    delete targetNameSet[currComponentType];
+	        type: 'path',
+
+	        __dirtyPath: true,
+
+	        strokeContainThreshold: 5,
+
+	        brush: function (ctx, prevEl) {
+	            var style = this.style;
+	            var path = this.path || pathProxyForDraw;
+	            var hasStroke = style.hasStroke();
+	            var hasFill = style.hasFill();
+	            var fill = style.fill;
+	            var stroke = style.stroke;
+	            var hasFillGradient = hasFill && !!(fill.colorStops);
+	            var hasStrokeGradient = hasStroke && !!(stroke.colorStops);
+	            var hasFillPattern = hasFill && !!(fill.image);
+	            var hasStrokePattern = hasStroke && !!(stroke.image);
+
+	            style.bind(ctx, this, prevEl);
+	            this.setTransform(ctx);
+
+	            if (this.__dirty) {
+	                var rect;
+	                // Update gradient because bounding rect may changed
+	                if (hasFillGradient) {
+	                    rect = rect || this.getBoundingRect();
+	                    this._fillGradient = style.getGradient(ctx, fill, rect);
 	                }
-	                zrUtil.each(
-	                    currVertex.successor,
-	                    isInTargetNameSet ? removeEdgeAndAdd : removeEdge
-	                );
-	            }
-
-	            zrUtil.each(targetNameSet, function () {
-	                throw new Error('Circle dependency may exists');
-	            });
-
-	            function removeEdge(succComponentType) {
-	                graph[succComponentType].entryCount--;
-	                if (graph[succComponentType].entryCount === 0) {
-	                    stack.push(succComponentType);
+	                if (hasStrokeGradient) {
+	                    rect = rect || this.getBoundingRect();
+	                    this._strokeGradient = style.getGradient(ctx, stroke, rect);
 	                }
 	            }
-
-	            // Consider this case: legend depends on series, and we call
-	            // chart.setOption({series: [...]}), where only series is in option.
-	            // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will
-	            // not be called, but only sereis.mergeOption is called. Thus legend
-	            // have no chance to update its local record about series (like which
-	            // name of series is available in legend).
-	            function removeEdgeAndAdd(succComponentType) {
-	                targetNameSet[succComponentType] = true;
-	                removeEdge(succComponentType);
+	            // Use the gradient or pattern
+	            if (hasFillGradient) {
+	                // PENDING If may have affect the state
+	                ctx.fillStyle = this._fillGradient;
 	            }
-	        };
+	            else if (hasFillPattern) {
+	                ctx.fillStyle = getCanvasPattern.call(fill, ctx);
+	            }
+	            if (hasStrokeGradient) {
+	                ctx.strokeStyle = this._strokeGradient;
+	            }
+	            else if (hasStrokePattern) {
+	                ctx.strokeStyle = getCanvasPattern.call(stroke, ctx);
+	            }
+
+	            var lineDash = style.lineDash;
+	            var lineDashOffset = style.lineDashOffset;
+
+	            var ctxLineDash = !!ctx.setLineDash;
+
+	            // Update path sx, sy
+	            var scale = this.getGlobalScale();
+	            path.setScale(scale[0], scale[1]);
+
+	            // Proxy context
+	            // Rebuild path in following 2 cases
+	            // 1. Path is dirty
+	            // 2. Path needs javascript implemented lineDash stroking.
+	            //    In this case, lineDash information will not be saved in PathProxy
+	            if (this.__dirtyPath
+	                || (lineDash && !ctxLineDash && hasStroke)
+	            ) {
+	                path.beginPath(ctx);
+
+	                // Setting line dash before build path
+	                if (lineDash && !ctxLineDash) {
+	                    path.setLineDash(lineDash);
+	                    path.setLineDashOffset(lineDashOffset);
+	                }
+
+	                this.buildPath(path, this.shape, false);
+
+	                // Clear path dirty flag
+	                if (this.path) {
+	                    this.__dirtyPath = false;
+	                }
+	            }
+	            else {
+	                // Replay path building
+	                ctx.beginPath();
+	                this.path.rebuildPath(ctx);
+	            }
+
+	            hasFill && path.fill(ctx);
+
+	            if (lineDash && ctxLineDash) {
+	                ctx.setLineDash(lineDash);
+	                ctx.lineDashOffset = lineDashOffset;
+	            }
+
+	            hasStroke && path.stroke(ctx);
+
+	            if (lineDash && ctxLineDash) {
+	                // PENDING
+	                // Remove lineDash
+	                ctx.setLineDash([]);
+	            }
+
+
+	            this.restoreTransform(ctx);
+
+	            // Draw rect text
+	            if (style.text != null) {
+	                // var rect = this.getBoundingRect();
+	                this.drawRectText(ctx, this.getBoundingRect());
+	            }
+	        },
+
+	        // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath
+	        // Like in circle
+	        buildPath: function (ctx, shapeCfg, inBundle) {},
+
+	        createPathProxy: function () {
+	            this.path = new PathProxy();
+	        },
+
+	        getBoundingRect: function () {
+	            var rect = this._rect;
+	            var style = this.style;
+	            var needsUpdateRect = !rect;
+	            if (needsUpdateRect) {
+	                var path = this.path;
+	                if (!path) {
+	                    // Create path on demand.
+	                    path = this.path = new PathProxy();
+	                }
+	                if (this.__dirtyPath) {
+	                    path.beginPath();
+	                    this.buildPath(path, this.shape, false);
+	                }
+	                rect = path.getBoundingRect();
+	            }
+	            this._rect = rect;
+
+	            if (style.hasStroke()) {
+	                // Needs update rect with stroke lineWidth when
+	                // 1. Element changes scale or lineWidth
+	                // 2. Shape is changed
+	                var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone());
+	                if (this.__dirty || needsUpdateRect) {
+	                    rectWithStroke.copy(rect);
+	                    // FIXME Must after updateTransform
+	                    var w = style.lineWidth;
+	                    // PENDING, Min line width is needed when line is horizontal or vertical
+	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
+
+	                    // Only add extra hover lineWidth when there are no fill
+	                    if (!style.hasFill()) {
+	                        w = Math.max(w, this.strokeContainThreshold || 4);
+	                    }
+	                    // Consider line width
+	                    // Line scale can't be 0;
+	                    if (lineScale > 1e-10) {
+	                        rectWithStroke.width += w / lineScale;
+	                        rectWithStroke.height += w / lineScale;
+	                        rectWithStroke.x -= w / lineScale / 2;
+	                        rectWithStroke.y -= w / lineScale / 2;
+	                    }
+	                }
+
+	                // Return rect with stroke
+	                return rectWithStroke;
+	            }
+
+	            return rect;
+	        },
+
+	        contain: function (x, y) {
+	            var localPos = this.transformCoordToLocal(x, y);
+	            var rect = this.getBoundingRect();
+	            var style = this.style;
+	            x = localPos[0];
+	            y = localPos[1];
+
+	            if (rect.contain(x, y)) {
+	                var pathData = this.path.data;
+	                if (style.hasStroke()) {
+	                    var lineWidth = style.lineWidth;
+	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
+	                    // Line scale can't be 0;
+	                    if (lineScale > 1e-10) {
+	                        // Only add extra hover lineWidth when there are no fill
+	                        if (!style.hasFill()) {
+	                            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);
+	                        }
+	                        if (pathContain.containStroke(
+	                            pathData, lineWidth / lineScale, x, y
+	                        )) {
+	                            return true;
+	                        }
+	                    }
+	                }
+	                if (style.hasFill()) {
+	                    return pathContain.contain(pathData, x, y);
+	                }
+	            }
+	            return false;
+	        },
 
 	        /**
-	         * DepndencyGraph: {Object}
-	         * key: conponentType,
-	         * value: {
-	         *     successor: [conponentTypes...],
-	         *     originalDeps: [conponentTypes...],
-	         *     entryCount: {number}
-	         * }
+	         * @param  {boolean} dirtyPath
 	         */
-	        function makeDepndencyGraph(fullNameList) {
-	            var graph = {};
-	            var noEntryList = [];
-
-	            zrUtil.each(fullNameList, function (name) {
-
-	                var thisItem = createDependencyGraphItem(graph, name);
-	                var originalDeps = thisItem.originalDeps = dependencyGetter(name);
-
-	                var availableDeps = getAvailableDependencies(originalDeps, fullNameList);
-	                thisItem.entryCount = availableDeps.length;
-	                if (thisItem.entryCount === 0) {
-	                    noEntryList.push(name);
-	                }
-
-	                zrUtil.each(availableDeps, function (dependentName) {
-	                    if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) {
-	                        thisItem.predecessor.push(dependentName);
-	                    }
-	                    var thatItem = createDependencyGraphItem(graph, dependentName);
-	                    if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) {
-	                        thatItem.successor.push(name);
-	                    }
-	                });
-	            });
-
-	            return {graph: graph, noEntryList: noEntryList};
-	        }
-
-	        function createDependencyGraphItem(graph, name) {
-	            if (!graph[name]) {
-	                graph[name] = {predecessor: [], successor: []};
+	        dirty: function (dirtyPath) {
+	            if (dirtyPath == null) {
+	                dirtyPath = true;
 	            }
-	            return graph[name];
-	        }
+	            // Only mark dirty, not mark clean
+	            if (dirtyPath) {
+	                this.__dirtyPath = dirtyPath;
+	                this._rect = null;
+	            }
 
-	        function getAvailableDependencies(originalDeps, fullNameList) {
-	            var availableDeps = [];
-	            zrUtil.each(originalDeps, function (dep) {
-	                zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);
-	            });
-	            return availableDeps;
+	            this.__dirty = true;
+
+	            this.__zr && this.__zr.refresh();
+
+	            // Used as a clipping path
+	            if (this.__clipTarget) {
+	                this.__clipTarget.dirty();
+	            }
+	        },
+
+	        /**
+	         * Alias for animate('shape')
+	         * @param {boolean} loop
+	         */
+	        animateShape: function (loop) {
+	            return this.animate('shape', loop);
+	        },
+
+	        // Overwrite attrKV
+	        attrKV: function (key, value) {
+	            // FIXME
+	            if (key === 'shape') {
+	                this.setShape(value);
+	                this.__dirtyPath = true;
+	                this._rect = null;
+	            }
+	            else {
+	                Displayable.prototype.attrKV.call(this, key, value);
+	            }
+	        },
+
+	        /**
+	         * @param {Object|string} key
+	         * @param {*} value
+	         */
+	        setShape: function (key, value) {
+	            var shape = this.shape;
+	            // Path from string may not have shape
+	            if (shape) {
+	                if (zrUtil.isObject(key)) {
+	                    for (var name in key) {
+	                        if (key.hasOwnProperty(name)) {
+	                            shape[name] = key[name];
+	                        }
+	                    }
+	                }
+	                else {
+	                    shape[key] = value;
+	                }
+	                this.dirty(true);
+	            }
+	            return this;
+	        },
+
+	        getLineScale: function () {
+	            var m = this.transform;
+	            // Get the line scale.
+	            // Determinant of `m` means how much the area is enlarged by the
+	            // transformation. So its square root can be used as a scale factor
+	            // for width.
+	            return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10
+	                ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1]))
+	                : 1;
 	        }
 	    };
 
-	    module.exports = componentUtil;
+	    /**
+	     * 扩展一个 Path element, 比如星形，圆等。
+	     * Extend a path element
+	     * @param {Object} props
+	     * @param {string} props.type Path type
+	     * @param {Function} props.init Initialize
+	     * @param {Function} props.buildPath Overwrite buildPath method
+	     * @param {Object} [props.style] Extended default style config
+	     * @param {Object} [props.shape] Extended default shape config
+	     */
+	    Path.extend = function (defaults) {
+	        var Sub = function (opts) {
+	            Path.call(this, opts);
+
+	            if (defaults.style) {
+	                // Extend default style
+	                this.style.extendFrom(defaults.style, false);
+	            }
+
+	            // Extend default shape
+	            var defaultShape = defaults.shape;
+	            if (defaultShape) {
+	                this.shape = this.shape || {};
+	                var thisShape = this.shape;
+	                for (var name in defaultShape) {
+	                    if (
+	                        ! thisShape.hasOwnProperty(name)
+	                        && defaultShape.hasOwnProperty(name)
+	                    ) {
+	                        thisShape[name] = defaultShape[name];
+	                    }
+	                }
+	            }
+
+	            defaults.init && defaults.init.call(this, opts);
+	        };
+
+	        zrUtil.inherits(Sub, Path);
+
+	        // FIXME 不能 extend position, rotation 等引用对象
+	        for (var name in defaults) {
+	            // Extending prototype values and methods
+	            if (name !== 'style' && name !== 'shape') {
+	                Sub.prototype[name] = defaults[name];
+	            }
+	        }
+
+	        return Sub;
+	    };
+
+	    zrUtil.inherits(Path, Displayable);
+
+	    module.exports = Path;
 
 
 /***/ },
 /* 21 */
 /***/ function(module, exports, __webpack_require__) {
 
-	'use strict';
-	// Layout helpers for each component positioning
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var BoundingRect = __webpack_require__(9);
-	    var numberUtil = __webpack_require__(7);
-	    var formatUtil = __webpack_require__(6);
-	    var parsePercent = numberUtil.parsePercent;
-	    var each = zrUtil.each;
-
-	    var layout = {};
-
-	    /**
-	     * @public
-	     */
-	    var LOCATION_PARAMS = layout.LOCATION_PARAMS = [
-	        'left', 'right', 'top', 'bottom', 'width', 'height'
-	    ];
-
-	    /**
-	     * @public
-	     */
-	    var HV_NAMES = layout.HV_NAMES = [
-	        ['width', 'left', 'right'],
-	        ['height', 'top', 'bottom']
-	    ];
-
-	    function boxLayout(orient, group, gap, maxWidth, maxHeight) {
-	        var x = 0;
-	        var y = 0;
-	        if (maxWidth == null) {
-	            maxWidth = Infinity;
-	        }
-	        if (maxHeight == null) {
-	            maxHeight = Infinity;
-	        }
-	        var currentLineMaxSize = 0;
-	        group.eachChild(function (child, idx) {
-	            var position = child.position;
-	            var rect = child.getBoundingRect();
-	            var nextChild = group.childAt(idx + 1);
-	            var nextChildRect = nextChild && nextChild.getBoundingRect();
-	            var nextX;
-	            var nextY;
-	            if (orient === 'horizontal') {
-	                var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0);
-	                nextX = x + moveX;
-	                // Wrap when width exceeds maxWidth or meet a `newline` group
-	                if (nextX > maxWidth || child.newline) {
-	                    x = 0;
-	                    nextX = moveX;
-	                    y += currentLineMaxSize + gap;
-	                    currentLineMaxSize = rect.height;
-	                }
-	                else {
-	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);
-	                }
-	            }
-	            else {
-	                var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0);
-	                nextY = y + moveY;
-	                // Wrap when width exceeds maxHeight or meet a `newline` group
-	                if (nextY > maxHeight || child.newline) {
-	                    x += currentLineMaxSize + gap;
-	                    y = 0;
-	                    nextY = moveY;
-	                    currentLineMaxSize = rect.width;
-	                }
-	                else {
-	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);
-	                }
-	            }
-
-	            if (child.newline) {
-	                return;
-	            }
-
-	            position[0] = x;
-	            position[1] = y;
-
-	            orient === 'horizontal'
-	                ? (x = nextX + gap)
-	                : (y = nextY + gap);
-	        });
-	    }
-
-	    /**
-	     * VBox or HBox layouting
-	     * @param {string} orient
-	     * @param {module:zrender/container/Group} group
-	     * @param {number} gap
-	     * @param {number} [width=Infinity]
-	     * @param {number} [height=Infinity]
-	     */
-	    layout.box = boxLayout;
-
-	    /**
-	     * VBox layouting
-	     * @param {module:zrender/container/Group} group
-	     * @param {number} gap
-	     * @param {number} [width=Infinity]
-	     * @param {number} [height=Infinity]
-	     */
-	    layout.vbox = zrUtil.curry(boxLayout, 'vertical');
-
-	    /**
-	     * HBox layouting
-	     * @param {module:zrender/container/Group} group
-	     * @param {number} gap
-	     * @param {number} [width=Infinity]
-	     * @param {number} [height=Infinity]
-	     */
-	    layout.hbox = zrUtil.curry(boxLayout, 'horizontal');
-
-	    /**
-	     * If x or x2 is not specified or 'center' 'left' 'right',
-	     * the width would be as long as possible.
-	     * If y or y2 is not specified or 'middle' 'top' 'bottom',
-	     * the height would be as long as possible.
-	     *
-	     * @param {Object} positionInfo
-	     * @param {number|string} [positionInfo.x]
-	     * @param {number|string} [positionInfo.y]
-	     * @param {number|string} [positionInfo.x2]
-	     * @param {number|string} [positionInfo.y2]
-	     * @param {Object} containerRect
-	     * @param {string|number} margin
-	     * @return {Object} {width, height}
-	     */
-	    layout.getAvailableSize = function (positionInfo, containerRect, margin) {
-	        var containerWidth = containerRect.width;
-	        var containerHeight = containerRect.height;
-
-	        var x = parsePercent(positionInfo.x, containerWidth);
-	        var y = parsePercent(positionInfo.y, containerHeight);
-	        var x2 = parsePercent(positionInfo.x2, containerWidth);
-	        var y2 = parsePercent(positionInfo.y2, containerHeight);
-
-	        (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);
-	        (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);
-	        (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);
-	        (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);
-
-	        margin = formatUtil.normalizeCssArray(margin || 0);
-
-	        return {
-	            width: Math.max(x2 - x - margin[1] - margin[3], 0),
-	            height: Math.max(y2 - y - margin[0] - margin[2], 0)
-	        };
-	    };
-
-	    /**
-	     * Parse position info.
-	     *
-	     * @param {Object} positionInfo
-	     * @param {number|string} [positionInfo.left]
-	     * @param {number|string} [positionInfo.top]
-	     * @param {number|string} [positionInfo.right]
-	     * @param {number|string} [positionInfo.bottom]
-	     * @param {number|string} [positionInfo.width]
-	     * @param {number|string} [positionInfo.height]
-	     * @param {number|string} [positionInfo.aspect] Aspect is width / height
-	     * @param {Object} containerRect
-	     * @param {string|number} [margin]
-	     *
-	     * @return {module:zrender/core/BoundingRect}
-	     */
-	    layout.getLayoutRect = function (
-	        positionInfo, containerRect, margin
-	    ) {
-	        margin = formatUtil.normalizeCssArray(margin || 0);
-
-	        var containerWidth = containerRect.width;
-	        var containerHeight = containerRect.height;
-
-	        var left = parsePercent(positionInfo.left, containerWidth);
-	        var top = parsePercent(positionInfo.top, containerHeight);
-	        var right = parsePercent(positionInfo.right, containerWidth);
-	        var bottom = parsePercent(positionInfo.bottom, containerHeight);
-	        var width = parsePercent(positionInfo.width, containerWidth);
-	        var height = parsePercent(positionInfo.height, containerHeight);
-
-	        var verticalMargin = margin[2] + margin[0];
-	        var horizontalMargin = margin[1] + margin[3];
-	        var aspect = positionInfo.aspect;
-
-	        // If width is not specified, calculate width from left and right
-	        if (isNaN(width)) {
-	            width = containerWidth - right - horizontalMargin - left;
-	        }
-	        if (isNaN(height)) {
-	            height = containerHeight - bottom - verticalMargin - top;
-	        }
-
-	        // If width and height are not given
-	        // 1. Graph should not exceeds the container
-	        // 2. Aspect must be keeped
-	        // 3. Graph should take the space as more as possible
-	        if (isNaN(width) && isNaN(height)) {
-	            if (aspect > containerWidth / containerHeight) {
-	                width = containerWidth * 0.8;
-	            }
-	            else {
-	                height = containerHeight * 0.8;
-	            }
-	        }
-
-	        if (aspect != null) {
-	            // Calculate width or height with given aspect
-	            if (isNaN(width)) {
-	                width = aspect * height;
-	            }
-	            if (isNaN(height)) {
-	                height = width / aspect;
-	            }
-	        }
-
-	        // If left is not specified, calculate left from right and width
-	        if (isNaN(left)) {
-	            left = containerWidth - right - width - horizontalMargin;
-	        }
-	        if (isNaN(top)) {
-	            top = containerHeight - bottom - height - verticalMargin;
-	        }
-
-	        // Align left and top
-	        switch (positionInfo.left || positionInfo.right) {
-	            case 'center':
-	                left = containerWidth / 2 - width / 2 - margin[3];
-	                break;
-	            case 'right':
-	                left = containerWidth - width - horizontalMargin;
-	                break;
-	        }
-	        switch (positionInfo.top || positionInfo.bottom) {
-	            case 'middle':
-	            case 'center':
-	                top = containerHeight / 2 - height / 2 - margin[0];
-	                break;
-	            case 'bottom':
-	                top = containerHeight - height - verticalMargin;
-	                break;
-	        }
-	        // If something is wrong and left, top, width, height are calculated as NaN
-	        left = left || 0;
-	        top = top || 0;
-	        if (isNaN(width)) {
-	            // Width may be NaN if only one value is given except width
-	            width = containerWidth - left - (right || 0);
-	        }
-	        if (isNaN(height)) {
-	            // Height may be NaN if only one value is given except height
-	            height = containerHeight - top - (bottom || 0);
-	        }
-
-	        var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);
-	        rect.margin = margin;
-	        return rect;
-	    };
-
-
-	    /**
-	     * Position a zr element in viewport
-	     *  Group position is specified by either
-	     *  {left, top}, {right, bottom}
-	     *  If all properties exists, right and bottom will be igonred.
-	     *
-	     * Logic:
-	     *     1. Scale (against origin point in parent coord)
-	     *     2. Rotate (against origin point in parent coord)
-	     *     3. Traslate (with el.position by this method)
-	     * So this method only fixes the last step 'Traslate', which does not affect
-	     * scaling and rotating.
-	     *
-	     * If be called repeatly with the same input el, the same result will be gotten.
-	     *
-	     * @param {module:zrender/Element} el Should have `getBoundingRect` method.
-	     * @param {Object} positionInfo
-	     * @param {number|string} [positionInfo.left]
-	     * @param {number|string} [positionInfo.top]
-	     * @param {number|string} [positionInfo.right]
-	     * @param {number|string} [positionInfo.bottom]
-	     * @param {Object} containerRect
-	     * @param {string|number} margin
-	     * @param {Object} [opt]
-	     * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.
-	     * @param {Array.<number>} [opt.boundingMode='all']
-	     *        Specify how to calculate boundingRect when locating.
-	     *        'all': Position the boundingRect that is transformed and uioned
-	     *               both itself and its descendants.
-	     *               This mode simplies confine the elements in the bounding
-	     *               of their container (e.g., using 'right: 0').
-	     *        'raw': Position the boundingRect that is not transformed and only itself.
-	     *               This mode is useful when you want a element can overflow its
-	     *               container. (Consider a rotated circle needs to be located in a corner.)
-	     *               In this mode positionInfo.width/height can only be number.
-	     */
-	    layout.positionElement = function (el, positionInfo, containerRect, margin, opt) {
-	        var h = !opt || !opt.hv || opt.hv[0];
-	        var v = !opt || !opt.hv || opt.hv[1];
-	        var boundingMode = opt && opt.boundingMode || 'all';
-
-	        if (!h && !v) {
-	            return;
-	        }
-
-	        var rect;
-	        if (boundingMode === 'raw') {
-	            rect = el.type === 'group'
-	                ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0)
-	                : el.getBoundingRect();
-	        }
-	        else {
-	            rect = el.getBoundingRect();
-	            if (el.needLocalTransform()) {
-	                var transform = el.getLocalTransform();
-	                // Notice: raw rect may be inner object of el,
-	                // which should not be modified.
-	                rect = rect.clone();
-	                rect.applyTransform(transform);
-	            }
-	        }
-
-	        positionInfo = layout.getLayoutRect(
-	            zrUtil.defaults(
-	                {width: rect.width, height: rect.height},
-	                positionInfo
-	            ),
-	            containerRect,
-	            margin
-	        );
-
-	        // Because 'tranlate' is the last step in transform
-	        // (see zrender/core/Transformable#getLocalTransfrom),
-	        // we can just only modify el.position to get final result.
-	        var elPos = el.position;
-	        var dx = h ? positionInfo.x - rect.x : 0;
-	        var dy = v ? positionInfo.y - rect.y : 0;
-
-	        el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);
-	    };
-
-	    /**
-	     * @param {Object} option Contains some of the properties in HV_NAMES.
-	     * @param {number} hvIdx 0: horizontal; 1: vertical.
-	     */
-	    layout.sizeCalculable = function (option, hvIdx) {
-	        return option[HV_NAMES[hvIdx][0]] != null
-	            || (option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null);
-	    };
-
-	    /**
-	     * Consider Case:
-	     * When defulat option has {left: 0, width: 100}, and we set {right: 0}
-	     * through setOption or media query, using normal zrUtil.merge will cause
-	     * {right: 0} does not take effect.
-	     *
-	     * @example
-	     * ComponentModel.extend({
-	     *     init: function () {
-	     *         ...
-	     *         var inputPositionParams = layout.getLayoutParams(option);
-	     *         this.mergeOption(inputPositionParams);
-	     *     },
-	     *     mergeOption: function (newOption) {
-	     *         newOption && zrUtil.merge(thisOption, newOption, true);
-	     *         layout.mergeLayoutParam(thisOption, newOption);
-	     *     }
-	     * });
-	     *
-	     * @param {Object} targetOption
-	     * @param {Object} newOption
-	     * @param {Object|string} [opt]
-	     * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Some component must has width and height.
-	     */
-	    layout.mergeLayoutParam = function (targetOption, newOption, opt) {
-	        !zrUtil.isObject(opt) && (opt = {});
-
-	        var ignoreSize = opt.ignoreSize;
-	        !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);
-
-	        var hResult = merge(HV_NAMES[0], 0);
-	        var vResult = merge(HV_NAMES[1], 1);
-
-	        copy(HV_NAMES[0], targetOption, hResult);
-	        copy(HV_NAMES[1], targetOption, vResult);
-
-	        function merge(names, hvIdx) {
-	            var newParams = {};
-	            var newValueCount = 0;
-	            var merged = {};
-	            var mergedValueCount = 0;
-	            var enoughParamNumber = 2;
-
-	            each(names, function (name) {
-	                merged[name] = targetOption[name];
-	            });
-	            each(names, function (name) {
-	                // Consider case: newOption.width is null, which is
-	                // set by user for removing width setting.
-	                hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);
-	                hasValue(newParams, name) && newValueCount++;
-	                hasValue(merged, name) && mergedValueCount++;
-	            });
-
-	            if (ignoreSize[hvIdx]) {
-	                // Only one of left/right is premitted to exist.
-	                if (hasValue(newOption, names[1])) {
-	                    merged[names[2]] = null;
-	                }
-	                else if (hasValue(newOption, names[2])) {
-	                    merged[names[1]] = null;
-	                }
-	                return merged;
-	            }
-
-	            // Case: newOption: {width: ..., right: ...},
-	            // or targetOption: {right: ...} and newOption: {width: ...},
-	            // There is no conflict when merged only has params count
-	            // little than enoughParamNumber.
-	            if (mergedValueCount === enoughParamNumber || !newValueCount) {
-	                return merged;
-	            }
-	            // Case: newOption: {width: ..., right: ...},
-	            // Than we can make sure user only want those two, and ignore
-	            // all origin params in targetOption.
-	            else if (newValueCount >= enoughParamNumber) {
-	                return newParams;
-	            }
-	            else {
-	                // Chose another param from targetOption by priority.
-	                for (var i = 0; i < names.length; i++) {
-	                    var name = names[i];
-	                    if (!hasProp(newParams, name) && hasProp(targetOption, name)) {
-	                        newParams[name] = targetOption[name];
-	                        break;
-	                    }
-	                }
-	                return newParams;
-	            }
-	        }
-
-	        function hasProp(obj, name) {
-	            return obj.hasOwnProperty(name);
-	        }
-
-	        function hasValue(obj, name) {
-	            return obj[name] != null && obj[name] !== 'auto';
-	        }
-
-	        function copy(names, target, source) {
-	            each(names, function (name) {
-	                target[name] = source[name];
-	            });
-	        }
-	    };
-
-	    /**
-	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
-	     * @param {Object} source
-	     * @return {Object} Result contains those props.
-	     */
-	    layout.getLayoutParams = function (source) {
-	        return layout.copyLayoutParams({}, source);
-	    };
-
-	    /**
-	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
-	     * @param {Object} source
-	     * @return {Object} Result contains those props.
-	     */
-	    layout.copyLayoutParams = function (target, source) {
-	        source && target && each(LOCATION_PARAMS, function (name) {
-	            source.hasOwnProperty(name) && (target[name] = source[name]);
-	        });
-	        return target;
-	    };
-
-	    module.exports = layout;
-
-
-
-/***/ },
-/* 22 */
-/***/ function(module, exports) {
-
-	
-
-	    module.exports = {
-	        getBoxLayoutParams: function () {
-	            return {
-	                left: this.get('left'),
-	                top: this.get('top'),
-	                right: this.get('right'),
-	                bottom: this.get('bottom'),
-	                width: this.get('width'),
-	                height: this.get('height')
-	            };
-	        }
-	    };
-
-
-/***/ },
-/* 23 */
-/***/ function(module, exports) {
-
-	
-	    var platform = '';
-	    // Navigator not exists in node
-	    if (typeof navigator !== 'undefined') {
-	        platform = navigator.platform || '';
-	    }
-	    module.exports = {
-	        // 全图默认背景
-	        // backgroundColor: 'rgba(0,0,0,0)',
-
-	        // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization
-	        // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'],
-	        // 浅色
-	        // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'],
-	        // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'],
-	        // 深色
-	        color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83',  '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'],
-
-	        // 默认需要 Grid 配置项
-	        // grid: {},
-	        // 主题，主题
-	        textStyle: {
-	            // color: '#000',
-	            // decoration: 'none',
-	            // PENDING
-	            fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',
-	            // fontFamily: 'Arial, Verdana, sans-serif',
-	            fontSize: 12,
-	            fontStyle: 'normal',
-	            fontWeight: 'normal'
-	        },
-
-	        // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/
-	        // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
-	        // Default is source-over
-	        blendMode: null,
-
-	        animation: 'auto',
-	        animationDuration: 1000,
-	        animationDurationUpdate: 300,
-	        animationEasing: 'exponentialOut',
-	        animationEasingUpdate: 'cubicOut',
-
-	        animationThreshold: 2000,
-	        // Configuration for progressive/incremental rendering
-	        progressiveThreshold: 3000,
-	        progressive: 400,
-
-	        // Threshold of if use single hover layer to optimize.
-	        // It is recommended that `hoverLayerThreshold` is equivalent to or less than
-	        // `progressiveThreshold`, otherwise hover will cause restart of progressive,
-	        // which is unexpected.
-	        // see example <echarts/test/heatmap-large.html>.
-	        hoverLayerThreshold: 3000,
-
-	        // See: module:echarts/scale/Time
-	        useUTC: false
-	    };
-
-
-/***/ },
-/* 24 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var classUtil = __webpack_require__(13);
-	    var set = classUtil.set;
-	    var get = classUtil.get;
-
-	    module.exports = {
-	        clearColorPalette: function () {
-	            set(this, 'colorIdx', 0);
-	            set(this, 'colorNameMap', {});
-	        },
-
-	        getColorFromPalette: function (name, scope) {
-	            scope = scope || this;
-	            var colorIdx = get(scope, 'colorIdx') || 0;
-	            var colorNameMap = get(scope, 'colorNameMap') || set(scope, 'colorNameMap', {});
-	            if (colorNameMap[name]) {
-	                return colorNameMap[name];
-	            }
-	            var colorPalette = this.get('color', true) || [];
-	            if (!colorPalette.length) {
-	                return;
-	            }
-
-	            var color = colorPalette[colorIdx];
-	            if (name) {
-	                colorNameMap[name] = color;
-	            }
-	            set(scope, 'colorIdx', (colorIdx + 1) % colorPalette.length);
-
-	            return color;
-	        }
-	    };
-
-
-/***/ },
-/* 25 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var echartsAPIList = [
-	        'getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed',
-	        'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption',
-	        'getViewOfComponentModel', 'getViewOfSeriesModel'
-	    ];
-	    // And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js
-
-	    function ExtensionAPI(chartInstance) {
-	        zrUtil.each(echartsAPIList, function (name) {
-	            this[name] = zrUtil.bind(chartInstance[name], chartInstance);
-	        }, this);
-	    }
-
-	    module.exports = ExtensionAPI;
-
-
-/***/ },
-/* 26 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var coordinateSystemCreators = {};
-
-	    function CoordinateSystemManager() {
-
-	        this._coordinateSystems = [];
-	    }
-
-	    CoordinateSystemManager.prototype = {
-
-	        constructor: CoordinateSystemManager,
-
-	        create: function (ecModel, api) {
-	            var coordinateSystems = [];
-	            zrUtil.each(coordinateSystemCreators, function (creater, type) {
-	                var list = creater.create(ecModel, api);
-	                coordinateSystems = coordinateSystems.concat(list || []);
-	            });
-
-	            this._coordinateSystems = coordinateSystems;
-	        },
-
-	        update: function (ecModel, api) {
-	            zrUtil.each(this._coordinateSystems, function (coordSys) {
-	                // FIXME MUST have
-	                coordSys.update && coordSys.update(ecModel, api);
-	            });
-	        },
-
-	        getCoordinateSystems: function () {
-	            return this._coordinateSystems.slice();
-	        }
-	    };
-
-	    CoordinateSystemManager.register = function (type, coordinateSystemCreator) {
-	        coordinateSystemCreators[type] = coordinateSystemCreator;
-	    };
-
-	    CoordinateSystemManager.get = function (type) {
-	        return coordinateSystemCreators[type];
-	    };
-
-	    module.exports = CoordinateSystemManager;
-
-
-/***/ },
-/* 27 */
-/***/ function(module, exports, __webpack_require__) {
-
 	/**
-	 * ECharts option manager
-	 *
-	 * @module {echarts/model/OptionManager}
+	 * 可绘制的图形基类
+	 * Base class of all displayable graphic objects
+	 * @module zrender/graphic/Displayable
 	 */
 
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var modelUtil = __webpack_require__(5);
-	    var ComponentModel = __webpack_require__(19);
-	    var each = zrUtil.each;
-	    var clone = zrUtil.clone;
-	    var map = zrUtil.map;
-	    var merge = zrUtil.merge;
 
-	    var QUERY_REG = /^(min|max)?(.+)$/;
+	    var Style = __webpack_require__(22);
+
+	    var Element = __webpack_require__(23);
+	    var RectText = __webpack_require__(35);
+	    // var Stateful = require('./mixin/Stateful');
 
 	    /**
-	     * TERM EXPLANATIONS:
-	     *
-	     * [option]:
-	     *
-	     *     An object that contains definitions of components. For example:
-	     *     var option = {
-	     *         title: {...},
-	     *         legend: {...},
-	     *         visualMap: {...},
-	     *         series: [
-	     *             {data: [...]},
-	     *             {data: [...]},
-	     *             ...
-	     *         ]
-	     *     };
-	     *
-	     * [rawOption]:
-	     *
-	     *     An object input to echarts.setOption. 'rawOption' may be an
-	     *     'option', or may be an object contains multi-options. For example:
-	     *     var option = {
-	     *         baseOption: {
-	     *             title: {...},
-	     *             legend: {...},
-	     *             series: [
-	     *                 {data: [...]},
-	     *                 {data: [...]},
-	     *                 ...
-	     *             ]
-	     *         },
-	     *         timeline: {...},
-	     *         options: [
-	     *             {title: {...}, series: {data: [...]}},
-	     *             {title: {...}, series: {data: [...]}},
-	     *             ...
-	     *         ],
-	     *         media: [
-	     *             {
-	     *                 query: {maxWidth: 320},
-	     *                 option: {series: {x: 20}, visualMap: {show: false}}
-	     *             },
-	     *             {
-	     *                 query: {minWidth: 320, maxWidth: 720},
-	     *                 option: {series: {x: 500}, visualMap: {show: true}}
-	     *             },
-	     *             {
-	     *                 option: {series: {x: 1200}, visualMap: {show: true}}
-	     *             }
-	     *         ]
-	     *     };
-	     *
-	     * @alias module:echarts/model/OptionManager
-	     * @param {module:echarts/ExtensionAPI} api
+	     * @alias module:zrender/graphic/Displayable
+	     * @extends module:zrender/Element
+	     * @extends module:zrender/graphic/mixin/RectText
 	     */
-	    function OptionManager(api) {
-
-	        /**
-	         * @private
-	         * @type {module:echarts/ExtensionAPI}
-	         */
-	        this._api = api;
-
-	        /**
-	         * @private
-	         * @type {Array.<number>}
-	         */
-	        this._timelineOptions = [];
-
-	        /**
-	         * @private
-	         * @type {Array.<Object>}
-	         */
-	        this._mediaList = [];
-
-	        /**
-	         * @private
-	         * @type {Object}
-	         */
-	        this._mediaDefault;
-
-	        /**
-	         * -1, means default.
-	         * empty means no media.
-	         * @private
-	         * @type {Array.<number>}
-	         */
-	        this._currentMediaIndices = [];
-
-	        /**
-	         * @private
-	         * @type {Object}
-	         */
-	        this._optionBackup;
-
-	        /**
-	         * @private
-	         * @type {Object}
-	         */
-	        this._newBaseOption;
-	    }
-
-	    // timeline.notMerge is not supported in ec3. Firstly there is rearly
-	    // case that notMerge is needed. Secondly supporting 'notMerge' requires
-	    // rawOption cloned and backuped when timeline changed, which does no
-	    // good to performance. What's more, that both timeline and setOption
-	    // method supply 'notMerge' brings complex and some problems.
-	    // Consider this case:
-	    // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);
-	    // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);
-
-	    OptionManager.prototype = {
-
-	        constructor: OptionManager,
-
-	        /**
-	         * @public
-	         * @param {Object} rawOption Raw option.
-	         * @param {module:echarts/model/Global} ecModel
-	         * @param {Array.<Function>} optionPreprocessorFuncs
-	         * @return {Object} Init option
-	         */
-	        setOption: function (rawOption, optionPreprocessorFuncs) {
-	            rawOption = clone(rawOption, true);
-
-	            // FIXME
-	            // 如果 timeline options 或者 media 中设置了某个属性，而baseOption中没有设置，则进行警告。
-
-	            var oldOptionBackup = this._optionBackup;
-	            var newParsedOption = parseRawOption.call(
-	                this, rawOption, optionPreprocessorFuncs, !oldOptionBackup
-	            );
-	            this._newBaseOption = newParsedOption.baseOption;
-
-	            // For setOption at second time (using merge mode);
-	            if (oldOptionBackup) {
-	                // Only baseOption can be merged.
-	                mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption);
-
-	                // For simplicity, timeline options and media options do not support merge,
-	                // that is, if you `setOption` twice and both has timeline options, the latter
-	                // timeline opitons will not be merged to the formers, but just substitude them.
-	                if (newParsedOption.timelineOptions.length) {
-	                    oldOptionBackup.timelineOptions = newParsedOption.timelineOptions;
-	                }
-	                if (newParsedOption.mediaList.length) {
-	                    oldOptionBackup.mediaList = newParsedOption.mediaList;
-	                }
-	                if (newParsedOption.mediaDefault) {
-	                    oldOptionBackup.mediaDefault = newParsedOption.mediaDefault;
-	                }
-	            }
-	            else {
-	                this._optionBackup = newParsedOption;
-	            }
-	        },
-
-	        /**
-	         * @param {boolean} isRecreate
-	         * @return {Object}
-	         */
-	        mountOption: function (isRecreate) {
-	            var optionBackup = this._optionBackup;
-
-	            // TODO
-	            // 如果没有reset功能则不clone。
-
-	            this._timelineOptions = map(optionBackup.timelineOptions, clone);
-	            this._mediaList = map(optionBackup.mediaList, clone);
-	            this._mediaDefault = clone(optionBackup.mediaDefault);
-	            this._currentMediaIndices = [];
-
-	            return clone(isRecreate
-	                // this._optionBackup.baseOption, which is created at the first `setOption`
-	                // called, and is merged into every new option by inner method `mergeOption`
-	                // each time `setOption` called, can be only used in `isRecreate`, because
-	                // its reliability is under suspicion. In other cases option merge is
-	                // performed by `model.mergeOption`.
-	                ? optionBackup.baseOption : this._newBaseOption
-	            );
-	        },
-
-	        /**
-	         * @param {module:echarts/model/Global} ecModel
-	         * @return {Object}
-	         */
-	        getTimelineOption: function (ecModel) {
-	            var option;
-	            var timelineOptions = this._timelineOptions;
-
-	            if (timelineOptions.length) {
-	                // getTimelineOption can only be called after ecModel inited,
-	                // so we can get currentIndex from timelineModel.
-	                var timelineModel = ecModel.getComponent('timeline');
-	                if (timelineModel) {
-	                    option = clone(
-	                        timelineOptions[timelineModel.getCurrentIndex()],
-	                        true
-	                    );
-	                }
-	            }
-
-	            return option;
-	        },
-
-	        /**
-	         * @param {module:echarts/model/Global} ecModel
-	         * @return {Array.<Object>}
-	         */
-	        getMediaOption: function (ecModel) {
-	            var ecWidth = this._api.getWidth();
-	            var ecHeight = this._api.getHeight();
-	            var mediaList = this._mediaList;
-	            var mediaDefault = this._mediaDefault;
-	            var indices = [];
-	            var result = [];
-
-	            // No media defined.
-	            if (!mediaList.length && !mediaDefault) {
-	                return result;
-	            }
-
-	            // Multi media may be applied, the latter defined media has higher priority.
-	            for (var i = 0, len = mediaList.length; i < len; i++) {
-	                if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {
-	                    indices.push(i);
-	                }
-	            }
-
-	            // FIXME
-	            // 是否mediaDefault应该强制用户设置，否则可能修改不能回归。
-	            if (!indices.length && mediaDefault) {
-	                indices = [-1];
-	            }
-
-	            if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {
-	                result = map(indices, function (index) {
-	                    return clone(
-	                        index === -1 ? mediaDefault.option : mediaList[index].option
-	                    );
-	                });
-	            }
-	            // Otherwise return nothing.
-
-	            this._currentMediaIndices = indices;
-
-	            return result;
-	        }
-	    };
-
-	    function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) {
-	        var timelineOptions = [];
-	        var mediaList = [];
-	        var mediaDefault;
-	        var baseOption;
-
-	        // Compatible with ec2.
-	        var timelineOpt = rawOption.timeline;
-
-	        if (rawOption.baseOption) {
-	            baseOption = rawOption.baseOption;
-	        }
-
-	        // For timeline
-	        if (timelineOpt || rawOption.options) {
-	            baseOption = baseOption || {};
-	            timelineOptions = (rawOption.options || []).slice();
-	        }
-
-	        // For media query
-	        if (rawOption.media) {
-	            baseOption = baseOption || {};
-	            var media = rawOption.media;
-	            each(media, function (singleMedia) {
-	                if (singleMedia && singleMedia.option) {
-	                    if (singleMedia.query) {
-	                        mediaList.push(singleMedia);
-	                    }
-	                    else if (!mediaDefault) {
-	                        // Use the first media default.
-	                        mediaDefault = singleMedia;
-	                    }
-	                }
-	            });
-	        }
-
-	        // For normal option
-	        if (!baseOption) {
-	            baseOption = rawOption;
-	        }
-
-	        // Set timelineOpt to baseOption in ec3,
-	        // which is convenient for merge option.
-	        if (!baseOption.timeline) {
-	            baseOption.timeline = timelineOpt;
-	        }
-
-	        // Preprocess.
-	        each([baseOption].concat(timelineOptions)
-	            .concat(zrUtil.map(mediaList, function (media) {
-	                return media.option;
-	            })),
-	            function (option) {
-	                each(optionPreprocessorFuncs, function (preProcess) {
-	                    preProcess(option, isNew);
-	                });
-	            }
-	        );
-
-	        return {
-	            baseOption: baseOption,
-	            timelineOptions: timelineOptions,
-	            mediaDefault: mediaDefault,
-	            mediaList: mediaList
-	        };
-	    }
-
-	    /**
-	     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
-	     * Support: width, height, aspectRatio
-	     * Can use max or min as prefix.
-	     */
-	    function applyMediaQuery(query, ecWidth, ecHeight) {
-	        var realMap = {
-	            width: ecWidth,
-	            height: ecHeight,
-	            aspectratio: ecWidth / ecHeight // lowser case for convenientce.
-	        };
-
-	        var applicatable = true;
-
-	        zrUtil.each(query, function (value, attr) {
-	            var matched = attr.match(QUERY_REG);
-
-	            if (!matched || !matched[1] || !matched[2]) {
-	                return;
-	            }
-
-	            var operator = matched[1];
-	            var realAttr = matched[2].toLowerCase();
-
-	            if (!compare(realMap[realAttr], value, operator)) {
-	                applicatable = false;
-	            }
-	        });
-
-	        return applicatable;
-	    }
-
-	    function compare(real, expect, operator) {
-	        if (operator === 'min') {
-	            return real >= expect;
-	        }
-	        else if (operator === 'max') {
-	            return real <= expect;
-	        }
-	        else { // Equals
-	            return real === expect;
-	        }
-	    }
-
-	    function indicesEquals(indices1, indices2) {
-	        // indices is always order by asc and has only finite number.
-	        return indices1.join(',') === indices2.join(',');
-	    }
-
-	    /**
-	     * Consider case:
-	     * `chart.setOption(opt1);`
-	     * Then user do some interaction like dataZoom, dataView changing.
-	     * `chart.setOption(opt2);`
-	     * Then user press 'reset button' in toolbox.
-	     *
-	     * After doing that all of the interaction effects should be reset, the
-	     * chart should be the same as the result of invoke
-	     * `chart.setOption(opt1); chart.setOption(opt2);`.
-	     *
-	     * Although it is not able ensure that
-	     * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to
-	     * `chart.setOption(merge(opt1, opt2));` exactly,
-	     * this might be the only simple way to implement that feature.
-	     *
-	     * MEMO: We've considered some other approaches:
-	     * 1. Each model handle its self restoration but not uniform treatment.
-	     *     (Too complex in logic and error-prone)
-	     * 2. Use a shadow ecModel. (Performace expensive)
-	     */
-	    function mergeOption(oldOption, newOption) {
-	        newOption = newOption || {};
-
-	        each(newOption, function (newCptOpt, mainType) {
-	            if (newCptOpt == null) {
-	                return;
-	            }
-
-	            var oldCptOpt = oldOption[mainType];
-
-	            if (!ComponentModel.hasClass(mainType)) {
-	                oldOption[mainType] = merge(oldCptOpt, newCptOpt, true);
-	            }
-	            else {
-	                newCptOpt = modelUtil.normalizeToArray(newCptOpt);
-	                oldCptOpt = modelUtil.normalizeToArray(oldCptOpt);
-
-	                var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt);
-
-	                oldOption[mainType] = map(mapResult, function (item) {
-	                    return (item.option && item.exist)
-	                        ? merge(item.exist, item.option, true)
-	                        : (item.exist || item.option);
-	                });
-	            }
-	        });
-	    }
-
-	    module.exports = OptionManager;
-
-
-/***/ },
-/* 28 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var formatUtil = __webpack_require__(6);
-	    var classUtil = __webpack_require__(13);
-	    var modelUtil = __webpack_require__(5);
-	    var ComponentModel = __webpack_require__(19);
-	    var colorPaletteMixin = __webpack_require__(24);
-	    var env = __webpack_require__(2);
-	    var layout = __webpack_require__(21);
-
-	    var set = classUtil.set;
-	    var get = classUtil.get;
-	    var encodeHTML = formatUtil.encodeHTML;
-	    var addCommas = formatUtil.addCommas;
-
-	    var SeriesModel = ComponentModel.extend({
-
-	        type: 'series.__base__',
-
-	        /**
-	         * @readOnly
-	         */
-	        seriesIndex: 0,
-
-	        // coodinateSystem will be injected in the echarts/CoordinateSystem
-	        coordinateSystem: null,
-
-	        /**
-	         * @type {Object}
-	         * @protected
-	         */
-	        defaultOption: null,
-
-	        /**
-	         * Data provided for legend
-	         * @type {Function}
-	         */
-	        // PENDING
-	        legendDataProvider: null,
-
-	        /**
-	         * Access path of color for visual
-	         */
-	        visualColorAccessPath: 'itemStyle.normal.color',
-
-	        /**
-	         * Support merge layout params.
-	         * Only support 'box' now (left/right/top/bottom/width/height).
-	         * @type {string|Object} Object can be {ignoreSize: true}
-	         * @readOnly
-	         */
-	        layoutMode: null,
-
-	        init: function (option, parentModel, ecModel, extraOpt) {
-
-	            /**
-	             * @type {number}
-	             * @readOnly
-	             */
-	            this.seriesIndex = this.componentIndex;
-
-	            this.mergeDefaultAndTheme(option, ecModel);
-
-	            var data = this.getInitialData(option, ecModel);
-	            if (true) {
-	                zrUtil.assert(data, 'getInitialData returned invalid data.');
-	            }
-	            /**
-	             * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph}
-	             * @private
-	             */
-	            set(this, 'dataBeforeProcessed', data);
-
-	            // If we reverse the order (make data firstly, and then make
-	            // dataBeforeProcessed by cloneShallow), cloneShallow will
-	            // cause data.graph.data !== data when using
-	            // module:echarts/data/Graph or module:echarts/data/Tree.
-	            // See module:echarts/data/helper/linkList
-	            this.restoreData();
-	        },
-
-	        /**
-	         * Util for merge default and theme to option
-	         * @param  {Object} option
-	         * @param  {module:echarts/model/Global} ecModel
-	         */
-	        mergeDefaultAndTheme: function (option, ecModel) {
-	            var layoutMode = this.layoutMode;
-	            var inputPositionParams = layoutMode
-	                ? layout.getLayoutParams(option) : {};
-
-	            zrUtil.merge(
-	                option,
-	                ecModel.getTheme().get(this.subType)
-	            );
-	            zrUtil.merge(option, this.getDefaultOption());
-
-	            // Default label emphasis `position` and `show`
-	            // FIXME Set label in mergeOption
-	            modelUtil.defaultEmphasis(option.label, modelUtil.LABEL_OPTIONS);
-
-	            this.fillDataTextStyle(option.data);
-
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
-	            }
-	        },
-
-	        mergeOption: function (newSeriesOption, ecModel) {
-	            newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);
-	            this.fillDataTextStyle(newSeriesOption.data);
-
-	            var layoutMode = this.layoutMode;
-	            if (layoutMode) {
-	                layout.mergeLayoutParam(this.option, newSeriesOption, layoutMode);
-	            }
-
-	            var data = this.getInitialData(newSeriesOption, ecModel);
-	            // TODO Merge data?
-	            if (data) {
-	                set(this, 'data', data);
-	                set(this, 'dataBeforeProcessed', data.cloneShallow());
-	            }
-	        },
-
-	        fillDataTextStyle: function (data) {
-	            // Default data label emphasis `position` and `show`
-	            // FIXME Tree structure data ?
-	            // FIXME Performance ?
-	            if (data) {
-	                for (var i = 0; i < data.length; i++) {
-	                    if (data[i] && data[i].label) {
-	                        modelUtil.defaultEmphasis(data[i].label, modelUtil.LABEL_OPTIONS);
-	                    }
-	                }
-	            }
-	        },
-
-	        /**
-	         * Init a data structure from data related option in series
-	         * Must be overwritten
-	         */
-	        getInitialData: function () {},
-
-	        /**
-	         * @param {string} [dataType]
-	         * @return {module:echarts/data/List}
-	         */
-	        getData: function (dataType) {
-	            var data = get(this, 'data');
-	            return dataType == null ? data : data.getLinkedData(dataType);
-	        },
-
-	        /**
-	         * @param {module:echarts/data/List} data
-	         */
-	        setData: function (data) {
-	            set(this, 'data', data);
-	        },
-
-	        /**
-	         * Get data before processed
-	         * @return {module:echarts/data/List}
-	         */
-	        getRawData: function () {
-	            return get(this, 'dataBeforeProcessed');
-	        },
-
-	        /**
-	         * Coord dimension to data dimension.
-	         *
-	         * By default the result is the same as dimensions of series data.
-	         * But in some series data dimensions are different from coord dimensions (i.e.
-	         * candlestick and boxplot). Override this method to handle those cases.
-	         *
-	         * Coord dimension to data dimension can be one-to-many
-	         *
-	         * @param {string} coordDim
-	         * @return {Array.<string>} dimensions on the axis.
-	         */
-	        coordDimToDataDim: function (coordDim) {
-	            return [coordDim];
-	        },
-
-	        /**
-	         * Convert data dimension to coord dimension.
-	         *
-	         * @param {string|number} dataDim
-	         * @return {string}
-	         */
-	        dataDimToCoordDim: function (dataDim) {
-	            return dataDim;
-	        },
-
-	        /**
-	         * Get base axis if has coordinate system and has axis.
-	         * By default use coordSys.getBaseAxis();
-	         * Can be overrided for some chart.
-	         * @return {type} description
-	         */
-	        getBaseAxis: function () {
-	            var coordSys = this.coordinateSystem;
-	            return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
-	        },
-
-	        // FIXME
-	        /**
-	         * Default tooltip formatter
-	         *
-	         * @param {number} dataIndex
-	         * @param {boolean} [multipleSeries=false]
-	         * @param {number} [dataType]
-	         */
-	        formatTooltip: function (dataIndex, multipleSeries, dataType) {
-	            function formatArrayValue(value) {
-	                var result = [];
-
-	                zrUtil.each(value, function (val, idx) {
-	                    var dimInfo = data.getDimensionInfo(idx);
-	                    var dimType = dimInfo && dimInfo.type;
-	                    var valStr;
-
-	                    if (dimType === 'ordinal') {
-	                        valStr = val + '';
-	                    }
-	                    else if (dimType === 'time') {
-	                        valStr = multipleSeries ? '' : formatUtil.formatTime('yyyy/MM/dd hh:mm:ss', val);
-	                    }
-	                    else {
-	                        valStr = addCommas(val);
-	                    }
-
-	                    valStr && result.push(valStr);
-	                });
-
-	                return result.join(', ');
-	            }
-
-	            var data = get(this, 'data');
-
-	            var value = this.getRawValue(dataIndex);
-	            var formattedValue = encodeHTML(
-	                zrUtil.isArray(value) ? formatArrayValue(value) : addCommas(value)
-	            );
-	            var name = data.getName(dataIndex);
-
-	            var color = data.getItemVisual(dataIndex, 'color');
-	            if (zrUtil.isObject(color) && color.colorStops) {
-	                color = (color.colorStops[0] || {}).color;
-	            }
-	            color = color || 'transparent';
-
-	            var colorEl = '<span style="display:inline-block;margin-right:5px;'
-	                + 'border-radius:10px;width:9px;height:9px;background-color:' + encodeHTML(color) + '"></span>';
-
-	            var seriesName = this.name;
-	            // FIXME
-	            if (seriesName === '\0-') {
-	                // Not show '-'
-	                seriesName = '';
-	            }
-	            return !multipleSeries
-	                ? ((seriesName && encodeHTML(seriesName) + '<br />') + colorEl
-	                    + (name
-	                        ? encodeHTML(name) + ' : ' + formattedValue
-	                        : formattedValue
-	                    )
-	                  )
-	                : (colorEl + encodeHTML(this.name) + ' : ' + formattedValue);
-	        },
-
-	        /**
-	         * @return {boolean}
-	         */
-	        isAnimationEnabled: function () {
-	            if (env.node) {
-	                return false;
-	            }
-
-	            var animationEnabled = this.getShallow('animation');
-	            if (animationEnabled) {
-	                if (this.getData().count() > this.getShallow('animationThreshold')) {
-	                    animationEnabled = false;
-	                }
-	            }
-	            return animationEnabled;
-	        },
-
-	        restoreData: function () {
-	            set(this, 'data', get(this, 'dataBeforeProcessed').cloneShallow());
-	        },
-
-	        getColorFromPalette: function (name, scope) {
-	            var ecModel = this.ecModel;
-	            // PENDING
-	            var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope);
-	            if (!color) {
-	                color = ecModel.getColorFromPalette(name, scope);
-	            }
-	            return color;
-	        },
-
-	        /**
-	         * Get data indices for show tooltip content. See tooltip.
-	         * @abstract
-	         * @param {Array.<string>|string} dim
-	         * @param {Array.<number>} value
-	         * @param {module:echarts/coord/single/SingleAxis} baseAxis
-	         * @return {Object} {dataIndices, nestestValue}.
-	         */
-	        getAxisTooltipData: null,
-
-	        /**
-	         * See tooltip.
-	         * @abstract
-	         * @param {number} dataIndex
-	         * @return {Array.<number>} Point of tooltip. null/undefined can be returned.
-	         */
-	        getTooltipPosition: null
-	    });
-
-	    zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin);
-	    zrUtil.mixin(SeriesModel, colorPaletteMixin);
-
-	    module.exports = SeriesModel;
-
-
-/***/ },
-/* 29 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var Group = __webpack_require__(30);
-	    var componentUtil = __webpack_require__(20);
-	    var clazzUtil = __webpack_require__(13);
-
-	    var Component = function () {
-	        /**
-	         * @type {module:zrender/container/Group}
-	         * @readOnly
-	         */
-	        this.group = new Group();
-
-	        /**
-	         * @type {string}
-	         * @readOnly
-	         */
-	        this.uid = componentUtil.getUID('viewComponent');
-	    };
-
-	    Component.prototype = {
-
-	        constructor: Component,
-
-	        init: function (ecModel, api) {},
-
-	        render: function (componentModel, ecModel, api, payload) {},
-
-	        dispose: function () {}
-
-	    };
-
-	    var componentProto = Component.prototype;
-	    componentProto.updateView
-	        = componentProto.updateLayout
-	        = componentProto.updateVisual
-	        = function (seriesModel, ecModel, api, payload) {
-	            // Do nothing;
-	        };
-	    // Enable Component.extend.
-	    clazzUtil.enableClassExtend(Component);
-
-	    // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
-	    clazzUtil.enableClassManagement(Component, {registerWhenExtend: true});
-
-	    module.exports = Component;
-
-
-/***/ },
-/* 30 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Group是一个容器，可以插入子节点，Group的变换也会被应用到子节点上
-	 * @module zrender/graphic/Group
-	 * @example
-	 *     var Group = require('zrender/lib/container/Group');
-	 *     var Circle = require('zrender/lib/graphic/shape/Circle');
-	 *     var g = new Group();
-	 *     g.position[0] = 100;
-	 *     g.position[1] = 100;
-	 *     g.add(new Circle({
-	 *         style: {
-	 *             x: 100,
-	 *             y: 100,
-	 *             r: 20,
-	 *         }
-	 *     }));
-	 *     zr.add(g);
-	 */
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var Element = __webpack_require__(31);
-	    var BoundingRect = __webpack_require__(9);
-
-	    /**
-	     * @alias module:zrender/graphic/Group
-	     * @constructor
-	     * @extends module:zrender/mixin/Transformable
-	     * @extends module:zrender/mixin/Eventful
-	     */
-	    var Group = function (opts) {
+	    function Displayable(opts) {
 
 	        opts = opts || {};
 
 	        Element.call(this, opts);
 
-	        for (var key in opts) {
-	            if (opts.hasOwnProperty(key)) {
-	                this[key] = opts[key];
+	        // Extend properties
+	        for (var name in opts) {
+	            if (
+	                opts.hasOwnProperty(name) &&
+	                name !== 'style'
+	            ) {
+	                this[name] = opts[name];
 	            }
 	        }
 
-	        this._children = [];
-
-	        this.__storage = null;
-
-	        this.__dirty = true;
-	    };
-
-	    Group.prototype = {
-
-	        constructor: Group,
-
-	        isGroup: true,
-
 	        /**
-	         * @type {string}
+	         * @type {module:zrender/graphic/Style}
 	         */
-	        type: 'group',
+	        this.style = new Style(opts.style);
+
+	        this._rect = null;
+	        // Shapes for cascade clipping.
+	        this.__clipPaths = [];
+
+	        // FIXME Stateful must be mixined after style is setted
+	        // Stateful.call(this, opts);
+	    }
+
+	    Displayable.prototype = {
+
+	        constructor: Displayable,
+
+	        type: 'displayable',
 
 	        /**
-	         * 所有子孙元素是否响应鼠标事件
-	         * @name module:/zrender/container/Group#silent
+	         * Displayable 是否为脏，Painter 中会根据该标记判断是否需要是否需要重新绘制
+	         * Dirty flag. From which painter will determine if this displayable object needs brush
+	         * @name module:zrender/graphic/Displayable#__dirty
+	         * @type {boolean}
+	         */
+	        __dirty: true,
+
+	        /**
+	         * 图形是否可见，为true时不绘制图形，但是仍能触发鼠标事件
+	         * If ignore drawing of the displayable object. Mouse event will still be triggered
+	         * @name module:/zrender/graphic/Displayable#invisible
+	         * @type {boolean}
+	         * @default false
+	         */
+	        invisible: false,
+
+	        /**
+	         * @name module:/zrender/graphic/Displayable#z
+	         * @type {number}
+	         * @default 0
+	         */
+	        z: 0,
+
+	        /**
+	         * @name module:/zrender/graphic/Displayable#z
+	         * @type {number}
+	         * @default 0
+	         */
+	        z2: 0,
+
+	        /**
+	         * z层level，决定绘画在哪层canvas中
+	         * @name module:/zrender/graphic/Displayable#zlevel
+	         * @type {number}
+	         * @default 0
+	         */
+	        zlevel: 0,
+
+	        /**
+	         * 是否可拖拽
+	         * @name module:/zrender/graphic/Displayable#draggable
+	         * @type {boolean}
+	         * @default false
+	         */
+	        draggable: false,
+
+	        /**
+	         * 是否正在拖拽
+	         * @name module:/zrender/graphic/Displayable#draggable
+	         * @type {boolean}
+	         * @default false
+	         */
+	        dragging: false,
+
+	        /**
+	         * 是否相应鼠标事件
+	         * @name module:/zrender/graphic/Displayable#silent
 	         * @type {boolean}
 	         * @default false
 	         */
 	        silent: false,
 
 	        /**
-	         * @return {Array.<module:zrender/Element>}
+	         * If enable culling
+	         * @type {boolean}
+	         * @default false
 	         */
-	        children: function () {
-	            return this._children.slice();
+	        culling: false,
+
+	        /**
+	         * Mouse cursor when hovered
+	         * @name module:/zrender/graphic/Displayable#cursor
+	         * @type {string}
+	         */
+	        cursor: 'pointer',
+
+	        /**
+	         * If hover area is bounding rect
+	         * @name module:/zrender/graphic/Displayable#rectHover
+	         * @type {string}
+	         */
+	        rectHover: false,
+
+	        /**
+	         * Render the element progressively when the value >= 0,
+	         * usefull for large data.
+	         * @type {number}
+	         */
+	        progressive: -1,
+
+	        beforeBrush: function (ctx) {},
+
+	        afterBrush: function (ctx) {},
+
+	        /**
+	         * 图形绘制方法
+	         * @param {Canvas2DRenderingContext} ctx
+	         */
+	        // Interface
+	        brush: function (ctx, prevEl) {},
+
+	        /**
+	         * 获取最小包围盒
+	         * @return {module:zrender/core/BoundingRect}
+	         */
+	        // Interface
+	        getBoundingRect: function () {},
+
+	        /**
+	         * 判断坐标 x, y 是否在图形上
+	         * If displayable element contain coord x, y
+	         * @param  {number} x
+	         * @param  {number} y
+	         * @return {boolean}
+	         */
+	        contain: function (x, y) {
+	            return this.rectContain(x, y);
 	        },
 
 	        /**
-	         * 获取指定 index 的儿子节点
-	         * @param  {number} idx
-	         * @return {module:zrender/Element}
-	         */
-	        childAt: function (idx) {
-	            return this._children[idx];
-	        },
-
-	        /**
-	         * 获取指定名字的儿子节点
-	         * @param  {string} name
-	         * @return {module:zrender/Element}
-	         */
-	        childOfName: function (name) {
-	            var children = this._children;
-	            for (var i = 0; i < children.length; i++) {
-	                if (children[i].name === name) {
-	                    return children[i];
-	                }
-	             }
-	        },
-
-	        /**
-	         * @return {number}
-	         */
-	        childCount: function () {
-	            return this._children.length;
-	        },
-
-	        /**
-	         * 添加子节点到最后
-	         * @param {module:zrender/Element} child
-	         */
-	        add: function (child) {
-	            if (child && child !== this && child.parent !== this) {
-
-	                this._children.push(child);
-
-	                this._doAdd(child);
-	            }
-
-	            return this;
-	        },
-
-	        /**
-	         * 添加子节点在 nextSibling 之前
-	         * @param {module:zrender/Element} child
-	         * @param {module:zrender/Element} nextSibling
-	         */
-	        addBefore: function (child, nextSibling) {
-	            if (child && child !== this && child.parent !== this
-	                && nextSibling && nextSibling.parent === this) {
-
-	                var children = this._children;
-	                var idx = children.indexOf(nextSibling);
-
-	                if (idx >= 0) {
-	                    children.splice(idx, 0, child);
-	                    this._doAdd(child);
-	                }
-	            }
-
-	            return this;
-	        },
-
-	        _doAdd: function (child) {
-	            if (child.parent) {
-	                child.parent.remove(child);
-	            }
-
-	            child.parent = this;
-
-	            var storage = this.__storage;
-	            var zr = this.__zr;
-	            if (storage && storage !== child.__storage) {
-
-	                storage.addToStorage(child);
-
-	                if (child instanceof Group) {
-	                    child.addChildrenToStorage(storage);
-	                }
-	            }
-
-	            zr && zr.refresh();
-	        },
-
-	        /**
-	         * 移除子节点
-	         * @param {module:zrender/Element} child
-	         */
-	        remove: function (child) {
-	            var zr = this.__zr;
-	            var storage = this.__storage;
-	            var children = this._children;
-
-	            var idx = zrUtil.indexOf(children, child);
-	            if (idx < 0) {
-	                return this;
-	            }
-	            children.splice(idx, 1);
-
-	            child.parent = null;
-
-	            if (storage) {
-
-	                storage.delFromStorage(child);
-
-	                if (child instanceof Group) {
-	                    child.delChildrenFromStorage(storage);
-	                }
-	            }
-
-	            zr && zr.refresh();
-
-	            return this;
-	        },
-
-	        /**
-	         * 移除所有子节点
-	         */
-	        removeAll: function () {
-	            var children = this._children;
-	            var storage = this.__storage;
-	            var child;
-	            var i;
-	            for (i = 0; i < children.length; i++) {
-	                child = children[i];
-	                if (storage) {
-	                    storage.delFromStorage(child);
-	                    if (child instanceof Group) {
-	                        child.delChildrenFromStorage(storage);
-	                    }
-	                }
-	                child.parent = null;
-	            }
-	            children.length = 0;
-
-	            return this;
-	        },
-
-	        /**
-	         * 遍历所有子节点
-	         * @param  {Function} cb
-	         * @param  {}   context
-	         */
-	        eachChild: function (cb, context) {
-	            var children = this._children;
-	            for (var i = 0; i < children.length; i++) {
-	                var child = children[i];
-	                cb.call(context, child, i);
-	            }
-	            return this;
-	        },
-
-	        /**
-	         * 深度优先遍历所有子孙节点
 	         * @param  {Function} cb
 	         * @param  {}   context
 	         */
 	        traverse: function (cb, context) {
-	            for (var i = 0; i < this._children.length; i++) {
-	                var child = this._children[i];
-	                cb.call(context, child);
-
-	                if (child.type === 'group') {
-	                    child.traverse(cb, context);
-	                }
-	            }
-	            return this;
+	            cb.call(context, this);
 	        },
 
-	        addChildrenToStorage: function (storage) {
-	            for (var i = 0; i < this._children.length; i++) {
-	                var child = this._children[i];
-	                storage.addToStorage(child);
-	                if (child instanceof Group) {
-	                    child.addChildrenToStorage(storage);
-	                }
-	            }
+	        /**
+	         * 判断坐标 x, y 是否在图形的包围盒上
+	         * If bounding rect of element contain coord x, y
+	         * @param  {number} x
+	         * @param  {number} y
+	         * @return {boolean}
+	         */
+	        rectContain: function (x, y) {
+	            var coord = this.transformCoordToLocal(x, y);
+	            var rect = this.getBoundingRect();
+	            return rect.contain(coord[0], coord[1]);
 	        },
 
-	        delChildrenFromStorage: function (storage) {
-	            for (var i = 0; i < this._children.length; i++) {
-	                var child = this._children[i];
-	                storage.delFromStorage(child);
-	                if (child instanceof Group) {
-	                    child.delChildrenFromStorage(storage);
-	                }
-	            }
-	        },
-
+	        /**
+	         * 标记图形元素为脏，并且在下一帧重绘
+	         * Mark displayable element dirty and refresh next frame
+	         */
 	        dirty: function () {
 	            this.__dirty = true;
+
+	            this._rect = null;
+
 	            this.__zr && this.__zr.refresh();
+	        },
+
+	        /**
+	         * 图形是否会触发事件
+	         * If displayable object binded any event
+	         * @return {boolean}
+	         */
+	        // TODO, 通过 bind 绑定的事件
+	        // isSilent: function () {
+	        //     return !(
+	        //         this.hoverable || this.draggable
+	        //         || this.onmousemove || this.onmouseover || this.onmouseout
+	        //         || this.onmousedown || this.onmouseup || this.onclick
+	        //         || this.ondragenter || this.ondragover || this.ondragleave
+	        //         || this.ondrop
+	        //     );
+	        // },
+	        /**
+	         * Alias for animate('style')
+	         * @param {boolean} loop
+	         */
+	        animateStyle: function (loop) {
+	            return this.animate('style', loop);
+	        },
+
+	        attrKV: function (key, value) {
+	            if (key !== 'style') {
+	                Element.prototype.attrKV.call(this, key, value);
+	            }
+	            else {
+	                this.style.set(value);
+	            }
+	        },
+
+	        /**
+	         * @param {Object|string} key
+	         * @param {*} value
+	         */
+	        setStyle: function (key, value) {
+	            this.style.set(key, value);
+	            this.dirty(false);
 	            return this;
 	        },
 
 	        /**
-	         * @return {module:zrender/core/BoundingRect}
+	         * Use given style object
+	         * @param  {Object} obj
 	         */
-	        getBoundingRect: function (includeChildren) {
-	            // TODO Caching
-	            var rect = null;
-	            var tmpRect = new BoundingRect(0, 0, 0, 0);
-	            var children = includeChildren || this._children;
-	            var tmpMat = [];
-
-	            for (var i = 0; i < children.length; i++) {
-	                var child = children[i];
-	                if (child.ignore || child.invisible) {
-	                    continue;
-	                }
-
-	                var childRect = child.getBoundingRect();
-	                var transform = child.getLocalTransform(tmpMat);
-	                // TODO
-	                // The boundingRect cacluated by transforming original
-	                // rect may be bigger than the actual bundingRect when rotation
-	                // is used. (Consider a circle rotated aginst its center, where
-	                // the actual boundingRect should be the same as that not be
-	                // rotated.) But we can not find better approach to calculate
-	                // actual boundingRect yet, considering performance.
-	                if (transform) {
-	                    tmpRect.copy(childRect);
-	                    tmpRect.applyTransform(transform);
-	                    rect = rect || tmpRect.clone();
-	                    rect.union(tmpRect);
-	                }
-	                else {
-	                    rect = rect || childRect.clone();
-	                    rect.union(childRect);
-	                }
-	            }
-	            return rect || tmpRect;
+	        useStyle: function (obj) {
+	            this.style = new Style(obj);
+	            this.dirty(false);
+	            return this;
 	        }
 	    };
 
-	    zrUtil.inherits(Group, Element);
+	    zrUtil.inherits(Displayable, Element);
 
-	    module.exports = Group;
+	    zrUtil.mixin(Displayable, RectText);
+	    // zrUtil.mixin(Displayable, Stateful);
+
+	    module.exports = Displayable;
 
 
 /***/ },
-/* 31 */
+/* 22 */
+/***/ function(module, exports) {
+
+	/**
+	 * @module zrender/graphic/Style
+	 */
+
+
+	    var STYLE_COMMON_PROPS = [
+	        ['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'],
+	        ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]
+	    ];
+
+	    // var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);
+	    // var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);
+
+	    var Style = function (opts) {
+	        this.extendFrom(opts);
+	    };
+
+	    function createLinearGradient(ctx, obj, rect) {
+	        var x = obj.x == null ? 0 : obj.x;
+	        var x2 = obj.x2 == null ? 1 : obj.x2;
+	        var y = obj.y == null ? 0 : obj.y;
+	        var y2 = obj.y2 == null ? 0 : obj.y2;
+
+	        if (!obj.global) {
+	            x = x * rect.width + rect.x;
+	            x2 = x2 * rect.width + rect.x;
+	            y = y * rect.height + rect.y;
+	            y2 = y2 * rect.height + rect.y;
+	        }
+
+	        var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);
+
+	        return canvasGradient;
+	    }
+
+	    function createRadialGradient(ctx, obj, rect) {
+	        var width = rect.width;
+	        var height = rect.height;
+	        var min = Math.min(width, height);
+
+	        var x = obj.x == null ? 0.5 : obj.x;
+	        var y = obj.y == null ? 0.5 : obj.y;
+	        var r = obj.r == null ? 0.5 : obj.r;
+	        if (!obj.global) {
+	            x = x * width + rect.x;
+	            y = y * height + rect.y;
+	            r = r * min;
+	        }
+
+	        var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);
+
+	        return canvasGradient;
+	    }
+
+
+	    Style.prototype = {
+
+	        constructor: Style,
+
+	        /**
+	         * @type {string}
+	         */
+	        fill: '#000000',
+
+	        /**
+	         * @type {string}
+	         */
+	        stroke: null,
+
+	        /**
+	         * @type {number}
+	         */
+	        opacity: 1,
+
+	        /**
+	         * @type {Array.<number>}
+	         */
+	        lineDash: null,
+
+	        /**
+	         * @type {number}
+	         */
+	        lineDashOffset: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        shadowBlur: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        shadowOffsetX: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        shadowOffsetY: 0,
+
+	        /**
+	         * @type {number}
+	         */
+	        lineWidth: 1,
+
+	        /**
+	         * If stroke ignore scale
+	         * @type {Boolean}
+	         */
+	        strokeNoScale: false,
+
+	        // Bounding rect text configuration
+	        // Not affected by element transform
+	        /**
+	         * @type {string}
+	         */
+	        text: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textFill: '#000',
+
+	        /**
+	         * @type {string}
+	         */
+	        textStroke: null,
+
+	        /**
+	         * 'inside', 'left', 'right', 'top', 'bottom'
+	         * [x, y]
+	         * @type {string|Array.<number>}
+	         * @default 'inside'
+	         */
+	        textPosition: 'inside',
+
+	        /**
+	         * [x, y]
+	         * @type {Array.<number>}
+	         */
+	        textOffset: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textBaseline: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textAlign: null,
+
+	        /**
+	         * @type {string}
+	         */
+	        textVerticalAlign: null,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textDistance: 5,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textShadowBlur: 0,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textShadowOffsetX: 0,
+
+	        /**
+	         * Only useful in Path and Image element
+	         * @type {number}
+	         */
+	        textShadowOffsetY: 0,
+
+	        /**
+	         * If transform text
+	         * Only useful in Path and Image element
+	         * @type {boolean}
+	         */
+	        textTransform: false,
+
+	        /**
+	         * Text rotate around position of Path or Image
+	         * Only useful in Path and Image element and textTransform is false.
+	         */
+	        textRotation: 0,
+
+	        /**
+	         * @type {string}
+	         * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
+	         */
+	        blend: null,
+
+	        /**
+	         * @param {CanvasRenderingContext2D} ctx
+	         */
+	        bind: function (ctx, el, prevEl) {
+	            var style = this;
+	            var prevStyle = prevEl && prevEl.style;
+	            var firstDraw = !prevStyle;
+
+	            for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
+	                var prop = STYLE_COMMON_PROPS[i];
+	                var styleName = prop[0];
+
+	                if (firstDraw || style[styleName] !== prevStyle[styleName]) {
+	                    // FIXME Invalid property value will cause style leak from previous element.
+	                    ctx[styleName] = style[styleName] || prop[1];
+	                }
+	            }
+
+	            if ((firstDraw || style.fill !== prevStyle.fill)) {
+	                ctx.fillStyle = style.fill;
+	            }
+	            if ((firstDraw || style.stroke !== prevStyle.stroke)) {
+	                ctx.strokeStyle = style.stroke;
+	            }
+	            if ((firstDraw || style.opacity !== prevStyle.opacity)) {
+	                ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;
+	            }
+
+	            if ((firstDraw || style.blend !== prevStyle.blend)) {
+	                ctx.globalCompositeOperation = style.blend || 'source-over';
+	            }
+	            if (this.hasStroke()) {
+	                var lineWidth = style.lineWidth;
+	                ctx.lineWidth = lineWidth / (
+	                    (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1
+	                );
+	            }
+	        },
+
+	        hasFill: function () {
+	            var fill = this.fill;
+	            return fill != null && fill !== 'none';
+	        },
+
+	        hasStroke: function () {
+	            var stroke = this.stroke;
+	            return stroke != null && stroke !== 'none' && this.lineWidth > 0;
+	        },
+
+	        /**
+	         * Extend from other style
+	         * @param {zrender/graphic/Style} otherStyle
+	         * @param {boolean} overwrite
+	         */
+	        extendFrom: function (otherStyle, overwrite) {
+	            if (otherStyle) {
+	                var target = this;
+	                for (var name in otherStyle) {
+	                    if (otherStyle.hasOwnProperty(name)
+	                        && (overwrite || ! target.hasOwnProperty(name))
+	                    ) {
+	                        target[name] = otherStyle[name];
+	                    }
+	                }
+	            }
+	        },
+
+	        /**
+	         * Batch setting style with a given object
+	         * @param {Object|string} obj
+	         * @param {*} [obj]
+	         */
+	        set: function (obj, value) {
+	            if (typeof obj === 'string') {
+	                this[obj] = value;
+	            }
+	            else {
+	                this.extendFrom(obj, true);
+	            }
+	        },
+
+	        /**
+	         * Clone
+	         * @return {zrender/graphic/Style} [description]
+	         */
+	        clone: function () {
+	            var newStyle = new this.constructor();
+	            newStyle.extendFrom(this, true);
+	            return newStyle;
+	        },
+
+	        getGradient: function (ctx, obj, rect) {
+	            var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;
+	            var canvasGradient = method(ctx, obj, rect);
+	            var colorStops = obj.colorStops;
+	            for (var i = 0; i < colorStops.length; i++) {
+	                canvasGradient.addColorStop(
+	                    colorStops[i].offset, colorStops[i].color
+	                );
+	            }
+	            return canvasGradient;
+	        }
+	    };
+
+	    var styleProto = Style.prototype;
+	    for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
+	        var prop = STYLE_COMMON_PROPS[i];
+	        if (!(prop[0] in styleProto)) {
+	            styleProto[prop[0]] = prop[1];
+	        }
+	    }
+
+	    // Provide for others
+	    Style.getGradient = styleProto.getGradient;
+
+	    module.exports = Style;
+
+
+/***/ },
+/* 23 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -8541,10 +8400,10 @@
 	 */
 
 
-	    var guid = __webpack_require__(32);
-	    var Eventful = __webpack_require__(33);
-	    var Transformable = __webpack_require__(34);
-	    var Animatable = __webpack_require__(35);
+	    var guid = __webpack_require__(24);
+	    var Eventful = __webpack_require__(25);
+	    var Transformable = __webpack_require__(26);
+	    var Animatable = __webpack_require__(27);
 	    var zrUtil = __webpack_require__(4);
 
 	    /**
@@ -8800,7 +8659,7 @@
 
 
 /***/ },
-/* 32 */
+/* 24 */
 /***/ function(module, exports) {
 
 	/**
@@ -8819,7 +8678,7 @@
 
 
 /***/ },
-/* 33 */
+/* 25 */
 /***/ function(module, exports) {
 
 	/**
@@ -9127,7 +8986,7 @@
 
 
 /***/ },
-/* 34 */
+/* 26 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -9395,7 +9254,7 @@
 
 
 /***/ },
-/* 35 */
+/* 27 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -9404,12 +9263,12 @@
 	 */
 
 
-	    var Animator = __webpack_require__(36);
+	    var Animator = __webpack_require__(28);
 	    var util = __webpack_require__(4);
 	    var isString = util.isString;
 	    var isFunction = util.isFunction;
 	    var isObject = util.isObject;
-	    var log = __webpack_require__(41);
+	    var log = __webpack_require__(33);
 
 	    /**
 	     * @alias modue:zrender/mixin/Animatable
@@ -9669,7 +9528,7 @@
 
 
 /***/ },
-/* 36 */
+/* 28 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -9677,8 +9536,8 @@
 	 */
 
 
-	    var Clip = __webpack_require__(37);
-	    var color = __webpack_require__(39);
+	    var Clip = __webpack_require__(29);
+	    var color = __webpack_require__(31);
 	    var util = __webpack_require__(4);
 	    var isArrayLike = util.isArrayLike;
 
@@ -9727,7 +9586,7 @@
 	            }
 	        }
 	        else {
-	            var len2 = p0[0].length;
+	            var len2 = len && p0[0].length;
 	            for (var i = 0; i < len; i++) {
 	                for (var j = 0; j < len2; j++) {
 	                    out[i][j] = interpolateNumber(
@@ -9891,6 +9750,11 @@
 	        return 'rgba(' + rgba.join(',') + ')';
 	    }
 
+	    function getArrayDim(keyframes) {
+	        var lastValue = keyframes[keyframes.length - 1].value;
+	        return isArrayLike(lastValue && lastValue[0]) ? 2 : 1;
+	    }
+
 	    function createTrackClip (animator, easing, oneTrackDone, keyframes, propName) {
 	        var getter = animator._getter;
 	        var setter = animator._setter;
@@ -9907,11 +9771,8 @@
 	        var isValueString = false;
 
 	        // For vertices morphing
-	        var arrDim = (
-	                isValueArray
-	                && isArrayLike(firstVal[0])
-	            )
-	            ? 2 : 1;
+	        var arrDim = isValueArray ? getArrayDim(keyframes) : 0;
+
 	        var trackMaxTime;
 	        // Sort keyframe as ascending
 	        keyframes.sort(function(a, b) {
@@ -10323,7 +10184,7 @@
 
 
 /***/ },
-/* 37 */
+/* 29 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -10342,7 +10203,7 @@
 	 */
 
 
-	    var easingFuncs = __webpack_require__(38);
+	    var easingFuncs = __webpack_require__(30);
 
 	    function Clip(options) {
 
@@ -10452,7 +10313,7 @@
 
 
 /***/ },
-/* 38 */
+/* 30 */
 /***/ function(module, exports) {
 
 	/**
@@ -10803,7 +10664,7 @@
 
 
 /***/ },
-/* 39 */
+/* 31 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -10811,7 +10672,7 @@
 	 */
 
 
-	    var LRU = __webpack_require__(40);
+	    var LRU = __webpack_require__(32);
 
 	    var kCSSColorTable = {
 	        'transparent': [0,0,0,0], 'aliceblue': [240,248,255,1],
@@ -11341,7 +11202,7 @@
 
 
 /***/ },
-/* 40 */
+/* 32 */
 /***/ function(module, exports) {
 
 	// Simple LRU cache use doubly linked list
@@ -11543,11 +11404,11 @@
 
 
 /***/ },
-/* 41 */
+/* 33 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
-	        var config = __webpack_require__(42);
+	        var config = __webpack_require__(34);
 
 	        /**
 	         * @exports zrender/tool/log
@@ -11581,7 +11442,7 @@
 
 
 /***/ },
-/* 42 */
+/* 34 */
 /***/ function(module, exports) {
 
 	
@@ -11613,2139 +11474,7 @@
 
 
 /***/ },
-/* 43 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var Group = __webpack_require__(30);
-	    var componentUtil = __webpack_require__(20);
-	    var clazzUtil = __webpack_require__(13);
-	    var modelUtil = __webpack_require__(5);
-	    var zrUtil = __webpack_require__(4);
-
-	    function Chart() {
-
-	        /**
-	         * @type {module:zrender/container/Group}
-	         * @readOnly
-	         */
-	        this.group = new Group();
-
-	        /**
-	         * @type {string}
-	         * @readOnly
-	         */
-	        this.uid = componentUtil.getUID('viewChart');
-	    }
-
-	    Chart.prototype = {
-
-	        type: 'chart',
-
-	        /**
-	         * Init the chart
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         */
-	        init: function (ecModel, api) {},
-
-	        /**
-	         * Render the chart
-	         * @param  {module:echarts/model/Series} seriesModel
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         * @param  {Object} payload
-	         */
-	        render: function (seriesModel, ecModel, api, payload) {},
-
-	        /**
-	         * Highlight series or specified data item
-	         * @param  {module:echarts/model/Series} seriesModel
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         * @param  {Object} payload
-	         */
-	        highlight: function (seriesModel, ecModel, api, payload) {
-	            toggleHighlight(seriesModel.getData(), payload, 'emphasis');
-	        },
-
-	        /**
-	         * Downplay series or specified data item
-	         * @param  {module:echarts/model/Series} seriesModel
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         * @param  {Object} payload
-	         */
-	        downplay: function (seriesModel, ecModel, api, payload) {
-	            toggleHighlight(seriesModel.getData(), payload, 'normal');
-	        },
-
-	        /**
-	         * Remove self
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         */
-	        remove: function (ecModel, api) {
-	            this.group.removeAll();
-	        },
-
-	        /**
-	         * Dispose self
-	         * @param  {module:echarts/model/Global} ecModel
-	         * @param  {module:echarts/ExtensionAPI} api
-	         */
-	        dispose: function () {}
-
-	        /**
-	         * The view contains the given point.
-	         * @interface
-	         * @param {Array.<number>} point
-	         * @return {boolean}
-	         */
-	        // containPoint: function () {}
-
-	    };
-
-	    var chartProto = Chart.prototype;
-	    chartProto.updateView
-	        = chartProto.updateLayout
-	        = chartProto.updateVisual
-	        = function (seriesModel, ecModel, api, payload) {
-	            this.render(seriesModel, ecModel, api, payload);
-	        };
-
-	    /**
-	     * Set state of single element
-	     * @param  {module:zrender/Element} el
-	     * @param  {string} state
-	     */
-	    function elSetState(el, state) {
-	        if (el) {
-	            el.trigger(state);
-	            if (el.type === 'group') {
-	                for (var i = 0; i < el.childCount(); i++) {
-	                    elSetState(el.childAt(i), state);
-	                }
-	            }
-	        }
-	    }
-	    /**
-	     * @param  {module:echarts/data/List} data
-	     * @param  {Object} payload
-	     * @param  {string} state 'normal'|'emphasis'
-	     * @inner
-	     */
-	    function toggleHighlight(data, payload, state) {
-	        var dataIndex = modelUtil.queryDataIndex(data, payload);
-
-	        if (dataIndex != null) {
-	            zrUtil.each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {
-	                elSetState(data.getItemGraphicEl(dataIdx), state);
-	            });
-	        }
-	        else {
-	            data.eachItemGraphicEl(function (el) {
-	                elSetState(el, state);
-	            });
-	        }
-	    }
-
-	    // Enable Chart.extend.
-	    clazzUtil.enableClassExtend(Chart, ['dispose']);
-
-	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
-	    clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true});
-
-	    module.exports = Chart;
-
-
-/***/ },
-/* 44 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var pathTool = __webpack_require__(45);
-	    var round = Math.round;
-	    var Path = __webpack_require__(46);
-	    var colorTool = __webpack_require__(39);
-	    var matrix = __webpack_require__(11);
-	    var vector = __webpack_require__(10);
-	    var Transformable = __webpack_require__(34);
-	    var BoundingRect = __webpack_require__(9);
-
-	    var graphic = {};
-
-	    graphic.Group = __webpack_require__(30);
-
-	    graphic.Image = __webpack_require__(62);
-
-	    graphic.Text = __webpack_require__(63);
-
-	    graphic.Circle = __webpack_require__(64);
-
-	    graphic.Sector = __webpack_require__(65);
-
-	    graphic.Ring = __webpack_require__(66);
-
-	    graphic.Polygon = __webpack_require__(67);
-
-	    graphic.Polyline = __webpack_require__(71);
-
-	    graphic.Rect = __webpack_require__(72);
-
-	    graphic.Line = __webpack_require__(74);
-
-	    graphic.BezierCurve = __webpack_require__(75);
-
-	    graphic.Arc = __webpack_require__(76);
-
-	    graphic.CompoundPath = __webpack_require__(77);
-
-	    graphic.LinearGradient = __webpack_require__(78);
-
-	    graphic.RadialGradient = __webpack_require__(80);
-
-	    graphic.BoundingRect = BoundingRect;
-
-	    /**
-	     * Extend shape with parameters
-	     */
-	    graphic.extendShape = function (opts) {
-	        return Path.extend(opts);
-	    };
-
-	    /**
-	     * Extend path
-	     */
-	    graphic.extendPath = function (pathData, opts) {
-	        return pathTool.extendFromString(pathData, opts);
-	    };
-
-	    /**
-	     * Create a path element from path data string
-	     * @param {string} pathData
-	     * @param {Object} opts
-	     * @param {module:zrender/core/BoundingRect} rect
-	     * @param {string} [layout=cover] 'center' or 'cover'
-	     */
-	    graphic.makePath = function (pathData, opts, rect, layout) {
-	        var path = pathTool.createFromString(pathData, opts);
-	        var boundingRect = path.getBoundingRect();
-	        if (rect) {
-	            var aspect = boundingRect.width / boundingRect.height;
-
-	            if (layout === 'center') {
-	                // Set rect to center, keep width / height ratio.
-	                var width = rect.height * aspect;
-	                var height;
-	                if (width <= rect.width) {
-	                    height = rect.height;
-	                }
-	                else {
-	                    width = rect.width;
-	                    height = width / aspect;
-	                }
-	                var cx = rect.x + rect.width / 2;
-	                var cy = rect.y + rect.height / 2;
-
-	                rect.x = cx - width / 2;
-	                rect.y = cy - height / 2;
-	                rect.width = width;
-	                rect.height = height;
-	            }
-
-	            graphic.resizePath(path, rect);
-	        }
-	        return path;
-	    };
-
-	    graphic.mergePath = pathTool.mergePath,
-
-	    /**
-	     * Resize a path to fit the rect
-	     * @param {module:zrender/graphic/Path} path
-	     * @param {Object} rect
-	     */
-	    graphic.resizePath = function (path, rect) {
-	        if (!path.applyTransform) {
-	            return;
-	        }
-
-	        var pathRect = path.getBoundingRect();
-
-	        var m = pathRect.calculateTransform(rect);
-
-	        path.applyTransform(m);
-	    };
-
-	    /**
-	     * Sub pixel optimize line for canvas
-	     *
-	     * @param {Object} param
-	     * @param {Object} [param.shape]
-	     * @param {number} [param.shape.x1]
-	     * @param {number} [param.shape.y1]
-	     * @param {number} [param.shape.x2]
-	     * @param {number} [param.shape.y2]
-	     * @param {Object} [param.style]
-	     * @param {number} [param.style.lineWidth]
-	     * @return {Object} Modified param
-	     */
-	    graphic.subPixelOptimizeLine = function (param) {
-	        var subPixelOptimize = graphic.subPixelOptimize;
-	        var shape = param.shape;
-	        var lineWidth = param.style.lineWidth;
-
-	        if (round(shape.x1 * 2) === round(shape.x2 * 2)) {
-	            shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);
-	        }
-	        if (round(shape.y1 * 2) === round(shape.y2 * 2)) {
-	            shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);
-	        }
-	        return param;
-	    };
-
-	    /**
-	     * Sub pixel optimize rect for canvas
-	     *
-	     * @param {Object} param
-	     * @param {Object} [param.shape]
-	     * @param {number} [param.shape.x]
-	     * @param {number} [param.shape.y]
-	     * @param {number} [param.shape.width]
-	     * @param {number} [param.shape.height]
-	     * @param {Object} [param.style]
-	     * @param {number} [param.style.lineWidth]
-	     * @return {Object} Modified param
-	     */
-	    graphic.subPixelOptimizeRect = function (param) {
-	        var subPixelOptimize = graphic.subPixelOptimize;
-	        var shape = param.shape;
-	        var lineWidth = param.style.lineWidth;
-	        var originX = shape.x;
-	        var originY = shape.y;
-	        var originWidth = shape.width;
-	        var originHeight = shape.height;
-	        shape.x = subPixelOptimize(shape.x, lineWidth, true);
-	        shape.y = subPixelOptimize(shape.y, lineWidth, true);
-	        shape.width = Math.max(
-	            subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x,
-	            originWidth === 0 ? 0 : 1
-	        );
-	        shape.height = Math.max(
-	            subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y,
-	            originHeight === 0 ? 0 : 1
-	        );
-	        return param;
-	    };
-
-	    /**
-	     * Sub pixel optimize for canvas
-	     *
-	     * @param {number} position Coordinate, such as x, y
-	     * @param {number} lineWidth Should be nonnegative integer.
-	     * @param {boolean=} positiveOrNegative Default false (negative).
-	     * @return {number} Optimized position.
-	     */
-	    graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) {
-	        // Assure that (position + lineWidth / 2) is near integer edge,
-	        // otherwise line will be fuzzy in canvas.
-	        var doubledPosition = round(position * 2);
-	        return (doubledPosition + round(lineWidth)) % 2 === 0
-	            ? doubledPosition / 2
-	            : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;
-	    };
-
-	    function hasFillOrStroke(fillOrStroke) {
-	        return fillOrStroke != null && fillOrStroke != 'none';
-	    }
-
-	    function liftColor(color) {
-	        return typeof color === 'string' ? colorTool.lift(color, -0.1) : color;
-	    }
-
-	    /**
-	     * @private
-	     */
-	    function cacheElementStl(el) {
-	        if (el.__hoverStlDirty) {
-	            var stroke = el.style.stroke;
-	            var fill = el.style.fill;
-
-	            // Create hoverStyle on mouseover
-	            var hoverStyle = el.__hoverStl;
-	            hoverStyle.fill = hoverStyle.fill
-	                || (hasFillOrStroke(fill) ? liftColor(fill) : null);
-	            hoverStyle.stroke = hoverStyle.stroke
-	                || (hasFillOrStroke(stroke) ? liftColor(stroke) : null);
-
-	            var normalStyle = {};
-	            for (var name in hoverStyle) {
-	                if (hoverStyle.hasOwnProperty(name)) {
-	                    normalStyle[name] = el.style[name];
-	                }
-	            }
-
-	            el.__normalStl = normalStyle;
-
-	            el.__hoverStlDirty = false;
-	        }
-	    }
-
-	    /**
-	     * @private
-	     */
-	    function doSingleEnterHover(el) {
-	        if (el.__isHover) {
-	            return;
-	        }
-
-	        cacheElementStl(el);
-
-	        if (el.useHoverLayer) {
-	            el.__zr && el.__zr.addHover(el, el.__hoverStl);
-	        }
-	        else {
-	            el.setStyle(el.__hoverStl);
-	            el.z2 += 1;
-	        }
-
-	        el.__isHover = true;
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function doSingleLeaveHover(el) {
-	        if (!el.__isHover) {
-	            return;
-	        }
-
-	        var normalStl = el.__normalStl;
-	        if (el.useHoverLayer) {
-	            el.__zr && el.__zr.removeHover(el);
-	        }
-	        else {
-	            normalStl && el.setStyle(normalStl);
-	            el.z2 -= 1;
-	        }
-
-	        el.__isHover = false;
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function doEnterHover(el) {
-	        el.type === 'group'
-	            ? el.traverse(function (child) {
-	                if (child.type !== 'group') {
-	                    doSingleEnterHover(child);
-	                }
-	            })
-	            : doSingleEnterHover(el);
-	    }
-
-	    function doLeaveHover(el) {
-	        el.type === 'group'
-	            ? el.traverse(function (child) {
-	                if (child.type !== 'group') {
-	                    doSingleLeaveHover(child);
-	                }
-	            })
-	            : doSingleLeaveHover(el);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function setElementHoverStl(el, hoverStl) {
-	        // If element has sepcified hoverStyle, then use it instead of given hoverStyle
-	        // Often used when item group has a label element and it's hoverStyle is different
-	        el.__hoverStl = el.hoverStyle || hoverStl || {};
-	        el.__hoverStlDirty = true;
-
-	        if (el.__isHover) {
-	            cacheElementStl(el);
-	        }
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function onElementMouseOver(e) {
-	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
-	            return;
-	        }
-
-	        // Only if element is not in emphasis status
-	        !this.__isEmphasis && doEnterHover(this);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function onElementMouseOut(e) {
-	        if (this.__hoverSilentOnTouch && e.zrByTouch) {
-	            return;
-	        }
-
-	        // Only if element is not in emphasis status
-	        !this.__isEmphasis && doLeaveHover(this);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function enterEmphasis() {
-	        this.__isEmphasis = true;
-	        doEnterHover(this);
-	    }
-
-	    /**
-	     * @inner
-	     */
-	    function leaveEmphasis() {
-	        this.__isEmphasis = false;
-	        doLeaveHover(this);
-	    }
-
-	    /**
-	     * Set hover style of element.
-	     * This method can be called repeatly without side-effects.
-	     * @param {module:zrender/Element} el
-	     * @param {Object} [hoverStyle]
-	     * @param {Object} [opt]
-	     * @param {boolean} [opt.hoverSilentOnTouch=false]
-	     *        In touch device, mouseover event will be trigger on touchstart event
-	     *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
-	     *        conviniently use hoverStyle when tap on touch screen without additional
-	     *        code for compatibility.
-	     *        But if the chart/component has select feature, which usually also use
-	     *        hoverStyle, there might be conflict between 'select-highlight' and
-	     *        'hover-highlight' especially when roam is enabled (see geo for example).
-	     *        In this case, hoverSilentOnTouch should be used to disable hover-highlight
-	     *        on touch device.
-	     */
-	    graphic.setHoverStyle = function (el, hoverStyle, opt) {
-	        el.__hoverSilentOnTouch = opt && opt.hoverSilentOnTouch;
-
-	        el.type === 'group'
-	            ? el.traverse(function (child) {
-	                if (child.type !== 'group') {
-	                    setElementHoverStl(child, hoverStyle);
-	                }
-	            })
-	            : setElementHoverStl(el, hoverStyle);
-
-	        // Duplicated function will be auto-ignored, see Eventful.js.
-	        el.on('mouseover', onElementMouseOver)
-	          .on('mouseout', onElementMouseOut);
-
-	        // Emphasis, normal can be triggered manually
-	        el.on('emphasis', enterEmphasis)
-	          .on('normal', leaveEmphasis);
-	    };
-
-	    /**
-	     * Set text option in the style
-	     * @param {Object} textStyle
-	     * @param {module:echarts/model/Model} labelModel
-	     * @param {string} color
-	     */
-	    graphic.setText = function (textStyle, labelModel, color) {
-	        var labelPosition = labelModel.getShallow('position') || 'inside';
-	        var labelOffset = labelModel.getShallow('offset');
-	        var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color;
-	        var textStyleModel = labelModel.getModel('textStyle');
-	        zrUtil.extend(textStyle, {
-	            textDistance: labelModel.getShallow('distance') || 5,
-	            textFont: textStyleModel.getFont(),
-	            textPosition: labelPosition,
-	            textOffset: labelOffset,
-	            textFill: textStyleModel.getTextColor() || labelColor
-	        });
-	    };
-
-	    function animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {
-	        if (typeof dataIndex === 'function') {
-	            cb = dataIndex;
-	            dataIndex = null;
-	        }
-	        // Do not check 'animation' property directly here. Consider this case:
-	        // animation model is an `itemModel`, whose does not have `isAnimationEnabled`
-	        // but its parent model (`seriesModel`) does.
-	        var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();
-
-	        if (animationEnabled) {
-	            var postfix = isUpdate ? 'Update' : '';
-	            var duration = animatableModel.getShallow('animationDuration' + postfix);
-	            var animationEasing = animatableModel.getShallow('animationEasing' + postfix);
-	            var animationDelay = animatableModel.getShallow('animationDelay' + postfix);
-	            if (typeof animationDelay === 'function') {
-	                animationDelay = animationDelay(
-	                    dataIndex,
-	                    animatableModel.getAnimationDelayParams
-	                        ? animatableModel.getAnimationDelayParams(el, dataIndex)
-	                        : null
-	                );
-	            }
-	            if (typeof duration === 'function') {
-	                duration = duration(dataIndex);
-	            }
-
-	            duration > 0
-	                ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb)
-	                : (el.stopAnimation(), el.attr(props), cb && cb());
-	        }
-	        else {
-	            el.stopAnimation();
-	            el.attr(props);
-	            cb && cb();
-	        }
-	    }
-
-	    /**
-	     * Update graphic element properties with or without animation according to the configuration in series
-	     * @param {module:zrender/Element} el
-	     * @param {Object} props
-	     * @param {module:echarts/model/Model} [animatableModel]
-	     * @param {number} [dataIndex]
-	     * @param {Function} [cb]
-	     * @example
-	     *     graphic.updateProps(el, {
-	     *         position: [100, 100]
-	     *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
-	     *     // Or
-	     *     graphic.updateProps(el, {
-	     *         position: [100, 100]
-	     *     }, seriesModel, function () { console.log('Animation done!'); });
-	     */
-	    graphic.updateProps = function (el, props, animatableModel, dataIndex, cb) {
-	        animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);
-	    };
-
-	    /**
-	     * Init graphic element properties with or without animation according to the configuration in series
-	     * @param {module:zrender/Element} el
-	     * @param {Object} props
-	     * @param {module:echarts/model/Model} [animatableModel]
-	     * @param {number} [dataIndex]
-	     * @param {Function} cb
-	     */
-	    graphic.initProps = function (el, props, animatableModel, dataIndex, cb) {
-	        animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);
-	    };
-
-	    /**
-	     * Get transform matrix of target (param target),
-	     * in coordinate of its ancestor (param ancestor)
-	     *
-	     * @param {module:zrender/mixin/Transformable} target
-	     * @param {module:zrender/mixin/Transformable} [ancestor]
-	     */
-	    graphic.getTransform = function (target, ancestor) {
-	        var mat = matrix.identity([]);
-
-	        while (target && target !== ancestor) {
-	            matrix.mul(mat, target.getLocalTransform(), mat);
-	            target = target.parent;
-	        }
-
-	        return mat;
-	    };
-
-	    /**
-	     * Apply transform to an vertex.
-	     * @param {Array.<number>} target [x, y]
-	     * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:
-	     *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
-	     *      + {position, rotation, scale}, the same as `zrender/Transformable`.
-	     * @param {boolean=} invert Whether use invert matrix.
-	     * @return {Array.<number>} [x, y]
-	     */
-	    graphic.applyTransform = function (target, transform, invert) {
-	        if (transform && !zrUtil.isArrayLike(transform)) {
-	            transform = Transformable.getLocalTransform(transform);
-	        }
-
-	        if (invert) {
-	            transform = matrix.invert([], transform);
-	        }
-	        return vector.applyTransform([], target, transform);
-	    };
-
-	    /**
-	     * @param {string} direction 'left' 'right' 'top' 'bottom'
-	     * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]
-	     * @param {boolean=} invert Whether use invert matrix.
-	     * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'
-	     */
-	    graphic.transformDirection = function (direction, transform, invert) {
-
-	        // Pick a base, ensure that transform result will not be (0, 0).
-	        var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0)
-	            ? 1 : Math.abs(2 * transform[4] / transform[0]);
-	        var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0)
-	            ? 1 : Math.abs(2 * transform[4] / transform[2]);
-
-	        var vertex = [
-	            direction === 'left' ? -hBase : direction === 'right' ? hBase : 0,
-	            direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0
-	        ];
-
-	        vertex = graphic.applyTransform(vertex, transform, invert);
-
-	        return Math.abs(vertex[0]) > Math.abs(vertex[1])
-	            ? (vertex[0] > 0 ? 'right' : 'left')
-	            : (vertex[1] > 0 ? 'bottom' : 'top');
-	    };
-
-	    /**
-	     * Apply group transition animation from g1 to g2.
-	     * If no animatableModel, no animation.
-	     */
-	    graphic.groupTransition = function (g1, g2, animatableModel, cb) {
-	        if (!g1 || !g2) {
-	            return;
-	        }
-
-	        function getElMap(g) {
-	            var elMap = {};
-	            g.traverse(function (el) {
-	                if (!el.isGroup && el.anid) {
-	                    elMap[el.anid] = el;
-	                }
-	            });
-	            return elMap;
-	        }
-	        function getAnimatableProps(el) {
-	            var obj = {
-	                position: vector.clone(el.position),
-	                rotation: el.rotation
-	            };
-	            if (el.shape) {
-	                obj.shape = zrUtil.extend({}, el.shape);
-	            }
-	            return obj;
-	        }
-	        var elMap1 = getElMap(g1);
-
-	        g2.traverse(function (el) {
-	            if (!el.isGroup && el.anid) {
-	                var oldEl = elMap1[el.anid];
-	                if (oldEl) {
-	                    var newProp = getAnimatableProps(el);
-	                    el.attr(getAnimatableProps(oldEl));
-	                    graphic.updateProps(el, newProp, animatableModel, el.dataIndex);
-	                }
-	                // else {
-	                //     if (el.previousProps) {
-	                //         graphic.updateProps
-	                //     }
-	                // }
-	            }
-	        });
-	    };
-
-	    module.exports = graphic;
-
-
-
-/***/ },
-/* 45 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var Path = __webpack_require__(46);
-	    var PathProxy = __webpack_require__(50);
-	    var transformPath = __webpack_require__(61);
-
-	    // command chars
-	    var cc = [
-	        'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z',
-	        'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'
-	    ];
-
-	    var mathSqrt = Math.sqrt;
-	    var mathSin = Math.sin;
-	    var mathCos = Math.cos;
-	    var PI = Math.PI;
-
-	    var vMag = function(v) {
-	        return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
-	    };
-	    var vRatio = function(u, v) {
-	        return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
-	    };
-	    var vAngle = function(u, v) {
-	        return (u[0] * v[1] < u[1] * v[0] ? -1 : 1)
-	                * Math.acos(vRatio(u, v));
-	    };
-
-	    function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {
-	        var psi = psiDeg * (PI / 180.0);
-	        var xp = mathCos(psi) * (x1 - x2) / 2.0
-	                 + mathSin(psi) * (y1 - y2) / 2.0;
-	        var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0
-	                 + mathCos(psi) * (y1 - y2) / 2.0;
-
-	        var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);
-
-	        if (lambda > 1) {
-	            rx *= mathSqrt(lambda);
-	            ry *= mathSqrt(lambda);
-	        }
-
-	        var f = (fa === fs ? -1 : 1)
-	            * mathSqrt((((rx * rx) * (ry * ry))
-	                    - ((rx * rx) * (yp * yp))
-	                    - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp)
-	                    + (ry * ry) * (xp * xp))
-	                ) || 0;
-
-	        var cxp = f * rx * yp / ry;
-	        var cyp = f * -ry * xp / rx;
-
-	        var cx = (x1 + x2) / 2.0
-	                 + mathCos(psi) * cxp
-	                 - mathSin(psi) * cyp;
-	        var cy = (y1 + y2) / 2.0
-	                + mathSin(psi) * cxp
-	                + mathCos(psi) * cyp;
-
-	        var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]);
-	        var u = [ (xp - cxp) / rx, (yp - cyp) / ry ];
-	        var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ];
-	        var dTheta = vAngle(u, v);
-
-	        if (vRatio(u, v) <= -1) {
-	            dTheta = PI;
-	        }
-	        if (vRatio(u, v) >= 1) {
-	            dTheta = 0;
-	        }
-	        if (fs === 0 && dTheta > 0) {
-	            dTheta = dTheta - 2 * PI;
-	        }
-	        if (fs === 1 && dTheta < 0) {
-	            dTheta = dTheta + 2 * PI;
-	        }
-
-	        path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);
-	    }
-
-	    function createPathProxyFromString(data) {
-	        if (!data) {
-	            return [];
-	        }
-
-	        // command string
-	        var cs = data.replace(/-/g, ' -')
-	            .replace(/  /g, ' ')
-	            .replace(/ /g, ',')
-	            .replace(/,,/g, ',');
-
-	        var n;
-	        // create pipes so that we can split the data
-	        for (n = 0; n < cc.length; n++) {
-	            cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
-	        }
-
-	        // create array
-	        var arr = cs.split('|');
-	        // init context point
-	        var cpx = 0;
-	        var cpy = 0;
-
-	        var path = new PathProxy();
-	        var CMD = PathProxy.CMD;
-
-	        var prevCmd;
-	        for (n = 1; n < arr.length; n++) {
-	            var str = arr[n];
-	            var c = str.charAt(0);
-	            var off = 0;
-	            var p = str.slice(1).replace(/e,-/g, 'e-').split(',');
-	            var cmd;
-
-	            if (p.length > 0 && p[0] === '') {
-	                p.shift();
-	            }
-
-	            for (var i = 0; i < p.length; i++) {
-	                p[i] = parseFloat(p[i]);
-	            }
-	            while (off < p.length && !isNaN(p[off])) {
-	                if (isNaN(p[0])) {
-	                    break;
-	                }
-	                var ctlPtx;
-	                var ctlPty;
-
-	                var rx;
-	                var ry;
-	                var psi;
-	                var fa;
-	                var fs;
-
-	                var x1 = cpx;
-	                var y1 = cpy;
-
-	                // convert l, H, h, V, and v to L
-	                switch (c) {
-	                    case 'l':
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'L':
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'm':
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.M;
-	                        path.addData(cmd, cpx, cpy);
-	                        c = 'l';
-	                        break;
-	                    case 'M':
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.M;
-	                        path.addData(cmd, cpx, cpy);
-	                        c = 'L';
-	                        break;
-	                    case 'h':
-	                        cpx += p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'H':
-	                        cpx = p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'v':
-	                        cpy += p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'V':
-	                        cpy = p[off++];
-	                        cmd = CMD.L;
-	                        path.addData(cmd, cpx, cpy);
-	                        break;
-	                    case 'C':
-	                        cmd = CMD.C;
-	                        path.addData(
-	                            cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]
-	                        );
-	                        cpx = p[off - 2];
-	                        cpy = p[off - 1];
-	                        break;
-	                    case 'c':
-	                        cmd = CMD.C;
-	                        path.addData(
-	                            cmd,
-	                            p[off++] + cpx, p[off++] + cpy,
-	                            p[off++] + cpx, p[off++] + cpy,
-	                            p[off++] + cpx, p[off++] + cpy
-	                        );
-	                        cpx += p[off - 2];
-	                        cpy += p[off - 1];
-	                        break;
-	                    case 'S':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.C) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cmd = CMD.C;
-	                        x1 = p[off++];
-	                        y1 = p[off++];
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
-	                        break;
-	                    case 's':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.C) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cmd = CMD.C;
-	                        x1 = cpx + p[off++];
-	                        y1 = cpy + p[off++];
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
-	                        break;
-	                    case 'Q':
-	                        x1 = p[off++];
-	                        y1 = p[off++];
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, x1, y1, cpx, cpy);
-	                        break;
-	                    case 'q':
-	                        x1 = p[off++] + cpx;
-	                        y1 = p[off++] + cpy;
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, x1, y1, cpx, cpy);
-	                        break;
-	                    case 'T':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.Q) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
-	                        break;
-	                    case 't':
-	                        ctlPtx = cpx;
-	                        ctlPty = cpy;
-	                        var len = path.len();
-	                        var pathData = path.data;
-	                        if (prevCmd === CMD.Q) {
-	                            ctlPtx += cpx - pathData[len - 4];
-	                            ctlPty += cpy - pathData[len - 3];
-	                        }
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.Q;
-	                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
-	                        break;
-	                    case 'A':
-	                        rx = p[off++];
-	                        ry = p[off++];
-	                        psi = p[off++];
-	                        fa = p[off++];
-	                        fs = p[off++];
-
-	                        x1 = cpx, y1 = cpy;
-	                        cpx = p[off++];
-	                        cpy = p[off++];
-	                        cmd = CMD.A;
-	                        processArc(
-	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
-	                        );
-	                        break;
-	                    case 'a':
-	                        rx = p[off++];
-	                        ry = p[off++];
-	                        psi = p[off++];
-	                        fa = p[off++];
-	                        fs = p[off++];
-
-	                        x1 = cpx, y1 = cpy;
-	                        cpx += p[off++];
-	                        cpy += p[off++];
-	                        cmd = CMD.A;
-	                        processArc(
-	                            x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path
-	                        );
-	                        break;
-	                }
-	            }
-
-	            if (c === 'z' || c === 'Z') {
-	                cmd = CMD.Z;
-	                path.addData(cmd);
-	            }
-
-	            prevCmd = cmd;
-	        }
-
-	        path.toStatic();
-
-	        return path;
-	    }
-
-	    // TODO Optimize double memory cost problem
-	    function createPathOptions(str, opts) {
-	        var pathProxy = createPathProxyFromString(str);
-	        opts = opts || {};
-	        opts.buildPath = function (path) {
-	            if (path.setData) {
-	                path.setData(pathProxy.data);
-	                // Svg and vml renderer don't have context
-	                var ctx = path.getContext();
-	                if (ctx) {
-	                    path.rebuildPath(ctx);
-	                }
-	            }
-	            else {
-	                var ctx = path;
-	                pathProxy.rebuildPath(ctx);
-	            }
-	        };
-
-	        opts.applyTransform = function (m) {
-	            transformPath(pathProxy, m);
-
-	            this.dirty(true);
-	        };
-
-	        return opts;
-	    }
-
-	    module.exports = {
-	        /**
-	         * Create a Path object from path string data
-	         * http://www.w3.org/TR/SVG/paths.html#PathData
-	         * @param  {Object} opts Other options
-	         */
-	        createFromString: function (str, opts) {
-	            return new Path(createPathOptions(str, opts));
-	        },
-
-	        /**
-	         * Create a Path class from path string data
-	         * @param  {string} str
-	         * @param  {Object} opts Other options
-	         */
-	        extendFromString: function (str, opts) {
-	            return Path.extend(createPathOptions(str, opts));
-	        },
-
-	        /**
-	         * Merge multiple paths
-	         */
-	        // TODO Apply transform
-	        // TODO stroke dash
-	        // TODO Optimize double memory cost problem
-	        mergePath: function (pathEls, opts) {
-	            var pathList = [];
-	            var len = pathEls.length;
-	            for (var i = 0; i < len; i++) {
-	                var pathEl = pathEls[i];
-	                if (!pathEl.path) {
-	                    pathEl.createPathProxy();
-	                }
-	                if (pathEl.__dirtyPath) {
-	                    pathEl.buildPath(pathEl.path, pathEl.shape, true);
-	                }
-	                pathList.push(pathEl.path);
-	            }
-
-	            var pathBundle = new Path(opts);
-	            // Need path proxy.
-	            pathBundle.createPathProxy();
-	            pathBundle.buildPath = function (path) {
-	                path.appendPath(pathList);
-	                // Svg and vml renderer don't have context
-	                var ctx = path.getContext();
-	                if (ctx) {
-	                    path.rebuildPath(ctx);
-	                }
-	            };
-
-	            return pathBundle;
-	        }
-	    };
-
-
-/***/ },
-/* 46 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Path element
-	 * @module zrender/graphic/Path
-	 */
-
-
-
-	    var Displayable = __webpack_require__(47);
-	    var zrUtil = __webpack_require__(4);
-	    var PathProxy = __webpack_require__(50);
-	    var pathContain = __webpack_require__(53);
-
-	    var Pattern = __webpack_require__(60);
-	    var getCanvasPattern = Pattern.prototype.getCanvasPattern;
-
-	    var abs = Math.abs;
-
-	    var pathProxyForDraw = new PathProxy(true);
-	    /**
-	     * @alias module:zrender/graphic/Path
-	     * @extends module:zrender/graphic/Displayable
-	     * @constructor
-	     * @param {Object} opts
-	     */
-	    function Path(opts) {
-	        Displayable.call(this, opts);
-
-	        /**
-	         * @type {module:zrender/core/PathProxy}
-	         * @readOnly
-	         */
-	        this.path = null;
-	    }
-
-	    Path.prototype = {
-
-	        constructor: Path,
-
-	        type: 'path',
-
-	        __dirtyPath: true,
-
-	        strokeContainThreshold: 5,
-
-	        brush: function (ctx, prevEl) {
-	            var style = this.style;
-	            var path = this.path || pathProxyForDraw;
-	            var hasStroke = style.hasStroke();
-	            var hasFill = style.hasFill();
-	            var fill = style.fill;
-	            var stroke = style.stroke;
-	            var hasFillGradient = hasFill && !!(fill.colorStops);
-	            var hasStrokeGradient = hasStroke && !!(stroke.colorStops);
-	            var hasFillPattern = hasFill && !!(fill.image);
-	            var hasStrokePattern = hasStroke && !!(stroke.image);
-
-	            style.bind(ctx, this, prevEl);
-	            this.setTransform(ctx);
-
-	            if (this.__dirty) {
-	                var rect;
-	                // Update gradient because bounding rect may changed
-	                if (hasFillGradient) {
-	                    rect = rect || this.getBoundingRect();
-	                    this._fillGradient = style.getGradient(ctx, fill, rect);
-	                }
-	                if (hasStrokeGradient) {
-	                    rect = rect || this.getBoundingRect();
-	                    this._strokeGradient = style.getGradient(ctx, stroke, rect);
-	                }
-	            }
-	            // Use the gradient or pattern
-	            if (hasFillGradient) {
-	                // PENDING If may have affect the state
-	                ctx.fillStyle = this._fillGradient;
-	            }
-	            else if (hasFillPattern) {
-	                ctx.fillStyle = getCanvasPattern.call(fill, ctx);
-	            }
-	            if (hasStrokeGradient) {
-	                ctx.strokeStyle = this._strokeGradient;
-	            }
-	            else if (hasStrokePattern) {
-	                ctx.strokeStyle = getCanvasPattern.call(stroke, ctx);
-	            }
-
-	            var lineDash = style.lineDash;
-	            var lineDashOffset = style.lineDashOffset;
-
-	            var ctxLineDash = !!ctx.setLineDash;
-
-	            // Update path sx, sy
-	            var scale = this.getGlobalScale();
-	            path.setScale(scale[0], scale[1]);
-
-	            // Proxy context
-	            // Rebuild path in following 2 cases
-	            // 1. Path is dirty
-	            // 2. Path needs javascript implemented lineDash stroking.
-	            //    In this case, lineDash information will not be saved in PathProxy
-	            if (this.__dirtyPath
-	                || (lineDash && !ctxLineDash && hasStroke)
-	            ) {
-	                path.beginPath(ctx);
-
-	                // Setting line dash before build path
-	                if (lineDash && !ctxLineDash) {
-	                    path.setLineDash(lineDash);
-	                    path.setLineDashOffset(lineDashOffset);
-	                }
-
-	                this.buildPath(path, this.shape, false);
-
-	                // Clear path dirty flag
-	                if (this.path) {
-	                    this.__dirtyPath = false;
-	                }
-	            }
-	            else {
-	                // Replay path building
-	                ctx.beginPath();
-	                this.path.rebuildPath(ctx);
-	            }
-
-	            hasFill && path.fill(ctx);
-
-	            if (lineDash && ctxLineDash) {
-	                ctx.setLineDash(lineDash);
-	                ctx.lineDashOffset = lineDashOffset;
-	            }
-
-	            hasStroke && path.stroke(ctx);
-
-	            if (lineDash && ctxLineDash) {
-	                // PENDING
-	                // Remove lineDash
-	                ctx.setLineDash([]);
-	            }
-
-
-	            this.restoreTransform(ctx);
-
-	            // Draw rect text
-	            if (style.text != null) {
-	                // var rect = this.getBoundingRect();
-	                this.drawRectText(ctx, this.getBoundingRect());
-	            }
-	        },
-
-	        // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath
-	        // Like in circle
-	        buildPath: function (ctx, shapeCfg, inBundle) {},
-
-	        createPathProxy: function () {
-	            this.path = new PathProxy();
-	        },
-
-	        getBoundingRect: function () {
-	            var rect = this._rect;
-	            var style = this.style;
-	            var needsUpdateRect = !rect;
-	            if (needsUpdateRect) {
-	                var path = this.path;
-	                if (!path) {
-	                    // Create path on demand.
-	                    path = this.path = new PathProxy();
-	                }
-	                if (this.__dirtyPath) {
-	                    path.beginPath();
-	                    this.buildPath(path, this.shape, false);
-	                }
-	                rect = path.getBoundingRect();
-	            }
-	            this._rect = rect;
-
-	            if (style.hasStroke()) {
-	                // Needs update rect with stroke lineWidth when
-	                // 1. Element changes scale or lineWidth
-	                // 2. Shape is changed
-	                var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone());
-	                if (this.__dirty || needsUpdateRect) {
-	                    rectWithStroke.copy(rect);
-	                    // FIXME Must after updateTransform
-	                    var w = style.lineWidth;
-	                    // PENDING, Min line width is needed when line is horizontal or vertical
-	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
-
-	                    // Only add extra hover lineWidth when there are no fill
-	                    if (!style.hasFill()) {
-	                        w = Math.max(w, this.strokeContainThreshold || 4);
-	                    }
-	                    // Consider line width
-	                    // Line scale can't be 0;
-	                    if (lineScale > 1e-10) {
-	                        rectWithStroke.width += w / lineScale;
-	                        rectWithStroke.height += w / lineScale;
-	                        rectWithStroke.x -= w / lineScale / 2;
-	                        rectWithStroke.y -= w / lineScale / 2;
-	                    }
-	                }
-
-	                // Return rect with stroke
-	                return rectWithStroke;
-	            }
-
-	            return rect;
-	        },
-
-	        contain: function (x, y) {
-	            var localPos = this.transformCoordToLocal(x, y);
-	            var rect = this.getBoundingRect();
-	            var style = this.style;
-	            x = localPos[0];
-	            y = localPos[1];
-
-	            if (rect.contain(x, y)) {
-	                var pathData = this.path.data;
-	                if (style.hasStroke()) {
-	                    var lineWidth = style.lineWidth;
-	                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
-	                    // Line scale can't be 0;
-	                    if (lineScale > 1e-10) {
-	                        // Only add extra hover lineWidth when there are no fill
-	                        if (!style.hasFill()) {
-	                            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);
-	                        }
-	                        if (pathContain.containStroke(
-	                            pathData, lineWidth / lineScale, x, y
-	                        )) {
-	                            return true;
-	                        }
-	                    }
-	                }
-	                if (style.hasFill()) {
-	                    return pathContain.contain(pathData, x, y);
-	                }
-	            }
-	            return false;
-	        },
-
-	        /**
-	         * @param  {boolean} dirtyPath
-	         */
-	        dirty: function (dirtyPath) {
-	            if (dirtyPath == null) {
-	                dirtyPath = true;
-	            }
-	            // Only mark dirty, not mark clean
-	            if (dirtyPath) {
-	                this.__dirtyPath = dirtyPath;
-	                this._rect = null;
-	            }
-
-	            this.__dirty = true;
-
-	            this.__zr && this.__zr.refresh();
-
-	            // Used as a clipping path
-	            if (this.__clipTarget) {
-	                this.__clipTarget.dirty();
-	            }
-	        },
-
-	        /**
-	         * Alias for animate('shape')
-	         * @param {boolean} loop
-	         */
-	        animateShape: function (loop) {
-	            return this.animate('shape', loop);
-	        },
-
-	        // Overwrite attrKV
-	        attrKV: function (key, value) {
-	            // FIXME
-	            if (key === 'shape') {
-	                this.setShape(value);
-	                this.__dirtyPath = true;
-	                this._rect = null;
-	            }
-	            else {
-	                Displayable.prototype.attrKV.call(this, key, value);
-	            }
-	        },
-
-	        /**
-	         * @param {Object|string} key
-	         * @param {*} value
-	         */
-	        setShape: function (key, value) {
-	            var shape = this.shape;
-	            // Path from string may not have shape
-	            if (shape) {
-	                if (zrUtil.isObject(key)) {
-	                    for (var name in key) {
-	                        if (key.hasOwnProperty(name)) {
-	                            shape[name] = key[name];
-	                        }
-	                    }
-	                }
-	                else {
-	                    shape[key] = value;
-	                }
-	                this.dirty(true);
-	            }
-	            return this;
-	        },
-
-	        getLineScale: function () {
-	            var m = this.transform;
-	            // Get the line scale.
-	            // Determinant of `m` means how much the area is enlarged by the
-	            // transformation. So its square root can be used as a scale factor
-	            // for width.
-	            return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10
-	                ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1]))
-	                : 1;
-	        }
-	    };
-
-	    /**
-	     * 扩展一个 Path element, 比如星形，圆等。
-	     * Extend a path element
-	     * @param {Object} props
-	     * @param {string} props.type Path type
-	     * @param {Function} props.init Initialize
-	     * @param {Function} props.buildPath Overwrite buildPath method
-	     * @param {Object} [props.style] Extended default style config
-	     * @param {Object} [props.shape] Extended default shape config
-	     */
-	    Path.extend = function (defaults) {
-	        var Sub = function (opts) {
-	            Path.call(this, opts);
-
-	            if (defaults.style) {
-	                // Extend default style
-	                this.style.extendFrom(defaults.style, false);
-	            }
-
-	            // Extend default shape
-	            var defaultShape = defaults.shape;
-	            if (defaultShape) {
-	                this.shape = this.shape || {};
-	                var thisShape = this.shape;
-	                for (var name in defaultShape) {
-	                    if (
-	                        ! thisShape.hasOwnProperty(name)
-	                        && defaultShape.hasOwnProperty(name)
-	                    ) {
-	                        thisShape[name] = defaultShape[name];
-	                    }
-	                }
-	            }
-
-	            defaults.init && defaults.init.call(this, opts);
-	        };
-
-	        zrUtil.inherits(Sub, Path);
-
-	        // FIXME 不能 extend position, rotation 等引用对象
-	        for (var name in defaults) {
-	            // Extending prototype values and methods
-	            if (name !== 'style' && name !== 'shape') {
-	                Sub.prototype[name] = defaults[name];
-	            }
-	        }
-
-	        return Sub;
-	    };
-
-	    zrUtil.inherits(Path, Displayable);
-
-	    module.exports = Path;
-
-
-/***/ },
-/* 47 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * 可绘制的图形基类
-	 * Base class of all displayable graphic objects
-	 * @module zrender/graphic/Displayable
-	 */
-
-
-
-	    var zrUtil = __webpack_require__(4);
-
-	    var Style = __webpack_require__(48);
-
-	    var Element = __webpack_require__(31);
-	    var RectText = __webpack_require__(49);
-	    // var Stateful = require('./mixin/Stateful');
-
-	    /**
-	     * @alias module:zrender/graphic/Displayable
-	     * @extends module:zrender/Element
-	     * @extends module:zrender/graphic/mixin/RectText
-	     */
-	    function Displayable(opts) {
-
-	        opts = opts || {};
-
-	        Element.call(this, opts);
-
-	        // Extend properties
-	        for (var name in opts) {
-	            if (
-	                opts.hasOwnProperty(name) &&
-	                name !== 'style'
-	            ) {
-	                this[name] = opts[name];
-	            }
-	        }
-
-	        /**
-	         * @type {module:zrender/graphic/Style}
-	         */
-	        this.style = new Style(opts.style);
-
-	        this._rect = null;
-	        // Shapes for cascade clipping.
-	        this.__clipPaths = [];
-
-	        // FIXME Stateful must be mixined after style is setted
-	        // Stateful.call(this, opts);
-	    }
-
-	    Displayable.prototype = {
-
-	        constructor: Displayable,
-
-	        type: 'displayable',
-
-	        /**
-	         * Displayable 是否为脏，Painter 中会根据该标记判断是否需要是否需要重新绘制
-	         * Dirty flag. From which painter will determine if this displayable object needs brush
-	         * @name module:zrender/graphic/Displayable#__dirty
-	         * @type {boolean}
-	         */
-	        __dirty: true,
-
-	        /**
-	         * 图形是否可见，为true时不绘制图形，但是仍能触发鼠标事件
-	         * If ignore drawing of the displayable object. Mouse event will still be triggered
-	         * @name module:/zrender/graphic/Displayable#invisible
-	         * @type {boolean}
-	         * @default false
-	         */
-	        invisible: false,
-
-	        /**
-	         * @name module:/zrender/graphic/Displayable#z
-	         * @type {number}
-	         * @default 0
-	         */
-	        z: 0,
-
-	        /**
-	         * @name module:/zrender/graphic/Displayable#z
-	         * @type {number}
-	         * @default 0
-	         */
-	        z2: 0,
-
-	        /**
-	         * z层level，决定绘画在哪层canvas中
-	         * @name module:/zrender/graphic/Displayable#zlevel
-	         * @type {number}
-	         * @default 0
-	         */
-	        zlevel: 0,
-
-	        /**
-	         * 是否可拖拽
-	         * @name module:/zrender/graphic/Displayable#draggable
-	         * @type {boolean}
-	         * @default false
-	         */
-	        draggable: false,
-
-	        /**
-	         * 是否正在拖拽
-	         * @name module:/zrender/graphic/Displayable#draggable
-	         * @type {boolean}
-	         * @default false
-	         */
-	        dragging: false,
-
-	        /**
-	         * 是否相应鼠标事件
-	         * @name module:/zrender/graphic/Displayable#silent
-	         * @type {boolean}
-	         * @default false
-	         */
-	        silent: false,
-
-	        /**
-	         * If enable culling
-	         * @type {boolean}
-	         * @default false
-	         */
-	        culling: false,
-
-	        /**
-	         * Mouse cursor when hovered
-	         * @name module:/zrender/graphic/Displayable#cursor
-	         * @type {string}
-	         */
-	        cursor: 'pointer',
-
-	        /**
-	         * If hover area is bounding rect
-	         * @name module:/zrender/graphic/Displayable#rectHover
-	         * @type {string}
-	         */
-	        rectHover: false,
-
-	        /**
-	         * Render the element progressively when the value >= 0,
-	         * usefull for large data.
-	         * @type {number}
-	         */
-	        progressive: -1,
-
-	        beforeBrush: function (ctx) {},
-
-	        afterBrush: function (ctx) {},
-
-	        /**
-	         * 图形绘制方法
-	         * @param {Canvas2DRenderingContext} ctx
-	         */
-	        // Interface
-	        brush: function (ctx, prevEl) {},
-
-	        /**
-	         * 获取最小包围盒
-	         * @return {module:zrender/core/BoundingRect}
-	         */
-	        // Interface
-	        getBoundingRect: function () {},
-
-	        /**
-	         * 判断坐标 x, y 是否在图形上
-	         * If displayable element contain coord x, y
-	         * @param  {number} x
-	         * @param  {number} y
-	         * @return {boolean}
-	         */
-	        contain: function (x, y) {
-	            return this.rectContain(x, y);
-	        },
-
-	        /**
-	         * @param  {Function} cb
-	         * @param  {}   context
-	         */
-	        traverse: function (cb, context) {
-	            cb.call(context, this);
-	        },
-
-	        /**
-	         * 判断坐标 x, y 是否在图形的包围盒上
-	         * If bounding rect of element contain coord x, y
-	         * @param  {number} x
-	         * @param  {number} y
-	         * @return {boolean}
-	         */
-	        rectContain: function (x, y) {
-	            var coord = this.transformCoordToLocal(x, y);
-	            var rect = this.getBoundingRect();
-	            return rect.contain(coord[0], coord[1]);
-	        },
-
-	        /**
-	         * 标记图形元素为脏，并且在下一帧重绘
-	         * Mark displayable element dirty and refresh next frame
-	         */
-	        dirty: function () {
-	            this.__dirty = true;
-
-	            this._rect = null;
-
-	            this.__zr && this.__zr.refresh();
-	        },
-
-	        /**
-	         * 图形是否会触发事件
-	         * If displayable object binded any event
-	         * @return {boolean}
-	         */
-	        // TODO, 通过 bind 绑定的事件
-	        // isSilent: function () {
-	        //     return !(
-	        //         this.hoverable || this.draggable
-	        //         || this.onmousemove || this.onmouseover || this.onmouseout
-	        //         || this.onmousedown || this.onmouseup || this.onclick
-	        //         || this.ondragenter || this.ondragover || this.ondragleave
-	        //         || this.ondrop
-	        //     );
-	        // },
-	        /**
-	         * Alias for animate('style')
-	         * @param {boolean} loop
-	         */
-	        animateStyle: function (loop) {
-	            return this.animate('style', loop);
-	        },
-
-	        attrKV: function (key, value) {
-	            if (key !== 'style') {
-	                Element.prototype.attrKV.call(this, key, value);
-	            }
-	            else {
-	                this.style.set(value);
-	            }
-	        },
-
-	        /**
-	         * @param {Object|string} key
-	         * @param {*} value
-	         */
-	        setStyle: function (key, value) {
-	            this.style.set(key, value);
-	            this.dirty(false);
-	            return this;
-	        },
-
-	        /**
-	         * Use given style object
-	         * @param  {Object} obj
-	         */
-	        useStyle: function (obj) {
-	            this.style = new Style(obj);
-	            this.dirty(false);
-	            return this;
-	        }
-	    };
-
-	    zrUtil.inherits(Displayable, Element);
-
-	    zrUtil.mixin(Displayable, RectText);
-	    // zrUtil.mixin(Displayable, Stateful);
-
-	    module.exports = Displayable;
-
-
-/***/ },
-/* 48 */
-/***/ function(module, exports) {
-
-	/**
-	 * @module zrender/graphic/Style
-	 */
-
-
-	    var STYLE_COMMON_PROPS = [
-	        ['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'],
-	        ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]
-	    ];
-
-	    // var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);
-	    // var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);
-
-	    var Style = function (opts) {
-	        this.extendFrom(opts);
-	    };
-
-	    function createLinearGradient(ctx, obj, rect) {
-	        var x = obj.x == null ? 0 : obj.x;
-	        var x2 = obj.x2 == null ? 1 : obj.x2;
-	        var y = obj.y == null ? 0 : obj.y;
-	        var y2 = obj.y2 == null ? 0 : obj.y2;
-
-	        if (!obj.global) {
-	            x = x * rect.width + rect.x;
-	            x2 = x2 * rect.width + rect.x;
-	            y = y * rect.height + rect.y;
-	            y2 = y2 * rect.height + rect.y;
-	        }
-
-	        var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);
-
-	        return canvasGradient;
-	    }
-
-	    function createRadialGradient(ctx, obj, rect) {
-	        var width = rect.width;
-	        var height = rect.height;
-	        var min = Math.min(width, height);
-
-	        var x = obj.x == null ? 0.5 : obj.x;
-	        var y = obj.y == null ? 0.5 : obj.y;
-	        var r = obj.r == null ? 0.5 : obj.r;
-	        if (!obj.global) {
-	            x = x * width + rect.x;
-	            y = y * height + rect.y;
-	            r = r * min;
-	        }
-
-	        var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);
-
-	        return canvasGradient;
-	    }
-
-
-	    Style.prototype = {
-
-	        constructor: Style,
-
-	        /**
-	         * @type {string}
-	         */
-	        fill: '#000000',
-
-	        /**
-	         * @type {string}
-	         */
-	        stroke: null,
-
-	        /**
-	         * @type {number}
-	         */
-	        opacity: 1,
-
-	        /**
-	         * @type {Array.<number>}
-	         */
-	        lineDash: null,
-
-	        /**
-	         * @type {number}
-	         */
-	        lineDashOffset: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        shadowBlur: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        shadowOffsetX: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        shadowOffsetY: 0,
-
-	        /**
-	         * @type {number}
-	         */
-	        lineWidth: 1,
-
-	        /**
-	         * If stroke ignore scale
-	         * @type {Boolean}
-	         */
-	        strokeNoScale: false,
-
-	        // Bounding rect text configuration
-	        // Not affected by element transform
-	        /**
-	         * @type {string}
-	         */
-	        text: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textFill: '#000',
-
-	        /**
-	         * @type {string}
-	         */
-	        textStroke: null,
-
-	        /**
-	         * 'inside', 'left', 'right', 'top', 'bottom'
-	         * [x, y]
-	         * @type {string|Array.<number>}
-	         * @default 'inside'
-	         */
-	        textPosition: 'inside',
-
-	        /**
-	         * [x, y]
-	         * @type {Array.<number>}
-	         */
-	        textOffset: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textBaseline: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textAlign: null,
-
-	        /**
-	         * @type {string}
-	         */
-	        textVerticalAlign: null,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textDistance: 5,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textShadowBlur: 0,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textShadowOffsetX: 0,
-
-	        /**
-	         * Only useful in Path and Image element
-	         * @type {number}
-	         */
-	        textShadowOffsetY: 0,
-
-	        /**
-	         * If transform text
-	         * Only useful in Path and Image element
-	         * @type {boolean}
-	         */
-	        textTransform: false,
-
-	        /**
-	         * Text rotate around position of Path or Image
-	         * Only useful in Path and Image element and textTransform is false.
-	         */
-	        textRotation: 0,
-
-	        /**
-	         * @type {string}
-	         * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
-	         */
-	        blend: null,
-
-	        /**
-	         * @param {CanvasRenderingContext2D} ctx
-	         */
-	        bind: function (ctx, el, prevEl) {
-	            var style = this;
-	            var prevStyle = prevEl && prevEl.style;
-	            var firstDraw = !prevStyle;
-
-	            for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
-	                var prop = STYLE_COMMON_PROPS[i];
-	                var styleName = prop[0];
-
-	                if (firstDraw || style[styleName] !== prevStyle[styleName]) {
-	                    // FIXME Invalid property value will cause style leak from previous element.
-	                    ctx[styleName] = style[styleName] || prop[1];
-	                }
-	            }
-
-	            if ((firstDraw || style.fill !== prevStyle.fill)) {
-	                ctx.fillStyle = style.fill;
-	            }
-	            if ((firstDraw || style.stroke !== prevStyle.stroke)) {
-	                ctx.strokeStyle = style.stroke;
-	            }
-	            if ((firstDraw || style.opacity !== prevStyle.opacity)) {
-	                ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;
-	            }
-
-	            if ((firstDraw || style.blend !== prevStyle.blend)) {
-	                ctx.globalCompositeOperation = style.blend || 'source-over';
-	            }
-	            if (this.hasStroke()) {
-	                var lineWidth = style.lineWidth;
-	                ctx.lineWidth = lineWidth / (
-	                    (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1
-	                );
-	            }
-	        },
-
-	        hasFill: function () {
-	            var fill = this.fill;
-	            return fill != null && fill !== 'none';
-	        },
-
-	        hasStroke: function () {
-	            var stroke = this.stroke;
-	            return stroke != null && stroke !== 'none' && this.lineWidth > 0;
-	        },
-
-	        /**
-	         * Extend from other style
-	         * @param {zrender/graphic/Style} otherStyle
-	         * @param {boolean} overwrite
-	         */
-	        extendFrom: function (otherStyle, overwrite) {
-	            if (otherStyle) {
-	                var target = this;
-	                for (var name in otherStyle) {
-	                    if (otherStyle.hasOwnProperty(name)
-	                        && (overwrite || ! target.hasOwnProperty(name))
-	                    ) {
-	                        target[name] = otherStyle[name];
-	                    }
-	                }
-	            }
-	        },
-
-	        /**
-	         * Batch setting style with a given object
-	         * @param {Object|string} obj
-	         * @param {*} [obj]
-	         */
-	        set: function (obj, value) {
-	            if (typeof obj === 'string') {
-	                this[obj] = value;
-	            }
-	            else {
-	                this.extendFrom(obj, true);
-	            }
-	        },
-
-	        /**
-	         * Clone
-	         * @return {zrender/graphic/Style} [description]
-	         */
-	        clone: function () {
-	            var newStyle = new this.constructor();
-	            newStyle.extendFrom(this, true);
-	            return newStyle;
-	        },
-
-	        getGradient: function (ctx, obj, rect) {
-	            var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;
-	            var canvasGradient = method(ctx, obj, rect);
-	            var colorStops = obj.colorStops;
-	            for (var i = 0; i < colorStops.length; i++) {
-	                canvasGradient.addColorStop(
-	                    colorStops[i].offset, colorStops[i].color
-	                );
-	            }
-	            return canvasGradient;
-	        }
-	    };
-
-	    var styleProto = Style.prototype;
-	    for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
-	        var prop = STYLE_COMMON_PROPS[i];
-	        if (!(prop[0] in styleProto)) {
-	            styleProto[prop[0]] = prop[1];
-	        }
-	    }
-
-	    // Provide for others
-	    Style.getGradient = styleProto.getGradient;
-
-	    module.exports = Style;
-
-
-/***/ },
-/* 49 */
+/* 35 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -13901,7 +11630,7 @@
 
 
 /***/ },
-/* 50 */
+/* 36 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -13916,11 +11645,11 @@
 	 // TODO getTotalLength, getPointAtLength
 
 
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 	    var vec2 = __webpack_require__(10);
-	    var bbox = __webpack_require__(52);
+	    var bbox = __webpack_require__(38);
 	    var BoundingRect = __webpack_require__(9);
-	    var dpr = __webpack_require__(42).devicePixelRatio;
+	    var dpr = __webpack_require__(34).devicePixelRatio;
 
 	    var CMD = {
 	        M: 1,
@@ -14695,7 +12424,7 @@
 
 
 /***/ },
-/* 51 */
+/* 37 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -15241,7 +12970,7 @@
 
 
 /***/ },
-/* 52 */
+/* 38 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -15250,7 +12979,7 @@
 
 
 	    var vec2 = __webpack_require__(10);
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 
 	    var bbox = {};
 	    var mathMin = Math.min;
@@ -15477,21 +13206,21 @@
 
 
 /***/ },
-/* 53 */
+/* 39 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var CMD = __webpack_require__(50).CMD;
-	    var line = __webpack_require__(54);
-	    var cubic = __webpack_require__(55);
-	    var quadratic = __webpack_require__(56);
-	    var arc = __webpack_require__(57);
-	    var normalizeRadian = __webpack_require__(58).normalizeRadian;
-	    var curve = __webpack_require__(51);
+	    var CMD = __webpack_require__(36).CMD;
+	    var line = __webpack_require__(40);
+	    var cubic = __webpack_require__(41);
+	    var quadratic = __webpack_require__(42);
+	    var arc = __webpack_require__(43);
+	    var normalizeRadian = __webpack_require__(44).normalizeRadian;
+	    var curve = __webpack_require__(37);
 
-	    var windingLine = __webpack_require__(59);
+	    var windingLine = __webpack_require__(45);
 
 	    var containStroke = line.containStroke;
 
@@ -15883,7 +13612,7 @@
 
 
 /***/ },
-/* 54 */
+/* 40 */
 /***/ function(module, exports) {
 
 	
@@ -15931,12 +13660,12 @@
 
 
 /***/ },
-/* 55 */
+/* 41 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 
 	    module.exports = {
 	        /**
@@ -15978,12 +13707,12 @@
 
 
 /***/ },
-/* 56 */
+/* 42 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var curve = __webpack_require__(51);
+	    var curve = __webpack_require__(37);
 
 	    module.exports = {
 	        /**
@@ -16023,12 +13752,12 @@
 
 
 /***/ },
-/* 57 */
+/* 43 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var normalizeRadian = __webpack_require__(58).normalizeRadian;
+	    var normalizeRadian = __webpack_require__(44).normalizeRadian;
 	    var PI2 = Math.PI * 2;
 
 	    module.exports = {
@@ -16089,7 +13818,7 @@
 
 
 /***/ },
-/* 58 */
+/* 44 */
 /***/ function(module, exports) {
 
 	
@@ -16107,7 +13836,7 @@
 
 
 /***/ },
-/* 59 */
+/* 45 */
 /***/ function(module, exports) {
 
 	
@@ -16134,7 +13863,7 @@
 
 
 /***/ },
-/* 60 */
+/* 46 */
 /***/ function(module, exports) {
 
 	
@@ -16158,12 +13887,12 @@
 
 
 /***/ },
-/* 61 */
+/* 47 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var CMD = __webpack_require__(50).CMD;
+	    var CMD = __webpack_require__(36).CMD;
 	    var vec2 = __webpack_require__(10);
 	    var v2ApplyTransform = vec2.applyTransform;
 
@@ -16261,7 +13990,329 @@
 
 
 /***/ },
-/* 62 */
+/* 48 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Group是一个容器，可以插入子节点，Group的变换也会被应用到子节点上
+	 * @module zrender/graphic/Group
+	 * @example
+	 *     var Group = require('zrender/lib/container/Group');
+	 *     var Circle = require('zrender/lib/graphic/shape/Circle');
+	 *     var g = new Group();
+	 *     g.position[0] = 100;
+	 *     g.position[1] = 100;
+	 *     g.add(new Circle({
+	 *         style: {
+	 *             x: 100,
+	 *             y: 100,
+	 *             r: 20,
+	 *         }
+	 *     }));
+	 *     zr.add(g);
+	 */
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var Element = __webpack_require__(23);
+	    var BoundingRect = __webpack_require__(9);
+
+	    /**
+	     * @alias module:zrender/graphic/Group
+	     * @constructor
+	     * @extends module:zrender/mixin/Transformable
+	     * @extends module:zrender/mixin/Eventful
+	     */
+	    var Group = function (opts) {
+
+	        opts = opts || {};
+
+	        Element.call(this, opts);
+
+	        for (var key in opts) {
+	            if (opts.hasOwnProperty(key)) {
+	                this[key] = opts[key];
+	            }
+	        }
+
+	        this._children = [];
+
+	        this.__storage = null;
+
+	        this.__dirty = true;
+	    };
+
+	    Group.prototype = {
+
+	        constructor: Group,
+
+	        isGroup: true,
+
+	        /**
+	         * @type {string}
+	         */
+	        type: 'group',
+
+	        /**
+	         * 所有子孙元素是否响应鼠标事件
+	         * @name module:/zrender/container/Group#silent
+	         * @type {boolean}
+	         * @default false
+	         */
+	        silent: false,
+
+	        /**
+	         * @return {Array.<module:zrender/Element>}
+	         */
+	        children: function () {
+	            return this._children.slice();
+	        },
+
+	        /**
+	         * 获取指定 index 的儿子节点
+	         * @param  {number} idx
+	         * @return {module:zrender/Element}
+	         */
+	        childAt: function (idx) {
+	            return this._children[idx];
+	        },
+
+	        /**
+	         * 获取指定名字的儿子节点
+	         * @param  {string} name
+	         * @return {module:zrender/Element}
+	         */
+	        childOfName: function (name) {
+	            var children = this._children;
+	            for (var i = 0; i < children.length; i++) {
+	                if (children[i].name === name) {
+	                    return children[i];
+	                }
+	             }
+	        },
+
+	        /**
+	         * @return {number}
+	         */
+	        childCount: function () {
+	            return this._children.length;
+	        },
+
+	        /**
+	         * 添加子节点到最后
+	         * @param {module:zrender/Element} child
+	         */
+	        add: function (child) {
+	            if (child && child !== this && child.parent !== this) {
+
+	                this._children.push(child);
+
+	                this._doAdd(child);
+	            }
+
+	            return this;
+	        },
+
+	        /**
+	         * 添加子节点在 nextSibling 之前
+	         * @param {module:zrender/Element} child
+	         * @param {module:zrender/Element} nextSibling
+	         */
+	        addBefore: function (child, nextSibling) {
+	            if (child && child !== this && child.parent !== this
+	                && nextSibling && nextSibling.parent === this) {
+
+	                var children = this._children;
+	                var idx = children.indexOf(nextSibling);
+
+	                if (idx >= 0) {
+	                    children.splice(idx, 0, child);
+	                    this._doAdd(child);
+	                }
+	            }
+
+	            return this;
+	        },
+
+	        _doAdd: function (child) {
+	            if (child.parent) {
+	                child.parent.remove(child);
+	            }
+
+	            child.parent = this;
+
+	            var storage = this.__storage;
+	            var zr = this.__zr;
+	            if (storage && storage !== child.__storage) {
+
+	                storage.addToStorage(child);
+
+	                if (child instanceof Group) {
+	                    child.addChildrenToStorage(storage);
+	                }
+	            }
+
+	            zr && zr.refresh();
+	        },
+
+	        /**
+	         * 移除子节点
+	         * @param {module:zrender/Element} child
+	         */
+	        remove: function (child) {
+	            var zr = this.__zr;
+	            var storage = this.__storage;
+	            var children = this._children;
+
+	            var idx = zrUtil.indexOf(children, child);
+	            if (idx < 0) {
+	                return this;
+	            }
+	            children.splice(idx, 1);
+
+	            child.parent = null;
+
+	            if (storage) {
+
+	                storage.delFromStorage(child);
+
+	                if (child instanceof Group) {
+	                    child.delChildrenFromStorage(storage);
+	                }
+	            }
+
+	            zr && zr.refresh();
+
+	            return this;
+	        },
+
+	        /**
+	         * 移除所有子节点
+	         */
+	        removeAll: function () {
+	            var children = this._children;
+	            var storage = this.__storage;
+	            var child;
+	            var i;
+	            for (i = 0; i < children.length; i++) {
+	                child = children[i];
+	                if (storage) {
+	                    storage.delFromStorage(child);
+	                    if (child instanceof Group) {
+	                        child.delChildrenFromStorage(storage);
+	                    }
+	                }
+	                child.parent = null;
+	            }
+	            children.length = 0;
+
+	            return this;
+	        },
+
+	        /**
+	         * 遍历所有子节点
+	         * @param  {Function} cb
+	         * @param  {}   context
+	         */
+	        eachChild: function (cb, context) {
+	            var children = this._children;
+	            for (var i = 0; i < children.length; i++) {
+	                var child = children[i];
+	                cb.call(context, child, i);
+	            }
+	            return this;
+	        },
+
+	        /**
+	         * 深度优先遍历所有子孙节点
+	         * @param  {Function} cb
+	         * @param  {}   context
+	         */
+	        traverse: function (cb, context) {
+	            for (var i = 0; i < this._children.length; i++) {
+	                var child = this._children[i];
+	                cb.call(context, child);
+
+	                if (child.type === 'group') {
+	                    child.traverse(cb, context);
+	                }
+	            }
+	            return this;
+	        },
+
+	        addChildrenToStorage: function (storage) {
+	            for (var i = 0; i < this._children.length; i++) {
+	                var child = this._children[i];
+	                storage.addToStorage(child);
+	                if (child instanceof Group) {
+	                    child.addChildrenToStorage(storage);
+	                }
+	            }
+	        },
+
+	        delChildrenFromStorage: function (storage) {
+	            for (var i = 0; i < this._children.length; i++) {
+	                var child = this._children[i];
+	                storage.delFromStorage(child);
+	                if (child instanceof Group) {
+	                    child.delChildrenFromStorage(storage);
+	                }
+	            }
+	        },
+
+	        dirty: function () {
+	            this.__dirty = true;
+	            this.__zr && this.__zr.refresh();
+	            return this;
+	        },
+
+	        /**
+	         * @return {module:zrender/core/BoundingRect}
+	         */
+	        getBoundingRect: function (includeChildren) {
+	            // TODO Caching
+	            var rect = null;
+	            var tmpRect = new BoundingRect(0, 0, 0, 0);
+	            var children = includeChildren || this._children;
+	            var tmpMat = [];
+
+	            for (var i = 0; i < children.length; i++) {
+	                var child = children[i];
+	                if (child.ignore || child.invisible) {
+	                    continue;
+	                }
+
+	                var childRect = child.getBoundingRect();
+	                var transform = child.getLocalTransform(tmpMat);
+	                // TODO
+	                // The boundingRect cacluated by transforming original
+	                // rect may be bigger than the actual bundingRect when rotation
+	                // is used. (Consider a circle rotated aginst its center, where
+	                // the actual boundingRect should be the same as that not be
+	                // rotated.) But we can not find better approach to calculate
+	                // actual boundingRect yet, considering performance.
+	                if (transform) {
+	                    tmpRect.copy(childRect);
+	                    tmpRect.applyTransform(transform);
+	                    rect = rect || tmpRect.clone();
+	                    rect.union(tmpRect);
+	                }
+	                else {
+	                    rect = rect || childRect.clone();
+	                    rect.union(childRect);
+	                }
+	            }
+	            return rect || tmpRect;
+	        }
+	    };
+
+	    zrUtil.inherits(Group, Element);
+
+	    module.exports = Group;
+
+
+/***/ },
+/* 49 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16271,11 +14322,11 @@
 
 
 
-	    var Displayable = __webpack_require__(47);
+	    var Displayable = __webpack_require__(21);
 	    var BoundingRect = __webpack_require__(9);
 	    var zrUtil = __webpack_require__(4);
 
-	    var LRU = __webpack_require__(40);
+	    var LRU = __webpack_require__(32);
 	    var globalImageCache = new LRU(50);
 	    /**
 	     * @alias zrender/graphic/Image
@@ -16425,7 +14476,7 @@
 
 
 /***/ },
-/* 63 */
+/* 50 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16439,7 +14490,7 @@
 
 
 
-	    var Displayable = __webpack_require__(47);
+	    var Displayable = __webpack_require__(21);
 	    var zrUtil = __webpack_require__(4);
 	    var textContain = __webpack_require__(8);
 
@@ -16566,7 +14617,7 @@
 
 
 /***/ },
-/* 64 */
+/* 51 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -16577,7 +14628,7 @@
 
 
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'circle',
 
@@ -16608,7 +14659,7 @@
 
 
 /***/ },
-/* 65 */
+/* 52 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16619,7 +14670,7 @@
 
 
 	    var env = __webpack_require__(2);
-	    var Path = __webpack_require__(46);
+	    var Path = __webpack_require__(20);
 
 	    var shadowTemp = [
 	        ['shadowBlur', 0],
@@ -16727,7 +14778,7 @@
 
 
 /***/ },
-/* 66 */
+/* 53 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16736,7 +14787,7 @@
 	 */
 
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'ring',
 
@@ -16761,7 +14812,7 @@
 
 
 /***/ },
-/* 67 */
+/* 54 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16770,9 +14821,9 @@
 	 */
 
 
-	    var polyHelper = __webpack_require__(68);
+	    var polyHelper = __webpack_require__(55);
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 	        
 	        type: 'polygon',
 
@@ -16791,13 +14842,13 @@
 
 
 /***/ },
-/* 68 */
+/* 55 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
-	    var smoothSpline = __webpack_require__(69);
-	    var smoothBezier = __webpack_require__(70);
+	    var smoothSpline = __webpack_require__(56);
+	    var smoothBezier = __webpack_require__(57);
 
 	    module.exports = {
 	        buildPath: function (ctx, shape, closePath) {
@@ -16838,7 +14889,7 @@
 
 
 /***/ },
-/* 69 */
+/* 56 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -16914,7 +14965,7 @@
 
 
 /***/ },
-/* 70 */
+/* 57 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17021,7 +15072,7 @@
 
 
 /***/ },
-/* 71 */
+/* 58 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17029,9 +15080,9 @@
 	 */
 
 
-	    var polyHelper = __webpack_require__(68);
+	    var polyHelper = __webpack_require__(55);
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 	        
 	        type: 'polyline',
 
@@ -17056,7 +15107,7 @@
 
 
 /***/ },
-/* 72 */
+/* 59 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17065,9 +15116,9 @@
 	 */
 
 
-	    var roundRectHelper = __webpack_require__(73);
+	    var roundRectHelper = __webpack_require__(60);
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'rect',
 
@@ -17104,7 +15155,7 @@
 
 
 /***/ },
-/* 73 */
+/* 60 */
 /***/ function(module, exports) {
 
 	
@@ -17199,7 +15250,7 @@
 
 
 /***/ },
-/* 74 */
+/* 61 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17207,7 +15258,7 @@
 	 * @module zrender/graphic/shape/Line
 	 */
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'line',
 
@@ -17264,7 +15315,7 @@
 
 
 /***/ },
-/* 75 */
+/* 62 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -17274,7 +15325,7 @@
 	 */
 
 
-	    var curveTool = __webpack_require__(51);
+	    var curveTool = __webpack_require__(37);
 	    var vec2 = __webpack_require__(10);
 	    var quadraticSubdivide = curveTool.quadraticSubdivide;
 	    var cubicSubdivide = curveTool.cubicSubdivide;
@@ -17301,7 +15352,7 @@
 	            ];
 	        }
 	    }
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'bezier-curve',
 
@@ -17405,7 +15456,7 @@
 
 
 /***/ },
-/* 76 */
+/* 63 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -17414,7 +15465,7 @@
 	 */
 	 
 
-	    module.exports = __webpack_require__(46).extend({
+	    module.exports = __webpack_require__(20).extend({
 
 	        type: 'arc',
 
@@ -17459,13 +15510,13 @@
 
 
 /***/ },
-/* 77 */
+/* 64 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// CompoundPath to improve performance
 
 
-	    var Path = __webpack_require__(46);
+	    var Path = __webpack_require__(20);
 
 	    module.exports = Path.extend({
 
@@ -17522,7 +15573,7 @@
 
 
 /***/ },
-/* 78 */
+/* 65 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -17530,7 +15581,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 
 	    /**
 	     * x, y, x2, y2 are all percent from 0 to 1
@@ -17574,7 +15625,7 @@
 
 
 /***/ },
-/* 79 */
+/* 66 */
 /***/ function(module, exports) {
 
 	
@@ -17605,7 +15656,7 @@
 
 
 /***/ },
-/* 80 */
+/* 67 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -17613,7 +15664,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 
 	    /**
 	     * x, y, r are all percent from 0 to 1
@@ -17654,6 +15705,2095 @@
 
 
 /***/ },
+/* 68 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+	    var getItemStyle = __webpack_require__(15)(
+	        [
+	            ['fill', 'color'],
+	            ['stroke', 'borderColor'],
+	            ['lineWidth', 'borderWidth'],
+	            ['opacity'],
+	            ['shadowBlur'],
+	            ['shadowOffsetX'],
+	            ['shadowOffsetY'],
+	            ['shadowColor'],
+	            ['textPosition'],
+	            ['textAlign']
+	        ]
+	    );
+	    module.exports = {
+	        getItemStyle: function (excludes, includes) {
+	            var style = getItemStyle.call(this, excludes, includes);
+	            var lineDash = this.getBorderLineDash();
+	            lineDash && (style.lineDash = lineDash);
+	            return style;
+	        },
+
+	        getBorderLineDash: function () {
+	            var lineType = this.get('borderType');
+	            return (lineType === 'solid' || lineType == null) ? null
+	                : (lineType === 'dashed' ? [5, 5] : [1, 1]);
+	        }
+	    };
+
+
+/***/ },
+/* 69 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Component model
+	 *
+	 * @module echarts/model/Component
+	 */
+
+
+	    var Model = __webpack_require__(12);
+	    var zrUtil = __webpack_require__(4);
+	    var arrayPush = Array.prototype.push;
+	    var componentUtil = __webpack_require__(70);
+	    var clazzUtil = __webpack_require__(13);
+	    var layout = __webpack_require__(71);
+
+	    /**
+	     * @alias module:echarts/model/Component
+	     * @constructor
+	     * @param {Object} option
+	     * @param {module:echarts/model/Model} parentModel
+	     * @param {module:echarts/model/Model} ecModel
+	     */
+	    var ComponentModel = Model.extend({
+
+	        type: 'component',
+
+	        /**
+	         * @readOnly
+	         * @type {string}
+	         */
+	        id: '',
+
+	        /**
+	         * @readOnly
+	         */
+	        name: '',
+
+	        /**
+	         * @readOnly
+	         * @type {string}
+	         */
+	        mainType: '',
+
+	        /**
+	         * @readOnly
+	         * @type {string}
+	         */
+	        subType: '',
+
+	        /**
+	         * @readOnly
+	         * @type {number}
+	         */
+	        componentIndex: 0,
+
+	        /**
+	         * @type {Object}
+	         * @protected
+	         */
+	        defaultOption: null,
+
+	        /**
+	         * @type {module:echarts/model/Global}
+	         * @readOnly
+	         */
+	        ecModel: null,
+
+	        /**
+	         * key: componentType
+	         * value:  Component model list, can not be null.
+	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
+	         * @readOnly
+	         */
+	        dependentModels: [],
+
+	        /**
+	         * @type {string}
+	         * @readOnly
+	         */
+	        uid: null,
+
+	        /**
+	         * Support merge layout params.
+	         * Only support 'box' now (left/right/top/bottom/width/height).
+	         * @type {string|Object} Object can be {ignoreSize: true}
+	         * @readOnly
+	         */
+	        layoutMode: null,
+
+	        $constructor: function (option, parentModel, ecModel, extraOpt) {
+	            Model.call(this, option, parentModel, ecModel, extraOpt);
+
+	            this.uid = componentUtil.getUID('componentModel');
+	        },
+
+
+	        init: function (option, parentModel, ecModel, extraOpt) {
+	            this.mergeDefaultAndTheme(option, ecModel);
+	        },
+
+	        mergeDefaultAndTheme: function (option, ecModel) {
+	            var layoutMode = this.layoutMode;
+	            var inputPositionParams = layoutMode
+	                ? layout.getLayoutParams(option) : {};
+
+	            var themeModel = ecModel.getTheme();
+	            zrUtil.merge(option, themeModel.get(this.mainType));
+	            zrUtil.merge(option, this.getDefaultOption());
+
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
+	            }
+	        },
+
+	        mergeOption: function (option, extraOpt) {
+	            zrUtil.merge(this.option, option, true);
+
+	            var layoutMode = this.layoutMode;
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(this.option, option, layoutMode);
+	            }
+	        },
+
+	        // Hooker after init or mergeOption
+	        optionUpdated: function (newCptOption, isInit) {},
+
+	        getDefaultOption: function () {
+	            if (!clazzUtil.hasOwn(this, '__defaultOption')) {
+	                var optList = [];
+	                var Class = this.constructor;
+	                while (Class) {
+	                    var opt = Class.prototype.defaultOption;
+	                    opt && optList.push(opt);
+	                    Class = Class.superClass;
+	                }
+
+	                var defaultOption = {};
+	                for (var i = optList.length - 1; i >= 0; i--) {
+	                    defaultOption = zrUtil.merge(defaultOption, optList[i], true);
+	                }
+	                clazzUtil.set(this, '__defaultOption', defaultOption);
+	            }
+	            return clazzUtil.get(this, '__defaultOption');
+	        },
+
+	        getReferringComponents: function (mainType) {
+	            return this.ecModel.queryComponents({
+	                mainType: mainType,
+	                index: this.get(mainType + 'Index', true),
+	                id: this.get(mainType + 'Id', true)
+	            });
+	        }
+
+	    });
+
+	    // Reset ComponentModel.extend, add preConstruct.
+	    // clazzUtil.enableClassExtend(
+	    //     ComponentModel,
+	    //     function (option, parentModel, ecModel, extraOpt) {
+	    //         // Set dependentModels, componentIndex, name, id, mainType, subType.
+	    //         zrUtil.extend(this, extraOpt);
+
+	    //         this.uid = componentUtil.getUID('componentModel');
+
+	    //         // this.setReadOnly([
+	    //         //     'type', 'id', 'uid', 'name', 'mainType', 'subType',
+	    //         //     'dependentModels', 'componentIndex'
+	    //         // ]);
+	    //     }
+	    // );
+
+	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+	    clazzUtil.enableClassManagement(
+	        ComponentModel, {registerWhenExtend: true}
+	    );
+	    componentUtil.enableSubTypeDefaulter(ComponentModel);
+
+	    // Add capability of ComponentModel.topologicalTravel.
+	    componentUtil.enableTopologicalTravel(ComponentModel, getDependencies);
+
+	    function getDependencies(componentType) {
+	        var deps = [];
+	        zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
+	            arrayPush.apply(deps, Clazz.prototype.dependencies || []);
+	        });
+	        // Ensure main type
+	        return zrUtil.map(deps, function (type) {
+	            return clazzUtil.parseClassType(type).main;
+	        });
+	    }
+
+	    zrUtil.mixin(ComponentModel, __webpack_require__(72));
+
+	    module.exports = ComponentModel;
+
+
+/***/ },
+/* 70 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var zrUtil = __webpack_require__(4);
+	    var clazz = __webpack_require__(13);
+
+	    var parseClassType = clazz.parseClassType;
+
+	    var base = 0;
+
+	    var componentUtil = {};
+
+	    var DELIMITER = '_';
+
+	    /**
+	     * @public
+	     * @param {string} type
+	     * @return {string}
+	     */
+	    componentUtil.getUID = function (type) {
+	        // Considering the case of crossing js context,
+	        // use Math.random to make id as unique as possible.
+	        return [(type || ''), base++, Math.random()].join(DELIMITER);
+	    };
+
+	    /**
+	     * @inner
+	     */
+	    componentUtil.enableSubTypeDefaulter = function (entity) {
+
+	        var subTypeDefaulters = {};
+
+	        entity.registerSubTypeDefaulter = function (componentType, defaulter) {
+	            componentType = parseClassType(componentType);
+	            subTypeDefaulters[componentType.main] = defaulter;
+	        };
+
+	        entity.determineSubType = function (componentType, option) {
+	            var type = option.type;
+	            if (!type) {
+	                var componentTypeMain = parseClassType(componentType).main;
+	                if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {
+	                    type = subTypeDefaulters[componentTypeMain](option);
+	                }
+	            }
+	            return type;
+	        };
+
+	        return entity;
+	    };
+
+	    /**
+	     * Topological travel on Activity Network (Activity On Vertices).
+	     * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
+	     *
+	     * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
+	     *
+	     * If there is circle dependencey, Error will be thrown.
+	     *
+	     */
+	    componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) {
+
+	        /**
+	         * @public
+	         * @param {Array.<string>} targetNameList Target Component type list.
+	         *                                           Can be ['aa', 'bb', 'aa.xx']
+	         * @param {Array.<string>} fullNameList By which we can build dependency graph.
+	         * @param {Function} callback Params: componentType, dependencies.
+	         * @param {Object} context Scope of callback.
+	         */
+	        entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {
+	            if (!targetNameList.length) {
+	                return;
+	            }
+
+	            var result = makeDepndencyGraph(fullNameList);
+	            var graph = result.graph;
+	            var stack = result.noEntryList;
+
+	            var targetNameSet = {};
+	            zrUtil.each(targetNameList, function (name) {
+	                targetNameSet[name] = true;
+	            });
+
+	            while (stack.length) {
+	                var currComponentType = stack.pop();
+	                var currVertex = graph[currComponentType];
+	                var isInTargetNameSet = !!targetNameSet[currComponentType];
+	                if (isInTargetNameSet) {
+	                    callback.call(context, currComponentType, currVertex.originalDeps.slice());
+	                    delete targetNameSet[currComponentType];
+	                }
+	                zrUtil.each(
+	                    currVertex.successor,
+	                    isInTargetNameSet ? removeEdgeAndAdd : removeEdge
+	                );
+	            }
+
+	            zrUtil.each(targetNameSet, function () {
+	                throw new Error('Circle dependency may exists');
+	            });
+
+	            function removeEdge(succComponentType) {
+	                graph[succComponentType].entryCount--;
+	                if (graph[succComponentType].entryCount === 0) {
+	                    stack.push(succComponentType);
+	                }
+	            }
+
+	            // Consider this case: legend depends on series, and we call
+	            // chart.setOption({series: [...]}), where only series is in option.
+	            // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will
+	            // not be called, but only sereis.mergeOption is called. Thus legend
+	            // have no chance to update its local record about series (like which
+	            // name of series is available in legend).
+	            function removeEdgeAndAdd(succComponentType) {
+	                targetNameSet[succComponentType] = true;
+	                removeEdge(succComponentType);
+	            }
+	        };
+
+	        /**
+	         * DepndencyGraph: {Object}
+	         * key: conponentType,
+	         * value: {
+	         *     successor: [conponentTypes...],
+	         *     originalDeps: [conponentTypes...],
+	         *     entryCount: {number}
+	         * }
+	         */
+	        function makeDepndencyGraph(fullNameList) {
+	            var graph = {};
+	            var noEntryList = [];
+
+	            zrUtil.each(fullNameList, function (name) {
+
+	                var thisItem = createDependencyGraphItem(graph, name);
+	                var originalDeps = thisItem.originalDeps = dependencyGetter(name);
+
+	                var availableDeps = getAvailableDependencies(originalDeps, fullNameList);
+	                thisItem.entryCount = availableDeps.length;
+	                if (thisItem.entryCount === 0) {
+	                    noEntryList.push(name);
+	                }
+
+	                zrUtil.each(availableDeps, function (dependentName) {
+	                    if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) {
+	                        thisItem.predecessor.push(dependentName);
+	                    }
+	                    var thatItem = createDependencyGraphItem(graph, dependentName);
+	                    if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) {
+	                        thatItem.successor.push(name);
+	                    }
+	                });
+	            });
+
+	            return {graph: graph, noEntryList: noEntryList};
+	        }
+
+	        function createDependencyGraphItem(graph, name) {
+	            if (!graph[name]) {
+	                graph[name] = {predecessor: [], successor: []};
+	            }
+	            return graph[name];
+	        }
+
+	        function getAvailableDependencies(originalDeps, fullNameList) {
+	            var availableDeps = [];
+	            zrUtil.each(originalDeps, function (dep) {
+	                zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);
+	            });
+	            return availableDeps;
+	        }
+	    };
+
+	    module.exports = componentUtil;
+
+
+/***/ },
+/* 71 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+	// Layout helpers for each component positioning
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var BoundingRect = __webpack_require__(9);
+	    var numberUtil = __webpack_require__(7);
+	    var formatUtil = __webpack_require__(6);
+	    var parsePercent = numberUtil.parsePercent;
+	    var each = zrUtil.each;
+
+	    var layout = {};
+
+	    /**
+	     * @public
+	     */
+	    var LOCATION_PARAMS = layout.LOCATION_PARAMS = [
+	        'left', 'right', 'top', 'bottom', 'width', 'height'
+	    ];
+
+	    /**
+	     * @public
+	     */
+	    var HV_NAMES = layout.HV_NAMES = [
+	        ['width', 'left', 'right'],
+	        ['height', 'top', 'bottom']
+	    ];
+
+	    function boxLayout(orient, group, gap, maxWidth, maxHeight) {
+	        var x = 0;
+	        var y = 0;
+	        if (maxWidth == null) {
+	            maxWidth = Infinity;
+	        }
+	        if (maxHeight == null) {
+	            maxHeight = Infinity;
+	        }
+	        var currentLineMaxSize = 0;
+	        group.eachChild(function (child, idx) {
+	            var position = child.position;
+	            var rect = child.getBoundingRect();
+	            var nextChild = group.childAt(idx + 1);
+	            var nextChildRect = nextChild && nextChild.getBoundingRect();
+	            var nextX;
+	            var nextY;
+	            if (orient === 'horizontal') {
+	                var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0);
+	                nextX = x + moveX;
+	                // Wrap when width exceeds maxWidth or meet a `newline` group
+	                if (nextX > maxWidth || child.newline) {
+	                    x = 0;
+	                    nextX = moveX;
+	                    y += currentLineMaxSize + gap;
+	                    currentLineMaxSize = rect.height;
+	                }
+	                else {
+	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);
+	                }
+	            }
+	            else {
+	                var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0);
+	                nextY = y + moveY;
+	                // Wrap when width exceeds maxHeight or meet a `newline` group
+	                if (nextY > maxHeight || child.newline) {
+	                    x += currentLineMaxSize + gap;
+	                    y = 0;
+	                    nextY = moveY;
+	                    currentLineMaxSize = rect.width;
+	                }
+	                else {
+	                    currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);
+	                }
+	            }
+
+	            if (child.newline) {
+	                return;
+	            }
+
+	            position[0] = x;
+	            position[1] = y;
+
+	            orient === 'horizontal'
+	                ? (x = nextX + gap)
+	                : (y = nextY + gap);
+	        });
+	    }
+
+	    /**
+	     * VBox or HBox layouting
+	     * @param {string} orient
+	     * @param {module:zrender/container/Group} group
+	     * @param {number} gap
+	     * @param {number} [width=Infinity]
+	     * @param {number} [height=Infinity]
+	     */
+	    layout.box = boxLayout;
+
+	    /**
+	     * VBox layouting
+	     * @param {module:zrender/container/Group} group
+	     * @param {number} gap
+	     * @param {number} [width=Infinity]
+	     * @param {number} [height=Infinity]
+	     */
+	    layout.vbox = zrUtil.curry(boxLayout, 'vertical');
+
+	    /**
+	     * HBox layouting
+	     * @param {module:zrender/container/Group} group
+	     * @param {number} gap
+	     * @param {number} [width=Infinity]
+	     * @param {number} [height=Infinity]
+	     */
+	    layout.hbox = zrUtil.curry(boxLayout, 'horizontal');
+
+	    /**
+	     * If x or x2 is not specified or 'center' 'left' 'right',
+	     * the width would be as long as possible.
+	     * If y or y2 is not specified or 'middle' 'top' 'bottom',
+	     * the height would be as long as possible.
+	     *
+	     * @param {Object} positionInfo
+	     * @param {number|string} [positionInfo.x]
+	     * @param {number|string} [positionInfo.y]
+	     * @param {number|string} [positionInfo.x2]
+	     * @param {number|string} [positionInfo.y2]
+	     * @param {Object} containerRect
+	     * @param {string|number} margin
+	     * @return {Object} {width, height}
+	     */
+	    layout.getAvailableSize = function (positionInfo, containerRect, margin) {
+	        var containerWidth = containerRect.width;
+	        var containerHeight = containerRect.height;
+
+	        var x = parsePercent(positionInfo.x, containerWidth);
+	        var y = parsePercent(positionInfo.y, containerHeight);
+	        var x2 = parsePercent(positionInfo.x2, containerWidth);
+	        var y2 = parsePercent(positionInfo.y2, containerHeight);
+
+	        (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);
+	        (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);
+	        (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);
+	        (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);
+
+	        margin = formatUtil.normalizeCssArray(margin || 0);
+
+	        return {
+	            width: Math.max(x2 - x - margin[1] - margin[3], 0),
+	            height: Math.max(y2 - y - margin[0] - margin[2], 0)
+	        };
+	    };
+
+	    /**
+	     * Parse position info.
+	     *
+	     * @param {Object} positionInfo
+	     * @param {number|string} [positionInfo.left]
+	     * @param {number|string} [positionInfo.top]
+	     * @param {number|string} [positionInfo.right]
+	     * @param {number|string} [positionInfo.bottom]
+	     * @param {number|string} [positionInfo.width]
+	     * @param {number|string} [positionInfo.height]
+	     * @param {number|string} [positionInfo.aspect] Aspect is width / height
+	     * @param {Object} containerRect
+	     * @param {string|number} [margin]
+	     *
+	     * @return {module:zrender/core/BoundingRect}
+	     */
+	    layout.getLayoutRect = function (
+	        positionInfo, containerRect, margin
+	    ) {
+	        margin = formatUtil.normalizeCssArray(margin || 0);
+
+	        var containerWidth = containerRect.width;
+	        var containerHeight = containerRect.height;
+
+	        var left = parsePercent(positionInfo.left, containerWidth);
+	        var top = parsePercent(positionInfo.top, containerHeight);
+	        var right = parsePercent(positionInfo.right, containerWidth);
+	        var bottom = parsePercent(positionInfo.bottom, containerHeight);
+	        var width = parsePercent(positionInfo.width, containerWidth);
+	        var height = parsePercent(positionInfo.height, containerHeight);
+
+	        var verticalMargin = margin[2] + margin[0];
+	        var horizontalMargin = margin[1] + margin[3];
+	        var aspect = positionInfo.aspect;
+
+	        // If width is not specified, calculate width from left and right
+	        if (isNaN(width)) {
+	            width = containerWidth - right - horizontalMargin - left;
+	        }
+	        if (isNaN(height)) {
+	            height = containerHeight - bottom - verticalMargin - top;
+	        }
+
+	        // If width and height are not given
+	        // 1. Graph should not exceeds the container
+	        // 2. Aspect must be keeped
+	        // 3. Graph should take the space as more as possible
+	        if (isNaN(width) && isNaN(height)) {
+	            if (aspect > containerWidth / containerHeight) {
+	                width = containerWidth * 0.8;
+	            }
+	            else {
+	                height = containerHeight * 0.8;
+	            }
+	        }
+
+	        if (aspect != null) {
+	            // Calculate width or height with given aspect
+	            if (isNaN(width)) {
+	                width = aspect * height;
+	            }
+	            if (isNaN(height)) {
+	                height = width / aspect;
+	            }
+	        }
+
+	        // If left is not specified, calculate left from right and width
+	        if (isNaN(left)) {
+	            left = containerWidth - right - width - horizontalMargin;
+	        }
+	        if (isNaN(top)) {
+	            top = containerHeight - bottom - height - verticalMargin;
+	        }
+
+	        // Align left and top
+	        switch (positionInfo.left || positionInfo.right) {
+	            case 'center':
+	                left = containerWidth / 2 - width / 2 - margin[3];
+	                break;
+	            case 'right':
+	                left = containerWidth - width - horizontalMargin;
+	                break;
+	        }
+	        switch (positionInfo.top || positionInfo.bottom) {
+	            case 'middle':
+	            case 'center':
+	                top = containerHeight / 2 - height / 2 - margin[0];
+	                break;
+	            case 'bottom':
+	                top = containerHeight - height - verticalMargin;
+	                break;
+	        }
+	        // If something is wrong and left, top, width, height are calculated as NaN
+	        left = left || 0;
+	        top = top || 0;
+	        if (isNaN(width)) {
+	            // Width may be NaN if only one value is given except width
+	            width = containerWidth - left - (right || 0);
+	        }
+	        if (isNaN(height)) {
+	            // Height may be NaN if only one value is given except height
+	            height = containerHeight - top - (bottom || 0);
+	        }
+
+	        var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);
+	        rect.margin = margin;
+	        return rect;
+	    };
+
+
+	    /**
+	     * Position a zr element in viewport
+	     *  Group position is specified by either
+	     *  {left, top}, {right, bottom}
+	     *  If all properties exists, right and bottom will be igonred.
+	     *
+	     * Logic:
+	     *     1. Scale (against origin point in parent coord)
+	     *     2. Rotate (against origin point in parent coord)
+	     *     3. Traslate (with el.position by this method)
+	     * So this method only fixes the last step 'Traslate', which does not affect
+	     * scaling and rotating.
+	     *
+	     * If be called repeatly with the same input el, the same result will be gotten.
+	     *
+	     * @param {module:zrender/Element} el Should have `getBoundingRect` method.
+	     * @param {Object} positionInfo
+	     * @param {number|string} [positionInfo.left]
+	     * @param {number|string} [positionInfo.top]
+	     * @param {number|string} [positionInfo.right]
+	     * @param {number|string} [positionInfo.bottom]
+	     * @param {Object} containerRect
+	     * @param {string|number} margin
+	     * @param {Object} [opt]
+	     * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.
+	     * @param {Array.<number>} [opt.boundingMode='all']
+	     *        Specify how to calculate boundingRect when locating.
+	     *        'all': Position the boundingRect that is transformed and uioned
+	     *               both itself and its descendants.
+	     *               This mode simplies confine the elements in the bounding
+	     *               of their container (e.g., using 'right: 0').
+	     *        'raw': Position the boundingRect that is not transformed and only itself.
+	     *               This mode is useful when you want a element can overflow its
+	     *               container. (Consider a rotated circle needs to be located in a corner.)
+	     *               In this mode positionInfo.width/height can only be number.
+	     */
+	    layout.positionElement = function (el, positionInfo, containerRect, margin, opt) {
+	        var h = !opt || !opt.hv || opt.hv[0];
+	        var v = !opt || !opt.hv || opt.hv[1];
+	        var boundingMode = opt && opt.boundingMode || 'all';
+
+	        if (!h && !v) {
+	            return;
+	        }
+
+	        var rect;
+	        if (boundingMode === 'raw') {
+	            rect = el.type === 'group'
+	                ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0)
+	                : el.getBoundingRect();
+	        }
+	        else {
+	            rect = el.getBoundingRect();
+	            if (el.needLocalTransform()) {
+	                var transform = el.getLocalTransform();
+	                // Notice: raw rect may be inner object of el,
+	                // which should not be modified.
+	                rect = rect.clone();
+	                rect.applyTransform(transform);
+	            }
+	        }
+
+	        positionInfo = layout.getLayoutRect(
+	            zrUtil.defaults(
+	                {width: rect.width, height: rect.height},
+	                positionInfo
+	            ),
+	            containerRect,
+	            margin
+	        );
+
+	        // Because 'tranlate' is the last step in transform
+	        // (see zrender/core/Transformable#getLocalTransfrom),
+	        // we can just only modify el.position to get final result.
+	        var elPos = el.position;
+	        var dx = h ? positionInfo.x - rect.x : 0;
+	        var dy = v ? positionInfo.y - rect.y : 0;
+
+	        el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);
+	    };
+
+	    /**
+	     * @param {Object} option Contains some of the properties in HV_NAMES.
+	     * @param {number} hvIdx 0: horizontal; 1: vertical.
+	     */
+	    layout.sizeCalculable = function (option, hvIdx) {
+	        return option[HV_NAMES[hvIdx][0]] != null
+	            || (option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null);
+	    };
+
+	    /**
+	     * Consider Case:
+	     * When defulat option has {left: 0, width: 100}, and we set {right: 0}
+	     * through setOption or media query, using normal zrUtil.merge will cause
+	     * {right: 0} does not take effect.
+	     *
+	     * @example
+	     * ComponentModel.extend({
+	     *     init: function () {
+	     *         ...
+	     *         var inputPositionParams = layout.getLayoutParams(option);
+	     *         this.mergeOption(inputPositionParams);
+	     *     },
+	     *     mergeOption: function (newOption) {
+	     *         newOption && zrUtil.merge(thisOption, newOption, true);
+	     *         layout.mergeLayoutParam(thisOption, newOption);
+	     *     }
+	     * });
+	     *
+	     * @param {Object} targetOption
+	     * @param {Object} newOption
+	     * @param {Object|string} [opt]
+	     * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Some component must has width and height.
+	     */
+	    layout.mergeLayoutParam = function (targetOption, newOption, opt) {
+	        !zrUtil.isObject(opt) && (opt = {});
+
+	        var ignoreSize = opt.ignoreSize;
+	        !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);
+
+	        var hResult = merge(HV_NAMES[0], 0);
+	        var vResult = merge(HV_NAMES[1], 1);
+
+	        copy(HV_NAMES[0], targetOption, hResult);
+	        copy(HV_NAMES[1], targetOption, vResult);
+
+	        function merge(names, hvIdx) {
+	            var newParams = {};
+	            var newValueCount = 0;
+	            var merged = {};
+	            var mergedValueCount = 0;
+	            var enoughParamNumber = 2;
+
+	            each(names, function (name) {
+	                merged[name] = targetOption[name];
+	            });
+	            each(names, function (name) {
+	                // Consider case: newOption.width is null, which is
+	                // set by user for removing width setting.
+	                hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);
+	                hasValue(newParams, name) && newValueCount++;
+	                hasValue(merged, name) && mergedValueCount++;
+	            });
+
+	            if (ignoreSize[hvIdx]) {
+	                // Only one of left/right is premitted to exist.
+	                if (hasValue(newOption, names[1])) {
+	                    merged[names[2]] = null;
+	                }
+	                else if (hasValue(newOption, names[2])) {
+	                    merged[names[1]] = null;
+	                }
+	                return merged;
+	            }
+
+	            // Case: newOption: {width: ..., right: ...},
+	            // or targetOption: {right: ...} and newOption: {width: ...},
+	            // There is no conflict when merged only has params count
+	            // little than enoughParamNumber.
+	            if (mergedValueCount === enoughParamNumber || !newValueCount) {
+	                return merged;
+	            }
+	            // Case: newOption: {width: ..., right: ...},
+	            // Than we can make sure user only want those two, and ignore
+	            // all origin params in targetOption.
+	            else if (newValueCount >= enoughParamNumber) {
+	                return newParams;
+	            }
+	            else {
+	                // Chose another param from targetOption by priority.
+	                for (var i = 0; i < names.length; i++) {
+	                    var name = names[i];
+	                    if (!hasProp(newParams, name) && hasProp(targetOption, name)) {
+	                        newParams[name] = targetOption[name];
+	                        break;
+	                    }
+	                }
+	                return newParams;
+	            }
+	        }
+
+	        function hasProp(obj, name) {
+	            return obj.hasOwnProperty(name);
+	        }
+
+	        function hasValue(obj, name) {
+	            return obj[name] != null && obj[name] !== 'auto';
+	        }
+
+	        function copy(names, target, source) {
+	            each(names, function (name) {
+	                target[name] = source[name];
+	            });
+	        }
+	    };
+
+	    /**
+	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+	     * @param {Object} source
+	     * @return {Object} Result contains those props.
+	     */
+	    layout.getLayoutParams = function (source) {
+	        return layout.copyLayoutParams({}, source);
+	    };
+
+	    /**
+	     * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+	     * @param {Object} source
+	     * @return {Object} Result contains those props.
+	     */
+	    layout.copyLayoutParams = function (target, source) {
+	        source && target && each(LOCATION_PARAMS, function (name) {
+	            source.hasOwnProperty(name) && (target[name] = source[name]);
+	        });
+	        return target;
+	    };
+
+	    module.exports = layout;
+
+
+
+/***/ },
+/* 72 */
+/***/ function(module, exports) {
+
+	
+
+	    module.exports = {
+	        getBoxLayoutParams: function () {
+	            return {
+	                left: this.get('left'),
+	                top: this.get('top'),
+	                right: this.get('right'),
+	                bottom: this.get('bottom'),
+	                width: this.get('width'),
+	                height: this.get('height')
+	            };
+	        }
+	    };
+
+
+/***/ },
+/* 73 */
+/***/ function(module, exports) {
+
+	
+	    var platform = '';
+	    // Navigator not exists in node
+	    if (typeof navigator !== 'undefined') {
+	        platform = navigator.platform || '';
+	    }
+	    module.exports = {
+	        // 全图默认背景
+	        // backgroundColor: 'rgba(0,0,0,0)',
+
+	        // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization
+	        // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'],
+	        // 浅色
+	        // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'],
+	        // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'],
+	        // 深色
+	        color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83',  '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'],
+
+	        // 默认需要 Grid 配置项
+	        // grid: {},
+	        // 主题，主题
+	        textStyle: {
+	            // color: '#000',
+	            // decoration: 'none',
+	            // PENDING
+	            fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',
+	            // fontFamily: 'Arial, Verdana, sans-serif',
+	            fontSize: 12,
+	            fontStyle: 'normal',
+	            fontWeight: 'normal'
+	        },
+
+	        // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/
+	        // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
+	        // Default is source-over
+	        blendMode: null,
+
+	        animation: 'auto',
+	        animationDuration: 1000,
+	        animationDurationUpdate: 300,
+	        animationEasing: 'exponentialOut',
+	        animationEasingUpdate: 'cubicOut',
+
+	        animationThreshold: 2000,
+	        // Configuration for progressive/incremental rendering
+	        progressiveThreshold: 3000,
+	        progressive: 400,
+
+	        // Threshold of if use single hover layer to optimize.
+	        // It is recommended that `hoverLayerThreshold` is equivalent to or less than
+	        // `progressiveThreshold`, otherwise hover will cause restart of progressive,
+	        // which is unexpected.
+	        // see example <echarts/test/heatmap-large.html>.
+	        hoverLayerThreshold: 3000,
+
+	        // See: module:echarts/scale/Time
+	        useUTC: false
+	    };
+
+
+/***/ },
+/* 74 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var classUtil = __webpack_require__(13);
+	    var set = classUtil.set;
+	    var get = classUtil.get;
+
+	    module.exports = {
+	        clearColorPalette: function () {
+	            set(this, 'colorIdx', 0);
+	            set(this, 'colorNameMap', {});
+	        },
+
+	        getColorFromPalette: function (name, scope) {
+	            scope = scope || this;
+	            var colorIdx = get(scope, 'colorIdx') || 0;
+	            var colorNameMap = get(scope, 'colorNameMap') || set(scope, 'colorNameMap', {});
+	            // Use `hasOwnProperty` to avoid conflict with Object.prototype.
+	            if (colorNameMap.hasOwnProperty(name)) {
+	                return colorNameMap[name];
+	            }
+	            var colorPalette = this.get('color', true) || [];
+	            if (!colorPalette.length) {
+	                return;
+	            }
+
+	            var color = colorPalette[colorIdx];
+	            if (name) {
+	                colorNameMap[name] = color;
+	            }
+	            set(scope, 'colorIdx', (colorIdx + 1) % colorPalette.length);
+
+	            return color;
+	        }
+	    };
+
+
+/***/ },
+/* 75 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+
+	    var echartsAPIList = [
+	        'getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed',
+	        'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption',
+	        'getViewOfComponentModel', 'getViewOfSeriesModel'
+	    ];
+	    // And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js
+
+	    function ExtensionAPI(chartInstance) {
+	        zrUtil.each(echartsAPIList, function (name) {
+	            this[name] = zrUtil.bind(chartInstance[name], chartInstance);
+	        }, this);
+	    }
+
+	    module.exports = ExtensionAPI;
+
+
+/***/ },
+/* 76 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+
+	    var coordinateSystemCreators = {};
+
+	    function CoordinateSystemManager() {
+
+	        this._coordinateSystems = [];
+	    }
+
+	    CoordinateSystemManager.prototype = {
+
+	        constructor: CoordinateSystemManager,
+
+	        create: function (ecModel, api) {
+	            var coordinateSystems = [];
+	            zrUtil.each(coordinateSystemCreators, function (creater, type) {
+	                var list = creater.create(ecModel, api);
+	                coordinateSystems = coordinateSystems.concat(list || []);
+	            });
+
+	            this._coordinateSystems = coordinateSystems;
+	        },
+
+	        update: function (ecModel, api) {
+	            zrUtil.each(this._coordinateSystems, function (coordSys) {
+	                // FIXME MUST have
+	                coordSys.update && coordSys.update(ecModel, api);
+	            });
+	        },
+
+	        getCoordinateSystems: function () {
+	            return this._coordinateSystems.slice();
+	        }
+	    };
+
+	    CoordinateSystemManager.register = function (type, coordinateSystemCreator) {
+	        coordinateSystemCreators[type] = coordinateSystemCreator;
+	    };
+
+	    CoordinateSystemManager.get = function (type) {
+	        return coordinateSystemCreators[type];
+	    };
+
+	    module.exports = CoordinateSystemManager;
+
+
+/***/ },
+/* 77 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * ECharts option manager
+	 *
+	 * @module {echarts/model/OptionManager}
+	 */
+
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+	    var ComponentModel = __webpack_require__(69);
+	    var each = zrUtil.each;
+	    var clone = zrUtil.clone;
+	    var map = zrUtil.map;
+	    var merge = zrUtil.merge;
+
+	    var QUERY_REG = /^(min|max)?(.+)$/;
+
+	    /**
+	     * TERM EXPLANATIONS:
+	     *
+	     * [option]:
+	     *
+	     *     An object that contains definitions of components. For example:
+	     *     var option = {
+	     *         title: {...},
+	     *         legend: {...},
+	     *         visualMap: {...},
+	     *         series: [
+	     *             {data: [...]},
+	     *             {data: [...]},
+	     *             ...
+	     *         ]
+	     *     };
+	     *
+	     * [rawOption]:
+	     *
+	     *     An object input to echarts.setOption. 'rawOption' may be an
+	     *     'option', or may be an object contains multi-options. For example:
+	     *     var option = {
+	     *         baseOption: {
+	     *             title: {...},
+	     *             legend: {...},
+	     *             series: [
+	     *                 {data: [...]},
+	     *                 {data: [...]},
+	     *                 ...
+	     *             ]
+	     *         },
+	     *         timeline: {...},
+	     *         options: [
+	     *             {title: {...}, series: {data: [...]}},
+	     *             {title: {...}, series: {data: [...]}},
+	     *             ...
+	     *         ],
+	     *         media: [
+	     *             {
+	     *                 query: {maxWidth: 320},
+	     *                 option: {series: {x: 20}, visualMap: {show: false}}
+	     *             },
+	     *             {
+	     *                 query: {minWidth: 320, maxWidth: 720},
+	     *                 option: {series: {x: 500}, visualMap: {show: true}}
+	     *             },
+	     *             {
+	     *                 option: {series: {x: 1200}, visualMap: {show: true}}
+	     *             }
+	     *         ]
+	     *     };
+	     *
+	     * @alias module:echarts/model/OptionManager
+	     * @param {module:echarts/ExtensionAPI} api
+	     */
+	    function OptionManager(api) {
+
+	        /**
+	         * @private
+	         * @type {module:echarts/ExtensionAPI}
+	         */
+	        this._api = api;
+
+	        /**
+	         * @private
+	         * @type {Array.<number>}
+	         */
+	        this._timelineOptions = [];
+
+	        /**
+	         * @private
+	         * @type {Array.<Object>}
+	         */
+	        this._mediaList = [];
+
+	        /**
+	         * @private
+	         * @type {Object}
+	         */
+	        this._mediaDefault;
+
+	        /**
+	         * -1, means default.
+	         * empty means no media.
+	         * @private
+	         * @type {Array.<number>}
+	         */
+	        this._currentMediaIndices = [];
+
+	        /**
+	         * @private
+	         * @type {Object}
+	         */
+	        this._optionBackup;
+
+	        /**
+	         * @private
+	         * @type {Object}
+	         */
+	        this._newBaseOption;
+	    }
+
+	    // timeline.notMerge is not supported in ec3. Firstly there is rearly
+	    // case that notMerge is needed. Secondly supporting 'notMerge' requires
+	    // rawOption cloned and backuped when timeline changed, which does no
+	    // good to performance. What's more, that both timeline and setOption
+	    // method supply 'notMerge' brings complex and some problems.
+	    // Consider this case:
+	    // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);
+	    // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);
+
+	    OptionManager.prototype = {
+
+	        constructor: OptionManager,
+
+	        /**
+	         * @public
+	         * @param {Object} rawOption Raw option.
+	         * @param {module:echarts/model/Global} ecModel
+	         * @param {Array.<Function>} optionPreprocessorFuncs
+	         * @return {Object} Init option
+	         */
+	        setOption: function (rawOption, optionPreprocessorFuncs) {
+	            rawOption = clone(rawOption, true);
+
+	            // FIXME
+	            // 如果 timeline options 或者 media 中设置了某个属性，而baseOption中没有设置，则进行警告。
+
+	            var oldOptionBackup = this._optionBackup;
+	            var newParsedOption = parseRawOption.call(
+	                this, rawOption, optionPreprocessorFuncs, !oldOptionBackup
+	            );
+	            this._newBaseOption = newParsedOption.baseOption;
+
+	            // For setOption at second time (using merge mode);
+	            if (oldOptionBackup) {
+	                // Only baseOption can be merged.
+	                mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption);
+
+	                // For simplicity, timeline options and media options do not support merge,
+	                // that is, if you `setOption` twice and both has timeline options, the latter
+	                // timeline opitons will not be merged to the formers, but just substitude them.
+	                if (newParsedOption.timelineOptions.length) {
+	                    oldOptionBackup.timelineOptions = newParsedOption.timelineOptions;
+	                }
+	                if (newParsedOption.mediaList.length) {
+	                    oldOptionBackup.mediaList = newParsedOption.mediaList;
+	                }
+	                if (newParsedOption.mediaDefault) {
+	                    oldOptionBackup.mediaDefault = newParsedOption.mediaDefault;
+	                }
+	            }
+	            else {
+	                this._optionBackup = newParsedOption;
+	            }
+	        },
+
+	        /**
+	         * @param {boolean} isRecreate
+	         * @return {Object}
+	         */
+	        mountOption: function (isRecreate) {
+	            var optionBackup = this._optionBackup;
+
+	            // TODO
+	            // 如果没有reset功能则不clone。
+
+	            this._timelineOptions = map(optionBackup.timelineOptions, clone);
+	            this._mediaList = map(optionBackup.mediaList, clone);
+	            this._mediaDefault = clone(optionBackup.mediaDefault);
+	            this._currentMediaIndices = [];
+
+	            return clone(isRecreate
+	                // this._optionBackup.baseOption, which is created at the first `setOption`
+	                // called, and is merged into every new option by inner method `mergeOption`
+	                // each time `setOption` called, can be only used in `isRecreate`, because
+	                // its reliability is under suspicion. In other cases option merge is
+	                // performed by `model.mergeOption`.
+	                ? optionBackup.baseOption : this._newBaseOption
+	            );
+	        },
+
+	        /**
+	         * @param {module:echarts/model/Global} ecModel
+	         * @return {Object}
+	         */
+	        getTimelineOption: function (ecModel) {
+	            var option;
+	            var timelineOptions = this._timelineOptions;
+
+	            if (timelineOptions.length) {
+	                // getTimelineOption can only be called after ecModel inited,
+	                // so we can get currentIndex from timelineModel.
+	                var timelineModel = ecModel.getComponent('timeline');
+	                if (timelineModel) {
+	                    option = clone(
+	                        timelineOptions[timelineModel.getCurrentIndex()],
+	                        true
+	                    );
+	                }
+	            }
+
+	            return option;
+	        },
+
+	        /**
+	         * @param {module:echarts/model/Global} ecModel
+	         * @return {Array.<Object>}
+	         */
+	        getMediaOption: function (ecModel) {
+	            var ecWidth = this._api.getWidth();
+	            var ecHeight = this._api.getHeight();
+	            var mediaList = this._mediaList;
+	            var mediaDefault = this._mediaDefault;
+	            var indices = [];
+	            var result = [];
+
+	            // No media defined.
+	            if (!mediaList.length && !mediaDefault) {
+	                return result;
+	            }
+
+	            // Multi media may be applied, the latter defined media has higher priority.
+	            for (var i = 0, len = mediaList.length; i < len; i++) {
+	                if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {
+	                    indices.push(i);
+	                }
+	            }
+
+	            // FIXME
+	            // 是否mediaDefault应该强制用户设置，否则可能修改不能回归。
+	            if (!indices.length && mediaDefault) {
+	                indices = [-1];
+	            }
+
+	            if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {
+	                result = map(indices, function (index) {
+	                    return clone(
+	                        index === -1 ? mediaDefault.option : mediaList[index].option
+	                    );
+	                });
+	            }
+	            // Otherwise return nothing.
+
+	            this._currentMediaIndices = indices;
+
+	            return result;
+	        }
+	    };
+
+	    function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) {
+	        var timelineOptions = [];
+	        var mediaList = [];
+	        var mediaDefault;
+	        var baseOption;
+
+	        // Compatible with ec2.
+	        var timelineOpt = rawOption.timeline;
+
+	        if (rawOption.baseOption) {
+	            baseOption = rawOption.baseOption;
+	        }
+
+	        // For timeline
+	        if (timelineOpt || rawOption.options) {
+	            baseOption = baseOption || {};
+	            timelineOptions = (rawOption.options || []).slice();
+	        }
+
+	        // For media query
+	        if (rawOption.media) {
+	            baseOption = baseOption || {};
+	            var media = rawOption.media;
+	            each(media, function (singleMedia) {
+	                if (singleMedia && singleMedia.option) {
+	                    if (singleMedia.query) {
+	                        mediaList.push(singleMedia);
+	                    }
+	                    else if (!mediaDefault) {
+	                        // Use the first media default.
+	                        mediaDefault = singleMedia;
+	                    }
+	                }
+	            });
+	        }
+
+	        // For normal option
+	        if (!baseOption) {
+	            baseOption = rawOption;
+	        }
+
+	        // Set timelineOpt to baseOption in ec3,
+	        // which is convenient for merge option.
+	        if (!baseOption.timeline) {
+	            baseOption.timeline = timelineOpt;
+	        }
+
+	        // Preprocess.
+	        each([baseOption].concat(timelineOptions)
+	            .concat(zrUtil.map(mediaList, function (media) {
+	                return media.option;
+	            })),
+	            function (option) {
+	                each(optionPreprocessorFuncs, function (preProcess) {
+	                    preProcess(option, isNew);
+	                });
+	            }
+	        );
+
+	        return {
+	            baseOption: baseOption,
+	            timelineOptions: timelineOptions,
+	            mediaDefault: mediaDefault,
+	            mediaList: mediaList
+	        };
+	    }
+
+	    /**
+	     * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
+	     * Support: width, height, aspectRatio
+	     * Can use max or min as prefix.
+	     */
+	    function applyMediaQuery(query, ecWidth, ecHeight) {
+	        var realMap = {
+	            width: ecWidth,
+	            height: ecHeight,
+	            aspectratio: ecWidth / ecHeight // lowser case for convenientce.
+	        };
+
+	        var applicatable = true;
+
+	        zrUtil.each(query, function (value, attr) {
+	            var matched = attr.match(QUERY_REG);
+
+	            if (!matched || !matched[1] || !matched[2]) {
+	                return;
+	            }
+
+	            var operator = matched[1];
+	            var realAttr = matched[2].toLowerCase();
+
+	            if (!compare(realMap[realAttr], value, operator)) {
+	                applicatable = false;
+	            }
+	        });
+
+	        return applicatable;
+	    }
+
+	    function compare(real, expect, operator) {
+	        if (operator === 'min') {
+	            return real >= expect;
+	        }
+	        else if (operator === 'max') {
+	            return real <= expect;
+	        }
+	        else { // Equals
+	            return real === expect;
+	        }
+	    }
+
+	    function indicesEquals(indices1, indices2) {
+	        // indices is always order by asc and has only finite number.
+	        return indices1.join(',') === indices2.join(',');
+	    }
+
+	    /**
+	     * Consider case:
+	     * `chart.setOption(opt1);`
+	     * Then user do some interaction like dataZoom, dataView changing.
+	     * `chart.setOption(opt2);`
+	     * Then user press 'reset button' in toolbox.
+	     *
+	     * After doing that all of the interaction effects should be reset, the
+	     * chart should be the same as the result of invoke
+	     * `chart.setOption(opt1); chart.setOption(opt2);`.
+	     *
+	     * Although it is not able ensure that
+	     * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to
+	     * `chart.setOption(merge(opt1, opt2));` exactly,
+	     * this might be the only simple way to implement that feature.
+	     *
+	     * MEMO: We've considered some other approaches:
+	     * 1. Each model handle its self restoration but not uniform treatment.
+	     *     (Too complex in logic and error-prone)
+	     * 2. Use a shadow ecModel. (Performace expensive)
+	     */
+	    function mergeOption(oldOption, newOption) {
+	        newOption = newOption || {};
+
+	        each(newOption, function (newCptOpt, mainType) {
+	            if (newCptOpt == null) {
+	                return;
+	            }
+
+	            var oldCptOpt = oldOption[mainType];
+
+	            if (!ComponentModel.hasClass(mainType)) {
+	                oldOption[mainType] = merge(oldCptOpt, newCptOpt, true);
+	            }
+	            else {
+	                newCptOpt = modelUtil.normalizeToArray(newCptOpt);
+	                oldCptOpt = modelUtil.normalizeToArray(oldCptOpt);
+
+	                var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt);
+
+	                oldOption[mainType] = map(mapResult, function (item) {
+	                    return (item.option && item.exist)
+	                        ? merge(item.exist, item.option, true)
+	                        : (item.exist || item.option);
+	                });
+	            }
+	        });
+	    }
+
+	    module.exports = OptionManager;
+
+
+/***/ },
+/* 78 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var formatUtil = __webpack_require__(6);
+	    var classUtil = __webpack_require__(13);
+	    var modelUtil = __webpack_require__(5);
+	    var ComponentModel = __webpack_require__(69);
+	    var colorPaletteMixin = __webpack_require__(74);
+	    var env = __webpack_require__(2);
+	    var layout = __webpack_require__(71);
+
+	    var set = classUtil.set;
+	    var get = classUtil.get;
+	    var encodeHTML = formatUtil.encodeHTML;
+	    var addCommas = formatUtil.addCommas;
+
+	    var SeriesModel = ComponentModel.extend({
+
+	        type: 'series.__base__',
+
+	        /**
+	         * @readOnly
+	         */
+	        seriesIndex: 0,
+
+	        // coodinateSystem will be injected in the echarts/CoordinateSystem
+	        coordinateSystem: null,
+
+	        /**
+	         * @type {Object}
+	         * @protected
+	         */
+	        defaultOption: null,
+
+	        /**
+	         * Data provided for legend
+	         * @type {Function}
+	         */
+	        // PENDING
+	        legendDataProvider: null,
+
+	        /**
+	         * Access path of color for visual
+	         */
+	        visualColorAccessPath: 'itemStyle.normal.color',
+
+	        /**
+	         * Support merge layout params.
+	         * Only support 'box' now (left/right/top/bottom/width/height).
+	         * @type {string|Object} Object can be {ignoreSize: true}
+	         * @readOnly
+	         */
+	        layoutMode: null,
+
+	        init: function (option, parentModel, ecModel, extraOpt) {
+
+	            /**
+	             * @type {number}
+	             * @readOnly
+	             */
+	            this.seriesIndex = this.componentIndex;
+
+	            this.mergeDefaultAndTheme(option, ecModel);
+
+	            var data = this.getInitialData(option, ecModel);
+	            if (true) {
+	                zrUtil.assert(data, 'getInitialData returned invalid data.');
+	            }
+	            /**
+	             * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph}
+	             * @private
+	             */
+	            set(this, 'dataBeforeProcessed', data);
+
+	            // If we reverse the order (make data firstly, and then make
+	            // dataBeforeProcessed by cloneShallow), cloneShallow will
+	            // cause data.graph.data !== data when using
+	            // module:echarts/data/Graph or module:echarts/data/Tree.
+	            // See module:echarts/data/helper/linkList
+	            this.restoreData();
+	        },
+
+	        /**
+	         * Util for merge default and theme to option
+	         * @param  {Object} option
+	         * @param  {module:echarts/model/Global} ecModel
+	         */
+	        mergeDefaultAndTheme: function (option, ecModel) {
+	            var layoutMode = this.layoutMode;
+	            var inputPositionParams = layoutMode
+	                ? layout.getLayoutParams(option) : {};
+
+	            zrUtil.merge(
+	                option,
+	                ecModel.getTheme().get(this.subType)
+	            );
+	            zrUtil.merge(option, this.getDefaultOption());
+
+	            // Default label emphasis `position` and `show`
+	            // FIXME Set label in mergeOption
+	            modelUtil.defaultEmphasis(option.label, modelUtil.LABEL_OPTIONS);
+
+	            this.fillDataTextStyle(option.data);
+
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
+	            }
+	        },
+
+	        mergeOption: function (newSeriesOption, ecModel) {
+	            newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);
+	            this.fillDataTextStyle(newSeriesOption.data);
+
+	            var layoutMode = this.layoutMode;
+	            if (layoutMode) {
+	                layout.mergeLayoutParam(this.option, newSeriesOption, layoutMode);
+	            }
+
+	            var data = this.getInitialData(newSeriesOption, ecModel);
+	            // TODO Merge data?
+	            if (data) {
+	                set(this, 'data', data);
+	                set(this, 'dataBeforeProcessed', data.cloneShallow());
+	            }
+	        },
+
+	        fillDataTextStyle: function (data) {
+	            // Default data label emphasis `position` and `show`
+	            // FIXME Tree structure data ?
+	            // FIXME Performance ?
+	            if (data) {
+	                for (var i = 0; i < data.length; i++) {
+	                    if (data[i] && data[i].label) {
+	                        modelUtil.defaultEmphasis(data[i].label, modelUtil.LABEL_OPTIONS);
+	                    }
+	                }
+	            }
+	        },
+
+	        /**
+	         * Init a data structure from data related option in series
+	         * Must be overwritten
+	         */
+	        getInitialData: function () {},
+
+	        /**
+	         * @param {string} [dataType]
+	         * @return {module:echarts/data/List}
+	         */
+	        getData: function (dataType) {
+	            var data = get(this, 'data');
+	            return dataType == null ? data : data.getLinkedData(dataType);
+	        },
+
+	        /**
+	         * @param {module:echarts/data/List} data
+	         */
+	        setData: function (data) {
+	            set(this, 'data', data);
+	        },
+
+	        /**
+	         * Get data before processed
+	         * @return {module:echarts/data/List}
+	         */
+	        getRawData: function () {
+	            return get(this, 'dataBeforeProcessed');
+	        },
+
+	        /**
+	         * Coord dimension to data dimension.
+	         *
+	         * By default the result is the same as dimensions of series data.
+	         * But in some series data dimensions are different from coord dimensions (i.e.
+	         * candlestick and boxplot). Override this method to handle those cases.
+	         *
+	         * Coord dimension to data dimension can be one-to-many
+	         *
+	         * @param {string} coordDim
+	         * @return {Array.<string>} dimensions on the axis.
+	         */
+	        coordDimToDataDim: function (coordDim) {
+	            return modelUtil.coordDimToDataDim(this.getData(), coordDim);
+	        },
+
+	        /**
+	         * Convert data dimension to coord dimension.
+	         *
+	         * @param {string|number} dataDim
+	         * @return {string}
+	         */
+	        dataDimToCoordDim: function (dataDim) {
+	            return modelUtil.dataDimToCoordDim(this.getData(), dataDim);
+	        },
+
+	        /**
+	         * Get base axis if has coordinate system and has axis.
+	         * By default use coordSys.getBaseAxis();
+	         * Can be overrided for some chart.
+	         * @return {type} description
+	         */
+	        getBaseAxis: function () {
+	            var coordSys = this.coordinateSystem;
+	            return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
+	        },
+
+	        // FIXME
+	        /**
+	         * Default tooltip formatter
+	         *
+	         * @param {number} dataIndex
+	         * @param {boolean} [multipleSeries=false]
+	         * @param {number} [dataType]
+	         */
+	        formatTooltip: function (dataIndex, multipleSeries, dataType) {
+	            function formatArrayValue(value) {
+	                var vertially = zrUtil.reduce(value, function (vertially, val, idx) {
+	                    var dimItem = data.getDimensionInfo(idx);
+	                    return vertially |= dimItem.tooltip !== false && dimItem.tooltipName != null;
+	                }, 0);
+
+	                var result = [];
+	                var tooltipDims = modelUtil.otherDimToDataDim(data, 'tooltip');
+
+	                tooltipDims.length
+	                    ? zrUtil.each(tooltipDims, function (dimIdx) {
+	                        setEachItem(data.get(dimIdx, dataIndex), dimIdx);
+	                    })
+	                    // By default, all dims is used on tooltip.
+	                    : zrUtil.each(value, setEachItem);
+
+	                function setEachItem(val, dimIdx) {
+	                    var dimInfo = data.getDimensionInfo(dimIdx);
+	                    // If `dimInfo.tooltip` is not set, show tooltip.
+	                    if (!dimInfo || dimInfo.otherDims.tooltip === false) {
+	                        return;
+	                    }
+	                    var dimType = dimInfo.type;
+	                    var valStr = (vertially ? '- ' + (dimInfo.tooltipName || dimInfo.name) + ': ' : '')
+	                        + (dimType === 'ordinal'
+	                            ? val + ''
+	                            : dimType === 'time'
+	                            ? (multipleSeries ? '' : formatUtil.formatTime('yyyy/MM/dd hh:mm:ss', val))
+	                            : addCommas(val)
+	                        );
+	                    valStr && result.push(encodeHTML(valStr));
+	                }
+
+	                return (vertially ? '<br/>' : '') + result.join(vertially ? '<br/>' : ', ');
+	            }
+
+	            var data = get(this, 'data');
+
+	            var value = this.getRawValue(dataIndex);
+	            var formattedValue = zrUtil.isArray(value)
+	                ? formatArrayValue(value) : encodeHTML(addCommas(value));
+	            var name = data.getName(dataIndex);
+
+	            var color = data.getItemVisual(dataIndex, 'color');
+	            if (zrUtil.isObject(color) && color.colorStops) {
+	                color = (color.colorStops[0] || {}).color;
+	            }
+	            color = color || 'transparent';
+
+	            var colorEl = formatUtil.getTooltipMarker(color);
+
+	            var seriesName = this.name;
+	            // FIXME
+	            if (seriesName === '\0-') {
+	                // Not show '-'
+	                seriesName = '';
+	            }
+	            seriesName = seriesName
+	                ? encodeHTML(seriesName) + (!multipleSeries ? '<br/>' : ': ')
+	                : '';
+	            return !multipleSeries
+	                ? seriesName + colorEl
+	                    + (name
+	                        ? encodeHTML(name) + ': ' + formattedValue
+	                        : formattedValue
+	                    )
+	                : colorEl + seriesName + formattedValue;
+	        },
+
+	        /**
+	         * @return {boolean}
+	         */
+	        isAnimationEnabled: function () {
+	            if (env.node) {
+	                return false;
+	            }
+
+	            var animationEnabled = this.getShallow('animation');
+	            if (animationEnabled) {
+	                if (this.getData().count() > this.getShallow('animationThreshold')) {
+	                    animationEnabled = false;
+	                }
+	            }
+	            return animationEnabled;
+	        },
+
+	        restoreData: function () {
+	            set(this, 'data', get(this, 'dataBeforeProcessed').cloneShallow());
+	        },
+
+	        getColorFromPalette: function (name, scope) {
+	            var ecModel = this.ecModel;
+	            // PENDING
+	            var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope);
+	            if (!color) {
+	                color = ecModel.getColorFromPalette(name, scope);
+	            }
+	            return color;
+	        },
+
+	        /**
+	         * Get data indices for show tooltip content. See tooltip.
+	         * @abstract
+	         * @param {Array.<string>|string} dim
+	         * @param {Array.<number>} value
+	         * @param {module:echarts/coord/single/SingleAxis} baseAxis
+	         * @return {Object} {dataIndices, nestestValue}.
+	         */
+	        getAxisTooltipData: null,
+
+	        /**
+	         * See tooltip.
+	         * @abstract
+	         * @param {number} dataIndex
+	         * @return {Array.<number>} Point of tooltip. null/undefined can be returned.
+	         */
+	        getTooltipPosition: null
+	    });
+
+	    zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin);
+	    zrUtil.mixin(SeriesModel, colorPaletteMixin);
+
+	    module.exports = SeriesModel;
+
+
+/***/ },
+/* 79 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var Group = __webpack_require__(48);
+	    var componentUtil = __webpack_require__(70);
+	    var clazzUtil = __webpack_require__(13);
+
+	    var Component = function () {
+	        /**
+	         * @type {module:zrender/container/Group}
+	         * @readOnly
+	         */
+	        this.group = new Group();
+
+	        /**
+	         * @type {string}
+	         * @readOnly
+	         */
+	        this.uid = componentUtil.getUID('viewComponent');
+	    };
+
+	    Component.prototype = {
+
+	        constructor: Component,
+
+	        init: function (ecModel, api) {},
+
+	        render: function (componentModel, ecModel, api, payload) {},
+
+	        dispose: function () {}
+
+	    };
+
+	    var componentProto = Component.prototype;
+	    componentProto.updateView
+	        = componentProto.updateLayout
+	        = componentProto.updateVisual
+	        = function (seriesModel, ecModel, api, payload) {
+	            // Do nothing;
+	        };
+	    // Enable Component.extend.
+	    clazzUtil.enableClassExtend(Component);
+
+	    // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+	    clazzUtil.enableClassManagement(Component, {registerWhenExtend: true});
+
+	    module.exports = Component;
+
+
+/***/ },
+/* 80 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var Group = __webpack_require__(48);
+	    var componentUtil = __webpack_require__(70);
+	    var clazzUtil = __webpack_require__(13);
+	    var modelUtil = __webpack_require__(5);
+	    var zrUtil = __webpack_require__(4);
+
+	    function Chart() {
+
+	        /**
+	         * @type {module:zrender/container/Group}
+	         * @readOnly
+	         */
+	        this.group = new Group();
+
+	        /**
+	         * @type {string}
+	         * @readOnly
+	         */
+	        this.uid = componentUtil.getUID('viewChart');
+	    }
+
+	    Chart.prototype = {
+
+	        type: 'chart',
+
+	        /**
+	         * Init the chart
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         */
+	        init: function (ecModel, api) {},
+
+	        /**
+	         * Render the chart
+	         * @param  {module:echarts/model/Series} seriesModel
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         * @param  {Object} payload
+	         */
+	        render: function (seriesModel, ecModel, api, payload) {},
+
+	        /**
+	         * Highlight series or specified data item
+	         * @param  {module:echarts/model/Series} seriesModel
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         * @param  {Object} payload
+	         */
+	        highlight: function (seriesModel, ecModel, api, payload) {
+	            toggleHighlight(seriesModel.getData(), payload, 'emphasis');
+	        },
+
+	        /**
+	         * Downplay series or specified data item
+	         * @param  {module:echarts/model/Series} seriesModel
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         * @param  {Object} payload
+	         */
+	        downplay: function (seriesModel, ecModel, api, payload) {
+	            toggleHighlight(seriesModel.getData(), payload, 'normal');
+	        },
+
+	        /**
+	         * Remove self
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         */
+	        remove: function (ecModel, api) {
+	            this.group.removeAll();
+	        },
+
+	        /**
+	         * Dispose self
+	         * @param  {module:echarts/model/Global} ecModel
+	         * @param  {module:echarts/ExtensionAPI} api
+	         */
+	        dispose: function () {}
+
+	        /**
+	         * The view contains the given point.
+	         * @interface
+	         * @param {Array.<number>} point
+	         * @return {boolean}
+	         */
+	        // containPoint: function () {}
+
+	    };
+
+	    var chartProto = Chart.prototype;
+	    chartProto.updateView
+	        = chartProto.updateLayout
+	        = chartProto.updateVisual
+	        = function (seriesModel, ecModel, api, payload) {
+	            this.render(seriesModel, ecModel, api, payload);
+	        };
+
+	    /**
+	     * Set state of single element
+	     * @param  {module:zrender/Element} el
+	     * @param  {string} state
+	     */
+	    function elSetState(el, state) {
+	        if (el) {
+	            el.trigger(state);
+	            if (el.type === 'group') {
+	                for (var i = 0; i < el.childCount(); i++) {
+	                    elSetState(el.childAt(i), state);
+	                }
+	            }
+	        }
+	    }
+	    /**
+	     * @param  {module:echarts/data/List} data
+	     * @param  {Object} payload
+	     * @param  {string} state 'normal'|'emphasis'
+	     * @inner
+	     */
+	    function toggleHighlight(data, payload, state) {
+	        var dataIndex = modelUtil.queryDataIndex(data, payload);
+
+	        if (dataIndex != null) {
+	            zrUtil.each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {
+	                elSetState(data.getItemGraphicEl(dataIdx), state);
+	            });
+	        }
+	        else {
+	            data.eachItemGraphicEl(function (el) {
+	                elSetState(el, state);
+	            });
+	        }
+	    }
+
+	    // Enable Chart.extend.
+	    clazzUtil.enableClassExtend(Chart, ['dispose']);
+
+	    // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+	    clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true});
+
+	    module.exports = Chart;
+
+
+/***/ },
 /* 81 */
 /***/ function(module, exports) {
 
@@ -17827,7 +17967,7 @@
 	 */
 	// Global defines
 
-	    var guid = __webpack_require__(32);
+	    var guid = __webpack_require__(24);
 	    var env = __webpack_require__(2);
 	    var zrUtil = __webpack_require__(4);
 
@@ -17849,7 +17989,7 @@
 	    /**
 	     * @type {string}
 	     */
-	    zrender.version = '3.4.4';
+	    zrender.version = '3.5.0';
 
 	    /**
 	     * Initializing a zrender instance
@@ -18267,7 +18407,7 @@
 	    var util = __webpack_require__(4);
 	    var Draggable = __webpack_require__(84);
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 
 	    var SILENT = 'silent';
 
@@ -18552,6 +18692,8 @@
 	            var isSilent;
 	            while (el) {
 	                // If clipped by ancestor.
+	                // FIXME: If clipPath has neither stroke nor fill,
+	                // el.clipPath.contain(x, y) will always return false.
 	                if (el.clipPath && !el.clipPath.contain(x, y))  {
 	                    return false;
 	                }
@@ -18572,6 +18714,7 @@
 	    module.exports = Handler;
 
 
+
 /***/ },
 /* 84 */
 /***/ function(module, exports) {
@@ -18681,7 +18824,7 @@
 	    var util = __webpack_require__(4);
 	    var env = __webpack_require__(2);
 
-	    var Group = __webpack_require__(30);
+	    var Group = __webpack_require__(48);
 
 	    // Use timsort because in most case elements are partially sorted
 	    // https://jsfiddle.net/pissang/jr4x7mdm/8/
@@ -19624,7 +19767,7 @@
 
 	    var requestAnimationFrame = __webpack_require__(89);
 
-	    var Animator = __webpack_require__(36);
+	    var Animator = __webpack_require__(28);
 	    /**
 	     * @typedef {Object} IZRenderStage
 	     * @property {Function} update
@@ -19875,7 +20018,7 @@
 	 */
 
 
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var env = __webpack_require__(2);
 
 	    var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener;
@@ -20039,7 +20182,7 @@
 
 	    var eventTool = __webpack_require__(88);
 	    var zrUtil = __webpack_require__(4);
-	    var Eventful = __webpack_require__(33);
+	    var Eventful = __webpack_require__(25);
 	    var env = __webpack_require__(2);
 	    var GestureMgr = __webpack_require__(91);
 
@@ -20555,9 +20698,9 @@
 	 */
 	 
 
-	    var config = __webpack_require__(42);
+	    var config = __webpack_require__(34);
 	    var util = __webpack_require__(4);
-	    var log = __webpack_require__(41);
+	    var log = __webpack_require__(33);
 	    var BoundingRect = __webpack_require__(9);
 	    var timsort = __webpack_require__(86);
 
@@ -21518,11 +21661,41 @@
 	            var displayList = this.storage.getDisplayList(true);
 
 	            var scope = {};
+	            var zlevel;
+
+	            var self = this;
+	            function findAndDrawOtherLayer(smaller, larger) {
+	                var zlevelList = self._zlevelList;
+	                if (smaller == null) {
+	                    smaller = -Infinity;
+	                }
+	                var intermediateLayer;
+	                for (var i = 0; i < zlevelList.length; i++) {
+	                    var z = zlevelList[i];
+	                    var layer = self._layers[z];
+	                    if (!layer.__builtin__ && z > smaller && z < larger) {
+	                        intermediateLayer = layer;
+	                        break;
+	                    }
+	                }
+	                if (intermediateLayer && intermediateLayer.renderToCanvas) {
+	                    imageLayer.ctx.save();
+	                    intermediateLayer.renderToCanvas(imageLayer.ctx);
+	                    imageLayer.ctx.restore();
+	                }
+	            }
 	            for (var i = 0; i < displayList.length; i++) {
 	                var el = displayList[i];
+
+	                if (el.zlevel !== zlevel) {
+	                    findAndDrawOtherLayer(zlevel, el.zlevel);
+	                    zlevel = el.zlevel;
+	                }
 	                this._doPaintEl(el, imageLayer, true, scope);
 	            }
 
+	            findAndDrawOtherLayer(zlevel, Infinity);
+
 	            return imageLayer.dom;
 	        },
 	        /**
@@ -21599,7 +21772,7 @@
 	                path.brush(ctx);
 	            }
 
-	            var ImageShape = __webpack_require__(62);
+	            var ImageShape = __webpack_require__(49);
 	            var imgShape = new ImageShape({
 	                style: {
 	                    x: 0,
@@ -21639,9 +21812,9 @@
 
 
 	    var util = __webpack_require__(4);
-	    var config = __webpack_require__(42);
-	    var Style = __webpack_require__(48);
-	    var Pattern = __webpack_require__(60);
+	    var config = __webpack_require__(34);
+	    var Style = __webpack_require__(22);
+	    var Pattern = __webpack_require__(46);
 
 	    function returnFalse() {
 	        return false;
@@ -21868,7 +22041,7 @@
 /***/ function(module, exports, __webpack_require__) {
 
 	
-	    var Gradient = __webpack_require__(79);
+	    var Gradient = __webpack_require__(66);
 	    module.exports = function (ecModel) {
 	        function encodeColor(seriesModel) {
 	            var colorAccessPath = (seriesModel.visualColorAccessPath || 'itemStyle.normal.color').split('.');
@@ -22100,7 +22273,7 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var PI = Math.PI;
 	    /**
@@ -22234,7 +22407,7 @@
 	        'stackedOn', 'hasItemOption', '_nameList', '_idList', '_rawData'
 	    ];
 
-	    var transferProperties = function (a, b) {
+	    function transferProperties(a, b) {
 	        zrUtil.each(TRANSFERABLE_PROPERTIES.concat(b.__wrappedMethods || []), function (propName) {
 	            if (b.hasOwnProperty(propName)) {
 	                a[propName] = b[propName];
@@ -22242,6 +22415,19 @@
 	        });
 
 	        a.__wrappedMethods = b.__wrappedMethods;
+	    }
+
+	    function DefaultDataProvider(dataArray) {
+	        this._array = dataArray || [];
+	    }
+
+	    DefaultDataProvider.prototype.pure = false;
+
+	    DefaultDataProvider.prototype.count = function () {
+	        return this._array.length;
+	    };
+	    DefaultDataProvider.prototype.getItem = function (idx) {
+	        return this._array[idx];
 	    };
 
 	    /**
@@ -22266,6 +22452,8 @@
 	                dimensionName = dimensions[i];
 	                dimensionInfo = {
 	                    name: dimensionName,
+	                    coordDim: dimensionName,
+	                    coordDimIndex: 0,
 	                    stackable: false,
 	                    // Type can be 'float', 'int', 'number'
 	                    // Default is number, Precision of float may not enough
@@ -22276,10 +22464,16 @@
 	                dimensionInfo = dimensions[i];
 	                dimensionName = dimensionInfo.name;
 	                dimensionInfo.type = dimensionInfo.type || 'number';
+	                if (!dimensionInfo.coordDim) {
+	                    dimensionInfo.coordDim = dimensionName;
+	                    dimensionInfo.coordDimIndex = 0;
+	                }
 	            }
+	            dimensionInfo.otherDims = dimensionInfo.otherDims || {};
 	            dimensionNames.push(dimensionName);
 	            dimensionInfos[dimensionName] = dimensionInfo;
 	        }
+
 	        /**
 	         * @readOnly
 	         * @type {Array.<string>}
@@ -22325,6 +22519,7 @@
 	         * @type {Array.<string>}
 	         */
 	        this._idList = [];
+
 	        /**
 	         * Models of data option is stored sparse for optimizing memory cost
 	         * @type {Array.<module:echarts/model/Model>}
@@ -22388,6 +22583,7 @@
 	    var listProto = List.prototype;
 
 	    listProto.type = 'list';
+
 	    /**
 	     * If each data item has it's own option
 	     * @type {boolean}
@@ -22407,6 +22603,7 @@
 	        }
 	        return dim;
 	    };
+
 	    /**
 	     * Get type and stackable info of particular dimension
 	     * @param {string|number} dim
@@ -22426,9 +22623,13 @@
 	    listProto.initData = function (data, nameList, dimValueGetter) {
 	        data = data || [];
 
+	        var isDataArray = zrUtil.isArray(data);
+	        if (isDataArray) {
+	            data = new DefaultDataProvider(data);
+	        }
 	        if (true) {
-	            if (!zrUtil.isArray(data)) {
-	                throw new Error('Invalid data.');
+	            if (!isDataArray && (typeof data.getItem != 'function' || typeof data.count != 'function')) {
+	                throw new Error('Inavlid data provider.');
 	            }
 	        }
 
@@ -22439,17 +22640,20 @@
 	        var indices = this.indices = [];
 
 	        var dimensions = this.dimensions;
-	        var size = data.length;
 	        var dimensionInfoMap = this._dimensionInfos;
 
+	        var size = data.count();
+
 	        var idList = [];
 	        var nameRepeatCount = {};
+	        var nameDimIdx;
 
 	        nameList = nameList || [];
 
 	        // Init storage
 	        for (var i = 0; i < dimensions.length; i++) {
 	            var dimInfo = dimensionInfoMap[dimensions[i]];
+	            dimInfo.otherDims.itemName === 0 && (nameDimIdx = i);
 	            var DataCtor = dataCtors[dimInfo.type];
 	            storage[dimensions[i]] = new DataCtor(size);
 	        }
@@ -22474,8 +22678,9 @@
 	            );
 	        };
 
-	        for (var idx = 0; idx < data.length; idx++) {
-	            var dataItem = data[idx];
+	        for (var i = 0; i < size; i++) {
+	            // NOTICE: Try not to write things into dataItem
+	            var dataItem = data.getItem(i);
 	            // Each data item is value
 	            // [1, 2]
 	            // 2
@@ -22488,22 +22693,26 @@
 	                var dim = dimensions[k];
 	                var dimStorage = storage[dim];
 	                // PENDING NULL is empty or zero
-	                dimStorage[idx] = dimValueGetter(dataItem, dim, idx, k);
+	                dimStorage[i] = dimValueGetter(dataItem, dim, i, k);
 	            }
 
-	            indices.push(idx);
+	            indices.push(i);
 	        }
 
 	        // Use the name in option and create id
-	        for (var i = 0; i < data.length; i++) {
-	            if (!nameList[i]) {
-	                if (data[i] && data[i].name != null) {
-	                    nameList[i] = data[i].name;
+	        for (var i = 0; i < size; i++) {
+	            var dataItem = data.getItem(i);
+	            if (!nameList[i] && dataItem) {
+	                if (dataItem.name != null) {
+	                    nameList[i] = dataItem.name;
+	                }
+	                else if (nameDimIdx != null) {
+	                    nameList[i] = storage[dimensions[nameDimIdx]][i];
 	                }
 	            }
 	            var name = nameList[i] || '';
 	            // Try using the id in option
-	            var id = data[i] && data[i].id;
+	            var id = dataItem && dataItem.id;
 
 	            if (!id && name) {
 	                // Use name as id and add counter to avoid same name
@@ -22540,11 +22749,11 @@
 	        var dataIndex = this.indices[idx];
 
 	        // If value not exists
-	        if (dataIndex == null) {
+	        if (dataIndex == null || !storage[dim]) {
 	            return NaN;
 	        }
 
-	        var value = storage[dim] && storage[dim][dataIndex];
+	        var value = storage[dim][dataIndex];
 	        // FIXME ordinal data type is not stackable
 	        if (stack) {
 	            var dimensionInfo = this._dimensionInfos[dim];
@@ -22801,7 +23010,7 @@
 	     * @return {number}
 	     */
 	    listProto.getRawDataItem = function (idx) {
-	        return this._rawData[this.getRawIndex(idx)];
+	        return this._rawData.getItem(this.getRawIndex(idx));
 	    };
 
 	    /**
@@ -22910,7 +23119,10 @@
 	        for (var i = 0; i < indices.length; i++) {
 	            var keep;
 	            // Simple optimization
-	            if (dimSize === 1) {
+	            if (!dimSize) {
+	                keep = cb.call(context, i);
+	            }
+	            else if (dimSize === 1) {
 	                keep = cb.call(
 	                    context, this.get(dimensions[0], i, stack), i
 	                );
@@ -23085,7 +23297,7 @@
 	    listProto.getItemModel = function (idx) {
 	        var hostModel = this.hostModel;
 	        idx = this.indices[idx];
-	        return new Model(this._rawData[idx], hostModel, hostModel && hostModel.ecModel);
+	        return new Model(this._rawData.getItem(idx), hostModel, hostModel && hostModel.ecModel);
 	    };
 
 	    /**
@@ -23202,7 +23414,7 @@
 	     * Get visual property of single data item
 	     * @param {number} idx
 	     * @param {string} key
-	     * @param {boolean} ignoreParent
+	     * @param {boolean} [ignoreParent=false]
 	     */
 	    listProto.getItemVisual = function (idx, key, ignoreParent) {
 	        var itemVisual = this._itemVisuals[idx];
@@ -23460,7 +23672,8 @@
 
 	    function initIndexMap(arr, map, keyArr, keyGetter) {
 	        for (var i = 0; i < arr.length; i++) {
-	            var key = keyGetter(arr[i], i);
+	            // Add prefix to avoid conflict with Object.prototype.
+	            var key = '_ec_' + keyGetter(arr[i], i);
 	            var existence = map[key];
 	            if (existence == null) {
 	                keyArr.push(key);
@@ -23487,6 +23700,7 @@
 	    var numberUtil = __webpack_require__(7);
 	    var linearMap = numberUtil.linearMap;
 	    var zrUtil = __webpack_require__(4);
+	    var axisHelper = __webpack_require__(101);
 
 	    function fixExtentWithBands(extent, nTick) {
 	        var size = extent[1] - extent[0];
@@ -23531,6 +23745,12 @@
 	         * @type {boolean}
 	         */
 	        this.onBand = false;
+
+	        /**
+	         * @private
+	         * @type {number}
+	         */
+	        this._labelInterval;
 	    };
 
 	    Axis.prototype = {
@@ -23563,8 +23783,7 @@
 	         * @return {Array.<number>}
 	         */
 	        getExtent: function () {
-	            var ret = this._extent.slice();
-	            return ret;
+	            return this._extent.slice();
 	        },
 
 	        /**
@@ -23708,6 +23927,32 @@
 	            var size = Math.abs(axisExtent[1] - axisExtent[0]);
 
 	            return Math.abs(size) / len;
+	        },
+
+	        /**
+	         * Get interval of the axis label.
+	         * @return {number}
+	         */
+	        getLabelInterval: function () {
+	            var labelInterval = this._labelInterval;
+	            if (!labelInterval) {
+	                var axisModel = this.model;
+	                var labelModel = axisModel.getModel('axisLabel');
+	                var interval = labelModel.get('interval');
+	                if (!(this.type === 'category' && interval === 'auto')) {
+	                    labelInterval = interval === 'auto' ? 0 : interval;
+	                }
+	                else if (this.isHorizontal){
+	                    labelInterval = axisHelper.getAxisLabelInterval(
+	                        zrUtil.map(this.scale.getTicks(), this.dataToCoord, this),
+	                        axisModel.getFormattedLabels(),
+	                        labelModel.getModel('textStyle').getFont(),
+	                        this.isHorizontal()
+	                    );
+	                }
+	                this._labelInterval = labelInterval;
+	            }
+	            return labelInterval;
 	        }
 
 	    };
@@ -23721,9 +23966,1238 @@
 
 	
 
-	    var createListFromArray = __webpack_require__(102);
-	    var symbolUtil = __webpack_require__(104);
-	    var axisHelper = __webpack_require__(105);
+	    var OrdinalScale = __webpack_require__(102);
+	    var IntervalScale = __webpack_require__(104);
+	    __webpack_require__(106);
+	    __webpack_require__(107);
+	    var Scale = __webpack_require__(103);
+
+	    var numberUtil = __webpack_require__(7);
+	    var zrUtil = __webpack_require__(4);
+	    var textContain = __webpack_require__(8);
+	    var axisHelper = {};
+
+	    /**
+	     * Get axis scale extent before niced.
+	     * Item of returned array can only be number (including Infinity and NaN).
+	     */
+	    axisHelper.getScaleExtent = function (scale, model) {
+	        var scaleType = scale.type;
+
+	        var min = model.getMin();
+	        var max = model.getMax();
+	        var fixMin = min != null;
+	        var fixMax = max != null;
+	        var originalExtent = scale.getExtent();
+
+	        var axisDataLen;
+	        var boundaryGap;
+	        var span;
+	        if (scaleType === 'ordinal') {
+	            axisDataLen = (model.get('data') || []).length;
+	        }
+	        else {
+	            boundaryGap = model.get('boundaryGap');
+	            if (!zrUtil.isArray(boundaryGap)) {
+	                boundaryGap = [boundaryGap || 0, boundaryGap || 0];
+	            }
+	            if (typeof boundaryGap[0] === 'boolean') {
+	                if (true) {
+	                    console.warn('Boolean type for boundaryGap is only '
+	                        + 'allowed for ordinal axis. Please use string in '
+	                        + 'percentage instead, e.g., "20%". Currently, '
+	                        + 'boundaryGap is set to be 0.');
+	                }
+	                boundaryGap = [0, 0];
+	            }
+	            boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1);
+	            boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1);
+	            span = (originalExtent[1] - originalExtent[0])
+	                || Math.abs(originalExtent[0]);
+	        }
+
+	        // Notice: When min/max is not set (that is, when there are null/undefined,
+	        // which is the most common case), these cases should be ensured:
+	        // (1) For 'ordinal', show all axis.data.
+	        // (2) For others:
+	        //      + `boundaryGap` is applied (if min/max set, boundaryGap is
+	        //      disabled).
+	        //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should
+	        //      be the result that originalExtent enlarged by boundaryGap.
+	        // (3) If no data, it should be ensured that `scale.setBlank` is set.
+
+	        // FIXME
+	        // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used?
+	        // (2) When `needCrossZero` and all data is positive/negative, should it be ensured
+	        // that the results processed by boundaryGap are positive/negative?
+
+	        if (min == null) {
+	            min = scaleType === 'ordinal'
+	                ? (axisDataLen ? 0 : NaN)
+	                : originalExtent[0] - boundaryGap[0] * span;
+	        }
+	        if (max == null) {
+	            max = scaleType === 'ordinal'
+	                ? (axisDataLen ? axisDataLen - 1 : NaN)
+	                : originalExtent[1] + boundaryGap[1] * span;
+	        }
+
+	        if (min === 'dataMin') {
+	            min = originalExtent[0];
+	        }
+	        if (max === 'dataMax') {
+	            max = originalExtent[1];
+	        }
+
+	        (min == null || !isFinite(min)) && (min = NaN);
+	        (max == null || !isFinite(max)) && (max = NaN);
+
+	        scale.setBlank(zrUtil.eqNaN(min) || zrUtil.eqNaN(max));
+
+	        // Evaluate if axis needs cross zero
+	        if (model.getNeedCrossZero()) {
+	            // Axis is over zero and min is not set
+	            if (min > 0 && max > 0 && !fixMin) {
+	                min = 0;
+	            }
+	            // Axis is under zero and max is not set
+	            if (min < 0 && max < 0 && !fixMax) {
+	                max = 0;
+	            }
+	        }
+
+	        return [min, max];
+	    };
+
+	    axisHelper.niceScaleExtent = function (scale, model) {
+	        var extent = axisHelper.getScaleExtent(scale, model);
+	        var fixMin = model.getMin() != null;
+	        var fixMax = model.getMax() != null;
+	        var splitNumber = model.get('splitNumber');
+
+	        if (scale.type === 'log') {
+	            scale.base = model.get('logBase');
+	        }
+
+	        scale.setExtent(extent[0], extent[1]);
+	        scale.niceExtent({
+	            splitNumber: splitNumber,
+	            fixMin: fixMin,
+	            fixMax: fixMax,
+	            minInterval: scale.type === 'interval' ? model.get('minInterval') : null
+	        });
+
+	        // If some one specified the min, max. And the default calculated interval
+	        // is not good enough. He can specify the interval. It is often appeared
+	        // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard
+	        // to be 60.
+	        // FIXME
+	        var interval = model.get('interval');
+	        if (interval != null) {
+	            scale.setInterval && scale.setInterval(interval);
+	        }
+	    };
+
+	    /**
+	     * @param {module:echarts/model/Model} model
+	     * @param {string} [axisType] Default retrieve from model.type
+	     * @return {module:echarts/scale/*}
+	     */
+	    axisHelper.createScaleByModel = function(model, axisType) {
+	        axisType = axisType || model.get('type');
+	        if (axisType) {
+	            switch (axisType) {
+	                // Buildin scale
+	                case 'category':
+	                    return new OrdinalScale(
+	                        model.getCategories(), [Infinity, -Infinity]
+	                    );
+	                case 'value':
+	                    return new IntervalScale();
+	                // Extended scale, like time and log
+	                default:
+	                    return (Scale.getClass(axisType) || IntervalScale).create(model);
+	            }
+	        }
+	    };
+
+	    /**
+	     * Check if the axis corss 0
+	     */
+	    axisHelper.ifAxisCrossZero = function (axis) {
+	        var dataExtent = axis.scale.getExtent();
+	        var min = dataExtent[0];
+	        var max = dataExtent[1];
+	        return !((min > 0 && max > 0) || (min < 0 && max < 0));
+	    };
+
+	    /**
+	     * @param {Array.<number>} tickCoords In axis self coordinate.
+	     * @param {Array.<string>} labels
+	     * @param {string} font
+	     * @param {boolean} isAxisHorizontal
+	     * @return {number}
+	     */
+	    axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) {
+	        // FIXME
+	        // 不同角的axis和label，不只是horizontal和vertical.
+
+	        var textSpaceTakenRect;
+	        var autoLabelInterval = 0;
+	        var accumulatedLabelInterval = 0;
+
+	        var step = 1;
+	        if (labels.length > 40) {
+	            // Simple optimization for large amount of labels
+	            step = Math.floor(labels.length / 40);
+	        }
+
+	        for (var i = 0; i < tickCoords.length; i += step) {
+	            var tickCoord = tickCoords[i];
+	            var rect = textContain.getBoundingRect(
+	                labels[i], font, 'center', 'top'
+	            );
+	            rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord;
+	            // FIXME Magic number 1.5
+	            rect[isAxisHorizontal ? 'width' : 'height'] *= 1.3;
+	            if (!textSpaceTakenRect) {
+	                textSpaceTakenRect = rect.clone();
+	            }
+	            // There is no space for current label;
+	            else if (textSpaceTakenRect.intersect(rect)) {
+	                accumulatedLabelInterval++;
+	                autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval);
+	            }
+	            else {
+	                textSpaceTakenRect.union(rect);
+	                // Reset
+	                accumulatedLabelInterval = 0;
+	            }
+	        }
+	        if (autoLabelInterval === 0 && step > 1) {
+	            return step;
+	        }
+	        return (autoLabelInterval + 1) * step - 1;
+	    };
+
+	    /**
+	     * @param {Object} axis
+	     * @param {Function} labelFormatter
+	     * @return {Array.<string>}
+	     */
+	    axisHelper.getFormattedLabels = function (axis, labelFormatter) {
+	        var scale = axis.scale;
+	        var labels = scale.getTicksLabels();
+	        var ticks = scale.getTicks();
+	        if (typeof labelFormatter === 'string') {
+	            labelFormatter = (function (tpl) {
+	                return function (val) {
+	                    return tpl.replace('{value}', val != null ? val : '');
+	                };
+	            })(labelFormatter);
+	            // Consider empty array
+	            return zrUtil.map(labels, labelFormatter);
+	        }
+	        else if (typeof labelFormatter === 'function') {
+	            return zrUtil.map(ticks, function (tick, idx) {
+	                return labelFormatter(
+	                    axisHelper.getAxisRawValue(axis, tick),
+	                    idx
+	                );
+	            }, this);
+	        }
+	        else {
+	            return labels;
+	        }
+	    };
+
+	    axisHelper.getAxisRawValue = function (axis, value) {
+	        // In category axis with data zoom, tick is not the original
+	        // index of axis.data. So tick should not be exposed to user
+	        // in category axis.
+	        return axis.type === 'category' ? axis.scale.getLabel(value) : value;
+	    };
+
+	    module.exports = axisHelper;
+
+
+/***/ },
+/* 102 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Linear continuous scale
+	 * @module echarts/coord/scale/Ordinal
+	 *
+	 * http://en.wikipedia.org/wiki/Level_of_measurement
+	 */
+
+	// FIXME only one data
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var Scale = __webpack_require__(103);
+
+	    var scaleProto = Scale.prototype;
+
+	    var OrdinalScale = Scale.extend({
+
+	        type: 'ordinal',
+
+	        init: function (data, extent) {
+	            this._data = data;
+	            this._extent = extent || [0, data.length - 1];
+	        },
+
+	        parse: function (val) {
+	            return typeof val === 'string'
+	                ? zrUtil.indexOf(this._data, val)
+	                // val might be float.
+	                : Math.round(val);
+	        },
+
+	        contain: function (rank) {
+	            rank = this.parse(rank);
+	            return scaleProto.contain.call(this, rank)
+	                && this._data[rank] != null;
+	        },
+
+	        /**
+	         * Normalize given rank or name to linear [0, 1]
+	         * @param {number|string} [val]
+	         * @return {number}
+	         */
+	        normalize: function (val) {
+	            return scaleProto.normalize.call(this, this.parse(val));
+	        },
+
+	        scale: function (val) {
+	            return Math.round(scaleProto.scale.call(this, val));
+	        },
+
+	        /**
+	         * @return {Array}
+	         */
+	        getTicks: function () {
+	            var ticks = [];
+	            var extent = this._extent;
+	            var rank = extent[0];
+
+	            while (rank <= extent[1]) {
+	                ticks.push(rank);
+	                rank++;
+	            }
+
+	            return ticks;
+	        },
+
+	        /**
+	         * Get item on rank n
+	         * @param {number} n
+	         * @return {string}
+	         */
+	        getLabel: function (n) {
+	            return this._data[n];
+	        },
+
+	        /**
+	         * @return {number}
+	         */
+	        count: function () {
+	            return this._extent[1] - this._extent[0] + 1;
+	        },
+
+	        /**
+	         * @override
+	         */
+	        unionExtentFromData: function (data, dim) {
+	            this.unionExtent(data.getDataExtent(dim, false));
+	        },
+
+	        niceTicks: zrUtil.noop,
+	        niceExtent: zrUtil.noop
+	    });
+
+	    /**
+	     * @return {module:echarts/scale/Time}
+	     */
+	    OrdinalScale.create = function () {
+	        return new OrdinalScale();
+	    };
+
+	    module.exports = OrdinalScale;
+
+
+/***/ },
+/* 103 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * // Scale class management
+	 * @module echarts/scale/Scale
+	 */
+
+
+	    var clazzUtil = __webpack_require__(13);
+
+	    /**
+	     * @param {Object} [setting]
+	     */
+	    function Scale(setting) {
+	        this._setting = setting || {};
+
+	        /**
+	         * Extent
+	         * @type {Array.<number>}
+	         * @protected
+	         */
+	        this._extent = [Infinity, -Infinity];
+
+	        /**
+	         * Step is calculated in adjustExtent
+	         * @type {Array.<number>}
+	         * @protected
+	         */
+	        this._interval = 0;
+
+	        this.init && this.init.apply(this, arguments);
+	    }
+
+	    var scaleProto = Scale.prototype;
+
+	    /**
+	     * Parse input val to valid inner number.
+	     * @param {*} val
+	     * @return {number}
+	     */
+	    scaleProto.parse = function (val) {
+	        // Notice: This would be a trap here, If the implementation
+	        // of this method depends on extent, and this method is used
+	        // before extent set (like in dataZoom), it would be wrong.
+	        // Nevertheless, parse does not depend on extent generally.
+	        return val;
+	    };
+
+	    scaleProto.getSetting = function (name) {
+	        return this._setting[name];
+	    };
+
+	    scaleProto.contain = function (val) {
+	        var extent = this._extent;
+	        return val >= extent[0] && val <= extent[1];
+	    };
+
+	    /**
+	     * Normalize value to linear [0, 1], return 0.5 if extent span is 0
+	     * @param {number} val
+	     * @return {number}
+	     */
+	    scaleProto.normalize = function (val) {
+	        var extent = this._extent;
+	        if (extent[1] === extent[0]) {
+	            return 0.5;
+	        }
+	        return (val - extent[0]) / (extent[1] - extent[0]);
+	    };
+
+	    /**
+	     * Scale normalized value
+	     * @param {number} val
+	     * @return {number}
+	     */
+	    scaleProto.scale = function (val) {
+	        var extent = this._extent;
+	        return val * (extent[1] - extent[0]) + extent[0];
+	    };
+
+	    /**
+	     * Set extent from data
+	     * @param {Array.<number>} other
+	     */
+	    scaleProto.unionExtent = function (other) {
+	        var extent = this._extent;
+	        other[0] < extent[0] && (extent[0] = other[0]);
+	        other[1] > extent[1] && (extent[1] = other[1]);
+	        // not setExtent because in log axis it may transformed to power
+	        // this.setExtent(extent[0], extent[1]);
+	    };
+
+	    /**
+	     * Set extent from data
+	     * @param {module:echarts/data/List} data
+	     * @param {string} dim
+	     */
+	    scaleProto.unionExtentFromData = function (data, dim) {
+	        this.unionExtent(data.getDataExtent(dim, true));
+	    };
+
+	    /**
+	     * Get extent
+	     * @return {Array.<number>}
+	     */
+	    scaleProto.getExtent = function () {
+	        return this._extent.slice();
+	    };
+
+	    /**
+	     * Set extent
+	     * @param {number} start
+	     * @param {number} end
+	     */
+	    scaleProto.setExtent = function (start, end) {
+	        var thisExtent = this._extent;
+	        if (!isNaN(start)) {
+	            thisExtent[0] = start;
+	        }
+	        if (!isNaN(end)) {
+	            thisExtent[1] = end;
+	        }
+	    };
+
+	    /**
+	     * @return {Array.<string>}
+	     */
+	    scaleProto.getTicksLabels = function () {
+	        var labels = [];
+	        var ticks = this.getTicks();
+	        for (var i = 0; i < ticks.length; i++) {
+	            labels.push(this.getLabel(ticks[i]));
+	        }
+	        return labels;
+	    };
+
+	    /**
+	     * When axis extent depends on data and no data exists,
+	     * axis ticks should not be drawn, which is named 'blank'.
+	     */
+	    scaleProto.isBlank = function () {
+	        return this._isBlank;
+	    },
+
+	    /**
+	     * When axis extent depends on data and no data exists,
+	     * axis ticks should not be drawn, which is named 'blank'.
+	     */
+	    scaleProto.setBlank = function (isBlank) {
+	        this._isBlank = isBlank;
+	    };
+
+
+	    clazzUtil.enableClassExtend(Scale);
+	    clazzUtil.enableClassManagement(Scale, {
+	        registerWhenExtend: true
+	    });
+
+	    module.exports = Scale;
+
+
+/***/ },
+/* 104 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Interval scale
+	 * @module echarts/scale/Interval
+	 */
+
+
+
+	    var numberUtil = __webpack_require__(7);
+	    var formatUtil = __webpack_require__(6);
+	    var Scale = __webpack_require__(103);
+	    var helper = __webpack_require__(105);
+
+	    var roundNumber = numberUtil.round;
+
+	    /**
+	     * @alias module:echarts/coord/scale/Interval
+	     * @constructor
+	     */
+	    var IntervalScale = Scale.extend({
+
+	        type: 'interval',
+
+	        _interval: 0,
+
+	        _intervalPrecision: 2,
+
+	        setExtent: function (start, end) {
+	            var thisExtent = this._extent;
+	            //start,end may be a Number like '25',so...
+	            if (!isNaN(start)) {
+	                thisExtent[0] = parseFloat(start);
+	            }
+	            if (!isNaN(end)) {
+	                thisExtent[1] = parseFloat(end);
+	            }
+	        },
+
+	        unionExtent: function (other) {
+	            var extent = this._extent;
+	            other[0] < extent[0] && (extent[0] = other[0]);
+	            other[1] > extent[1] && (extent[1] = other[1]);
+
+	            // unionExtent may called by it's sub classes
+	            IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]);
+	        },
+	        /**
+	         * Get interval
+	         */
+	        getInterval: function () {
+	            if (true) {
+	                if (this._interval == null) {
+	                    throw new Error('`nice` should be called firstly' );
+	                }
+	            }
+	            return this._interval;
+	        },
+
+	        /**
+	         * Set interval
+	         */
+	        setInterval: function (interval) {
+	            this._interval = interval;
+	            // Dropped auto calculated niceExtent and use user setted extent
+	            // We assume user wan't to set both interval, min, max to get a better result
+	            this._niceExtent = this._extent.slice();
+	        },
+
+	        /**
+	         * @return {Array.<number>}
+	         */
+	        getTicks: function () {
+	            if (true) {
+	                if (this._interval == null) {
+	                    throw new Error('`nice` should be called firstly' );
+	                }
+	            }
+	            return helper.intervalScaleGetTicks(
+	                this._interval, this._extent, this._niceExtent, this._intervalPrecision
+	            );
+	        },
+
+	        /**
+	         * @return {Array.<string>}
+	         */
+	        getTicksLabels: function () {
+	            var labels = [];
+	            var ticks = this.getTicks();
+	            for (var i = 0; i < ticks.length; i++) {
+	                labels.push(this.getLabel(ticks[i]));
+	            }
+	            return labels;
+	        },
+
+	        /**
+	         * @param {number} data
+	         * @param {Object} [opt]
+	         * @param {number|string} [opt.precision] If 'auto', use nice presision.
+	         * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2.
+	         * @return {string}
+	         */
+	        getLabel: function (data, opt) {
+	            if (data == null) {
+	                return '';
+	            }
+
+	            var precision = opt && opt.precision;
+
+	            if (precision == null) {
+	                precision = numberUtil.getPrecisionSafe(data) || 0;
+	            }
+	            else if (precision === 'auto') {
+	                // Should be more precise then tick.
+	                precision = this._intervalPrecision;
+	            }
+
+	            // (1) If `precision` is set, 12.005 should be display as '12.00500'.
+	            // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.
+	            data = roundNumber(data, precision, true);
+
+	            return formatUtil.addCommas(data);
+	        },
+
+	        /**
+	         * Update interval and extent of intervals for nice ticks
+	         *
+	         * @param {number} [splitNumber = 5] Desired number of ticks
+	         * @param {number} [minInterval]
+	         */
+	        niceTicks: function (splitNumber, minInterval) {
+	            splitNumber = splitNumber || 5;
+	            var extent = this._extent;
+	            var span = extent[1] - extent[0];
+	            if (!isFinite(span)) {
+	                return;
+	            }
+	            // User may set axis min 0 and data are all negative
+	            // FIXME If it needs to reverse ?
+	            if (span < 0) {
+	                span = -span;
+	                extent.reverse();
+	            }
+
+	            var result = helper.intervalScaleNiceTicks(extent, splitNumber, minInterval);
+
+	            this._intervalPrecision = result.intervalPrecision;
+	            this._interval = result.interval;
+	            this._niceExtent = result.niceTickExtent;
+	        },
+
+	        /**
+	         * Nice extent.
+	         * @param {Object} opt
+	         * @param {number} [opt.splitNumber = 5] Given approx tick number
+	         * @param {boolean} [opt.fixMin=false]
+	         * @param {boolean} [opt.fixMax=false]
+	         * @param {boolean} [opt.minInterval=false]
+	         */
+	        niceExtent: function (opt) {
+	            var extent = this._extent;
+	            // If extent start and end are same, expand them
+	            if (extent[0] === extent[1]) {
+	                if (extent[0] !== 0) {
+	                    // Expand extent
+	                    var expandSize = extent[0];
+	                    // In the fowllowing case
+	                    //      Axis has been fixed max 100
+	                    //      Plus data are all 100 and axis extent are [100, 100].
+	                    // Extend to the both side will cause expanded max is larger than fixed max.
+	                    // So only expand to the smaller side.
+	                    if (!opt.fixMax) {
+	                        extent[1] += expandSize / 2;
+	                        extent[0] -= expandSize / 2;
+	                    }
+	                    else {
+	                        extent[0] -= expandSize / 2;
+	                    }
+	                }
+	                else {
+	                    extent[1] = 1;
+	                }
+	            }
+	            var span = extent[1] - extent[0];
+	            // If there are no data and extent are [Infinity, -Infinity]
+	            if (!isFinite(span)) {
+	                extent[0] = 0;
+	                extent[1] = 1;
+	            }
+
+	            this.niceTicks(opt.splitNumber, opt.minInterval);
+
+	            // var extent = this._extent;
+	            var interval = this._interval;
+
+	            if (!opt.fixMin) {
+	                extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);
+	            }
+	            if (!opt.fixMax) {
+	                extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);
+	            }
+	        }
+	    });
+
+	    /**
+	     * @return {module:echarts/scale/Time}
+	     */
+	    IntervalScale.create = function () {
+	        return new IntervalScale();
+	    };
+
+	    module.exports = IntervalScale;
+
+
+
+/***/ },
+/* 105 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * For testable.
+	 */
+
+
+	    var numberUtil = __webpack_require__(7);
+
+	    var roundNumber = numberUtil.round;
+
+	    var helper = {};
+
+	    /**
+	     * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number.
+	     *                                Should be extent[0] < extent[1].
+	     * @param {number} splitNumber splitNumber should be >= 1.
+	     * @param {number} [minInterval]
+	     * @return {Object} {interval, intervalPrecision, niceTickExtent}
+	     */
+	    helper.intervalScaleNiceTicks = function (extent, splitNumber, minInterval) {
+	        var result = {};
+	        var span = extent[1] - extent[0];
+
+	        var interval = result.interval = numberUtil.nice(span / splitNumber, true);
+	        if (minInterval != null && interval < minInterval) {
+	            interval = result.interval = minInterval;
+	        }
+	        // Tow more digital for tick.
+	        var precision = result.intervalPrecision = numberUtil.getPrecisionSafe(interval) + 2;
+	        // Niced extent inside original extent
+	        var niceTickExtent = result.niceTickExtent = [
+	            roundNumber(Math.ceil(extent[0] / interval) * interval, precision),
+	            roundNumber(Math.floor(extent[1] / interval) * interval, precision)
+	        ];
+
+	        helper.fixExtent(niceTickExtent, extent);
+
+	        return result;
+	    };
+
+	    function clamp(niceTickExtent, idx, extent) {
+	        niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);
+	    }
+
+	    // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.
+	    helper.fixExtent = function (niceTickExtent, extent) {
+	        !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);
+	        !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);
+	        clamp(niceTickExtent, 0, extent);
+	        clamp(niceTickExtent, 1, extent);
+	        if (niceTickExtent[0] > niceTickExtent[1]) {
+	            niceTickExtent[0] = niceTickExtent[1];
+	        }
+	    };
+
+	    helper.intervalScaleGetTicks = function (interval, extent, niceTickExtent, intervalPrecision) {
+	        var ticks = [];
+
+	        // If interval is 0, return [];
+	        if (!interval) {
+	            return ticks;
+	        }
+
+	        // Consider this case: using dataZoom toolbox, zoom and zoom.
+	        var safeLimit = 10000;
+
+	        if (extent[0] < niceTickExtent[0]) {
+	            ticks.push(extent[0]);
+	        }
+	        var tick = niceTickExtent[0];
+
+	        while (tick <= niceTickExtent[1]) {
+	            ticks.push(tick);
+	            // Avoid rounding error
+	            tick = roundNumber(tick + interval, intervalPrecision);
+	            if (tick === ticks[ticks.length - 1]) {
+	                // Consider out of safe float point, e.g.,
+	                // -3711126.9907707 + 2e-10 === -3711126.9907707
+	                break;
+	            }
+	            if (ticks.length > safeLimit) {
+	                return [];
+	            }
+	        }
+	        // Consider this case: the last item of ticks is smaller
+	        // than niceTickExtent[1] and niceTickExtent[1] === extent[1].
+	        if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {
+	            ticks.push(extent[1]);
+	        }
+
+	        return ticks;
+	    };
+
+	    module.exports = helper;
+
+
+/***/ },
+/* 106 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Interval scale
+	 * @module echarts/coord/scale/Time
+	 */
+
+
+
+	    // [About UTC and local time zone]:
+	    // In most cases, `number.parseDate` will treat input data string as local time
+	    // (except time zone is specified in time string). And `format.formateTime` returns
+	    // local time by default. option.useUTC is false by default. This design have
+	    // concidered these common case:
+	    // (1) Time that is persistent in server is in UTC, but it is needed to be diplayed
+	    // in local time by default.
+	    // (2) By default, the input data string (e.g., '2011-01-02') should be displayed
+	    // as its original time, without any time difference.
+
+	    var zrUtil = __webpack_require__(4);
+	    var numberUtil = __webpack_require__(7);
+	    var formatUtil = __webpack_require__(6);
+	    var scaleHelper = __webpack_require__(105);
+
+	    var IntervalScale = __webpack_require__(104);
+
+	    var intervalScaleProto = IntervalScale.prototype;
+
+	    var mathCeil = Math.ceil;
+	    var mathFloor = Math.floor;
+	    var ONE_SECOND = 1000;
+	    var ONE_MINUTE = ONE_SECOND * 60;
+	    var ONE_HOUR = ONE_MINUTE * 60;
+	    var ONE_DAY = ONE_HOUR * 24;
+
+	    // FIXME 公用？
+	    var bisect = function (a, x, lo, hi) {
+	        while (lo < hi) {
+	            var mid = lo + hi >>> 1;
+	            if (a[mid][2] < x) {
+	                lo = mid + 1;
+	            }
+	            else {
+	                hi  = mid;
+	            }
+	        }
+	        return lo;
+	    };
+
+	    /**
+	     * @alias module:echarts/coord/scale/Time
+	     * @constructor
+	     */
+	    var TimeScale = IntervalScale.extend({
+	        type: 'time',
+
+	        /**
+	         * @override
+	         */
+	        getLabel: function (val) {
+	            var stepLvl = this._stepLvl;
+
+	            var date = new Date(val);
+
+	            return formatUtil.formatTime(stepLvl[0], date, this.getSetting('useUTC'));
+	        },
+
+	        /**
+	         * @override
+	         */
+	        niceExtent: function (opt) {
+	            var extent = this._extent;
+	            // If extent start and end are same, expand them
+	            if (extent[0] === extent[1]) {
+	                // Expand extent
+	                extent[0] -= ONE_DAY;
+	                extent[1] += ONE_DAY;
+	            }
+	            // If there are no data and extent are [Infinity, -Infinity]
+	            if (extent[1] === -Infinity && extent[0] === Infinity) {
+	                var d = new Date();
+	                extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate());
+	                extent[0] = extent[1] - ONE_DAY;
+	            }
+
+	            this.niceTicks(opt.splitNumber);
+
+	            // var extent = this._extent;
+	            var interval = this._interval;
+
+	            if (!opt.fixMin) {
+	                extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval);
+	            }
+	            if (!opt.fixMax) {
+	                extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval);
+	            }
+	        },
+
+	        /**
+	         * @override
+	         */
+	        niceTicks: function (approxTickNum) {
+	            var timezoneOffset = this.getSetting('useUTC')
+	                ? 0 : numberUtil.getTimezoneOffset() * 60 * 1000;
+	            approxTickNum = approxTickNum || 10;
+
+	            var extent = this._extent;
+	            var span = extent[1] - extent[0];
+	            var approxInterval = span / approxTickNum;
+	            var scaleLevelsLen = scaleLevels.length;
+	            var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen);
+
+	            var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)];
+	            var interval = level[2];
+	            // Same with interval scale if span is much larger than 1 year
+	            if (level[0] === 'year') {
+	                var yearSpan = span / interval;
+
+	                // From "Nice Numbers for Graph Labels" of Graphic Gems
+	                // var niceYearSpan = numberUtil.nice(yearSpan, false);
+	                var yearStep = numberUtil.nice(yearSpan / approxTickNum, true);
+
+	                interval *= yearStep;
+	            }
+
+	            var niceExtent = [
+	                Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset),
+	                Math.round(mathFloor((extent[1] - timezoneOffset)/ interval) * interval + timezoneOffset)
+	            ];
+
+	            scaleHelper.fixExtent(niceExtent, extent);
+
+	            this._stepLvl = level;
+	            // Interval will be used in getTicks
+	            this._interval = interval;
+	            this._niceExtent = niceExtent;
+	        },
+
+	        parse: function (val) {
+	            // val might be float.
+	            return +numberUtil.parseDate(val);
+	        }
+	    });
+
+	    zrUtil.each(['contain', 'normalize'], function (methodName) {
+	        TimeScale.prototype[methodName] = function (val) {
+	            return intervalScaleProto[methodName].call(this, this.parse(val));
+	        };
+	    });
+
+	    // Steps from d3
+	    var scaleLevels = [
+	        // Format       step    interval
+	        ['hh:mm:ss',    1,      ONE_SECOND],           // 1s
+	        ['hh:mm:ss',    5,      ONE_SECOND * 5],       // 5s
+	        ['hh:mm:ss',    10,     ONE_SECOND * 10],      // 10s
+	        ['hh:mm:ss',    15,     ONE_SECOND * 15],      // 15s
+	        ['hh:mm:ss',    30,     ONE_SECOND * 30],      // 30s
+	        ['hh:mm\nMM-dd',1,      ONE_MINUTE],          // 1m
+	        ['hh:mm\nMM-dd',5,      ONE_MINUTE * 5],      // 5m
+	        ['hh:mm\nMM-dd',10,     ONE_MINUTE * 10],     // 10m
+	        ['hh:mm\nMM-dd',15,     ONE_MINUTE * 15],     // 15m
+	        ['hh:mm\nMM-dd',30,     ONE_MINUTE * 30],     // 30m
+	        ['hh:mm\nMM-dd',1,      ONE_HOUR],        // 1h
+	        ['hh:mm\nMM-dd',2,      ONE_HOUR * 2],    // 2h
+	        ['hh:mm\nMM-dd',6,      ONE_HOUR * 6],    // 6h
+	        ['hh:mm\nMM-dd',12,     ONE_HOUR * 12],   // 12h
+	        ['MM-dd\nyyyy', 1,      ONE_DAY],   // 1d
+	        ['week',        7,      ONE_DAY * 7],        // 7d
+	        ['month',       1,      ONE_DAY * 31],       // 1M
+	        ['quarter',     3,      ONE_DAY * 380 / 4],  // 3M
+	        ['half-year',   6,      ONE_DAY * 380 / 2],  // 6M
+	        ['year',        1,      ONE_DAY * 380]       // 1Y
+	    ];
+
+	    /**
+	     * @param {module:echarts/model/Model}
+	     * @return {module:echarts/scale/Time}
+	     */
+	    TimeScale.create = function (model) {
+	        return new TimeScale({useUTC: model.ecModel.get('useUTC')});
+	    };
+
+	    module.exports = TimeScale;
+
+
+/***/ },
+/* 107 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Log scale
+	 * @module echarts/scale/Log
+	 */
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var Scale = __webpack_require__(103);
+	    var numberUtil = __webpack_require__(7);
+
+	    // Use some method of IntervalScale
+	    var IntervalScale = __webpack_require__(104);
+
+	    var scaleProto = Scale.prototype;
+	    var intervalScaleProto = IntervalScale.prototype;
+
+	    var getPrecisionSafe = numberUtil.getPrecisionSafe;
+	    var roundingErrorFix = numberUtil.round;
+
+	    var mathFloor = Math.floor;
+	    var mathCeil = Math.ceil;
+	    var mathPow = Math.pow;
+
+	    var mathLog = Math.log;
+
+	    var LogScale = Scale.extend({
+
+	        type: 'log',
+
+	        base: 10,
+
+	        $constructor: function () {
+	            Scale.apply(this, arguments);
+	            this._originalScale = new IntervalScale();
+	        },
+
+	        /**
+	         * @return {Array.<number>}
+	         */
+	        getTicks: function () {
+	            var originalScale = this._originalScale;
+	            var extent = this._extent;
+	            var originalExtent = originalScale.getExtent();
+
+	            return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) {
+	                var powVal = numberUtil.round(mathPow(this.base, val));
+
+	                // Fix #4158
+	                powVal = (val === extent[0] && originalScale.__fixMin)
+	                    ? fixRoundingError(powVal, originalExtent[0])
+	                    : powVal;
+	                powVal = (val === extent[1] && originalScale.__fixMax)
+	                    ? fixRoundingError(powVal, originalExtent[1])
+	                    : powVal;
+
+	                return powVal;
+	            }, this);
+	        },
+
+	        /**
+	         * @param {number} val
+	         * @return {string}
+	         */
+	        getLabel: intervalScaleProto.getLabel,
+
+	        /**
+	         * @param  {number} val
+	         * @return {number}
+	         */
+	        scale: function (val) {
+	            val = scaleProto.scale.call(this, val);
+	            return mathPow(this.base, val);
+	        },
+
+	        /**
+	         * @param {number} start
+	         * @param {number} end
+	         */
+	        setExtent: function (start, end) {
+	            var base = this.base;
+	            start = mathLog(start) / mathLog(base);
+	            end = mathLog(end) / mathLog(base);
+	            intervalScaleProto.setExtent.call(this, start, end);
+	        },
+
+	        /**
+	         * @return {number} end
+	         */
+	        getExtent: function () {
+	            var base = this.base;
+	            var extent = scaleProto.getExtent.call(this);
+	            extent[0] = mathPow(base, extent[0]);
+	            extent[1] = mathPow(base, extent[1]);
+
+	            // Fix #4158
+	            var originalScale = this._originalScale;
+	            var originalExtent = originalScale.getExtent();
+	            originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));
+	            originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));
+
+	            return extent;
+	        },
+
+	        /**
+	         * @param  {Array.<number>} extent
+	         */
+	        unionExtent: function (extent) {
+	            this._originalScale.unionExtent(extent);
+
+	            var base = this.base;
+	            extent[0] = mathLog(extent[0]) / mathLog(base);
+	            extent[1] = mathLog(extent[1]) / mathLog(base);
+	            scaleProto.unionExtent.call(this, extent);
+	        },
+
+	        /**
+	         * @override
+	         */
+	        unionExtentFromData: function (data, dim) {
+	            this.unionExtent(data.getDataExtent(dim, true, function (val) {
+	                return val > 0;
+	            }));
+	        },
+
+	        /**
+	         * Update interval and extent of intervals for nice ticks
+	         * @param  {number} [approxTickNum = 10] Given approx tick number
+	         */
+	        niceTicks: function (approxTickNum) {
+	            approxTickNum = approxTickNum || 10;
+	            var extent = this._extent;
+	            var span = extent[1] - extent[0];
+	            if (span === Infinity || span <= 0) {
+	                return;
+	            }
+
+	            var interval = numberUtil.quantity(span);
+	            var err = approxTickNum / span * interval;
+
+	            // Filter ticks to get closer to the desired count.
+	            if (err <= 0.5) {
+	                interval *= 10;
+	            }
+
+	            // Interval should be integer
+	            while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {
+	                interval *= 10;
+	            }
+
+	            var niceExtent = [
+	                numberUtil.round(mathCeil(extent[0] / interval) * interval),
+	                numberUtil.round(mathFloor(extent[1] / interval) * interval)
+	            ];
+
+	            this._interval = interval;
+	            this._niceExtent = niceExtent;
+	        },
+
+	        /**
+	         * Nice extent.
+	         * @override
+	         */
+	        niceExtent: function (opt) {
+	            intervalScaleProto.niceExtent.call(this, opt);
+
+	            var originalScale = this._originalScale;
+	            originalScale.__fixMin = opt.fixMin;
+	            originalScale.__fixMax = opt.fixMax;
+	        }
+
+	    });
+
+	    zrUtil.each(['contain', 'normalize'], function (methodName) {
+	        LogScale.prototype[methodName] = function (val) {
+	            val = mathLog(val) / mathLog(this.base);
+	            return scaleProto[methodName].call(this, val);
+	        };
+	    });
+
+	    LogScale.create = function () {
+	        return new LogScale();
+	    };
+
+	    function fixRoundingError(val, originalVal) {
+	        return roundingErrorFix(val, getPrecisionSafe(originalVal));
+	    }
+
+	    module.exports = LogScale;
+
+
+/***/ },
+/* 108 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+
+	    var createListFromArray = __webpack_require__(109);
+	    var symbolUtil = __webpack_require__(111);
+	    var axisHelper = __webpack_require__(101);
 	    var axisModelCommonMixin = __webpack_require__(112);
 	    var Model = __webpack_require__(12);
 	    var util = __webpack_require__(4);
@@ -23740,16 +25214,9 @@
 	        },
 
 	        /**
-	         * Complete the dimensions array guessed from the data structure.
-	         * @param  {Array.<string>} dimensions Necessary dimensions, like ['x', 'y']
-	         * @param  {Array} data Data list. [[1, 2, 3], [2, 3, 4]]
-	         * @param  {Object} [opt]
-	         * @param  {Array.<string>} [opt.defaultNames] Default names to fill not necessary dimensions, like ['value']
-	         * @param  {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
-	         * @param  {number} [opt.dimCount] If not specified, guess by the first data item.
-	         * @return {Array.<string>}
+	         * @see {module:echarts/data/helper/completeDimensions}
 	         */
-	        completeDimensions: __webpack_require__(103),
+	        completeDimensions: __webpack_require__(110),
 
 	        /**
 	         * Create a symbol element with given symbol configuration: shape, x, y, width, height, color
@@ -23801,17 +25268,17 @@
 
 
 /***/ },
-/* 102 */
+/* 109 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var List = __webpack_require__(98);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
-	    var CoordinateSystem = __webpack_require__(26);
+	    var CoordinateSystem = __webpack_require__(76);
 	    var getDataItemValue = modelUtil.getDataItemValue;
 	    var converDataValue = modelUtil.converDataValue;
 
@@ -23844,8 +25311,13 @@
 	        var coordSysName = seriesModel.get('coordinateSystem');
 	        var creator = creators[coordSysName];
 	        var registeredCoordSys = CoordinateSystem.get(coordSysName);
+	        var completeDimOpt = {
+	            encodeDef: seriesModel.get('encode'),
+	            dimsDef: seriesModel.get('dimensions')
+	        };
+
 	        // FIXME
-	        var axesInfo = creator && creator(data, seriesModel, ecModel);
+	        var axesInfo = creator && creator(data, seriesModel, ecModel, completeDimOpt);
 	        var dimensions = axesInfo && axesInfo.dimensions;
 	        if (!dimensions) {
 	            // Get dimensions from registered coordinate system
@@ -23854,7 +25326,7 @@
 	                    ? registeredCoordSys.getDimensionsInfo()
 	                    : registeredCoordSys.dimensions.slice()
 	            )) || ['x', 'y'];
-	            dimensions = completeDimensions(dimensions, data, {defaultNames: dimensions.concat(['value'])});
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 	        }
 
 	        var categoryIndex = axesInfo ? axesInfo.categoryIndex : -1;
@@ -23924,7 +25396,7 @@
 	     */
 	    var creators = {
 
-	        cartesian2d: function (data, seriesModel, ecModel) {
+	        cartesian2d: function (data, seriesModel, ecModel, completeDimOpt) {
 
 	            var axesModels = zrUtil.map(['xAxis', 'yAxis'], function (name) {
 	                return ecModel.queryComponents({
@@ -23973,7 +25445,7 @@
 	            var isXAxisCateogry = xAxisType === 'category';
 	            var isYAxisCategory = yAxisType === 'category';
 
-	            completeDimensions(dimensions, data, {defaultNames: ['x', 'y', 'z']});
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 
 	            var categoryAxesModels = {};
 	            if (isXAxisCateogry) {
@@ -23989,7 +25461,7 @@
 	            };
 	        },
 
-	        singleAxis: function (data, seriesModel, ecModel) {
+	        singleAxis: function (data, seriesModel, ecModel, completeDimOpt) {
 
 	            var singleAxisModel = ecModel.queryComponents({
 	                mainType: 'singleAxis',
@@ -24012,7 +25484,7 @@
 	                stackable: isStackable(singleAxisType)
 	            }];
 
-	            completeDimensions(dimensions, data);
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 
 	            var categoryAxesModels = {};
 	            if (isCategory) {
@@ -24026,7 +25498,7 @@
 	            };
 	        },
 
-	        polar: function (data, seriesModel, ecModel) {
+	        polar: function (data, seriesModel, ecModel, completeDimOpt) {
 	            var polarModel = ecModel.queryComponents({
 	                mainType: 'polar',
 	                index: seriesModel.get('polarIndex'),
@@ -24063,7 +25535,7 @@
 	            var isAngleAxisCateogry = angleAxisType === 'category';
 	            var isRadiusAxisCateogry = radiusAxisType === 'category';
 
-	            completeDimensions(dimensions, data, {defaultNames: ['radius', 'angle', 'value']});
+	            dimensions = completeDimensions(dimensions, data, completeDimOpt);
 
 	            var categoryAxesModels = {};
 	            if (isRadiusAxisCateogry) {
@@ -24079,14 +25551,14 @@
 	            };
 	        },
 
-	        geo: function (data, seriesModel, ecModel) {
+	        geo: function (data, seriesModel, ecModel, completeDimOpt) {
 	            // TODO Region
 	            // 多个散点图系列在同一个地区的时候
 	            return {
 	                dimensions: completeDimensions([
 	                    {name: 'lng'},
 	                    {name: 'lat'}
-	                ], data, {defaultNames: ['lng', 'lat', 'value']})
+	                ], data, completeDimOpt)
 	            };
 	        }
 	    };
@@ -24129,7 +25601,7 @@
 
 
 /***/ },
-/* 103 */
+/* 110 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -24138,42 +25610,202 @@
 
 
 	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+	    var each = zrUtil.each;
+	    var isString = zrUtil.isString;
+	    var defaults = zrUtil.defaults;
+	    var normalizeToArray = modelUtil.normalizeToArray;
+
+	    var OTHER_DIMS = {tooltip: 1, label: 1, itemName: 1};
 
 	    /**
-	     * Complete the dimensions array guessed from the data structure.
-	     * @param  {Array.<string>} dimensions Necessary dimensions, like ['x', 'y']
-	     * @param  {Array} data Data list. [[1, 2, 3], [2, 3, 4]]
-	     * @param  {Object} [opt]
-	     * @param  {Array.<string>} [opt.defaultNames] Default names to fill not necessary dimensions, like ['value']
-	     * @param  {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
-	     * @param  {number} [opt.dimCount] If not specified, guess by the first data item.
-	     * @return {Array.<string>}
+	     * Complete the dimensions array, by user defined `dimension` and `encode`,
+	     * and guessing from the data structure.
+	     * If no 'value' dimension specified, the first no-named dimension will be
+	     * named as 'value'.
+	     *
+	     * @param {Array.<string>} sysDims Necessary dimensions, like ['x', 'y'], which
+	     *      provides not only dim template, but also default order.
+	     *      `name` of each item provides default coord name.
+	     *      [{dimsDef: []}, ...] can be specified to give names.
+	     * @param {Array} data Data list. [[1, 2, 3], [2, 3, 4]].
+	     * @param {Object} [opt]
+	     * @param {Array.<Object|string>} [opt.dimsDef] option.series.dimensions User defined dimensions
+	     *      For example: ['asdf', {name, type}, ...].
+	     * @param {Object} [opt.encodeDef] option.series.encode {x: 2, y: [3, 1], tooltip: [1, 2], label: 3}
+	     * @param {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.
+	     * @param {string} [opt.extraFromZero] If specified, extra dim names will be:
+	     *                      extraPrefix + 0, extraPrefix + extraBaseIndex + 1 ...
+	     *                      If not specified, extra dim names will be:
+	     *                      extraPrefix, extraPrefix + 0, extraPrefix + 1 ...
+	     * @param {number} [opt.dimCount] If not specified, guess by the first data item.
+	     * @return {Array.<Object>} [{
+	     *      name: string mandatory,
+	     *      coordDim: string mandatory,
+	     *      coordDimIndex: number mandatory,
+	     *      type: string optional,
+	     *      tooltipName: string optional,
+	     *      otherDims: {
+	     *          tooltip: number optional,
+	     *          label: number optional
+	     *      },
+	     *      isExtraCoord: boolean true or undefined.
+	     *      other props ...
+	     * }]
 	     */
-	    function completeDimensions(dimensions, data, opt) {
-	        if (!data) {
-	            return dimensions;
-	        }
-
+	    function completeDimensions(sysDims, data, opt) {
+	        data = data || [];
 	        opt = opt || {};
+	        sysDims = (sysDims || []).slice();
+	        var dimsDef = (opt.dimsDef || []).slice();
+	        var encodeDef = zrUtil.createHashMap(opt.encodeDef);
+	        var dataDimNameMap = zrUtil.createHashMap();
+	        var coordDimNameMap = zrUtil.createHashMap();
+	        // var valueCandidate;
+	        var result = [];
 
 	        var dimCount = opt.dimCount;
 	        if (dimCount == null) {
 	            var value0 = retrieveValue(data[0]);
-	            dimCount = zrUtil.isArray(value0) && value0.length || 1;
+	            dimCount = Math.max(
+	                zrUtil.isArray(value0) && value0.length || 1,
+	                sysDims.length,
+	                dimsDef.length
+	            );
+	            each(sysDims, function (sysDimItem) {
+	                var sysDimItemDimsDef = sysDimItem.dimsDef;
+	                sysDimItemDimsDef && (dimCount = Math.max(dimCount, sysDimItemDimsDef.length));
+	            });
 	        }
 
-	        var defaultNames = opt.defaultNames || [];
-	        var extraPrefix = opt.extraPrefix || 'extra';
+	        // Apply user defined dims (`name` and `type`) and init result.
 	        for (var i = 0; i < dimCount; i++) {
-	            if (!dimensions[i]) {
-	                var name = defaultNames[i] || (extraPrefix + (i - defaultNames.length));
-	                dimensions[i] = guessOrdinal(data, i)
-	                    ? {type: 'ordinal', name: name}
-	                    : name;
+	            var dimDefItem = isString(dimsDef[i]) ? {name: dimsDef[i]} : (dimsDef[i] || {});
+	            var userDimName = dimDefItem.name;
+	            var resultItem = result[i] = {otherDims: {}};
+	            // Name will be applied later for avoiding duplication.
+	            if (userDimName != null && dataDimNameMap.get(userDimName) == null) {
+	                // Only if `series.dimensions` is defined in option, tooltipName
+	                // will be set, and dimension will be diplayed vertically in
+	                // tooltip by default.
+	                resultItem.name = resultItem.tooltipName = userDimName;
+	                dataDimNameMap.set(userDimName, i);
+	            }
+	            dimDefItem.type != null && (resultItem.type = dimDefItem.type);
+	        }
+
+	        // Set `coordDim` and `coordDimIndex` by `encodeDef` and normalize `encodeDef`.
+	        encodeDef.each(function (dataDims, coordDim) {
+	            dataDims = encodeDef.set(coordDim, normalizeToArray(dataDims).slice());
+	            each(dataDims, function (resultDimIdx, coordDimIndex) {
+	                // The input resultDimIdx can be dim name or index.
+	                isString(resultDimIdx) && (resultDimIdx = dataDimNameMap.get(resultDimIdx));
+	                if (resultDimIdx != null && resultDimIdx < dimCount) {
+	                    dataDims[coordDimIndex] = resultDimIdx;
+	                    applyDim(result[resultDimIdx], coordDim, coordDimIndex);
+	                    // coordDim === 'value' && valueCandidate == null && (valueCandidate = resultDimIdx);
+	                }
+	            });
+	        });
+
+	        // Apply templetes and default order from `sysDims`.
+	        var availDimIdx = 0;
+	        each(sysDims, function (sysDimItem, sysDimIndex) {
+	            var coordDim;
+	            var sysDimItem;
+	            var sysDimItemDimsDef;
+	            var sysDimItemOtherDims;
+	            if (isString(sysDimItem)) {
+	                coordDim = sysDimItem;
+	                sysDimItem = {};
+	            }
+	            else {
+	                coordDim = sysDimItem.name;
+	                sysDimItem = zrUtil.clone(sysDimItem);
+	                // `coordDimIndex` should not be set directly.
+	                sysDimItemDimsDef = sysDimItem.dimsDef;
+	                sysDimItemOtherDims = sysDimItem.otherDims;
+	                sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex
+	                    = sysDimItem.dimsDef = sysDimItem.otherDims = null;
+	            }
+
+	            var dataDims = normalizeToArray(encodeDef.get(coordDim));
+	            // dimensions provides default dim sequences.
+	            if (!dataDims.length) {
+	                for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) {
+	                    while (availDimIdx < result.length && result[availDimIdx].coordDim != null) {
+	                        availDimIdx++;
+	                    }
+	                    availDimIdx < result.length && dataDims.push(availDimIdx++);
+	                }
+	            }
+	            // Apply templates.
+	            each(dataDims, function (resultDimIdx, coordDimIndex) {
+	                var resultItem = result[resultDimIdx];
+	                applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex);
+	                // coordDim === 'value' && valueCandidate == null && (valueCandidate = resultDimIdx);
+	                if (resultItem.name == null && sysDimItemDimsDef) {
+	                    resultItem.name = resultItem.tooltipName = sysDimItemDimsDef[coordDimIndex];
+	                }
+	                sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims);
+	            });
+	        });
+
+	        // Make sure the first extra dim is 'value'.
+	        var extra = opt.extraPrefix || 'value';
+
+	        // Set dim `name` and other `coordDim` and other props.
+	        for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) {
+	            var resultItem = result[resultDimIdx] = result[resultDimIdx] || {};
+	            var coordDim = resultItem.coordDim;
+
+	            coordDim == null && (
+	                resultItem.coordDim = genName(extra, coordDimNameMap, opt.extraFromZero),
+	                resultItem.coordDimIndex = 0,
+	                resultItem.isExtraCoord = true
+	            );
+
+	            resultItem.name == null && (resultItem.name = genName(
+	                // Ensure At least one value dim.
+	                // (dataDimNameMap.get('value') == null
+	                //     && (valueCandidate == null || valueCandidate === resultDimIdx)
+	                //     // Try to set as 'value' only if coordDim is not set as 'extra'.
+	                //     && coordDim == null
+	                // )
+	                // ? 'value'
+	                // :
+	                resultItem.coordDim,
+	                dataDimNameMap
+	            ));
+
+	            resultItem.type == null && guessOrdinal(data, resultDimIdx)
+	                && (resultItem.type = 'ordinal');
+	        }
+
+	        return result;
+
+	        function applyDim(resultItem, coordDim, coordDimIndex) {
+	            if (OTHER_DIMS[coordDim]) {
+	                resultItem.otherDims[coordDim] = coordDimIndex;
+	            }
+	            else {
+	                resultItem.coordDim = coordDim;
+	                resultItem.coordDimIndex = coordDimIndex;
+	                coordDimNameMap.set(coordDim, true);
 	            }
 	        }
 
-	        return dimensions;
+	        function genName(name, map, fromZero) {
+	            if (fromZero || map.get(name) != null) {
+	                var i = 0;
+	                while (map.get(name + i) != null) {
+	                    i++;
+	                }
+	                name += i;
+	            }
+	            map.set(name, true);
+	            return name;
+	        }
 	    }
 
 	    // The rule should not be complex, otherwise user might not
@@ -24187,10 +25819,11 @@
 	            }
 
 	            var value = value[dimIndex];
+	            // Consider usage convenience, '1', '2' will be treated as "number".
 	            if (value != null && isFinite(value)) {
 	                return false;
 	            }
-	            else if (zrUtil.isString(value) && value !== '-') {
+	            else if (isString(value) && value !== '-') {
 	                return true;
 	            }
 	        }
@@ -24206,14 +25839,14 @@
 
 
 /***/ },
-/* 104 */
+/* 111 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	// Symbol factory
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var BoundingRect = __webpack_require__(9);
 
 	    /**
@@ -24568,1253 +26201,20 @@
 
 
 /***/ },
-/* 105 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-
-	    var OrdinalScale = __webpack_require__(106);
-	    var IntervalScale = __webpack_require__(108);
-	    __webpack_require__(110);
-	    __webpack_require__(111);
-	    var Scale = __webpack_require__(107);
-
-	    var numberUtil = __webpack_require__(7);
-	    var zrUtil = __webpack_require__(4);
-	    var textContain = __webpack_require__(8);
-	    var axisHelper = {};
-
-	    /**
-	     * Get axis scale extent before niced.
-	     * Item of returned array can only be number (including Infinity and NaN).
-	     */
-	    axisHelper.getScaleExtent = function (scale, model) {
-	        var scaleType = scale.type;
-
-	        var min = model.getMin();
-	        var max = model.getMax();
-	        var fixMin = min != null;
-	        var fixMax = max != null;
-	        var originalExtent = scale.getExtent();
-
-	        var axisDataLen;
-	        var boundaryGap;
-	        var span;
-	        if (scaleType === 'ordinal') {
-	            axisDataLen = (model.get('data') || []).length;
-	        }
-	        else {
-	            boundaryGap = model.get('boundaryGap');
-	            if (!zrUtil.isArray(boundaryGap)) {
-	                boundaryGap = [boundaryGap || 0, boundaryGap || 0];
-	            }
-	            if (typeof boundaryGap[0] === 'boolean') {
-	                if (true) {
-	                    console.warn('Boolean type for boundaryGap is only '
-	                        + 'allowed for ordinal axis. Please use string in '
-	                        + 'percentage instead, e.g., "20%". Currently, '
-	                        + 'boundaryGap is set to be 0.');
-	                }
-	                boundaryGap = [0, 0];
-	            }
-	            boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1);
-	            boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1);
-	            span = (originalExtent[1] - originalExtent[0])
-	                || Math.abs(originalExtent[0]);
-	        }
-
-	        // Notice: When min/max is not set (that is, when there are null/undefined,
-	        // which is the most common case), these cases should be ensured:
-	        // (1) For 'ordinal', show all axis.data.
-	        // (2) For others:
-	        //      + `boundaryGap` is applied (if min/max set, boundaryGap is
-	        //      disabled).
-	        //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should
-	        //      be the result that originalExtent enlarged by boundaryGap.
-	        // (3) If no data, it should be ensured that `scale.setBlank` is set.
-
-	        // FIXME
-	        // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used?
-	        // (2) When `needCrossZero` and all data is positive/negative, should it be ensured
-	        // that the results processed by boundaryGap are positive/negative?
-
-	        if (min == null) {
-	            min = scaleType === 'ordinal'
-	                ? (axisDataLen ? 0 : NaN)
-	                : originalExtent[0] - boundaryGap[0] * span;
-	        }
-	        if (max == null) {
-	            max = scaleType === 'ordinal'
-	                ? (axisDataLen ? axisDataLen - 1 : NaN)
-	                : originalExtent[1] + boundaryGap[1] * span;
-	        }
-
-	        if (min === 'dataMin') {
-	            min = originalExtent[0];
-	        }
-	        if (max === 'dataMax') {
-	            max = originalExtent[1];
-	        }
-
-	        (min == null || !isFinite(min)) && (min = NaN);
-	        (max == null || !isFinite(max)) && (max = NaN);
-
-	        scale.setBlank(zrUtil.eqNaN(min) || zrUtil.eqNaN(max));
-
-	        // Evaluate if axis needs cross zero
-	        if (model.getNeedCrossZero()) {
-	            // Axis is over zero and min is not set
-	            if (min > 0 && max > 0 && !fixMin) {
-	                min = 0;
-	            }
-	            // Axis is under zero and max is not set
-	            if (min < 0 && max < 0 && !fixMax) {
-	                max = 0;
-	            }
-	        }
-
-	        return [min, max];
-	    };
-
-	    axisHelper.niceScaleExtent = function (scale, model) {
-	        var extent = axisHelper.getScaleExtent(scale, model);
-	        var fixMin = model.getMin() != null;
-	        var fixMax = model.getMax() != null;
-	        var splitNumber = model.get('splitNumber');
-
-	        if (scale.type === 'log') {
-	            scale.base = model.get('logBase');
-	        }
-
-	        scale.setExtent(extent[0], extent[1]);
-	        scale.niceExtent(splitNumber, fixMin, fixMax);
-
-	        // Use minInterval to constraint the calculated interval.
-	        // If calculated interval is less than minInterval. increase the interval quantity until
-	        // it is larger than minInterval.
-	        // For example:
-	        //  minInterval is 1, calculated interval is 0.2, so increase it to be 1. In this way we can get
-	        //  an integer axis.
-	        var minInterval = model.get('minInterval');
-	        if (isFinite(minInterval) && !fixMin && !fixMax && scale.type === 'interval') {
-	            var interval = scale.getInterval();
-	            var intervalScale = Math.max(Math.abs(interval), minInterval) / interval;
-	            // while (interval < minInterval) {
-	            //     var quantity = numberUtil.quantity(interval);
-	            //     interval = quantity * 10;
-	            //     scaleQuantity *= 10;
-	            // }
-	            extent = scale.getExtent();
-	            var origin = (extent[1] + extent[0]) / 2;
-	            scale.setExtent(
-	                intervalScale * (extent[0] - origin) + origin,
-	                intervalScale * (extent[1] - origin) + origin
-	            );
-	            scale.niceExtent(splitNumber);
-	        }
-
-	        // If some one specified the min, max. And the default calculated interval
-	        // is not good enough. He can specify the interval. It is often appeared
-	        // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard
-	        // to be 60.
-	        // FIXME
-	        var interval = model.get('interval');
-	        if (interval != null) {
-	            scale.setInterval && scale.setInterval(interval);
-	        }
-	    };
-
-	    /**
-	     * @param {module:echarts/model/Model} model
-	     * @param {string} [axisType] Default retrieve from model.type
-	     * @return {module:echarts/scale/*}
-	     */
-	    axisHelper.createScaleByModel = function(model, axisType) {
-	        axisType = axisType || model.get('type');
-	        if (axisType) {
-	            switch (axisType) {
-	                // Buildin scale
-	                case 'category':
-	                    return new OrdinalScale(
-	                        model.getCategories(), [Infinity, -Infinity]
-	                    );
-	                case 'value':
-	                    return new IntervalScale();
-	                // Extended scale, like time and log
-	                default:
-	                    return (Scale.getClass(axisType) || IntervalScale).create(model);
-	            }
-	        }
-	    };
-
-	    /**
-	     * Check if the axis corss 0
-	     */
-	    axisHelper.ifAxisCrossZero = function (axis) {
-	        var dataExtent = axis.scale.getExtent();
-	        var min = dataExtent[0];
-	        var max = dataExtent[1];
-	        return !((min > 0 && max > 0) || (min < 0 && max < 0));
-	    };
-
-	    /**
-	     * @param {Array.<number>} tickCoords In axis self coordinate.
-	     * @param {Array.<string>} labels
-	     * @param {string} font
-	     * @param {boolean} isAxisHorizontal
-	     * @return {number}
-	     */
-	    axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) {
-	        // FIXME
-	        // 不同角的axis和label，不只是horizontal和vertical.
-
-	        var textSpaceTakenRect;
-	        var autoLabelInterval = 0;
-	        var accumulatedLabelInterval = 0;
-
-	        var step = 1;
-	        if (labels.length > 40) {
-	            // Simple optimization for large amount of labels
-	            step = Math.floor(labels.length / 40);
-	        }
-
-	        for (var i = 0; i < tickCoords.length; i += step) {
-	            var tickCoord = tickCoords[i];
-	            var rect = textContain.getBoundingRect(
-	                labels[i], font, 'center', 'top'
-	            );
-	            rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord;
-	            // FIXME Magic number 1.5
-	            rect[isAxisHorizontal ? 'width' : 'height'] *= 1.3;
-	            if (!textSpaceTakenRect) {
-	                textSpaceTakenRect = rect.clone();
-	            }
-	            // There is no space for current label;
-	            else if (textSpaceTakenRect.intersect(rect)) {
-	                accumulatedLabelInterval++;
-	                autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval);
-	            }
-	            else {
-	                textSpaceTakenRect.union(rect);
-	                // Reset
-	                accumulatedLabelInterval = 0;
-	            }
-	        }
-	        if (autoLabelInterval === 0 && step > 1) {
-	            return step;
-	        }
-	        return (autoLabelInterval + 1) * step - 1;
-	    };
-
-	    /**
-	     * @param {Object} axis
-	     * @param {Function} labelFormatter
-	     * @return {Array.<string>}
-	     */
-	    axisHelper.getFormattedLabels = function (axis, labelFormatter) {
-	        var scale = axis.scale;
-	        var labels = scale.getTicksLabels();
-	        var ticks = scale.getTicks();
-	        if (typeof labelFormatter === 'string') {
-	            labelFormatter = (function (tpl) {
-	                return function (val) {
-	                    return tpl.replace('{value}', val != null ? val : '');
-	                };
-	            })(labelFormatter);
-	            // Consider empty array
-	            return zrUtil.map(labels, labelFormatter);
-	        }
-	        else if (typeof labelFormatter === 'function') {
-	            return zrUtil.map(ticks, function (tick, idx) {
-	                return labelFormatter(
-	                    axisHelper.getAxisRawValue(axis, tick),
-	                    idx
-	                );
-	            }, this);
-	        }
-	        else {
-	            return labels;
-	        }
-	    };
-
-	    axisHelper.getAxisRawValue = function (axis, value) {
-	        // In category axis with data zoom, tick is not the original
-	        // index of axis.data. So tick should not be exposed to user
-	        // in category axis.
-	        return axis.type === 'category' ? axis.scale.getLabel(value) : value;
-	    };
-
-	    module.exports = axisHelper;
-
-
-/***/ },
-/* 106 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Linear continuous scale
-	 * @module echarts/coord/scale/Ordinal
-	 *
-	 * http://en.wikipedia.org/wiki/Level_of_measurement
-	 */
-
-	// FIXME only one data
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var Scale = __webpack_require__(107);
-
-	    var scaleProto = Scale.prototype;
-
-	    var OrdinalScale = Scale.extend({
-
-	        type: 'ordinal',
-
-	        init: function (data, extent) {
-	            this._data = data;
-	            this._extent = extent || [0, data.length - 1];
-	        },
-
-	        parse: function (val) {
-	            return typeof val === 'string'
-	                ? zrUtil.indexOf(this._data, val)
-	                // val might be float.
-	                : Math.round(val);
-	        },
-
-	        contain: function (rank) {
-	            rank = this.parse(rank);
-	            return scaleProto.contain.call(this, rank)
-	                && this._data[rank] != null;
-	        },
-
-	        /**
-	         * Normalize given rank or name to linear [0, 1]
-	         * @param {number|string} [val]
-	         * @return {number}
-	         */
-	        normalize: function (val) {
-	            return scaleProto.normalize.call(this, this.parse(val));
-	        },
-
-	        scale: function (val) {
-	            return Math.round(scaleProto.scale.call(this, val));
-	        },
-
-	        /**
-	         * @return {Array}
-	         */
-	        getTicks: function () {
-	            var ticks = [];
-	            var extent = this._extent;
-	            var rank = extent[0];
-
-	            while (rank <= extent[1]) {
-	                ticks.push(rank);
-	                rank++;
-	            }
-
-	            return ticks;
-	        },
-
-	        /**
-	         * Get item on rank n
-	         * @param {number} n
-	         * @return {string}
-	         */
-	        getLabel: function (n) {
-	            return this._data[n];
-	        },
-
-	        /**
-	         * @return {number}
-	         */
-	        count: function () {
-	            return this._extent[1] - this._extent[0] + 1;
-	        },
-
-	        /**
-	         * @override
-	         */
-	        unionExtentFromData: function (data, dim) {
-	            this.unionExtent(data.getDataExtent(dim, false));
-	        },
-
-	        niceTicks: zrUtil.noop,
-	        niceExtent: zrUtil.noop
-	    });
-
-	    /**
-	     * @return {module:echarts/scale/Time}
-	     */
-	    OrdinalScale.create = function () {
-	        return new OrdinalScale();
-	    };
-
-	    module.exports = OrdinalScale;
-
-
-/***/ },
-/* 107 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * // Scale class management
-	 * @module echarts/scale/Scale
-	 */
-
-
-	    var clazzUtil = __webpack_require__(13);
-
-	    /**
-	     * @param {Object} [setting]
-	     */
-	    function Scale(setting) {
-	        this._setting = setting || {};
-
-	        /**
-	         * Extent
-	         * @type {Array.<number>}
-	         * @protected
-	         */
-	        this._extent = [Infinity, -Infinity];
-
-	        /**
-	         * Step is calculated in adjustExtent
-	         * @type {Array.<number>}
-	         * @protected
-	         */
-	        this._interval = 0;
-
-	        this.init && this.init.apply(this, arguments);
-	    }
-
-	    var scaleProto = Scale.prototype;
-
-	    /**
-	     * Parse input val to valid inner number.
-	     * @param {*} val
-	     * @return {number}
-	     */
-	    scaleProto.parse = function (val) {
-	        // Notice: This would be a trap here, If the implementation
-	        // of this method depends on extent, and this method is used
-	        // before extent set (like in dataZoom), it would be wrong.
-	        // Nevertheless, parse does not depend on extent generally.
-	        return val;
-	    };
-
-	    scaleProto.getSetting = function (name) {
-	        return this._setting[name];
-	    };
-
-	    scaleProto.contain = function (val) {
-	        var extent = this._extent;
-	        return val >= extent[0] && val <= extent[1];
-	    };
-
-	    /**
-	     * Normalize value to linear [0, 1], return 0.5 if extent span is 0
-	     * @param {number} val
-	     * @return {number}
-	     */
-	    scaleProto.normalize = function (val) {
-	        var extent = this._extent;
-	        if (extent[1] === extent[0]) {
-	            return 0.5;
-	        }
-	        return (val - extent[0]) / (extent[1] - extent[0]);
-	    };
-
-	    /**
-	     * Scale normalized value
-	     * @param {number} val
-	     * @return {number}
-	     */
-	    scaleProto.scale = function (val) {
-	        var extent = this._extent;
-	        return val * (extent[1] - extent[0]) + extent[0];
-	    };
-
-	    /**
-	     * Set extent from data
-	     * @param {Array.<number>} other
-	     */
-	    scaleProto.unionExtent = function (other) {
-	        var extent = this._extent;
-	        other[0] < extent[0] && (extent[0] = other[0]);
-	        other[1] > extent[1] && (extent[1] = other[1]);
-	        // not setExtent because in log axis it may transformed to power
-	        // this.setExtent(extent[0], extent[1]);
-	    };
-
-	    /**
-	     * Set extent from data
-	     * @param {module:echarts/data/List} data
-	     * @param {string} dim
-	     */
-	    scaleProto.unionExtentFromData = function (data, dim) {
-	        this.unionExtent(data.getDataExtent(dim, true));
-	    };
-
-	    /**
-	     * Get extent
-	     * @return {Array.<number>}
-	     */
-	    scaleProto.getExtent = function () {
-	        return this._extent.slice();
-	    };
-
-	    /**
-	     * Set extent
-	     * @param {number} start
-	     * @param {number} end
-	     */
-	    scaleProto.setExtent = function (start, end) {
-	        var thisExtent = this._extent;
-	        if (!isNaN(start)) {
-	            thisExtent[0] = start;
-	        }
-	        if (!isNaN(end)) {
-	            thisExtent[1] = end;
-	        }
-	    };
-
-	    /**
-	     * @return {Array.<string>}
-	     */
-	    scaleProto.getTicksLabels = function () {
-	        var labels = [];
-	        var ticks = this.getTicks();
-	        for (var i = 0; i < ticks.length; i++) {
-	            labels.push(this.getLabel(ticks[i]));
-	        }
-	        return labels;
-	    };
-
-	    /**
-	     * When axis extent depends on data and no data exists,
-	     * axis ticks should not be drawn, which is named 'blank'.
-	     */
-	    scaleProto.isBlank = function () {
-	        return this._isBlank;
-	    },
-
-	    /**
-	     * When axis extent depends on data and no data exists,
-	     * axis ticks should not be drawn, which is named 'blank'.
-	     */
-	    scaleProto.setBlank = function (isBlank) {
-	        this._isBlank = isBlank;
-	    };
-
-
-	    clazzUtil.enableClassExtend(Scale);
-	    clazzUtil.enableClassManagement(Scale, {
-	        registerWhenExtend: true
-	    });
-
-	    module.exports = Scale;
-
-
-/***/ },
-/* 108 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Interval scale
-	 * @module echarts/scale/Interval
-	 */
-
-
-
-	    var numberUtil = __webpack_require__(7);
-	    var formatUtil = __webpack_require__(6);
-	    var Scale = __webpack_require__(107);
-	    var helper = __webpack_require__(109);
-
-	    var roundNumber = numberUtil.round;
-
-	    /**
-	     * @alias module:echarts/coord/scale/Interval
-	     * @constructor
-	     */
-	    var IntervalScale = Scale.extend({
-
-	        type: 'interval',
-
-	        _interval: 0,
-
-	        _intervalPrecision: 2,
-
-	        setExtent: function (start, end) {
-	            var thisExtent = this._extent;
-	            //start,end may be a Number like '25',so...
-	            if (!isNaN(start)) {
-	                thisExtent[0] = parseFloat(start);
-	            }
-	            if (!isNaN(end)) {
-	                thisExtent[1] = parseFloat(end);
-	            }
-	        },
-
-	        unionExtent: function (other) {
-	            var extent = this._extent;
-	            other[0] < extent[0] && (extent[0] = other[0]);
-	            other[1] > extent[1] && (extent[1] = other[1]);
-
-	            // unionExtent may called by it's sub classes
-	            IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]);
-	        },
-	        /**
-	         * Get interval
-	         */
-	        getInterval: function () {
-	            if (!this._interval) {
-	                this.niceTicks();
-	            }
-	            return this._interval;
-	        },
-
-	        /**
-	         * Set interval
-	         */
-	        setInterval: function (interval) {
-	            this._interval = interval;
-	            // Dropped auto calculated niceExtent and use user setted extent
-	            // We assume user wan't to set both interval, min, max to get a better result
-	            this._niceExtent = this._extent.slice();
-	        },
-
-	        /**
-	         * @return {Array.<number>}
-	         */
-	        getTicks: function () {
-	            if (!this._interval) {
-	                this.niceTicks();
-	            }
-	            return helper.intervalScaleGetTicks(
-	                this._interval, this._extent, this._niceExtent, this._intervalPrecision
-	            );
-	        },
-
-	        /**
-	         * @return {Array.<string>}
-	         */
-	        getTicksLabels: function () {
-	            var labels = [];
-	            var ticks = this.getTicks();
-	            for (var i = 0; i < ticks.length; i++) {
-	                labels.push(this.getLabel(ticks[i]));
-	            }
-	            return labels;
-	        },
-
-	        /**
-	         * @param {number} data
-	         * @param {Object} [opt]
-	         * @param {number|string} [opt.precision] If 'auto', use nice presision.
-	         * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2.
-	         * @return {string}
-	         */
-	        getLabel: function (data, opt) {
-	            if (data == null) {
-	                return '';
-	            }
-
-	            var precision = opt && opt.precision;
-
-	            if (precision == null) {
-	                precision = numberUtil.getPrecisionSafe(data) || 0;
-	            }
-	            else if (precision === 'auto') {
-	                // Should be more precise then tick.
-	                precision = this._intervalPrecision;
-	            }
-
-	            // (1) If `precision` is set, 12.005 should be display as '12.00500'.
-	            // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.
-	            data = roundNumber(data, precision, true);
-
-	            return formatUtil.addCommas(data);
-	        },
-
-	        /**
-	         * Update interval and extent of intervals for nice ticks
-	         *
-	         * @param {number} [splitNumber = 5] Desired number of ticks
-	         */
-	        niceTicks: function (splitNumber) {
-	            splitNumber = splitNumber || 5;
-	            var extent = this._extent;
-	            var span = extent[1] - extent[0];
-	            if (!isFinite(span)) {
-	                return;
-	            }
-	            // User may set axis min 0 and data are all negative
-	            // FIXME If it needs to reverse ?
-	            if (span < 0) {
-	                span = -span;
-	                extent.reverse();
-	            }
-
-	            var result = helper.intervalScaleNiceTicks(extent, splitNumber);
-
-	            this._intervalPrecision = result.intervalPrecision;
-	            this._interval = result.interval;
-	            this._niceExtent = result.niceTickExtent;
-	        },
-
-	        /**
-	         * Nice extent.
-	         * @param {number} [splitNumber = 5] Given approx tick number
-	         * @param {boolean} [fixMin=false]
-	         * @param {boolean} [fixMax=false]
-	         */
-	        niceExtent: function (splitNumber, fixMin, fixMax) {
-	            var extent = this._extent;
-	            // If extent start and end are same, expand them
-	            if (extent[0] === extent[1]) {
-	                if (extent[0] !== 0) {
-	                    // Expand extent
-	                    var expandSize = extent[0];
-	                    // In the fowllowing case
-	                    //      Axis has been fixed max 100
-	                    //      Plus data are all 100 and axis extent are [100, 100].
-	                    // Extend to the both side will cause expanded max is larger than fixed max.
-	                    // So only expand to the smaller side.
-	                    if (!fixMax) {
-	                        extent[1] += expandSize / 2;
-	                        extent[0] -= expandSize / 2;
-	                    }
-	                    else {
-	                        extent[0] -= expandSize / 2;
-	                    }
-	                }
-	                else {
-	                    extent[1] = 1;
-	                }
-	            }
-	            var span = extent[1] - extent[0];
-	            // If there are no data and extent are [Infinity, -Infinity]
-	            if (!isFinite(span)) {
-	                extent[0] = 0;
-	                extent[1] = 1;
-	            }
-
-	            this.niceTicks(splitNumber);
-
-	            // var extent = this._extent;
-	            var interval = this._interval;
-
-	            if (!fixMin) {
-	                extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);
-	            }
-	            if (!fixMax) {
-	                extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);
-	            }
-	        }
-	    });
-
-	    /**
-	     * @return {module:echarts/scale/Time}
-	     */
-	    IntervalScale.create = function () {
-	        return new IntervalScale();
-	    };
-
-	    module.exports = IntervalScale;
-
-
-
-/***/ },
-/* 109 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * For testable.
-	 */
-
-
-	    var numberUtil = __webpack_require__(7);
-
-	    var roundNumber = numberUtil.round;
-
-	    var helper = {};
-
-	    /**
-	     * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number.
-	     *                                Should be extent[0] < extent[1].
-	     * @param {number} splitNumber splitNumber should be >= 1.
-	     * @return {Object} {interval, intervalPrecision, niceTickExtent}
-	     */
-	    helper.intervalScaleNiceTicks = function (extent, splitNumber) {
-	        var result = {};
-	        var span = extent[1] - extent[0];
-
-	        var interval = result.interval = numberUtil.nice(span / splitNumber, true);
-	        // Tow more digital for tick.
-	        var precision = result.intervalPrecision = numberUtil.getPrecisionSafe(interval) + 2;
-	        // Niced extent inside original extent
-	        var niceTickExtent = result.niceTickExtent = [
-	            roundNumber(Math.ceil(extent[0] / interval) * interval, precision),
-	            roundNumber(Math.floor(extent[1] / interval) * interval, precision)
-	        ];
-
-	        helper.fixExtent(niceTickExtent, extent);
-
-	        return result;
-	    };
-
-	    function clamp(niceTickExtent, idx, extent) {
-	        niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);
-	    }
-
-	    // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.
-	    helper.fixExtent = function (niceTickExtent, extent) {
-	        !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);
-	        !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);
-	        clamp(niceTickExtent, 0, extent);
-	        clamp(niceTickExtent, 1, extent);
-	        if (niceTickExtent[0] > niceTickExtent[1]) {
-	            niceTickExtent[0] = niceTickExtent[1];
-	        }
-	    };
-
-	    helper.intervalScaleGetTicks = function (interval, extent, niceTickExtent, intervalPrecision) {
-	        var ticks = [];
-
-	        // If interval is 0, return [];
-	        if (!interval) {
-	            return ticks;
-	        }
-
-	        // Consider this case: using dataZoom toolbox, zoom and zoom.
-	        var safeLimit = 10000;
-
-	        if (extent[0] < niceTickExtent[0]) {
-	            ticks.push(extent[0]);
-	        }
-	        var tick = niceTickExtent[0];
-
-	        while (tick <= niceTickExtent[1]) {
-	            ticks.push(tick);
-	            // Avoid rounding error
-	            tick = roundNumber(tick + interval, intervalPrecision);
-	            if (tick === ticks[ticks.length - 1]) {
-	                // Consider out of safe float point, e.g.,
-	                // -3711126.9907707 + 2e-10 === -3711126.9907707
-	                break;
-	            }
-	            if (ticks.length > safeLimit) {
-	                return [];
-	            }
-	        }
-	        // Consider this case: the last item of ticks is smaller
-	        // than niceTickExtent[1] and niceTickExtent[1] === extent[1].
-	        if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {
-	            ticks.push(extent[1]);
-	        }
-
-	        return ticks;
-	    };
-
-	    module.exports = helper;
-
-
-/***/ },
-/* 110 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Interval scale
-	 * @module echarts/coord/scale/Time
-	 */
-
-
-
-	    // [About UTC and local time zone]:
-	    // In most cases, `number.parseDate` will treat input data string as local time
-	    // (except time zone is specified in time string). And `format.formateTime` returns
-	    // local time by default. option.useUTC is false by default. This design have
-	    // concidered these common case:
-	    // (1) Time that is persistent in server is in UTC, but it is needed to be diplayed
-	    // in local time by default.
-	    // (2) By default, the input data string (e.g., '2011-01-02') should be displayed
-	    // as its original time, without any time difference.
-
-	    var zrUtil = __webpack_require__(4);
-	    var numberUtil = __webpack_require__(7);
-	    var formatUtil = __webpack_require__(6);
-	    var scaleHelper = __webpack_require__(109);
-
-	    var IntervalScale = __webpack_require__(108);
-
-	    var intervalScaleProto = IntervalScale.prototype;
-
-	    var mathCeil = Math.ceil;
-	    var mathFloor = Math.floor;
-	    var ONE_SECOND = 1000;
-	    var ONE_MINUTE = ONE_SECOND * 60;
-	    var ONE_HOUR = ONE_MINUTE * 60;
-	    var ONE_DAY = ONE_HOUR * 24;
-
-	    // FIXME 公用？
-	    var bisect = function (a, x, lo, hi) {
-	        while (lo < hi) {
-	            var mid = lo + hi >>> 1;
-	            if (a[mid][2] < x) {
-	                lo = mid + 1;
-	            }
-	            else {
-	                hi  = mid;
-	            }
-	        }
-	        return lo;
-	    };
-
-	    /**
-	     * @alias module:echarts/coord/scale/Time
-	     * @constructor
-	     */
-	    var TimeScale = IntervalScale.extend({
-	        type: 'time',
-
-	        // Overwrite
-	        getLabel: function (val) {
-	            var stepLvl = this._stepLvl;
-
-	            var date = new Date(val);
-
-	            return formatUtil.formatTime(stepLvl[0], date, this.getSetting('useUTC'));
-	        },
-
-	        // Overwrite
-	        niceExtent: function (approxTickNum, fixMin, fixMax) {
-	            var extent = this._extent;
-	            // If extent start and end are same, expand them
-	            if (extent[0] === extent[1]) {
-	                // Expand extent
-	                extent[0] -= ONE_DAY;
-	                extent[1] += ONE_DAY;
-	            }
-	            // If there are no data and extent are [Infinity, -Infinity]
-	            if (extent[1] === -Infinity && extent[0] === Infinity) {
-	                var d = new Date();
-	                extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate());
-	                extent[0] = extent[1] - ONE_DAY;
-	            }
-
-	            this.niceTicks(approxTickNum);
-
-	            // var extent = this._extent;
-	            var interval = this._interval;
-
-	            if (!fixMin) {
-	                extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval);
-	            }
-	            if (!fixMax) {
-	                extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval);
-	            }
-	        },
-
-	        // Overwrite
-	        niceTicks: function (approxTickNum) {
-	            var timezoneOffset = this.getSetting('useUTC')
-	                ? 0 : numberUtil.getTimezoneOffset() * 60 * 1000;
-	            approxTickNum = approxTickNum || 10;
-
-	            var extent = this._extent;
-	            var span = extent[1] - extent[0];
-	            var approxInterval = span / approxTickNum;
-	            var scaleLevelsLen = scaleLevels.length;
-	            var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen);
-
-	            var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)];
-	            var interval = level[2];
-	            // Same with interval scale if span is much larger than 1 year
-	            if (level[0] === 'year') {
-	                var yearSpan = span / interval;
-
-	                // From "Nice Numbers for Graph Labels" of Graphic Gems
-	                // var niceYearSpan = numberUtil.nice(yearSpan, false);
-	                var yearStep = numberUtil.nice(yearSpan / approxTickNum, true);
-
-	                interval *= yearStep;
-	            }
-
-	            var niceExtent = [
-	                Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset),
-	                Math.round(mathFloor((extent[1] - timezoneOffset)/ interval) * interval + timezoneOffset)
-	            ];
-
-	            scaleHelper.fixExtent(niceExtent, extent);
-
-	            this._stepLvl = level;
-	            // Interval will be used in getTicks
-	            this._interval = interval;
-	            this._niceExtent = niceExtent;
-	        },
-
-	        parse: function (val) {
-	            // val might be float.
-	            return +numberUtil.parseDate(val);
-	        }
-	    });
-
-	    zrUtil.each(['contain', 'normalize'], function (methodName) {
-	        TimeScale.prototype[methodName] = function (val) {
-	            return intervalScaleProto[methodName].call(this, this.parse(val));
-	        };
-	    });
-
-	    // Steps from d3
-	    var scaleLevels = [
-	        // Format       step    interval
-	        ['hh:mm:ss',    1,      ONE_SECOND],           // 1s
-	        ['hh:mm:ss',    5,      ONE_SECOND * 5],       // 5s
-	        ['hh:mm:ss',    10,     ONE_SECOND * 10],      // 10s
-	        ['hh:mm:ss',    15,     ONE_SECOND * 15],      // 15s
-	        ['hh:mm:ss',    30,     ONE_SECOND * 30],      // 30s
-	        ['hh:mm\nMM-dd',1,      ONE_MINUTE],          // 1m
-	        ['hh:mm\nMM-dd',5,      ONE_MINUTE * 5],      // 5m
-	        ['hh:mm\nMM-dd',10,     ONE_MINUTE * 10],     // 10m
-	        ['hh:mm\nMM-dd',15,     ONE_MINUTE * 15],     // 15m
-	        ['hh:mm\nMM-dd',30,     ONE_MINUTE * 30],     // 30m
-	        ['hh:mm\nMM-dd',1,      ONE_HOUR],        // 1h
-	        ['hh:mm\nMM-dd',2,      ONE_HOUR * 2],    // 2h
-	        ['hh:mm\nMM-dd',6,      ONE_HOUR * 6],    // 6h
-	        ['hh:mm\nMM-dd',12,     ONE_HOUR * 12],   // 12h
-	        ['MM-dd\nyyyy', 1,      ONE_DAY],   // 1d
-	        ['week',        7,      ONE_DAY * 7],        // 7d
-	        ['month',       1,      ONE_DAY * 31],       // 1M
-	        ['quarter',     3,      ONE_DAY * 380 / 4],  // 3M
-	        ['half-year',   6,      ONE_DAY * 380 / 2],  // 6M
-	        ['year',        1,      ONE_DAY * 380]       // 1Y
-	    ];
-
-	    /**
-	     * @param {module:echarts/model/Model}
-	     * @return {module:echarts/scale/Time}
-	     */
-	    TimeScale.create = function (model) {
-	        return new TimeScale({useUTC: model.ecModel.get('useUTC')});
-	    };
-
-	    module.exports = TimeScale;
-
-
-/***/ },
-/* 111 */
-/***/ function(module, exports, __webpack_require__) {
-
-	/**
-	 * Log scale
-	 * @module echarts/scale/Log
-	 */
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var Scale = __webpack_require__(107);
-	    var numberUtil = __webpack_require__(7);
-
-	    // Use some method of IntervalScale
-	    var IntervalScale = __webpack_require__(108);
-
-	    var scaleProto = Scale.prototype;
-	    var intervalScaleProto = IntervalScale.prototype;
-
-	    var getPrecisionSafe = numberUtil.getPrecisionSafe;
-	    var roundingErrorFix = numberUtil.round;
-
-	    var mathFloor = Math.floor;
-	    var mathCeil = Math.ceil;
-	    var mathPow = Math.pow;
-
-	    var mathLog = Math.log;
-
-	    var LogScale = Scale.extend({
-
-	        type: 'log',
-
-	        base: 10,
-
-	        $constructor: function () {
-	            Scale.apply(this, arguments);
-	            this._originalScale = new IntervalScale();
-	        },
-
-	        /**
-	         * @return {Array.<number>}
-	         */
-	        getTicks: function () {
-	            var originalScale = this._originalScale;
-	            var extent = this._extent;
-	            var originalExtent = originalScale.getExtent();
-
-	            return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) {
-	                var powVal = numberUtil.round(mathPow(this.base, val));
-
-	                // Fix #4158
-	                powVal = (val === extent[0] && originalScale.__fixMin)
-	                    ? fixRoundingError(powVal, originalExtent[0])
-	                    : powVal;
-	                powVal = (val === extent[1] && originalScale.__fixMax)
-	                    ? fixRoundingError(powVal, originalExtent[1])
-	                    : powVal;
-
-	                return powVal;
-	            }, this);
-	        },
-
-	        /**
-	         * @param {number} val
-	         * @return {string}
-	         */
-	        getLabel: intervalScaleProto.getLabel,
-
-	        /**
-	         * @param  {number} val
-	         * @return {number}
-	         */
-	        scale: function (val) {
-	            val = scaleProto.scale.call(this, val);
-	            return mathPow(this.base, val);
-	        },
-
-	        /**
-	         * @param {number} start
-	         * @param {number} end
-	         */
-	        setExtent: function (start, end) {
-	            var base = this.base;
-	            start = mathLog(start) / mathLog(base);
-	            end = mathLog(end) / mathLog(base);
-	            intervalScaleProto.setExtent.call(this, start, end);
-	        },
-
-	        /**
-	         * @return {number} end
-	         */
-	        getExtent: function () {
-	            var base = this.base;
-	            var extent = scaleProto.getExtent.call(this);
-	            extent[0] = mathPow(base, extent[0]);
-	            extent[1] = mathPow(base, extent[1]);
-
-	            // Fix #4158
-	            var originalScale = this._originalScale;
-	            var originalExtent = originalScale.getExtent();
-	            originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));
-	            originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));
-
-	            return extent;
-	        },
-
-	        /**
-	         * @param  {Array.<number>} extent
-	         */
-	        unionExtent: function (extent) {
-	            this._originalScale.unionExtent(extent);
-
-	            var base = this.base;
-	            extent[0] = mathLog(extent[0]) / mathLog(base);
-	            extent[1] = mathLog(extent[1]) / mathLog(base);
-	            scaleProto.unionExtent.call(this, extent);
-	        },
-
-	        /**
-	         * @override
-	         */
-	        unionExtentFromData: function (data, dim) {
-	            this.unionExtent(data.getDataExtent(dim, true, function (val) {
-	                return val > 0;
-	            }));
-	        },
-
-	        /**
-	         * Update interval and extent of intervals for nice ticks
-	         * @param  {number} [approxTickNum = 10] Given approx tick number
-	         */
-	        niceTicks: function (approxTickNum) {
-	            approxTickNum = approxTickNum || 10;
-	            var extent = this._extent;
-	            var span = extent[1] - extent[0];
-	            if (span === Infinity || span <= 0) {
-	                return;
-	            }
-
-	            var interval = numberUtil.quantity(span);
-	            var err = approxTickNum / span * interval;
-
-	            // Filter ticks to get closer to the desired count.
-	            if (err <= 0.5) {
-	                interval *= 10;
-	            }
-
-	            // Interval should be integer
-	            while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {
-	                interval *= 10;
-	            }
-
-	            var niceExtent = [
-	                numberUtil.round(mathCeil(extent[0] / interval) * interval),
-	                numberUtil.round(mathFloor(extent[1] / interval) * interval)
-	            ];
-
-	            this._interval = interval;
-	            this._niceExtent = niceExtent;
-	        },
-
-	        /**
-	         * Nice extent.
-	         * @param {number} [approxTickNum = 10] Given approx tick number
-	         * @param {boolean} [fixMin=false]
-	         * @param {boolean} [fixMax=false]
-	         */
-	        niceExtent: function (splitNumber, fixMin, fixMax) {
-	            intervalScaleProto.niceExtent.call(this, splitNumber, fixMin, fixMax);
-
-	            var originalScale = this._originalScale;
-	            originalScale.__fixMin = fixMin;
-	            originalScale.__fixMax = fixMax;
-	        }
-
-	    });
-
-	    zrUtil.each(['contain', 'normalize'], function (methodName) {
-	        LogScale.prototype[methodName] = function (val) {
-	            val = mathLog(val) / mathLog(this.base);
-	            return scaleProto[methodName].call(this, val);
-	        };
-	    });
-
-	    LogScale.create = function () {
-	        return new LogScale();
-	    };
-
-	    function fixRoundingError(val, originalVal) {
-	        return roundingErrorFix(val, getPrecisionSafe(originalVal));
-	    }
-
-	    module.exports = LogScale;
-
-
-/***/ },
 /* 112 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var axisHelper = __webpack_require__(105);
+	    var axisHelper = __webpack_require__(101);
 
 	    function getName(obj) {
 	        if (zrUtil.isObject(obj) && obj.value != null) {
 	            return obj.value;
 	        }
 	        else {
-	            return obj;
+	            return obj + '';
 	        }
 	    }
 
@@ -25917,19 +26317,19 @@
 	    __webpack_require__(115);
 
 	    echarts.registerVisual(zrUtil.curry(
-	        __webpack_require__(120), 'line', 'circle', 'line'
+	        __webpack_require__(121), 'line', 'circle', 'line'
 	    ));
 	    echarts.registerLayout(zrUtil.curry(
-	        __webpack_require__(121), 'line'
+	        __webpack_require__(122), 'line'
 	    ));
 
 	    // Down sample after filter
 	    echarts.registerProcessor(PRIORITY.PROCESSOR.STATISTIC, zrUtil.curry(
-	        __webpack_require__(122), 'line'
+	        __webpack_require__(123), 'line'
 	    ));
 
 	    // In case developer forget to include grid component
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 
 /***/ },
@@ -25939,8 +26339,8 @@
 	'use strict';
 
 
-	    var createListFromArray = __webpack_require__(102);
-	    var SeriesModel = __webpack_require__(28);
+	    var createListFromArray = __webpack_require__(109);
+	    var SeriesModel = __webpack_require__(78);
 
 	    module.exports = SeriesModel.extend({
 
@@ -26034,11 +26434,11 @@
 	    var zrUtil = __webpack_require__(4);
 	    var SymbolDraw = __webpack_require__(116);
 	    var Symbol = __webpack_require__(117);
-	    var lineAnimationDiff = __webpack_require__(118);
-	    var graphic = __webpack_require__(44);
+	    var lineAnimationDiff = __webpack_require__(119);
+	    var graphic = __webpack_require__(18);
 	    var modelUtil = __webpack_require__(5);
-	    var polyHelper = __webpack_require__(119);
-	    var ChartView = __webpack_require__(43);
+	    var polyHelper = __webpack_require__(120);
+	    var ChartView = __webpack_require__(80);
 
 	    function isPointsSame(points1, points2) {
 	        if (points1.length !== points2.length) {
@@ -26740,7 +27140,7 @@
 	 */
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Symbol = __webpack_require__(117);
 
 	    /**
@@ -26873,9 +27273,10 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var symbolUtil = __webpack_require__(104);
-	    var graphic = __webpack_require__(44);
+	    var symbolUtil = __webpack_require__(111);
+	    var graphic = __webpack_require__(18);
 	    var numberUtil = __webpack_require__(7);
+	    var labelHelper = __webpack_require__(118);
 
 	    function getSymbolSize(data, idx) {
 	        var symbolSize = data.getItemVisual(idx, 'symbolSize');
@@ -27087,37 +27488,13 @@
 	            elStyle.opacity = opacity;
 	        }
 
-	        // Get last value dim
-	        var dimensions = data.dimensions.slice();
-	        var valueDim;
-	        var dataType;
-	        while (dimensions.length && (
-	            valueDim = dimensions.pop(),
-	            dataType = data.getDimensionInfo(valueDim).type,
-	            dataType === 'ordinal' || dataType === 'time'
-	        )) {} // jshint ignore:line
-
-	        if (valueDim != null && labelModel.getShallow('show')) {
-	            graphic.setText(elStyle, labelModel, color);
-	            elStyle.text = zrUtil.retrieve(
-	                seriesModel.getFormattedLabel(idx, 'normal'),
-	                data.get(valueDim, idx)
-	            );
-	        }
-	        else {
-	            elStyle.text = '';
-	        }
-
-	        if (valueDim != null && hoverLabelModel.getShallow('show')) {
-	            graphic.setText(hoverItemStyle, hoverLabelModel, color);
-	            hoverItemStyle.text = zrUtil.retrieve(
-	                seriesModel.getFormattedLabel(idx, 'emphasis'),
-	                data.get(valueDim, idx)
-	            );
-	        }
-	        else {
-	            hoverItemStyle.text = '';
-	        }
+	        var valueDim = labelHelper.findLabelValueDim(data);
+	        labelHelper.setTextToStyle(
+	            data, idx, valueDim, elStyle, seriesModel, labelModel, color
+	        );
+	        labelHelper.setTextToStyle(
+	            data, idx, valueDim, hoverItemStyle, seriesModel, hoverLabelModel, color
+	        );
 
 	        symbolPath.off('mouseover')
 	            .off('mouseout')
@@ -27170,6 +27547,60 @@
 
 /***/ },
 /* 118 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * @module echarts/chart/helper/Symbol
+	 */
+
+
+	    var graphic = __webpack_require__(18);
+	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+
+	    var helper = {};
+
+	    helper.findLabelValueDim = function (data) {
+	        var valueDim;
+	        var labelDims = modelUtil.otherDimToDataDim(data, 'label');
+
+	        if (labelDims.length) {
+	            valueDim = labelDims[0];
+	        }
+	        else {
+	            // Get last value dim
+	            var dimensions = data.dimensions.slice();
+	            var dataType;
+	            while (dimensions.length && (
+	                valueDim = dimensions.pop(),
+	                dataType = data.getDimensionInfo(valueDim).type,
+	                dataType === 'ordinal' || dataType === 'time'
+	            )) {} // jshint ignore:line
+	        }
+
+	        return valueDim;
+	    };
+
+	    helper.setTextToStyle = function (
+	        data, dataIndex, valueDim, elStyle, seriesModel, labelModel, color
+	    ) {
+	        if (valueDim != null && labelModel.getShallow('show')) {
+	            graphic.setText(elStyle, labelModel, color);
+	            elStyle.text = zrUtil.retrieve(
+	                seriesModel.getFormattedLabel(dataIndex, 'normal'),
+	                data.get(valueDim, dataIndex)
+	            );
+	        }
+	        else {
+	            elStyle.text = '';
+	        }
+	    };
+
+	    module.exports = helper;
+
+
+/***/ },
+/* 119 */
 /***/ function(module, exports) {
 
 	
@@ -27383,13 +27814,13 @@
 
 
 /***/ },
-/* 119 */
+/* 120 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// Poly path support NaN point
 
 
-	    var Path = __webpack_require__(46);
+	    var Path = __webpack_require__(20);
 	    var vec2 = __webpack_require__(10);
 
 	    var vec2Min = vec2.min;
@@ -27638,7 +28069,7 @@
 
 
 /***/ },
-/* 120 */
+/* 121 */
 /***/ function(module, exports) {
 
 	
@@ -27687,7 +28118,7 @@
 
 
 /***/ },
-/* 121 */
+/* 122 */
 /***/ function(module, exports) {
 
 	
@@ -27697,23 +28128,29 @@
 	            var data = seriesModel.getData();
 	            var coordSys = seriesModel.coordinateSystem;
 
-	            if (coordSys) {
-	                var dims = coordSys.dimensions;
+	            if (!coordSys) {
+	                return;
+	            }
 
-	                if (dims.length === 1) {
-	                    data.each(dims[0], function (x, idx) {
-	                        // Also {Array.<number>}, not undefined to avoid if...else... statement
-	                        data.setItemLayout(idx, isNaN(x) ? [NaN, NaN] : coordSys.dataToPoint(x));
-	                    });
-	                }
-	                else if (dims.length === 2) {
-	                    data.each(dims, function (x, y, idx) {
-	                        // Also {Array.<number>}, not undefined to avoid if...else... statement
-	                        data.setItemLayout(
-	                            idx, (isNaN(x) || isNaN(y)) ? [NaN, NaN] : coordSys.dataToPoint([x, y])
-	                        );
-	                    }, true);
-	                }
+	            var dims = [];
+	            var coordDims = coordSys.dimensions;
+	            for (var i = 0; i < coordDims.length; i++) {
+	                dims.push(seriesModel.coordDimToDataDim(coordSys.dimensions[i])[0]);
+	            }
+
+	            if (dims.length === 1) {
+	                data.each(dims[0], function (x, idx) {
+	                    // Also {Array.<number>}, not undefined to avoid if...else... statement
+	                    data.setItemLayout(idx, isNaN(x) ? [NaN, NaN] : coordSys.dataToPoint(x));
+	                });
+	            }
+	            else if (dims.length === 2) {
+	                data.each(dims, function (x, y, idx) {
+	                    // Also {Array.<number>}, not undefined to avoid if...else... statement
+	                    data.setItemLayout(
+	                        idx, (isNaN(x) || isNaN(y)) ? [NaN, NaN] : coordSys.dataToPoint([x, y])
+	                    );
+	                }, true);
 	            }
 	        });
 	    };
@@ -27721,7 +28158,7 @@
 
 
 /***/ },
-/* 122 */
+/* 123 */
 /***/ function(module, exports) {
 
 	
@@ -27804,17 +28241,17 @@
 
 
 /***/ },
-/* 123 */
+/* 124 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 	    var echarts = __webpack_require__(1);
 
-	    __webpack_require__(124);
+	    __webpack_require__(125);
 
 	    __webpack_require__(133);
 
@@ -27848,7 +28285,7 @@
 
 
 /***/ },
-/* 124 */
+/* 125 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
@@ -27858,12 +28295,12 @@
 	 */
 	var factory = exports;
 
-	    var layout = __webpack_require__(21);
-	    var axisHelper = __webpack_require__(105);
+	    var layout = __webpack_require__(71);
+	    var axisHelper = __webpack_require__(101);
 
 	    var zrUtil = __webpack_require__(4);
-	    var Cartesian2D = __webpack_require__(125);
-	    var Axis2D = __webpack_require__(127);
+	    var Cartesian2D = __webpack_require__(126);
+	    var Axis2D = __webpack_require__(128);
 
 	    var each = zrUtil.each;
 
@@ -27953,7 +28390,9 @@
 	            for (var idx in axes) {
 	                if (axes.hasOwnProperty(idx)) {
 	                    var axis = axes[idx];
-	                    if (axis && (axis.type === 'category' || !ifAxisCrossZero(axis))) {
+	                    if (axis && (
+	                        axis.type === 'category' || axis.type === 'time' || !ifAxisCrossZero(axis)
+	                    )) {
 	                        return true;
 	                    }
 	                }
@@ -28408,7 +28847,8 @@
 	        ecModel.eachComponent('grid', function (gridModel, idx) {
 	            var grid = new Grid(gridModel, ecModel, api);
 	            grid.name = 'grid_' + idx;
-	            grid.resize(gridModel, api);
+	            // Postpone `resize` to `update`.
+	            // grid.resize(gridModel, api);
 
 	            gridModel.coordinateSystem = grid;
 
@@ -28455,20 +28895,20 @@
 	    // For deciding which dimensions to use when creating list data
 	    Grid.dimensions = Grid.prototype.dimensions = Cartesian2D.prototype.dimensions;
 
-	    __webpack_require__(26).register('cartesian2d', Grid);
+	    __webpack_require__(76).register('cartesian2d', Grid);
 
 	    module.exports = Grid;
 
 
 /***/ },
-/* 125 */
+/* 126 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var Cartesian = __webpack_require__(126);
+	    var Cartesian = __webpack_require__(127);
 
 	    function Cartesian2D(name) {
 
@@ -28569,6 +29009,7 @@
 	        getOtherAxis: function (axis) {
 	            return this.getAxis(axis.dim === 'x' ? 'y' : 'x');
 	        }
+
 	    };
 
 	    zrUtil.inherits(Cartesian2D, Cartesian);
@@ -28577,7 +29018,7 @@
 
 
 /***/ },
-/* 126 */
+/* 127 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
@@ -28695,14 +29136,13 @@
 
 
 /***/ },
-/* 127 */
+/* 128 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 
 	    var zrUtil = __webpack_require__(4);
 	    var Axis = __webpack_require__(100);
-	    var axisLabelInterval = __webpack_require__(128);
 
 	    /**
 	     * Extend axis 2d
@@ -28782,17 +29222,6 @@
 	        },
 
 	        /**
-	         * @return {number}
-	         */
-	        getLabelInterval: function () {
-	            var labelInterval = this._labelInterval;
-	            if (!labelInterval) {
-	                labelInterval = this._labelInterval = axisLabelInterval(this);
-	            }
-	            return labelInterval;
-	        },
-
-	        /**
 	         * If label is ignored.
 	         * Automatically used when axis is category and label can not be all shown
 	         * @param  {number}  idx
@@ -28837,37 +29266,6 @@
 
 
 /***/ },
-/* 128 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-	/**
-	 * Helper function for axisLabelInterval calculation
-	 */
-
-
-
-	    var zrUtil = __webpack_require__(4);
-	    var axisHelper = __webpack_require__(105);
-
-	    module.exports = function (axis) {
-	        var axisModel = axis.model;
-	        var labelModel = axisModel.getModel('axisLabel');
-	        var labelInterval = labelModel.get('interval');
-	        if (!(axis.type === 'category' && labelInterval === 'auto')) {
-	            return labelInterval === 'auto' ? 0 : labelInterval;
-	        }
-
-	        return axisHelper.getAxisLabelInterval(
-	            zrUtil.map(axis.scale.getTicks(), axis.dataToCoord, axis),
-	            axisModel.getFormattedLabels(),
-	            labelModel.getModel('textStyle').getFont(),
-	            axis.isHorizontal()
-	        );
-	    };
-
-
-/***/ },
 /* 129 */
 /***/ function(module, exports, __webpack_require__) {
 
@@ -28878,7 +29276,7 @@
 
 	    __webpack_require__(130);
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 
 	    module.exports = ComponentModel.extend({
 
@@ -28919,7 +29317,7 @@
 	'use strict';
 
 
-	    var ComponentModel = __webpack_require__(19);
+	    var ComponentModel = __webpack_require__(69);
 	    var zrUtil = __webpack_require__(4);
 	    var axisModelCreator = __webpack_require__(131);
 
@@ -28999,8 +29397,8 @@
 
 	    var axisDefault = __webpack_require__(132);
 	    var zrUtil = __webpack_require__(4);
-	    var ComponentModel = __webpack_require__(19);
-	    var layout = __webpack_require__(21);
+	    var ComponentModel = __webpack_require__(69);
+	    var layout = __webpack_require__(71);
 
 	    // FIXME axisType is fixed ?
 	    var AXIS_TYPES = ['value', 'category', 'time', 'log'];
@@ -29202,10 +29600,11 @@
 	        min: 'dataMin',
 	        max: 'dataMax'
 	    }, valueAxis);
+
 	    var logAxis = zrUtil.defaults({
+	        scale: true,
 	        logBase: 10
 	    }, valueAxis);
-	    logAxis.scale = true;
 
 	    module.exports = {
 	        categoryAxis: categoryAxis,
@@ -29235,7 +29634,7 @@
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var AxisBuilder = __webpack_require__(135);
 	    var AxisView = __webpack_require__(136);
 	    var cartesianAxisHelper = __webpack_require__(138);
@@ -29471,7 +29870,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 	    var formatUtil = __webpack_require__(6);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var Model = __webpack_require__(12);
 	    var numberUtil = __webpack_require__(7);
 	    var remRadian = numberUtil.remRadian;
@@ -30642,7 +31041,7 @@
 
 	    var zrUtil = __webpack_require__(4);
 
-	    __webpack_require__(124);
+	    __webpack_require__(125);
 
 	    __webpack_require__(140);
 	    __webpack_require__(142);
@@ -30651,6 +31050,7 @@
 	    var echarts = __webpack_require__(1);
 
 	    echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'bar'));
+
 	    // Visual coding for legend
 	    echarts.registerVisual(function (ecModel) {
 	        ecModel.eachSeriesByType('bar', function (seriesModel) {
@@ -30660,7 +31060,7 @@
 	    });
 
 	    // In case developer forget to include grid component
-	    __webpack_require__(123);
+	    __webpack_require__(124);
 
 
 /***/ },
@@ -30686,20 +31086,14 @@
 	'use strict';
 
 
-	    var SeriesModel = __webpack_require__(28);
-	    var createListFromArray = __webpack_require__(102);
+	    var SeriesModel = __webpack_require__(78);
+	    var createListFromArray = __webpack_require__(109);
 
 	    module.exports = SeriesModel.extend({
 
 	        type: 'series.__base_bar__',
 
 	        getInitialData: function (option, ecModel) {
-	            if (true) {
-	                var coordSys = option.coordinateSystem;
-	                if (coordSys !== 'cartesian2d') {
-	                    throw new Error('Bar only support cartesian2d coordinateSystem');
-	                }
-	            }
 	            return createListFromArray(option.data, this, ecModel);
 	        },
 
@@ -30731,6 +31125,8 @@
 
 	            // 最小高度改为0
 	            barMinHeight: 0,
+	            // 最小角度为0，仅对极坐标系下的柱状图有效
+	            barMinAngle: 0,
 
 	            // barMaxWidth: null,
 	            // 默认自适应
@@ -30762,7 +31158,7 @@
 
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var helper = __webpack_require__(143);
 
 	    var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'normal', 'barBorderWidth'];
@@ -30778,8 +31174,13 @@
 	        render: function (seriesModel, ecModel, api) {
 	            var coordinateSystemType = seriesModel.get('coordinateSystem');
 
-	            if (coordinateSystemType === 'cartesian2d') {
-	                this._renderOnCartesian(seriesModel, ecModel, api);
+	            if (coordinateSystemType === 'cartesian2d'
+	                || coordinateSystemType === 'polar'
+	            ) {
+	                this._render(seriesModel, ecModel, api);
+	            }
+	            else if (true) {
+	                console.warn('Only cartesian2d and polar supported for bar.');
 	            }
 
 	            return this.group;
@@ -30787,14 +31188,22 @@
 
 	        dispose: zrUtil.noop,
 
-	        _renderOnCartesian: function (seriesModel, ecModel, api) {
+	        _render: function (seriesModel, ecModel, api) {
 	            var group = this.group;
 	            var data = seriesModel.getData();
 	            var oldData = this._data;
 
-	            var cartesian = seriesModel.coordinateSystem;
-	            var baseAxis = cartesian.getBaseAxis();
-	            var isHorizontal = baseAxis.isHorizontal();
+	            var coord = seriesModel.coordinateSystem;
+	            var baseAxis = coord.getBaseAxis();
+	            var isHorizontalOrRadial;
+
+	            if (coord.type === 'cartesian2d') {
+	                isHorizontalOrRadial = baseAxis.isHorizontal();
+	            }
+	            else if (coord.type === 'polar') {
+	                isHorizontalOrRadial = baseAxis.dim === 'angle';
+	            }
+
 	            var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;
 
 	            data.diff(oldData)
@@ -30804,12 +31213,17 @@
 	                    }
 
 	                    var itemModel = data.getItemModel(dataIndex);
-	                    var layout = getRectItemLayout(data, dataIndex, itemModel);
-	                    var el = createRect(data, dataIndex, itemModel, layout, isHorizontal, animationModel);
+	                    var layout = getLayout[coord.type](data, dataIndex, itemModel);
+	                    var el = elementCreator[coord.type](
+	                        data, dataIndex, itemModel, layout, isHorizontalOrRadial, animationModel
+	                    );
 	                    data.setItemGraphicEl(dataIndex, el);
 	                    group.add(el);
 
-	                    updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal);
+	                    updateStyle(
+	                        el, data, dataIndex, itemModel, layout,
+	                        seriesModel, isHorizontalOrRadial, coord.type === 'polar'
+	                    );
 	                })
 	                .update(function (newIndex, oldIndex) {
 	                    var el = oldData.getItemGraphicEl(oldIndex);
@@ -30820,24 +31234,34 @@
 	                    }
 
 	                    var itemModel = data.getItemModel(newIndex);
-	                    var layout = getRectItemLayout(data, newIndex, itemModel);
+	                    var layout = getLayout[coord.type](data, newIndex, itemModel);
 
 	                    if (el) {
 	                        graphic.updateProps(el, {shape: layout}, animationModel, newIndex);
 	                    }
 	                    else {
-	                        el = createRect(data, newIndex, itemModel, layout, isHorizontal, animationModel, true);
+	                        el = elementCreator[coord.type](
+	                            data, newIndex, itemModel, layout, isHorizontalOrRadial, animationModel, true
+	                        );
 	                    }
 
 	                    data.setItemGraphicEl(newIndex, el);
 	                    // Add back
 	                    group.add(el);
 
-	                    updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontal);
+	                    updateStyle(
+	                        el, data, newIndex, itemModel, layout,
+	                        seriesModel, isHorizontalOrRadial, coord.type === 'polar'
+	                    );
 	                })
 	                .remove(function (dataIndex) {
 	                    var el = oldData.getItemGraphicEl(dataIndex);
-	                    el && removeRect(dataIndex, animationModel, el);
+	                    if (coord.type === 'cartesian2d') {
+	                        el && removeRect(dataIndex, animationModel, el);
+	                    }
+	                    else {
+	                        el && removeSector(dataIndex, animationModel, el);
+	                    }
 	                })
 	                .execute();
 
@@ -30850,7 +31274,12 @@
 	            if (ecModel.get('animation')) {
 	                if (data) {
 	                    data.eachItemGraphicEl(function (el) {
-	                        removeRect(el.dataIndex, ecModel, el);
+	                        if (el.type === 'sector') {
+	                            removeSector(el.dataIndex, ecModel, el);
+	                        }
+	                        else {
+	                            removeRect(el.dataIndex, ecModel, el);
+	                        }
 	                    });
 	                }
 	            }
@@ -30860,23 +31289,50 @@
 	        }
 	    });
 
-	    function createRect(data, dataIndex, itemModel, layout, isHorizontal, animationModel, isUpdate) {
-	        var rect = new graphic.Rect({shape: zrUtil.extend({}, layout)});
+	    var elementCreator = {
 
-	        // Animation
-	        if (animationModel) {
-	            var rectShape = rect.shape;
-	            var animateProperty = isHorizontal ? 'height' : 'width';
-	            var animateTarget = {};
-	            rectShape[animateProperty] = 0;
-	            animateTarget[animateProperty] = layout[animateProperty];
-	            graphic[isUpdate ? 'updateProps' : 'initProps'](rect, {
-	                shape: animateTarget
-	            }, animationModel, dataIndex);
+	        cartesian2d: function (
+	            data, dataIndex, itemModel, layout, isHorizontal,
+	            animationModel, isUpdate
+	        ) {
+	            var rect = new graphic.Rect({shape: zrUtil.extend({}, layout)});
+
+	            // Animation
+	            if (animationModel) {
+	                var rectShape = rect.shape;
+	                var animateProperty = isHorizontal ? 'height' : 'width';
+	                var animateTarget = {};
+	                rectShape[animateProperty] = 0;
+	                animateTarget[animateProperty] = layout[animateProperty];
+	                graphic[isUpdate ? 'updateProps' : 'initProps'](rect, {
+	                    shape: animateTarget
+	                }, animationModel, dataIndex);
+	            }
+
+	            return rect;
+	        },
+
+	        polar: function (
+	            data, dataIndex, itemModel, layout, isRadial,
+	            animationModel, isUpdate
+	        ) {
+	            var sector = new graphic.Sector({shape: zrUtil.extend({}, layout)});
+
+	            // Animation
+	            if (animationModel) {
+	                var sectorShape = sector.shape;
+	                var animateProperty = isRadial ? 'r' : 'endAngle';
+	                var animateTarget = {};
+	                sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle;
+	                animateTarget[animateProperty] = layout[animateProperty];
+	                graphic[isUpdate ? 'updateProps' : 'initProps'](sector, {
+	                    shape: animateTarget
+	                }, animationModel, dataIndex);
+	            }
+
+	            return sector;
 	        }
-
-	        return rect;
-	    }
+	    };
 
 	    function removeRect(dataIndex, animationModel, el) {
 	        // Not show text when animating
@@ -30890,28 +31346,58 @@
 	        });
 	    }
 
-	    function getRectItemLayout(data, dataIndex, itemModel) {
-	        var layout = data.getItemLayout(dataIndex);
-	        var fixedLineWidth = getLineWidth(itemModel, layout);
-
-	        // fix layout with lineWidth
-	        var signX = layout.width > 0 ? 1 : -1;
-	        var signY = layout.height > 0 ? 1 : -1;
-	        return {
-	            x: layout.x + signX * fixedLineWidth / 2,
-	            y: layout.y + signY * fixedLineWidth / 2,
-	            width: layout.width - signX * fixedLineWidth,
-	            height: layout.height - signY * fixedLineWidth
-	        };
+	    function removeSector(dataIndex, animationModel, el) {
+	        // Not show text when animating
+	        el.style.text = '';
+	        graphic.updateProps(el, {
+	            shape: {
+	                r: el.shape.r0
+	            }
+	        }, animationModel, dataIndex, function () {
+	            el.parent && el.parent.remove(el);
+	        });
 	    }
 
-	    function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal) {
+	    var getLayout = {
+	        cartesian2d: function (data, dataIndex, itemModel) {
+	            var layout = data.getItemLayout(dataIndex);
+	            var fixedLineWidth = getLineWidth(itemModel, layout);
+
+	            // fix layout with lineWidth
+	            var signX = layout.width > 0 ? 1 : -1;
+	            var signY = layout.height > 0 ? 1 : -1;
+	            return {
+	                x: layout.x + signX * fixedLineWidth / 2,
+	                y: layout.y + signY * fixedLineWidth / 2,
+	                width: layout.width - signX * fixedLineWidth,
+	                height: layout.height - signY * fixedLineWidth
+	            };
+	        },
+
+	        polar: function (data, dataIndex, itemModel) {
+	            var layout = data.getItemLayout(dataIndex);
+	            return {
+	                cx: layout.cx,
+	                cy: layout.cy,
+	                r0: layout.r0,
+	                r: layout.r,
+	                startAngle: layout.startAngle,
+	                endAngle: layout.endAngle
+	            };
+	        }
+	    };
+
+	    function updateStyle(
+	        el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal, isPolar
+	    ) {
 	        var color = data.getItemVisual(dataIndex, 'color');
 	        var opacity = data.getItemVisual(dataIndex, 'opacity');
 	        var itemStyleModel = itemModel.getModel('itemStyle.normal');
 	        var hoverStyle = itemModel.getModel('itemStyle.emphasis').getBarItemStyle();
 
-	        el.setShape('r', itemStyleModel.get('barBorderRadius') || 0);
+	        if (!isPolar && isHorizontal) {
+	            el.setShape('r', itemStyleModel.get('barBorderRadius') || 0);
+	        }
 
 	        el.useStyle(zrUtil.defaults(
 	            {
@@ -30925,10 +31411,12 @@
 	            ? (layout.height > 0 ? 'bottom' : 'top')
 	            : (layout.width > 0 ? 'left' : 'right');
 
-	        helper.setLabel(
-	            el.style, hoverStyle, itemModel, color,
-	            seriesModel, dataIndex, labelPositionOutside
-	        );
+	        if (!isPolar) {
+	            helper.setLabel(
+	                el.style, hoverStyle, itemModel, color,
+	                seriesModel, dataIndex, labelPositionOutside
+	            );
+	        }
 
 	        graphic.setHoverStyle(el, hoverStyle);
 	    }
@@ -30949,7 +31437,7 @@
 	
 
 	    var zrUtil = __webpack_require__(4);
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 
 	    var helper = {};
 
@@ -31044,49 +31532,65 @@
 	    var numberUtil = __webpack_require__(7);
 	    var parsePercent = numberUtil.parsePercent;
 
+	    var STACK_PREFIX = '__ec_stack_';
+
 	    function getSeriesStackId(seriesModel) {
-	        return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex;
+	        return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex;
 	    }
 
 	    function getAxisKey(axis) {
 	        return axis.dim + axis.index;
 	    }
 
-	    function calBarWidthAndOffset(barSeries, api) {
-	        // Columns info on each category axis. Key is cartesian name
-	        var columnsMap = {};
+	    /**
+	     * @param {Object} opt
+	     * @param {module:echarts/coord/Axis} opt.axis Only support category axis currently.
+	     * @param {number} opt.count Positive interger.
+	     * @param {number} [opt.barWidth]
+	     * @param {number} [opt.barMaxWidth]
+	     * @param {number} [opt.barGap]
+	     * @param {number} [opt.barCategoryGap]
+	     * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined.
+	     */
+	    function getLayoutOnAxis(opt, api) {
+	        var params = [];
+	        var baseAxis = opt.axis;
+	        var axisKey = 'axis0';
 
-	        zrUtil.each(barSeries, function (seriesModel, idx) {
+	        if (baseAxis.type !== 'category') {
+	            return;
+	        }
+	        var bandWidth = baseAxis.getBandWidth();
+
+	        for (var i = 0; i < opt.count || 0; i++) {
+	            params.push(zrUtil.defaults({
+	                bandWidth: bandWidth,
+	                axisKey: axisKey,
+	                stackId: STACK_PREFIX + i
+	            }, opt));
+	        }
+	        var widthAndOffsets = doCalBarWidthAndOffset(params, api);
+
+	        var result = [];
+	        for (var i = 0; i < opt.count; i++) {
+	            var item = widthAndOffsets[axisKey][STACK_PREFIX + i];
+	            item.offsetCenter = item.offset + item.width / 2;
+	            result.push(item);
+	        }
+
+	        return result;
+	    }
+
+	    function calBarWidthAndOffset(barSeries, api) {
+	        var seriesInfoList = zrUtil.map(barSeries, function (seriesModel) {
 	            var data = seriesModel.getData();
 	            var cartesian = seriesModel.coordinateSystem;
-
 	            var baseAxis = cartesian.getBaseAxis();
 	            var axisExtent = baseAxis.getExtent();
 	            var bandWidth = baseAxis.type === 'category'
 	                ? baseAxis.getBandWidth()
 	                : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count());
 
-	            var columnsOnAxis = columnsMap[getAxisKey(baseAxis)] || {
-	                bandWidth: bandWidth,
-	                remainedWidth: bandWidth,
-	                autoWidthCount: 0,
-	                categoryGap: '20%',
-	                gap: '30%',
-	                stacks: {}
-	            };
-	            var stacks = columnsOnAxis.stacks;
-	            columnsMap[getAxisKey(baseAxis)] = columnsOnAxis;
-
-	            var stackId = getSeriesStackId(seriesModel);
-
-	            if (!stacks[stackId]) {
-	                columnsOnAxis.autoWidthCount++;
-	            }
-	            stacks[stackId] = stacks[stackId] || {
-	                width: 0,
-	                maxWidth: 0
-	            };
-
 	            var barWidth = parsePercent(
 	                seriesModel.get('barWidth'), bandWidth
 	            );
@@ -31096,20 +31600,66 @@
 	            var barGap = seriesModel.get('barGap');
 	            var barCategoryGap = seriesModel.get('barCategoryGap');
 
+	            return {
+	                bandWidth: bandWidth,
+	                barWidth: barWidth,
+	                barMaxWidth: barMaxWidth,
+	                barGap: barGap,
+	                barCategoryGap: barCategoryGap,
+	                axisKey: getAxisKey(baseAxis),
+	                stackId: getSeriesStackId(seriesModel)
+	            };
+	        });
+
+	        return doCalBarWidthAndOffset(seriesInfoList, api);
+	    }
+
+	    function doCalBarWidthAndOffset(seriesInfoList, api) {
+	        // Columns info on each category axis. Key is cartesian name
+	        var columnsMap = {};
+
+	        zrUtil.each(seriesInfoList, function (seriesInfo, idx) {
+	            var axisKey = seriesInfo.axisKey;
+	            var bandWidth = seriesInfo.bandWidth;
+	            var columnsOnAxis = columnsMap[axisKey] || {
+	                bandWidth: bandWidth,
+	                remainedWidth: bandWidth,
+	                autoWidthCount: 0,
+	                categoryGap: '20%',
+	                gap: '30%',
+	                stacks: {}
+	            };
+	            var stacks = columnsOnAxis.stacks;
+	            columnsMap[axisKey] = columnsOnAxis;
+
+	            var stackId = seriesInfo.stackId;
+
+	            if (!stacks[stackId]) {
+	                columnsOnAxis.autoWidthCount++;
+	            }
+	            stacks[stackId] = stacks[stackId] || {
+	                width: 0,
+	                maxWidth: 0
+	            };
+
 	            // Caution: In a single coordinate system, these barGrid attributes
 	            // will be shared by series. Consider that they have default values,
 	            // only the attributes set on the last series will work.
 	            // Do not change this fact unless there will be a break change.
 
 	            // TODO
+	            var barWidth = seriesInfo.barWidth;
 	            if (barWidth && !stacks[stackId].width) {
 	                barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);
 	                stacks[stackId].width = barWidth;
 	                columnsOnAxis.remainedWidth -= barWidth;
 	            }
 
+	            var barMaxWidth = seriesInfo.barMaxWidth;
 	            barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);
+	            var barGap = seriesInfo.barGap;
 	            (barGap != null) && (columnsOnAxis.gap = barGap);
+	            var barCategoryGap = seriesInfo.barCategoryGap;
 	            (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap);
 	        });
 
@@ -31199,6 +31749,11 @@
 
 	        ecModel.eachSeriesByType(seriesType, function (seriesModel) {
 
+	            // Check series coordinate, do layout for cartesian2d only
+	            if (seriesModel.coordinateSystem.type !== 'cartesian2d') {
+	                return;
+	            }
+
 	            var data = seriesModel.getData();
 	            var cartesian = seriesModel.coordinateSystem;
 	            var baseAxis = cartesian.getBaseAxis();
@@ -31285,6 +31840,8 @@
 	        }, this);
 	    }
 
+	    barLayoutGrid.getLayoutOnAxis = getLayoutOnAxis;
+
 	    module.exports = barLayoutGrid;
 
 
@@ -31333,7 +31890,7 @@
 	    var List = __webpack_require__(98);
 	    var zrUtil = __webpack_require__(4);
 	    var modelUtil = __webpack_require__(5);
-	    var completeDimensions = __webpack_require__(103);
+	    var completeDimensions = __webpack_require__(110);
 
 	    var dataSelectableMixin = __webpack_require__(148);
 
@@ -31492,9 +32049,9 @@
 
 	        updateSelectedMap: function (targetList) {
 	            this._selectTargetMap = zrUtil.reduce(targetList || [], function (targetMap, target) {
-	                targetMap[target.name] = target;
+	                targetMap.set(target.name, target);
 	                return targetMap;
-	            }, {});
+	            }, zrUtil.createHashMap());
 	        },
 	        /**
 	         * @param {string} name
@@ -31502,10 +32059,10 @@
 	        // PENGING If selectedMode is null ?
 	        select: function (name) {
 	            var targetMap = this._selectTargetMap;
-	            var target = targetMap[name];
+	            var target = targetMap.get(name);
 	            var selectedMode = this.get('selectedMode');
 	            if (selectedMode === 'single') {
-	                zrUtil.each(targetMap, function (target) {
+	                targetMap.each(function (target) {
 	                    target.selected = false;
 	                });
 	            }
@@ -31516,7 +32073,7 @@
 	         * @param {string} name
 	         */
 	        unSelect: function (name) {
-	            var target = this._selectTargetMap[name];
+	            var target = this._selectTargetMap.get(name);
 	            // var selectedMode = this.get('selectedMode');
 	            // selectedMode !== 'single' && target && (target.selected = false);
 	            target && (target.selected = false);
@@ -31526,7 +32083,7 @@
 	         * @param {string} name
 	         */
 	        toggleSelected: function (name) {
-	            var target = this._selectTargetMap[name];
+	            var target = this._selectTargetMap.get(name);
 	            if (target != null) {
 	                this[target.selected ? 'unSelect' : 'select'](name);
 	                return target.selected;
@@ -31537,7 +32094,7 @@
 	         * @param {string} name
 	         */
 	        isSelected: function (name) {
-	            var target = this._selectTargetMap[name];
+	            var target = this._selectTargetMap.get(name);
 	            return target && target.selected;
 	        }
 	    };
@@ -31549,7 +32106,7 @@
 
 	
 
-	    var graphic = __webpack_require__(44);
+	    var graphic = __webpack_require__(18);
 	    var zrUtil = __webpack_require__(4);
 
 	    /**
@@ -31827,7 +32384,7 @@
 
 
 	    // Pie view
-	    var Pie = __webpack_require__(43).extend({
+	    var Pie = __webpack_require__(80).extend({
 
 	        type: 'pie',
 
@@ -32044,9 +32601,7 @@
 /* 152 */
 /***/ function(module, exports, __webpack_require__) {
 
-	// TODO minAngle
-
-
+	
 
 	    var numberUtil = __webpack_require__(7);
 	    var parsePercent = numberUtil.parsePercent;
@@ -32082,9 +32637,14 @@
 
 	            var minAngle = seriesModel.get('minAngle') * RADIAN;
 
+	            var validDataCount = 0;
+	            data.each('value', function (value) {
+	                !isNaN(value) && validDataCount++;
+	            });
+
 	            var sum = data.getSum('value');
 	            // Sum may be 0
-	            var unitRadian = Math.PI / (sum || data.count()) * 2;
+	            var unitRadian = Math.PI / (sum || validDataCount) * 2;
 
 	            var clockwise = seriesModel.get('clockwise');
 
@@ -32100,8 +32660,8 @@
 	            var valueSumLargerThanMinAngle = 0;
 
 	            var currentAngle = startAngle;
-
 	            var dir = clockwise ? 1 : -1;
+
 	            data.each('value', function (value, idx) {
 	                var angle;
 	                if (isNaN(value)) {
@@ -32126,7 +32686,7 @@
 	                        ? unitRadian : (value * unitRadian);
 	                }
 	                else {
-	                    angle = PI2 / (data.count() || 1);
+	                    angle = PI2 / validDataCount;
 	                }
 
 	                if (angle < minAngle) {
@@ -32156,27 +32716,32 @@
 
 	            // Some sector is constrained by minAngle
 	            // Rest sectors needs recalculate angle
-	            if (restAngle < PI2) {
+	            if (restAngle < PI2 && validDataCount) {
 	                // Average the angle if rest angle is not enough after all angles is
 	                // Constrained by minAngle
 	                if (restAngle <= 1e-3) {
-	                    var angle = PI2 / data.count();
-	                    data.each(function (idx) {
-	                        var layout = data.getItemLayout(idx);
-	                        layout.startAngle = startAngle + dir * idx * angle;
-	                        layout.endAngle = startAngle + dir * (idx + 1) * angle;
+	                    var angle = PI2 / validDataCount;
+	                    data.each('value', function (value, idx) {
+	                        if (!isNaN(value)) {
+	                            var layout = data.getItemLayout(idx);
+	                            layout.angle = angle;
+	                            layout.startAngle = startAngle + dir * idx * angle;
+	                            layout.endAngle = startAngle + dir * (idx + 1) * angle;
+	                        }
 	                    });
 	                }
 	                else {
 	                    unitRadian = restAngle / valueSumLargerThanMinAngle;
 	                    currentAngle = startAngle;
 	                    data.each('value', function (value, idx) {
-	                        var layout = data.getItemLayout(idx);
-	                        var angle = layout.angle === minAngle
-	                            ? minAngle : value * unitRadian;
-	                        layout.startAngle = currentAngle;
-	                        layout.endAngle = currentAngle + dir * angle;
-	                        currentAngle += dir * angle;
+	                        if (!isNaN(value)) {
+	                            var layout = data.getItemLayout(idx);
+	                            var angle = layout.angle === minAngle
+	                                ? minAngle : value * unitRadian;
+	                            layout.startAngle = currentAngle;
+	                            layout.endAngle = currentAngle + dir * angle;
+	                            currentAngle += dir * angle;
+	                        }
 	                    });
 	                }
 	            }
diff --git a/dist/echarts.simple.min.js b/dist/echarts.simple.min.js
index aa99d5a..7b12f08 100644
--- a/dist/echarts.simple.min.js
+++ b/dist/echarts.simple.min.js
@@ -1,4 +1,4 @@
-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={exports:{},id:i,loaded:!1};return t[i].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){t.exports=n(2),n(107),n(101),n(111),n(32)},function(t,e){function n(t){if(null==t||"object"!=typeof t)return t;var e=t,i=R.call(t);if("[object Array]"===i){e=[];for(var r=0,a=t.length;r<a;r++)e[r]=n(t[r])}else if(N[i])e=t.constructor.from(t);else if(!z[i]&&!k(t)&&!S(t)){e={};for(var o in t)t.hasOwnProperty(o)&&(e[o]=n(t[o]))}return e}function i(t,e,r){if(!M(e)||!M(t))return r?n(e):t;for(var a in e)if(e.hasOwnProperty(a)){var o=t[a],s=e[a];!M(s)||!M(o)||_(s)||_(o)||S(s)||S(o)||T(s)||T(o)||k(s)||k(o)?!r&&a in t||(t[a]=n(e[a],!0)):i(o,s,r)}return t}function r(t,e){for(var n=t[0],r=1,a=t.length;r<a;r++)n=i(n,t[r],e);return n}function a(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function o(t,e,n){for(var i in e)e.hasOwnProperty(i)&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i]);return t}function s(){return document.createElement("canvas")}function l(){return E||(E=Z.createCanvas().getContext("2d")),E}function h(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function u(t,e){function n(){}var i=t.prototype;n.prototype=e.prototype,t.prototype=new n;for(var r in i)t.prototype[r]=i[r];t.prototype.constructor=t,t.superClass=e}function c(t,e,n){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,o(t,e,n)}function f(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function d(t,e,n){if(t&&e)if(t.forEach&&t.forEach===F)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(n,t[a],a,t)}function p(t,e,n){if(t&&e){if(t.map&&t.map===q)return t.map(e,n);for(var i=[],r=0,a=t.length;r<a;r++)i.push(e.call(n,t[r],r,t));return i}}function g(t,e,n,i){if(t&&e){if(t.reduce&&t.reduce===H)return t.reduce(e,n,i);for(var r=0,a=t.length;r<a;r++)n=e.call(i,n,t[r],r,t);return n}}function v(t,e,n){if(t&&e){if(t.filter&&t.filter===G)return t.filter(e,n);for(var i=[],r=0,a=t.length;r<a;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}}function m(t,e,n){if(t&&e)for(var i=0,r=t.length;i<r;i++)if(e.call(n,t[i],i,t))return t[i]}function y(t,e){var n=V.call(arguments,2);return function(){return t.apply(e,n.concat(V.call(arguments)))}}function x(t){var e=V.call(arguments,1);return function(){return t.apply(this,e.concat(V.call(arguments)))}}function _(t){return"[object Array]"===R.call(t)}function b(t){return"function"==typeof t}function w(t){return"[object String]"===R.call(t)}function M(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function T(t){return!!z[R.call(t)]}function S(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function A(t){return t!==t}function C(t){for(var e=0,n=arguments.length;e<n;e++)if(null!=arguments[e])return arguments[e]}function I(){return Function.call.apply(V,arguments)}function P(t,e){if(!t)throw new Error(e)}function L(t){t[W]=!0}function k(t){return t[W]}function O(t){t&&a(this,t)}function D(){return new O}var E,z={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},N={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},R=Object.prototype.toString,B=Array.prototype,F=B.forEach,G=B.filter,V=B.slice,q=B.map,H=B.reduce,W="__ec_primitive__",j="_ec_",U=4;O.prototype={constructor:O,get:function(t){return this[j+t]},set:function(t,e){return this[j+t]=e,e},each:function(t,e){void 0!==e&&(t=y(t,e));for(var n in this)this.hasOwnProperty(n)&&t(this[n],n.slice(U))},removeKey:function(t){delete this[t]}};var Z={inherits:u,mixin:c,clone:n,merge:i,mergeAll:r,extend:a,defaults:o,getContext:l,createCanvas:s,indexOf:h,slice:I,find:m,isArrayLike:f,each:d,map:p,reduce:g,filter:v,bind:y,curry:x,isArray:_,isString:w,isObject:M,isFunction:b,isBuiltInObject:T,isDom:S,eqNaN:A,retrieve:C,assert:P,setAsPrimitive:L,createHashMap:D,noop:function(){}};t.exports=Z},function(t,e,n){function i(t){return function(e,n,i){e=e&&e.toLowerCase(),B.prototype[t].call(this,e,n,i)}}function r(){B.call(this)}function a(t,e,n){function i(t,e){return t.prio-e.prio}n=n||{},"string"==typeof e&&(e=lt[e]),this.id,this.group,this._dom=t;var a=this._zr=z.init(t,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.width,height:n.height});this._throttledZrFlush=E.throttle(N.bind(a.flush,a),17),this._theme=N.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new A,this._api=b(this),B.call(this),this._messageCenter=new r,this._initEvents(),this.resize=N.bind(this.resize,this),this._pendingActions=[],F(st,i),F(rt,i),a.animation.on("frame",this._onframe,this),N.setAsPrimitive(this)}function o(t,e,n){var i,r=this._model,a=this._coordSysMgr.getCoordinateSystems();e=D.parseFinder(r,e);for(var o=0;o<a.length;o++){var s=a[o];if(s[t]&&null!=(i=s[t](r,e,n)))return i}}function s(t,e,n,i,r){function a(i){i&&i.__alive&&i[e]&&i[e](i.__model,o,t._api,n)}var o=t._model;if(!i)return void G(t._componentsViews.concat(t._chartsViews),a);var s={};s[i+"Id"]=n[i+"Id"],s[i+"Index"]=n[i+"Index"],s[i+"Name"]=n[i+"Name"];var l={mainType:i,query:s};r&&(l.subType=r),o&&o.eachComponent(l,function(e,n){a(t["series"===i?"_chartsMap":"_componentsMap"][e.__viewId])},t)}function l(t,e){var n=t.type,i=t.escapeConnect,r=nt[n],a=r.actionInfo,o=(a.update||"update").split(":"),l=o.pop();o=null!=o[0]&&V(o[0]),this[Y]=!0;var h=[t],u=!1;t.batch&&(u=!0,h=N.map(t.batch,function(e){return e=N.defaults(N.extend({},e),t),e.batch=null,e}));var c,f=[],d="highlight"===n||"downplay"===n;G(h,function(t){c=r.action(t,this._model,this._api),c=c||N.extend({},t),c.type=a.event||c.type,f.push(c),d?s(this,l,t,"series"):o&&s(this,l,t,o.main,o.sub)},this),"none"===l||d||o||(this[Q]?(tt.prepareAndUpdate.call(this,t),this[Q]=!1):tt[l].call(this,t)),c=u?{type:a.event||n,escapeConnect:i,batch:f}:f[0],this[Y]=!1,!e&&this._messageCenter.trigger(c.type,c)}function h(t){for(var e=this._pendingActions;e.length;){var n=e.shift();l.call(this,n,t)}}function u(t){!t&&this.trigger("updated")}function c(t,e,n){var i=this._api;G(this._componentsViews,function(r){var a=r.__model;r[t](a,e,i,n),_(a,r)},this),e.eachSeries(function(r,a){var o=this._chartsMap[r.__viewId];o[t](r,e,i,n),_(r,o),x(r,o)},this),y(this._zr,e),G(ot,function(t){t(e,i)})}function f(t,e){for(var n="component"===t,i=n?this._componentsViews:this._chartsViews,r=n?this._componentsMap:this._chartsMap,a=this._zr,o=0;o<i.length;o++)i[o].__alive=!1;e[n?"eachComponent":"eachSeries"](function(t,o){if(n){if("series"===t)return}else o=t;var s=o.id+"_"+o.type,l=r[s];if(!l){var h=V(o.type),u=n?L.getClass(h.main,h.sub):k.getClass(h.sub);if(!u)return;l=new u,l.init(e,this._api),r[s]=l,i.push(l),a.add(l.group)}o.__viewId=l.__id=s,l.__alive=!0,l.__model=o,l.group.__ecComponentInfo={mainType:o.mainType,index:o.componentIndex}},this);for(var o=0;o<i.length;){var s=i[o];s.__alive?o++:(a.remove(s.group),s.dispose(e,this._api),i.splice(o,1),delete r[s.__id],s.__id=s.group.__ecComponentInfo=null)}}function d(t,e){G(rt,function(n){n.func(t,e)})}function p(t){var e={};t.eachSeries(function(t){var n=t.get("stack"),i=t.getData();if(n&&"list"===i.type){var r=e[n];r&&(i.stackedOn=r),e[n]=i}})}function g(t,e){var n=this._api;G(st,function(i){i.isLayout&&i.func(t,n,e)})}function v(t,e,n){var i=this._api;t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()}),G(st,function(r){(!n||!r.isLayout)&&r.func(t,i,e)})}function m(t,e){var n=this._api;G(this._componentsViews,function(i){var r=i.__model;i.render(r,t,n,e),_(r,i)},this),G(this._chartsViews,function(t){t.__alive=!1},this),t.eachSeries(function(i,r){var a=this._chartsMap[i.__viewId];a.__alive=!0,a.render(i,t,n,e),a.group.silent=!!i.get("silent"),_(i,a),x(i,a)},this),y(this._zr,t),G(this._chartsViews,function(e){e.__alive||e.remove(t,n)},this)}function y(t,e){var n=t.storage,i=0;n.traverse(function(t){t.isGroup||i++}),i>e.get("hoverLayerThreshold")&&!M.node&&n.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function x(t,e){var n=0;e.group.traverse(function(t){"group"===t.type||t.ignore||n++});var i=+t.get("progressive"),r=n>t.get("progressiveThreshold")&&i&&!M.node;r&&e.group.traverse(function(t){t.isGroup||(t.progressive=r?Math.floor(n++/i):-1,r&&t.stopAnimation(!0))});var a=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.setStyle("blend",a)})}function _(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function b(t){var e=t._coordSysMgr;return N.extend(new S(t),{getCoordinateSystems:N.bind(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}}})}function w(t){function e(t,e){for(var n=0;n<t.length;n++){var i=t[n];i[a]=e}}var n=0,i=1,r=2,a="__connectUpdateStatus";N.each(it,function(o,s){t._messageCenter.on(s,function(o){if(ct[t.group]&&t[a]!==n){if(o&&o.escapeConnect)return;var s=t.makeActionFromEvent(o),l=[];N.each(ut,function(e){e!==t&&e.group===t.group&&l.push(e)}),e(l,n),G(l,function(t){t[a]!==i&&t.dispatchAction(s)}),e(l,r)}})})}/*!
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={exports:{},id:i,loaded:!1};return t[i].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){t.exports=n(2),n(108),n(102),n(112),n(32)},function(t,e){function n(t){if(null==t||"object"!=typeof t)return t;var e=t,i=R.call(t);if("[object Array]"===i){e=[];for(var r=0,a=t.length;r<a;r++)e[r]=n(t[r])}else if(N[i])e=t.constructor.from(t);else if(!z[i]&&!k(t)&&!S(t)){e={};for(var o in t)t.hasOwnProperty(o)&&(e[o]=n(t[o]))}return e}function i(t,e,r){if(!M(e)||!M(t))return r?n(e):t;for(var a in e)if(e.hasOwnProperty(a)){var o=t[a],s=e[a];!M(s)||!M(o)||_(s)||_(o)||S(s)||S(o)||T(s)||T(o)||k(s)||k(o)?!r&&a in t||(t[a]=n(e[a],!0)):i(o,s,r)}return t}function r(t,e){for(var n=t[0],r=1,a=t.length;r<a;r++)n=i(n,t[r],e);return n}function a(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function o(t,e,n){for(var i in e)e.hasOwnProperty(i)&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i]);return t}function s(){return document.createElement("canvas")}function l(){return E||(E=Z.createCanvas().getContext("2d")),E}function h(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function u(t,e){function n(){}var i=t.prototype;n.prototype=e.prototype,t.prototype=new n;for(var r in i)t.prototype[r]=i[r];t.prototype.constructor=t,t.superClass=e}function c(t,e,n){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,o(t,e,n)}function f(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function d(t,e,n){if(t&&e)if(t.forEach&&t.forEach===F)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(n,t[a],a,t)}function p(t,e,n){if(t&&e){if(t.map&&t.map===H)return t.map(e,n);for(var i=[],r=0,a=t.length;r<a;r++)i.push(e.call(n,t[r],r,t));return i}}function g(t,e,n,i){if(t&&e){if(t.reduce&&t.reduce===q)return t.reduce(e,n,i);for(var r=0,a=t.length;r<a;r++)n=e.call(i,n,t[r],r,t);return n}}function v(t,e,n){if(t&&e){if(t.filter&&t.filter===G)return t.filter(e,n);for(var i=[],r=0,a=t.length;r<a;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}}function m(t,e,n){if(t&&e)for(var i=0,r=t.length;i<r;i++)if(e.call(n,t[i],i,t))return t[i]}function y(t,e){var n=V.call(arguments,2);return function(){return t.apply(e,n.concat(V.call(arguments)))}}function x(t){var e=V.call(arguments,1);return function(){return t.apply(this,e.concat(V.call(arguments)))}}function _(t){return"[object Array]"===R.call(t)}function b(t){return"function"==typeof t}function w(t){return"[object String]"===R.call(t)}function M(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function T(t){return!!z[R.call(t)]}function S(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function A(t){return t!==t}function I(t){for(var e=0,n=arguments.length;e<n;e++)if(null!=arguments[e])return arguments[e]}function C(){return Function.call.apply(V,arguments)}function P(t,e){if(!t)throw new Error(e)}function L(t){t[W]=!0}function k(t){return t[W]}function D(t){t&&d(t,function(t,e){this.set(e,t)},this)}function O(t){return new D(t)}var E,z={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},N={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},R=Object.prototype.toString,B=Array.prototype,F=B.forEach,G=B.filter,V=B.slice,H=B.map,q=B.reduce,W="__ec_primitive__",j="_ec_",U=4;D.prototype={constructor:D,get:function(t){return this[j+t]},set:function(t,e){return this[j+t]=e,e},each:function(t,e){void 0!==e&&(t=y(t,e));for(var n in this)this.hasOwnProperty(n)&&t(this[n],n.slice(U))},removeKey:function(t){delete this[t]}};var Z={inherits:u,mixin:c,clone:n,merge:i,mergeAll:r,extend:a,defaults:o,getContext:l,createCanvas:s,indexOf:h,slice:C,find:m,isArrayLike:f,each:d,map:p,reduce:g,filter:v,bind:y,curry:x,isArray:_,isString:w,isObject:M,isFunction:b,isBuiltInObject:T,isDom:S,eqNaN:A,retrieve:I,assert:P,setAsPrimitive:L,createHashMap:O,noop:function(){}};t.exports=Z},function(t,e,n){function i(t){return function(e,n,i){e=e&&e.toLowerCase(),B.prototype[t].call(this,e,n,i)}}function r(){B.call(this)}function a(t,e,n){function i(t,e){return t.prio-e.prio}n=n||{},"string"==typeof e&&(e=lt[e]),this.id,this.group,this._dom=t;var a=this._zr=z.init(t,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.width,height:n.height});this._throttledZrFlush=E.throttle(N.bind(a.flush,a),17),this._theme=N.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new A,this._api=b(this),B.call(this),this._messageCenter=new r,this._initEvents(),this.resize=N.bind(this.resize,this),this._pendingActions=[],F(st,i),F(rt,i),a.animation.on("frame",this._onframe,this),N.setAsPrimitive(this)}function o(t,e,n){var i,r=this._model,a=this._coordSysMgr.getCoordinateSystems();e=O.parseFinder(r,e);for(var o=0;o<a.length;o++){var s=a[o];if(s[t]&&null!=(i=s[t](r,e,n)))return i}}function s(t,e,n,i,r){function a(i){i&&i.__alive&&i[e]&&i[e](i.__model,o,t._api,n)}var o=t._model;if(!i)return void G(t._componentsViews.concat(t._chartsViews),a);var s={};s[i+"Id"]=n[i+"Id"],s[i+"Index"]=n[i+"Index"],s[i+"Name"]=n[i+"Name"];var l={mainType:i,query:s};r&&(l.subType=r),o&&o.eachComponent(l,function(e,n){a(t["series"===i?"_chartsMap":"_componentsMap"][e.__viewId])},t)}function l(t,e){var n=t.type,i=t.escapeConnect,r=nt[n],a=r.actionInfo,o=(a.update||"update").split(":"),l=o.pop();o=null!=o[0]&&V(o[0]),this[Y]=!0;var h=[t],u=!1;t.batch&&(u=!0,h=N.map(t.batch,function(e){return e=N.defaults(N.extend({},e),t),e.batch=null,e}));var c,f=[],d="highlight"===n||"downplay"===n;G(h,function(t){c=r.action(t,this._model,this._api),c=c||N.extend({},t),c.type=a.event||c.type,f.push(c),d?s(this,l,t,"series"):o&&s(this,l,t,o.main,o.sub)},this),"none"===l||d||o||(this[Q]?(tt.prepareAndUpdate.call(this,t),this[Q]=!1):tt[l].call(this,t)),c=u?{type:a.event||n,escapeConnect:i,batch:f}:f[0],this[Y]=!1,!e&&this._messageCenter.trigger(c.type,c)}function h(t){for(var e=this._pendingActions;e.length;){var n=e.shift();l.call(this,n,t)}}function u(t){!t&&this.trigger("updated")}function c(t,e,n){var i=this._api;G(this._componentsViews,function(r){var a=r.__model;r[t](a,e,i,n),_(a,r)},this),e.eachSeries(function(r,a){var o=this._chartsMap[r.__viewId];o[t](r,e,i,n),_(r,o),x(r,o)},this),y(this._zr,e),G(ot,function(t){t(e,i)})}function f(t,e){for(var n="component"===t,i=n?this._componentsViews:this._chartsViews,r=n?this._componentsMap:this._chartsMap,a=this._zr,o=0;o<i.length;o++)i[o].__alive=!1;e[n?"eachComponent":"eachSeries"](function(t,o){if(n){if("series"===t)return}else o=t;var s="_ec_"+o.id+"_"+o.type,l=r[s];if(!l){var h=V(o.type),u=n?L.getClass(h.main,h.sub):k.getClass(h.sub);if(!u)return;l=new u,l.init(e,this._api),r[s]=l,i.push(l),a.add(l.group)}o.__viewId=l.__id=s,l.__alive=!0,l.__model=o,l.group.__ecComponentInfo={mainType:o.mainType,index:o.componentIndex}},this);for(var o=0;o<i.length;){var s=i[o];s.__alive?o++:(a.remove(s.group),s.dispose(e,this._api),i.splice(o,1),delete r[s.__id],s.__id=s.group.__ecComponentInfo=null)}}function d(t,e){G(rt,function(n){n.func(t,e)})}function p(t){var e={};t.eachSeries(function(t){var n=t.get("stack"),i=t.getData();if(n&&"list"===i.type){var r=e[n];e.hasOwnProperty(n)&&r&&(i.stackedOn=r),e[n]=i}})}function g(t,e){var n=this._api;G(st,function(i){i.isLayout&&i.func(t,n,e)})}function v(t,e,n){var i=this._api;t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()}),G(st,function(r){(!n||!r.isLayout)&&r.func(t,i,e)})}function m(t,e){var n=this._api;G(this._componentsViews,function(i){var r=i.__model;i.render(r,t,n,e),_(r,i)},this),G(this._chartsViews,function(t){t.__alive=!1},this),t.eachSeries(function(i,r){var a=this._chartsMap[i.__viewId];a.__alive=!0,a.render(i,t,n,e),a.group.silent=!!i.get("silent"),_(i,a),x(i,a)},this),y(this._zr,t),G(this._chartsViews,function(e){e.__alive||e.remove(t,n)},this)}function y(t,e){var n=t.storage,i=0;n.traverse(function(t){t.isGroup||i++}),i>e.get("hoverLayerThreshold")&&!M.node&&n.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function x(t,e){var n=0;e.group.traverse(function(t){"group"===t.type||t.ignore||n++});var i=+t.get("progressive"),r=n>t.get("progressiveThreshold")&&i&&!M.node;r&&e.group.traverse(function(t){t.isGroup||(t.progressive=r?Math.floor(n++/i):-1,r&&t.stopAnimation(!0))});var a=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.setStyle("blend",a)})}function _(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function b(t){var e=t._coordSysMgr;return N.extend(new S(t),{getCoordinateSystems:N.bind(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}}})}function w(t){function e(t,e){for(var n=0;n<t.length;n++){var i=t[n];i[a]=e}}var n=0,i=1,r=2,a="__connectUpdateStatus";N.each(it,function(o,s){t._messageCenter.on(s,function(o){if(ct[t.group]&&t[a]!==n){if(o&&o.escapeConnect)return;var s=t.makeActionFromEvent(o),l=[];N.each(ut,function(e){e!==t&&e.group===t.group&&l.push(e)}),e(l,n),G(l,function(t){t[a]!==i&&t.dispatchAction(s)}),e(l,r)}})})}/*!
 	 * ECharts, a javascript interactive chart library.
 	 *
 	 * Copyright (c) 2015, Baidu Inc.
@@ -7,11 +7,11 @@
 	 * LICENSE
 	 * https://github.com/ecomfe/echarts/blob/master/LICENSE.txt
 	 */
-var M=n(9),T=n(137),S=n(100),A=n(26),C=n(138),I=n(13),P=n(18),L=n(64),k=n(30),O=n(3),D=n(6),E=n(37),z=n(87),N=n(1),R=n(22),B=n(23),F=n(51),G=N.each,V=I.parseClassType,q=1e3,H=5e3,W=1e3,j=2e3,U=3e3,Z=4e3,X=5e3,Y="__flagInMainProcess",$="__hasGradientOrPatternBg",Q="__optionUpdated",K=/^[a-zA-Z0-9_]+$/;r.prototype.on=i("on"),r.prototype.off=i("off"),r.prototype.one=i("one"),N.mixin(r,B);var J=a.prototype;J._onframe=function(){if(this[Q]){var t=this[Q].silent;this[Y]=!0,tt.prepareAndUpdate.call(this),this[Y]=!1,this[Q]=!1,h.call(this,t),u.call(this,t)}},J.getDom=function(){return this._dom},J.getZr=function(){return this._zr},J.setOption=function(t,e,n){var i;if(N.isObject(e)&&(n=e.lazyUpdate,i=e.silent,e=e.notMerge),this[Y]=!0,!this._model||e){var r=new C(this._api),a=this._theme,o=this._model=new T(null,null,a,r);o.init(null,null,a,r)}this.__lastOnlyGraphic=!(!t||!t.graphic),N.each(t,function(t,e){"graphic"!==e&&(this.__lastOnlyGraphic=!1)},this),this._model.setOption(t,at,this.__lastOnlyGraphic),n?(this[Q]={silent:i},this[Y]=!1):(tt.prepareAndUpdate.call(this),this._zr.flush(),this[Q]=!1,this[Y]=!1,h.call(this,i),u.call(this,i))},J.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},J.getModel=function(){return this._model},J.getOption=function(){return this._model&&this._model.getOption()},J.getWidth=function(){return this._zr.getWidth()},J.getHeight=function(){return this._zr.getHeight()},J.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},J.getRenderedCanvas=function(t){if(M.canvasSupported){t=t||{},t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr,n=e.storage.getDisplayList();return N.each(n,function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},J.getDataURL=function(t){t=t||{};var e=t.excludeComponents,n=this._model,i=[],r=this;G(e,function(t){n.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)})});var a=this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return G(i,function(t){t.group.ignore=!1}),a},J.getConnectedDataURL=function(t){if(M.canvasSupported){var e=this.group,n=Math.min,i=Math.max,r=1/0;if(ct[e]){var a=r,o=r,s=-r,l=-r,h=[],u=t&&t.pixelRatio||1;N.each(ut,function(r,u){if(r.group===e){var c=r.getRenderedCanvas(N.clone(t)),f=r.getDom().getBoundingClientRect();a=n(f.left,a),o=n(f.top,o),s=i(f.right,s),l=i(f.bottom,l),h.push({dom:c,left:f.left,top:f.top})}}),a*=u,o*=u,s*=u,l*=u;var c=s-a,f=l-o,d=N.createCanvas();d.width=c,d.height=f;var p=z.init(d);return G(h,function(t){var e=new O.Image({style:{x:t.left*u-a,y:t.top*u-o,image:t.dom}});p.add(e)}),p.refreshImmediately(),d.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},J.convertToPixel=N.curry(o,"convertToPixel"),J.convertFromPixel=N.curry(o,"convertFromPixel"),J.containPixel=function(t,e){var n,i=this._model;return t=D.parseFinder(i,t),N.each(t,function(t,i){i.indexOf("Models")>=0&&N.each(t,function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n|=!!r.containPoint(e);else if("seriesModels"===i){var a=this._chartsMap[t.__viewId];a&&a.containPoint&&(n|=a.containPoint(e,t))}},this)},this),!!n},J.getVisual=function(t,e){var n=this._model;t=D.parseFinder(n,t,{defaultMainType:"series"});var i=t.seriesModel,r=i.getData(),a=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?r.indexOfRawIndex(t.dataIndex):null;return null!=a?r.getItemVisual(a,e):r.getVisual(e)},J.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},J.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var tt={update:function(t){var e=this._model,n=this._api,i=this._coordSysMgr,r=this._zr;if(e){e.restoreData(),i.create(this._model,this._api),d.call(this,e,n),p.call(this,e),i.update(e,n),v.call(this,e,t),m.call(this,e,t);var a=e.get("backgroundColor")||"transparent",o=r.painter;if(o.isSingleCanvas&&o.isSingleCanvas())r.configLayer(0,{clearColor:a});else{if(!M.canvasSupported){var s=R.parse(a);a=R.stringify(s,"rgb"),0===s[3]&&(a="transparent")}a.colorStops||a.image?(r.configLayer(0,{clearColor:a}),this[$]=!0,this._dom.style.background="transparent"):(this[$]&&r.configLayer(0,{clearColor:null}),this[$]=!1,this._dom.style.background=a)}G(ot,function(t){t(e,n)})}},updateView:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),v.call(this,e,t),c.call(this,"updateView",e,t))},updateVisual:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),v.call(this,e,t,!0),c.call(this,"updateVisual",e,t))},updateLayout:function(t){var e=this._model;e&&(g.call(this,e,t),c.call(this,"updateLayout",e,t))},prepareAndUpdate:function(t){var e=this._model;f.call(this,"component",e),f.call(this,"chart",e),this.__lastOnlyGraphic?(G(this._componentsViews,function(n){var i=n.__model;i&&"graphic"===i.mainType&&(n.render(i,e,this._api,t),_(i,n))},this),this.__lastOnlyGraphic=!1):tt.update.call(this,t)}};J.resize=function(t){this[Y]=!0,this._zr.resize(t);var e=this._model&&this._model.resetOption("media"),n=e?"prepareAndUpdate":"update";tt[n].call(this),this._loadingFX&&this._loadingFX.resize(),this[Y]=!1;var i=t&&t.silent;h.call(this,i),u.call(this,i)},J.showLoading=function(t,e){if(N.isObject(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),ht[t]){var n=ht[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},J.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},J.makeActionFromEvent=function(t){var e=N.extend({},t);return e.type=it[t.type],e},J.dispatchAction=function(t,e){if(N.isObject(e)||(e={silent:!!e}),nt[t.type]){if(this[Y])return void this._pendingActions.push(t);l.call(this,t,e.silent),e.flush?this._zr.flush(!0):e.flush!==!1&&M.browser.weChat&&this._throttledZrFlush(),h.call(this,e.silent),u.call(this,e.silent)}},J.on=i("on"),J.off=i("off"),J.one=i("one");var et=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];J._initEvents=function(){G(et,function(t){this._zr.on(t,function(e){var n,i=this.getModel(),r=e.target;if("globalout"===t)n={};else if(r&&null!=r.dataIndex){var a=r.dataModel||i.getSeriesByIndex(r.seriesIndex);n=a&&a.getDataParams(r.dataIndex,r.dataType)||{}}else r&&r.eventData&&(n=N.extend({},r.eventData));n&&(n.event=e,n.type=t,this.trigger(t,n))},this)},this),G(it,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},J.isDisposed=function(){return this._disposed},J.clear=function(){this.setOption({series:[]},!0)},J.dispose=function(){if(!this._disposed){this._disposed=!0;var t=this._api,e=this._model;G(this._componentsViews,function(n){n.dispose(e,t)}),G(this._chartsViews,function(n){n.dispose(e,t)}),this._zr.dispose(),delete ut[this.id]}},N.mixin(a,B);var nt={},it={},rt=[],at=[],ot=[],st=[],lt={},ht={},ut={},ct={},ft=new Date-0,dt=new Date-0,pt="_echarts_instance_",gt={version:"3.5.4",dependencies:{zrender:"3.4.4"}};gt.init=function(t,e,n){var i=new a(t,e,n);return i.id="ec_"+ft++,ut[i.id]=i,t.setAttribute&&t.setAttribute(pt,i.id),w(i),i},gt.connect=function(t){if(N.isArray(t)){var e=t;t=null,N.each(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+dt++,N.each(e,function(e){e.group=t})}return ct[t]=!0,t},gt.disConnect=function(t){ct[t]=!1},gt.disconnect=gt.disConnect,gt.dispose=function(t){N.isDom(t)?t=gt.getInstanceByDom(t):"string"==typeof t&&(t=ut[t]),t instanceof a&&!t.isDisposed()&&t.dispose()},gt.getInstanceByDom=function(t){var e=t.getAttribute(pt);return ut[e]},gt.getInstanceById=function(t){return ut[t]},gt.registerTheme=function(t,e){lt[t]=e},gt.registerPreprocessor=function(t){at.push(t)},gt.registerProcessor=function(t,e){"function"==typeof t&&(e=t,t=q),rt.push({prio:t,func:e})},gt.registerPostUpdate=function(t){ot.push(t)},gt.registerAction=function(t,e,n){"function"==typeof e&&(n=e,e="");var i=N.isObject(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,N.assert(K.test(i)&&K.test(e)),nt[i]||(nt[i]={action:n,actionInfo:t}),it[e]=i},gt.registerCoordinateSystem=function(t,e){A.register(t,e)},gt.registerLayout=function(t,e){"function"==typeof t&&(e=t,t=W),st.push({prio:t,func:e,isLayout:!0})},gt.registerVisual=function(t,e){"function"==typeof t&&(e=t,t=U),st.push({prio:t,func:e})},gt.registerLoading=function(t,e){ht[t]=e},gt.extendComponentModel=function(t){return I.extend(t)},gt.extendComponentView=function(t){return L.extend(t)},gt.extendSeriesModel=function(t){return P.extend(t)},gt.extendChartView=function(t){return k.extend(t)},gt.setCanvasCreator=function(t){N.createCanvas=t},gt.registerVisual(j,n(151)),gt.registerPreprocessor(n(145)),gt.registerLoading("default",n(136)),gt.registerAction({type:"highlight",event:"highlight",update:"highlight"},N.noop),gt.registerAction({type:"downplay",event:"downplay",update:"downplay"},N.noop),gt.zrender=z,gt.List=n(14),gt.Model=n(10),gt.Axis=n(33),gt.graphic=n(3),gt.number=n(4),gt.format=n(7),gt.throttle=E.throttle,gt.matrix=n(19),gt.vector=n(5),gt.color=n(22),gt.util={},G(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){gt.util[t]=N[t]}),gt.helper=n(135),gt.PRIORITY={PROCESSOR:{FILTER:q,STATISTIC:H},VISUAL:{LAYOUT:W,GLOBAL:j,CHART:U,COMPONENT:Z,BRUSH:X}},t.exports=gt},function(t,e,n){"use strict";function i(t){return null!=t&&"none"!=t}function r(t){return"string"==typeof t?_.lift(t,-.1):t}function a(t){if(t.__hoverStlDirty){var e=t.style.stroke,n=t.style.fill,a=t.__hoverStl;a.fill=a.fill||(i(n)?r(n):null),a.stroke=a.stroke||(i(e)?r(e):null);var o={};for(var s in a)a.hasOwnProperty(s)&&(o[s]=t.style[s]);t.__normalStl=o,t.__hoverStlDirty=!1}}function o(t){t.__isHover||(a(t),t.useHoverLayer?t.__zr&&t.__zr.addHover(t,t.__hoverStl):(t.setStyle(t.__hoverStl),t.z2+=1),t.__isHover=!0)}function s(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function l(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&o(t)}):o(t)}function h(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&s(t)}):s(t)}function u(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&a(t)}function c(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&l(this)}function f(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&h(this)}function d(){this.__isEmphasis=!0,l(this)}function p(){this.__isEmphasis=!1,h(this)}function g(t,e,n,i,r,a){"function"==typeof r&&(a=r,r=null);var o=i&&i.isAnimationEnabled();if(o){var s=t?"Update":"",l=i.getShallow("animationDuration"+s),h=i.getShallow("animationEasing"+s),u=i.getShallow("animationDelay"+s);"function"==typeof u&&(u=u(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof l&&(l=l(r)),l>0?e.animateTo(n,l,u||0,h,a):(e.stopAnimation(),e.attr(n),a&&a())}else e.stopAnimation(),e.attr(n),a&&a()}var v=n(1),m=n(180),y=Math.round,x=n(8),_=n(22),b=n(19),w=n(5),M=n(57),T=n(11),S={};S.Group=n(36),S.Image=n(53),S.Text=n(85),S.Circle=n(171),S.Sector=n(177),S.Ring=n(176),S.Polygon=n(173),S.Polyline=n(174),S.Rect=n(175),S.Line=n(172),S.BezierCurve=n(170),S.Arc=n(169),S.CompoundPath=n(164),S.LinearGradient=n(99),S.RadialGradient=n(165),S.BoundingRect=T,S.extendShape=function(t){return x.extend(t)},S.extendPath=function(t,e){return m.extendFromString(t,e)},S.makePath=function(t,e,n,i){var r=m.createFromString(t,e),a=r.getBoundingRect();if(n){var o=a.width/a.height;if("center"===i){var s,l=n.height*o;l<=n.width?s=n.height:(l=n.width,s=l/o);var h=n.x+n.width/2,u=n.y+n.height/2;n.x=h-l/2,n.y=u-s/2,n.width=l,n.height=s}S.resizePath(r,n)}return r},S.mergePath=m.mergePath,S.resizePath=function(t,e){if(t.applyTransform){var n=t.getBoundingRect(),i=n.calculateTransform(e);t.applyTransform(i)}},S.subPixelOptimizeLine=function(t){var e=S.subPixelOptimize,n=t.shape,i=t.style.lineWidth;return y(2*n.x1)===y(2*n.x2)&&(n.x1=n.x2=e(n.x1,i,!0)),y(2*n.y1)===y(2*n.y2)&&(n.y1=n.y2=e(n.y1,i,!0)),t},S.subPixelOptimizeRect=function(t){var e=S.subPixelOptimize,n=t.shape,i=t.style.lineWidth,r=n.x,a=n.y,o=n.width,s=n.height;return n.x=e(n.x,i,!0),n.y=e(n.y,i,!0),n.width=Math.max(e(r+o,i,!1)-n.x,0===o?0:1),n.height=Math.max(e(a+s,i,!1)-n.y,0===s?0:1),t},S.subPixelOptimize=function(t,e,n){var i=y(2*t);return(i+y(e))%2===0?i/2:(i+(n?1:-1))/2},S.setHoverStyle=function(t,e,n){t.__hoverSilentOnTouch=n&&n.hoverSilentOnTouch,"group"===t.type?t.traverse(function(t){"group"!==t.type&&u(t,e)}):u(t,e),t.on("mouseover",c).on("mouseout",f),t.on("emphasis",d).on("normal",p)},S.setText=function(t,e,n){var i=e.getShallow("position")||"inside",r=e.getShallow("offset"),a=i.indexOf("inside")>=0?"white":n,o=e.getModel("textStyle");v.extend(t,{textDistance:e.getShallow("distance")||5,textFont:o.getFont(),textPosition:i,textOffset:r,textFill:o.getTextColor()||a})},S.updateProps=function(t,e,n,i,r){g(!0,t,e,n,i,r)},S.initProps=function(t,e,n,i,r){g(!1,t,e,n,i,r)},S.getTransform=function(t,e){for(var n=b.identity([]);t&&t!==e;)b.mul(n,t.getLocalTransform(),n),t=t.parent;return n},S.applyTransform=function(t,e,n){return e&&!v.isArrayLike(e)&&(e=M.getLocalTransform(e)),n&&(e=b.invert([],e)),w.applyTransform([],t,e)},S.transformDirection=function(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return a=S.applyTransform(a,e,n),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?"bottom":"top"},S.groupTransition=function(t,e,n,i){function r(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}function a(t){var e={position:w.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=v.extend({},t.shape)),e}if(t&&e){var o=r(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=o[t.anid];if(e){var i=a(t);t.attr(a(e)),S.updateProps(t,i,n,t.dataIndex)}}})}},t.exports=S},function(t,e){function n(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function i(t){return Math.floor(Math.log(t)/Math.LN10)}var r={},a=1e-4;r.linearMap=function(t,e,n,i){var r=e[1]-e[0],a=n[1]-n[0];if(0===r)return 0===a?n[0]:(n[0]+n[1])/2;if(i)if(r>0){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*a+n[0]},r.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?n(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},r.round=function(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t},r.asc=function(t){return t.sort(function(t,e){return t-e}),t},r.getPrecision=function(t){if(t=+t,isNaN(t))return 0;for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n},r.getPrecisionSafe=function(t){var e=t.toString(),n=e.indexOf("e");if(n>0){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r},r.getPixelPrecision=function(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),a=Math.round(n(Math.abs(e[1]-e[0]))/i),o=Math.min(Math.max(-r+a,0),20);return isFinite(o)?o:20},r.MAX_SAFE_INTEGER=9007199254740991,r.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},r.isRadianAroundZero=function(t){return t>-a&&t<a};var o=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;r.getTimezoneOffset=function(){return(new Date).getTimezoneOffset()},r.parseDate=function(t){if(t instanceof Date)return t;if("string"==typeof t){var e=o.exec(t);if(!e)return new Date(NaN);var n=r.getTimezoneOffset(),i=e[8]?"Z"===e[8].toUpperCase()?n:60*+e[8].slice(0,3)+n:0;return new Date((+e[1]),+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0)-i,+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))},r.quantity=function(t){return Math.pow(10,i(t))},r.nice=function(t,e){var n,r=i(t),a=Math.pow(10,r),o=t/a;return n=e?o<1.5?1:o<2.5?2:o<4?3:o<7?5:10:o<1?1:o<2?2:o<3?3:o<5?5:10,t=n*a,r>=-20?+t.toFixed(r<0?-r:0):t},r.reformIntervals=function(t){function e(t,n,i){return t.interval[i]<n.interval[i]||t.interval[i]===n.interval[i]&&(t.close[i]-n.close[i]===(i?-1:1)||!i&&e(t,n,1))}t.sort(function(t,n){return e(t,n,0)?-1:1});for(var n=-(1/0),i=1,r=0;r<t.length;){for(var a=t[r].interval,o=t[r].close,s=0;s<2;s++)a[s]<=n&&(a[s]=n,o[s]=s?1:1-i),n=a[s],i=o[s];a[0]===a[1]&&o[0]*o[1]!==1?t.splice(r,1):r++}return t},r.isNumeric=function(t){return t-parseFloat(t)>=0},t.exports=r},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(t,e){var i=new n(2);return null==t&&(t=0),null==e&&(e=0),i[0]=t,i[1]=e,i},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new n(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,n){return t[0]=e,t[1]=n,t},add:function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t},scaleAndAdd:function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},sub:function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t},normalize:function(t,e){var n=i.len(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t},applyTransform:function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t},min:function(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t},max:function(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}};i.length=i.len,i.lengthSquare=i.lenSquare,i.dist=i.distance,i.distSquare=i.distanceSquare,t.exports=i},function(t,e,n){function i(t,e){return t&&t.hasOwnProperty(e)}var r=n(7),a=n(4),o=n(10),s=n(1),l=s.each,h=s.isObject,u={};u.normalizeToArray=function(t){return t instanceof Array?t:null==t?[]:[t]},u.defaultEmphasis=function(t,e){if(t){var n=t.emphasis=t.emphasis||{},i=t.normal=t.normal||{};l(e,function(t){var e=s.retrieve(n[t],i[t]);null!=e&&(n[t]=e)})}},u.LABEL_OPTIONS=["position","offset","show","textStyle","distance","formatter"],u.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},u.isDataItemOption=function(t){return h(t)&&!(t instanceof Array)},u.converDataValue=function(t,e){var n=e&&e.type;return"ordinal"===n?t:("time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+a.parseDate(t)),null==t||""===t?NaN:+t)},u.createDataFormatModel=function(t,e){var n=new o;return s.mixin(n,u.dataFormatMixin),n.seriesIndex=e.seriesIndex,n.name=e.name||"",n.mainType=e.mainType,n.subType=e.subType,n.getData=function(){return t},n},u.dataFormatMixin={getDataParams:function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),a=n.getName(t,!0),o=n.getRawDataItem(t);return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:this.seriesIndex,seriesId:this.id,seriesName:this.name,name:a,dataIndex:r,data:o,dataType:e,value:i,color:n.getItemVisual(t,"color"),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,n,i){e=e||"normal";var a=this.getData(n),o=a.getItemModel(t),s=this.getDataParams(t,n);null!=i&&s.value instanceof Array&&(s.value=s.value[i]);var l=o.get(["label",e,"formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?r.formatTpl(l,s):void 0},getRawValue:function(t,e){var n=this.getData(e),i=n.getRawDataItem(t);if(null!=i)return!h(i)||i instanceof Array?i:i.value},formatTooltip:s.noop},u.mappingToExists=function(t,e){e=(e||[]).slice();var n=s.map(t||[],function(t,e){return{exist:t}});return l(e,function(t,i){if(h(t)){for(var r=0;r<n.length;r++)if(!n[r].option&&null!=t.id&&n[r].exist.id===t.id+"")return n[r].option=t,void(e[i]=null);for(var r=0;r<n.length;r++){var a=n[r].exist;if(!(n[r].option||null!=a.id&&null!=t.id||null==t.name||u.isIdInner(t)||u.isIdInner(a)||a.name!==t.name+""))return n[r].option=t,void(e[i]=null)}}}),l(e,function(t,e){if(h(t)){for(var i=0;i<n.length;i++){var r=n[i].exist;if(!n[i].option&&!u.isIdInner(r)&&null==t.id){n[i].option=t;break}}i>=n.length&&n.push({option:t})}}),n},u.makeIdAndName=function(t){var e={};l(t,function(t,n){var i=t.exist;i&&(e[i.id]=t)}),l(t,function(t,n){var i=t.option;s.assert(!i||null==i.id||!e[i.id]||e[i.id]===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&(e[i.id]=t),!t.keyInfo&&(t.keyInfo={})}),l(t,function(t,n){var i=t.exist,r=t.option,a=t.keyInfo;if(h(r)){if(a.name=null!=r.name?r.name+"":i?i.name:"\0-",i)a.id=i.id;else if(null!=r.id)a.id=r.id+"";else{var o=0;do a.id="\0"+a.name+"\0"+o++;while(e[a.id])}e[a.id]=t}})},u.isIdInner=function(t){return h(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")},u.compressBatches=function(t,e){function n(t,e,n){for(var i=0,r=t.length;i<r;i++)for(var a=t[i].seriesId,o=u.normalizeToArray(t[i].dataIndex),s=n&&n[a],l=0,h=o.length;l<h;l++){var c=o[l];s&&s[c]?s[c]=null:(e[a]||(e[a]={}))[c]=1}}function i(t,e){var n=[];for(var r in t)if(t.hasOwnProperty(r)&&null!=t[r])if(e)n.push(+r);else{var a=i(t[r],!0);a.length&&n.push({seriesId:r,dataIndex:a})}return n}var r={},a={};return n(t||[],r),n(e||[],a,r),[i(r),i(a)]},u.queryDataIndex=function(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?s.isArray(e.dataIndex)?s.map(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?s.isArray(e.name)?s.map(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0},u.makeGetter=function(){var t=0;return function(){var e="\0__ec_prop_getter_"+t++;return function(t){return t[e]||(t[e]={})}}}(),u.parseFinder=function(t,e,n){if(s.isString(e)){var r={};r[e+"Index"]=0,e=r}var a=n&&n.defaultMainType;!a||i(e,a+"Index")||i(e,a+"Id")||i(e,a+"Name")||(e[a+"Index"]=0);var o={};return l(e,function(i,r){var i=e[r];if("dataIndex"===r||"dataIndexInside"===r)return void(o[r]=i);var a=r.match(/^(\w+)(Index|Id|Name)$/)||[],l=a[1],h=(a[2]||"").toLowerCase();if(!(!l||!h||null==i||"index"===h&&"none"===i||n&&n.includeMainTypes&&s.indexOf(n.includeMainTypes,l)<0)){var u={mainType:l};"index"===h&&"all"===i||(u[h]=i);var c=t.queryComponents(u);o[l+"Models"]=c,o[l+"Model"]=c[0]}}),o},t.exports=u},function(t,e,n){var i=n(1),r=n(4),a=n(16),o={};o.addCommas=function(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))},o.toCamelCase=function(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t},o.normalizeCssArray=function(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t};var s=o.encodeHTML=function(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")},l=["a","b","c","d","e","f","g"],h=function(t,e){return"{"+t+(null==e?"":e)+"}"};o.formatTpl=function(t,e,n){i.isArray(e)||(e=[e]);var r=e.length;if(!r)return"";for(var a=e[0].$vars||[],o=0;o<a.length;o++){var u=l[o],c=h(u,0);t=t.replace(h(u),n?s(c):c)}for(var f=0;f<r;f++)for(var d=0;d<a.length;d++){var c=e[f][a[d]];t=t.replace(h(l[d],f),n?s(c):c)}return t},o.formatTplSimple=function(t,e,n){return i.each(e,function(e,i){t=t.replace("{"+i+"}",n?s(e):e)}),t};var u=function(t){return t<10?"0"+t:t};o.formatTime=function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=r.parseDate(e),a=n?"UTC":"",o=i["get"+a+"FullYear"](),s=i["get"+a+"Month"]()+1,l=i["get"+a+"Date"](),h=i["get"+a+"Hours"](),c=i["get"+a+"Minutes"](),f=i["get"+a+"Seconds"]();return t=t.replace("MM",u(s)).toLowerCase().replace("yyyy",o).replace("yy",o%100).replace("dd",u(l)).replace("d",l).replace("hh",u(h)).replace("h",h).replace("mm",u(c)).replace("m",c).replace("ss",u(f)).replace("s",f)},o.capitalFirst=function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},o.truncateText=a.truncateText,t.exports=o},function(t,e,n){function i(t){r.call(this,t),this.path=null}var r=n(38),a=n(1),o=n(27),s=n(161),l=n(71),h=l.prototype.getCanvasPattern,u=Math.abs,c=new o((!0));i.prototype={constructor:i,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var n=this.style,i=this.path||c,r=n.hasStroke(),a=n.hasFill(),o=n.fill,s=n.stroke,l=a&&!!o.colorStops,u=r&&!!s.colorStops,f=a&&!!o.image,d=r&&!!s.image;if(n.bind(t,this,e),this.setTransform(t),this.__dirty){var p;l&&(p=p||this.getBoundingRect(),this._fillGradient=n.getGradient(t,o,p)),u&&(p=p||this.getBoundingRect(),this._strokeGradient=n.getGradient(t,s,p))}l?t.fillStyle=this._fillGradient:f&&(t.fillStyle=h.call(o,t)),u?t.strokeStyle=this._strokeGradient:d&&(t.strokeStyle=h.call(s,t));var g=n.lineDash,v=n.lineDashOffset,m=!!t.setLineDash,y=this.getGlobalScale();i.setScale(y[0],y[1]),this.__dirtyPath||g&&!m&&r?(i.beginPath(t),g&&!m&&(i.setLineDash(g),i.setLineDashOffset(v)),this.buildPath(i,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),a&&i.fill(t),g&&m&&(t.setLineDash(g),t.lineDashOffset=v),r&&i.stroke(t),g&&m&&t.setLineDash([]),this.restoreTransform(t),null!=n.text&&this.drawRectText(t,this.getBoundingRect())},buildPath:function(t,e,n){},createPathProxy:function(){this.path=new o},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var i=this.path;i||(i=this.path=new o),this.__dirtyPath&&(i.beginPath(),this.buildPath(i,this.shape,!1)),t=i.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){r.copy(t);var a=e.lineWidth,s=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(a=Math.max(a,this.strokeContainThreshold||4)),s>1e-10&&(r.width+=a/s,r.height+=a/s,r.x-=a/s/2,r.y-=a/s/2)}return r}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var a=this.path.data;if(r.hasStroke()){var o=r.lineWidth,l=r.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(r.hasFill()||(o=Math.max(o,this.strokeContainThreshold)),s.containStroke(a,o/l,t,e)))return!0}if(r.hasFill())return s.contain(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):r.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(a.isObject(t))for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&u(t[0]-1)>1e-10&&u(t[3]-1)>1e-10?Math.sqrt(u(t[0]*t[3]-t[2]*t[1])):1}},i.extend=function(t){var e=function(e){i.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var n=t.shape;if(n){this.shape=this.shape||{};var r=this.shape;for(var a in n)!r.hasOwnProperty(a)&&n.hasOwnProperty(a)&&(r[a]=n[a])}t.init&&t.init.call(this,e)};a.inherits(e,i);for(var n in t)"style"!==n&&"shape"!==n&&(e.prototype[n]=t[n]);return e},a.inherits(i,r),t.exports=i},function(t,e){function n(t){var e={},n={},i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),a=t.match(/Edge\/([\d.]+)/),o=/micromessenger/i.test(t);return i&&(n.firefox=!0,n.version=i[1]),r&&(n.ie=!0,n.version=r[1]),a&&(n.edge=!0,n.version=a[1]),o&&(n.weChat=!0),{browser:n,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!n.ie&&!n.edge,pointerEventsSupported:"onpointerdown"in window&&(n.edge||n.ie&&n.version>=11)}}var i={};i="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:n(navigator.userAgent),t.exports=i},function(t,e,n){function i(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}function r(t,e,n){for(var i=0;i<e.length&&(!e[i]||(t=t&&"object"==typeof t?t[e[i]]:null,null!=t));i++);return null==t&&n&&(t=n.get(e)),t}function a(t,e){var n=s.get(t,"getParent");return n?n.call(t,e):t.parentModel}var o=n(1),s=n(15),l=n(9);i.prototype={constructor:i,init:null,mergeOption:function(t){o.merge(this.option,t,!0)},get:function(t,e){return null==t?this.option:r(this.option,this.parsePath(t),!e&&a(this,t))},getShallow:function(t,e){var n=this.option,i=null==n?n:n[t],r=!e&&a(this,t);return null==i&&r&&(i=r.getShallow(t)),i},getModel:function(t,e){var n,o=null==t?this.option:r(this.option,t=this.parsePath(t));return e=e||(n=a(this,t))&&n.getModel(t),new i(o,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){var t=this.constructor;return new t(o.clone(this.option))},setReadOnly:function(t){s.setReadOnly(this,t)},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){s.set(this,"getParent",t)},isAnimationEnabled:function(){if(!l.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},s.enableClassExtend(i);var h=o.mixin;h(i,n(143)),h(i,n(140)),h(i,n(144)),h(i,n(142)),t.exports=i},function(t,e,n){"use strict";function i(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}var r=n(5),a=n(19),o=r.applyTransform,s=Math.min,l=Math.max;i.prototype={constructor:i,union:function(t){var e=s(t.x,this.x),n=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-n,this.x=e,this.y=n},applyTransform:function(){var t=[],e=[],n=[],i=[];return function(r){if(r){t[0]=n[0]=this.x,t[1]=i[1]=this.y,e[0]=i[0]=this.x+this.width,e[1]=n[1]=this.y+this.height,o(t,t,r),o(e,e,r),o(n,n,r),o(i,i,r),this.x=s(t[0],e[0],n[0],i[0]),this.y=s(t[1],e[1],n[1],i[1]);var a=l(t[0],e[0],n[0],i[0]),h=l(t[1],e[1],n[1],i[1]);this.width=a-this.x,this.height=h-this.y}}}(),calculateTransform:function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=a.create();return a.translate(r,r,[-e.x,-e.y]),a.scale(r,r,[n,i]),a.translate(r,r,[t.x,t.y]),r},intersect:function(t){if(!t)return!1;t instanceof i||(t=i.create(t));var e=this,n=e.x,r=e.x+e.width,a=e.y,o=e.y+e.height,s=t.x,l=t.x+t.width,h=t.y,u=t.y+t.height;return!(r<s||l<n||o<h||u<a)},contain:function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new i(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},i.create=function(t){return new i(t.x,t.y,t.width,t.height)},t.exports=i},function(t,e,n){"use strict";function i(t,e,n,i,r){var a=0,o=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,h){var u,c,f=l.position,d=l.getBoundingRect(),p=e.childAt(h+1),g=p&&p.getBoundingRect();if("horizontal"===t){var v=d.width+(g?-g.x+d.x:0);u=a+v,u>i||l.newline?(a=0,u=v,o+=s+n,s=d.height):s=Math.max(s,d.height)}else{var m=d.height+(g?-g.y+d.y:0);c=o+m,c>r||l.newline?(a+=s+n,o=0,c=m,s=d.width):s=Math.max(s,d.width)}l.newline||(f[0]=a,f[1]=o,"horizontal"===t?a=u+n:o=c+n)})}var r=n(1),a=n(11),o=n(4),s=n(7),l=o.parsePercent,h=r.each,u={},c=u.LOCATION_PARAMS=["left","right","top","bottom","width","height"],f=u.HV_NAMES=[["width","left","right"],["height","top","bottom"]];
-u.box=i,u.vbox=r.curry(i,"vertical"),u.hbox=r.curry(i,"horizontal"),u.getAvailableSize=function(t,e,n){var i=e.width,r=e.height,a=l(t.x,i),o=l(t.y,r),h=l(t.x2,i),u=l(t.y2,r);return(isNaN(a)||isNaN(parseFloat(t.x)))&&(a=0),(isNaN(h)||isNaN(parseFloat(t.x2)))&&(h=i),(isNaN(o)||isNaN(parseFloat(t.y)))&&(o=0),(isNaN(u)||isNaN(parseFloat(t.y2)))&&(u=r),n=s.normalizeCssArray(n||0),{width:Math.max(h-a-n[1]-n[3],0),height:Math.max(u-o-n[0]-n[2],0)}},u.getLayoutRect=function(t,e,n){n=s.normalizeCssArray(n||0);var i=e.width,r=e.height,o=l(t.left,i),h=l(t.top,r),u=l(t.right,i),c=l(t.bottom,r),f=l(t.width,i),d=l(t.height,r),p=n[2]+n[0],g=n[1]+n[3],v=t.aspect;switch(isNaN(f)&&(f=i-u-g-o),isNaN(d)&&(d=r-c-p-h),isNaN(f)&&isNaN(d)&&(v>i/r?f=.8*i:d=.8*r),null!=v&&(isNaN(f)&&(f=v*d),isNaN(d)&&(d=f/v)),isNaN(o)&&(o=i-u-f-g),isNaN(h)&&(h=r-c-d-p),t.left||t.right){case"center":o=i/2-f/2-n[3];break;case"right":o=i-f-g}switch(t.top||t.bottom){case"middle":case"center":h=r/2-d/2-n[0];break;case"bottom":h=r-d-p}o=o||0,h=h||0,isNaN(f)&&(f=i-o-(u||0)),isNaN(d)&&(d=r-h-(c||0));var m=new a(o+n[3],h+n[0],f,d);return m.margin=n,m},u.positionElement=function(t,e,n,i,o){var s=!o||!o.hv||o.hv[0],l=!o||!o.hv||o.hv[1],h=o&&o.boundingMode||"all";if(s||l){var c;if("raw"===h)c="group"===t.type?new a(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(c=t.getBoundingRect(),t.needLocalTransform()){var f=t.getLocalTransform();c=c.clone(),c.applyTransform(f)}e=u.getLayoutRect(r.defaults({width:c.width,height:c.height},e),n,i);var d=t.position,p=s?e.x-c.x:0,g=l?e.y-c.y:0;t.attr("position","raw"===h?[p,g]:[d[0]+p,d[1]+g])}},u.sizeCalculable=function(t,e){return null!=t[f[e][0]]||null!=t[f[e][1]]&&null!=t[f[e][2]]},u.mergeLayoutParam=function(t,e,n){function i(n,i){var r={},s=0,u={},c=0,f=2;if(h(n,function(e){u[e]=t[e]}),h(n,function(t){a(e,t)&&(r[t]=u[t]=e[t]),o(r,t)&&s++,o(u,t)&&c++}),l[i])return o(e,n[1])?u[n[2]]=null:o(e,n[2])&&(u[n[1]]=null),u;if(c!==f&&s){if(s>=f)return r;for(var d=0;d<n.length;d++){var p=n[d];if(!a(r,p)&&a(t,p)){r[p]=t[p];break}}return r}return u}function a(t,e){return t.hasOwnProperty(e)}function o(t,e){return null!=t[e]&&"auto"!==t[e]}function s(t,e,n){h(t,function(t){e[t]=n[t]})}!r.isObject(n)&&(n={});var l=n.ignoreSize;!r.isArray(l)&&(l=[l,l]);var u=i(f[0],0),c=i(f[1],1);s(f[0],t,u),s(f[1],t,c)},u.getLayoutParams=function(t){return u.copyLayoutParams({},t)},u.copyLayoutParams=function(t,e){return e&&t&&h(c,function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t},t.exports=u},function(t,e,n){function i(t){var e=[];return a.each(u.getClassesByMainType(t),function(t){o.apply(e,t.prototype.dependencies||[])}),a.map(e,function(t){return l.parseClassType(t).main})}var r=n(10),a=n(1),o=Array.prototype.push,s=n(49),l=n(15),h=n(12),u=r.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,n,i){r.call(this,t,e,n,i),this.uid=s.getUID("componentModel")},init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?h.getLayoutParams(t):{},r=e.getTheme();a.merge(t,r.get(this.mainType)),a.merge(t,this.getDefaultOption()),n&&h.mergeLayoutParam(t,i,n)},mergeOption:function(t,e){a.merge(this.option,t,!0);var n=this.layoutMode;n&&h.mergeLayoutParam(this.option,t,n)},optionUpdated:function(t,e){},getDefaultOption:function(){if(!l.hasOwn(this,"__defaultOption")){for(var t=[],e=this.constructor;e;){var n=e.prototype.defaultOption;n&&t.push(n),e=e.superClass}for(var i={},r=t.length-1;r>=0;r--)i=a.merge(i,t[r],!0);l.set(this,"__defaultOption",i)}return l.get(this,"__defaultOption")},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});l.enableClassManagement(u,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(u),s.enableTopologicalTravel(u,i),a.mixin(u,n(141)),t.exports=u},function(t,e,n){(function(e){function i(t){return f.isArray(t)||(t=[t]),t}function r(t,e){var n=t.dimensions,i=new m(f.map(n,t.getDimensionInfo,t),t.hostModel);v(i,t);for(var r=i._storage={},a=t._storage,o=0;o<n.length;o++){var s=n[o],l=a[s];f.indexOf(e,s)>=0?r[s]=new l.constructor(a[s].length):r[s]=a[s]}return i}var a="undefined",o="undefined"==typeof window?e:window,s=typeof o.Float64Array===a?Array:o.Float64Array,l=typeof o.Int32Array===a?Array:o.Int32Array,h={"float":s,"int":l,ordinal:Array,number:Array,time:Array},u=n(10),c=n(48),f=n(1),d=n(6),p=f.isObject,g=["stackedOn","hasItemOption","_nameList","_idList","_rawData"],v=function(t,e){f.each(g.concat(e.__wrappedMethods||[]),function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t.__wrappedMethods=e.__wrappedMethods},m=function(t,e){t=t||["x","y"];for(var n={},i=[],r=0;r<t.length;r++){var a,o={};"string"==typeof t[r]?(a=t[r],o={name:a,stackable:!1,type:"number"}):(o=t[r],a=o.name,o.type=o.type||"number"),i.push(a),n[a]=o}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this.dataType,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData,this._extent},y=m.prototype;y.type="list",y.hasItemOption=!0,y.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},y.getDimensionInfo=function(t){return f.clone(this._dimensionInfos[this.getDimension(t)])},y.initData=function(t,e,n){t=t||[],this._rawData=t;var i=this._storage={},r=this.indices=[],a=this.dimensions,o=t.length,s=this._dimensionInfos,l=[],u={};e=e||[];for(var c=0;c<a.length;c++){var f=s[a[c]],p=h[f.type];i[a[c]]=new p(o)}var g=this;n||(g.hasItemOption=!1),n=n||function(t,e,n,i){var r=d.getDataItemValue(t);return d.isDataItemOption(t)&&(g.hasItemOption=!0),d.converDataValue(r instanceof Array?r[i]:r,s[e])};for(var v=0;v<t.length;v++){for(var m=t[v],y=0;y<a.length;y++){var x=a[y],_=i[x];_[v]=n(m,x,v,y)}r.push(v)}for(var c=0;c<t.length;c++){e[c]||t[c]&&null!=t[c].name&&(e[c]=t[c].name);var b=e[c]||"",w=t[c]&&t[c].id;!w&&b&&(u[b]=u[b]||0,w=b,u[b]>0&&(w+="__ec__"+u[b]),u[b]++),w&&(l[c]=w)}this._nameList=e,this._idList=l},y.count=function(){return this.indices.length},y.get=function(t,e,n){var i=this._storage,r=this.indices[e];if(null==r)return NaN;var a=i[t]&&i[t][r];if(n){var o=this._dimensionInfos[t];if(o&&o.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(a>=0&&l>0||a<=0&&l<0)&&(a+=l),s=s.stackedOn}}return a},y.getValues=function(t,e,n){var i=[];f.isArray(t)||(n=e,e=t,t=this.dimensions);for(var r=0,a=t.length;r<a;r++)i.push(this.get(t[r],e,n));return i},y.hasValue=function(t){for(var e=this.dimensions,n=this._dimensionInfos,i=0,r=e.length;i<r;i++)if("ordinal"!==n[e[i]].type&&isNaN(this.get(e[i],t)))return!1;return!0},y.getDataExtent=function(t,e,n){t=this.getDimension(t);var i=this._storage[t],r=this.getDimensionInfo(t);e=r&&r.stackable&&e;var a,o=(this._extent||(this._extent={}))[t+!!e];if(o)return o;if(i){for(var s=1/0,l=-(1/0),h=0,u=this.count();h<u;h++)a=this.get(t,h,e),n&&!n(a,t,h)||(a<s&&(s=a),a>l&&(l=a));return this._extent[t+!!e]=[s,l]}return[1/0,-(1/0)]},y.getSum=function(t,e){var n=this._storage[t],i=0;if(n)for(var r=0,a=this.count();r<a;r++){var o=this.get(t,r,e);isNaN(o)||(i+=o)}return i},y.indexOf=function(t,e){var n=this._storage,i=n[t],r=this.indices;if(i)for(var a=0,o=r.length;a<o;a++){var s=r[a];if(i[s]===e)return a}return-1},y.indexOfName=function(t){for(var e=this.indices,n=this._nameList,i=0,r=e.length;i<r;i++){var a=e[i];if(n[a]===t)return i}return-1},y.indexOfRawIndex=function(t){var e=this.indices,n=e[t];if(null!=n&&n===t)return t;for(var i=0,r=e.length-1;i<=r;){var a=(i+r)/2|0;if(e[a]<t)i=a+1;else{if(!(e[a]>t))return a;r=a-1}}return-1},y.indicesOfNearest=function(t,e,n,i){var r=this._storage,a=r[t],o=[];if(!a)return o;null==i&&(i=1/0);for(var s=Number.MAX_VALUE,l=-1,h=0,u=this.count();h<u;h++){var c=e-this.get(t,h,n),f=Math.abs(c);c<=i&&f<=s&&((f<s||c>=0&&l<0)&&(s=f,l=c,o.length=0),o.push(h))}return o},y.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},y.getRawDataItem=function(t){return this._rawData[this.getRawIndex(t)]},y.getName=function(t){return this._nameList[this.indices[t]]||""},y.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},y.each=function(t,e,n,r){"function"==typeof t&&(r=n,n=e,e=t,t=[]),t=f.map(i(t),this.getDimension,this);var a=[],o=t.length,s=this.indices;r=r||this;for(var l=0;l<s.length;l++)switch(o){case 0:e.call(r,l);break;case 1:e.call(r,this.get(t[0],l,n),l);break;case 2:e.call(r,this.get(t[0],l,n),this.get(t[1],l,n),l);break;default:for(var h=0;h<o;h++)a[h]=this.get(t[h],l,n);a[h]=l,e.apply(r,a)}},y.filterSelf=function(t,e,n,r){"function"==typeof t&&(r=n,n=e,e=t,t=[]),t=f.map(i(t),this.getDimension,this);var a=[],o=[],s=t.length,l=this.indices;r=r||this;for(var h=0;h<l.length;h++){var u;if(1===s)u=e.call(r,this.get(t[0],h,n),h);else{for(var c=0;c<s;c++)o[c]=this.get(t[c],h,n);o[c]=h,u=e.apply(r,o)}u&&a.push(l[h])}return this.indices=a,this._extent={},this},y.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n,i),r},y.map=function(t,e,n,a){t=f.map(i(t),this.getDimension,this);var o=r(this,t),s=o.indices=this.indices,l=o._storage,h=[];return this.each(t,function(){var n=arguments[arguments.length-1],i=e&&e.apply(this,arguments);if(null!=i){"number"==typeof i&&(h[0]=i,i=h);for(var r=0;r<i.length;r++){var a=t[r],o=l[a],u=s[n];o&&(o[u]=i[r])}}},n,a),o},y.downSample=function(t,e,n,i){for(var a=r(this,[t]),o=this._storage,s=a._storage,l=this.indices,h=a.indices=[],u=[],c=[],f=Math.floor(1/e),d=s[t],p=this.count(),g=0;g<o[t].length;g++)s[t][g]=o[t][g];for(var g=0;g<p;g+=f){f>p-g&&(f=p-g,u.length=f);for(var v=0;v<f;v++){var m=l[g+v];u[v]=d[m],c[v]=m}var y=n(u),m=c[i(u,y)||0];d[m]=y,h.push(m)}return a},y.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new u(this._rawData[t],e,e&&e.ecModel)},y.diff=function(t){var e,n=this._idList,i=t&&t._idList,r="e\0\0";return new c(t?t.indices:[],this.indices,function(t){return null!=(e=i[t])?e:r+t},function(t){return null!=(e=n[t])?e:r+t})},y.getVisual=function(t){var e=this._visual;return e&&e[t]},y.setVisual=function(t,e){if(p(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},y.setLayout=function(t,e){if(p(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},y.getLayout=function(t){return this._layout[t]},y.getItemLayout=function(t){return this._itemLayouts[t]},y.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?f.extend(this._itemLayouts[t]||{},e):e},y.clearItemLayouts=function(){this._itemLayouts.length=0},y.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},y.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};if(this._itemVisuals[t]=i,p(e))for(var r in e)e.hasOwnProperty(r)&&(i[r]=e[r]);else i[e]=n},y.clearAllVisual=function(){this._visual={},this._itemVisuals=[]};var x=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};y.setItemGraphicEl=function(t,e){var n=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(x,e)),this._graphicEls[t]=e},y.getItemGraphicEl=function(t){return this._graphicEls[t]},y.eachItemGraphicEl=function(t,e){f.each(this._graphicEls,function(n,i){n&&t&&t.call(e,n,i)})},y.cloneShallow=function(){var t=f.map(this.dimensions,this.getDimensionInfo,this),e=new m(t,this.hostModel);return e._storage=this._storage,v(e,this),e.indices=this.indices.slice(),this._extent&&(e._extent=f.extend({},this._extent)),e},y.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(f.slice(arguments)))})},y.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],y.CHANGABLE_METHODS=["filterSelf"],t.exports=m}).call(e,function(){return this}())},function(t,e,n){function i(t){o.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function r(t,e){var n=o.slice(arguments,2);return this.superClass.prototype[e].apply(t,n)}function a(t,e,n){return this.superClass.prototype[e].apply(t,n)}var o=n(1),s={},l=".",h="___EC__COMPONENT__CONTAINER___",u="\0ec_\0";s.set=function(t,e,n){return t[u+e]=n},s.get=function(t,e){return t[u+e]},s.hasOwn=function(t,e){return t.hasOwnProperty(u+e)};var c=s.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(l),e.main=t[0]||"",e.sub=t[1]||""),e};s.enableClassExtend=function(t,e){t.$constructor=t,t.extend=function(t){var e=this,n=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return o.extend(n.prototype,t),n.extend=this.extend,n.superCall=r,n.superApply=a,o.inherits(n,this),n.superClass=e,n}},s.enableClassManagement=function(t,e){function n(t){var e=r[t.main];return e&&e[h]||(e=r[t.main]={},e[h]=!0),e}e=e||{};var r={};if(t.registerClass=function(t,e){if(e)if(i(e),e=c(e),e.sub){if(e.sub!==h){var a=n(e);a[e.sub]=t}}else r[e.main]=t;return t},t.getClass=function(t,e,n){var i=r[t];if(i&&i[h]&&(i=e?i[e]:null),n&&!i)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return i},t.getClassesByMainType=function(t){t=c(t);var e=[],n=r[t.main];return n&&n[h]?o.each(n,function(t,n){n!==h&&e.push(t)}):e.push(n),e},t.hasClass=function(t){return t=c(t),!!r[t.main]},t.getAllClassMainTypes=function(){var t=[];return o.each(r,function(e,n){t.push(n)}),t},t.hasSubTypes=function(t){t=c(t);var e=r[t.main];return e&&e[h]},t.parseClassType=c,e.registerWhenExtend){var a=t.extend;a&&(t.extend=function(e){var n=a.call(this,e);return t.registerClass(n,e.type)})}return t},s.setReadOnly=function(t,e){},t.exports=s},function(t,e,n){function i(t,e){var n=t+":"+e;if(l[n])return l[n];for(var i=(t+"").split("\n"),r=0,a=0,o=i.length;a<o;a++)r=Math.max(p.measureText(i[a],e).width,r);return h>u&&(h=0,l={}),h++,l[n]=r,r}function r(t,e,n,r){var a=((t||"")+"").split("\n").length,o=i(t,e),s=i("国",e),l=a*s,h=new f(0,0,o,l);switch(h.lineHeight=s,r){case"bottom":case"alphabetic":h.y-=s;break;case"middle":h.y-=s/2}switch(n){case"end":case"right":h.x-=h.width;break;case"center":h.x-=h.width/2}return h}function a(t,e,n,i){var r=e.x,a=e.y,o=e.height,s=e.width,l=n.height,h=n.lineHeight,u=o/2-l/2+h,c="left";switch(t){case"left":r-=i,a+=u,c="right";break;case"right":r+=i+s,a+=u,c="left";break;case"top":r+=s/2,a-=i+l-h,c="center";break;case"bottom":r+=s/2,a+=o+i+h,c="center";break;case"inside":r+=s/2,a+=u,c="center";break;case"insideLeft":r+=i,a+=u,c="left";break;case"insideRight":r+=s-i,a+=u,c="right";break;case"insideTop":r+=s/2,a+=i+h,c="center";break;case"insideBottom":r+=s/2,a+=o-l-i+h,c="center";break;case"insideTopLeft":r+=i,a+=i+h,c="left";break;case"insideTopRight":r+=s-i,a+=i+h,c="right";break;case"insideBottomLeft":r+=i,a+=o-l-i+h;break;case"insideBottomRight":r+=s-i,a+=o-l-i+h,c="right"}return{x:r,y:a,textAlign:c,textBaseline:"alphabetic"}}function o(t,e,n,r,a){if(!e)return"";a=a||{},r=d(r,"...");for(var o=d(a.maxIterations,2),l=d(a.minChar,0),h=i("国",n),u=i("a",n),c=d(a.placeholder,""),f=e=Math.max(0,e-1),p=0;p<l&&f>=u;p++)f-=u;var g=i(r);g>f&&(r="",g=0),f=e-g;for(var v=(t+"").split("\n"),p=0,m=v.length;p<m;p++){var y=v[p],x=i(y,n);if(!(x<=e)){for(var _=0;;_++){if(x<=f||_>=o){y+=r;break}var b=0===_?s(y,f,u,h):x>0?Math.floor(y.length*f/x):0;y=y.substr(0,b),x=i(y,n)}""===y&&(y=c),v[p]=y}}return v.join("\n")}function s(t,e,n,i){for(var r=0,a=0,o=t.length;a<o&&r<e;a++){var s=t.charCodeAt(a);r+=0<=s&&s<=127?n:i}return a}var l={},h=0,u=5e3,c=n(1),f=n(11),d=c.retrieve,p={getWidth:i,getBoundingRect:r,adjustTextPositionOnRect:a,truncateText:o,measureText:function(t,e){var n=c.getContext();return n.font=e||"12px sans-serif",n.measureText(t)}};t.exports=p},function(t,e,n){var i=n(149),r=n(43);n(150),n(148);var a=n(34),o=n(4),s=n(1),l=n(16),h={};h.getScaleExtent=function(t,e){var n,i,r,a=t.type,l=e.getMin(),h=e.getMax(),u=null!=l,c=null!=h,f=t.getExtent();return"ordinal"===a?n=(e.get("data")||[]).length:(i=e.get("boundaryGap"),s.isArray(i)||(i=[i||0,i||0]),"boolean"==typeof i[0]&&(i=[0,0]),i[0]=o.parsePercent(i[0],1),i[1]=o.parsePercent(i[1],1),r=f[1]-f[0]||Math.abs(f[0])),null==l&&(l="ordinal"===a?n?0:NaN:f[0]-i[0]*r),null==h&&(h="ordinal"===a?n?n-1:NaN:f[1]+i[1]*r),"dataMin"===l&&(l=f[0]),"dataMax"===h&&(h=f[1]),(null==l||!isFinite(l))&&(l=NaN),(null==h||!isFinite(h))&&(h=NaN),t.setBlank(s.eqNaN(l)||s.eqNaN(h)),e.getNeedCrossZero()&&(l>0&&h>0&&!u&&(l=0),l<0&&h<0&&!c&&(h=0)),[l,h]},h.niceScaleExtent=function(t,e){var n=h.getScaleExtent(t,e),i=null!=e.getMin(),r=null!=e.getMax(),a=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase")),t.setExtent(n[0],n[1]),t.niceExtent(a,i,r);var o=e.get("minInterval");if(isFinite(o)&&!i&&!r&&"interval"===t.type){var s=t.getInterval(),l=Math.max(Math.abs(s),o)/s;n=t.getExtent();var u=(n[1]+n[0])/2;t.setExtent(l*(n[0]-u)+u,l*(n[1]-u)+u),t.niceExtent(a)}var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)},h.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new i(t.getCategories(),[1/0,-(1/0)]);case"value":return new r;default:return(a.getClass(e)||r).create(t)}},h.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)},h.getAxisLabelInterval=function(t,e,n,i){var r,a=0,o=0,s=1;e.length>40&&(s=Math.floor(e.length/40));for(var h=0;h<t.length;h+=s){var u=t[h],c=l.getBoundingRect(e[h],n,"center","top");c[i?"x":"y"]+=u,c[i?"width":"height"]*=1.3,r?r.intersect(c)?(o++,a=Math.max(a,o)):(r.union(c),o=0):r=c.clone()}return 0===a&&s>1?s:(a+1)*s-1},h.getFormattedLabels=function(t,e){var n=t.scale,i=n.getTicksLabels(),r=n.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),s.map(i,e)):"function"==typeof e?s.map(r,function(n,i){return e(h.getAxisRawValue(t,n),i)},this):i},h.getAxisRawValue=function(t,e){return"category"===t.type?t.scale.getLabel(e):e},t.exports=h},function(t,e,n){"use strict";var i=n(1),r=n(7),a=n(15),o=n(6),s=n(13),l=n(61),h=n(9),u=n(12),c=a.set,f=a.get,d=r.encodeHTML,p=r.addCommas,g=s.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.normal.color",layoutMode:null,init:function(t,e,n,i){this.seriesIndex=this.componentIndex,this.mergeDefaultAndTheme(t,n);var r=this.getInitialData(t,n);c(this,"dataBeforeProcessed",r),this.restoreData()},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,r=n?u.getLayoutParams(t):{};i.merge(t,e.getTheme().get(this.subType)),i.merge(t,this.getDefaultOption()),o.defaultEmphasis(t.label,o.LABEL_OPTIONS),this.fillDataTextStyle(t.data),n&&u.mergeLayoutParam(t,r,n)},mergeOption:function(t,e){t=i.merge(this.option,t,!0),this.fillDataTextStyle(t.data);var n=this.layoutMode;n&&u.mergeLayoutParam(this.option,t,n);var r=this.getInitialData(t,e);r&&(c(this,"data",r),c(this,"dataBeforeProcessed",r.cloneShallow()))},fillDataTextStyle:function(t){if(t)for(var e=0;e<t.length;e++)t[e]&&t[e].label&&o.defaultEmphasis(t[e].label,o.LABEL_OPTIONS)},getInitialData:function(){},getData:function(t){var e=f(this,"data");return null==t?e:e.getLinkedData(t)},setData:function(t){c(this,"data",t)},getRawData:function(){return f(this,"dataBeforeProcessed")},coordDimToDataDim:function(t){return[t]},dataDimToCoordDim:function(t){return t},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,n){function a(t){var n=[];return i.each(t,function(t,i){var a,s=o.getDimensionInfo(i),l=s&&s.type;a="ordinal"===l?t+"":"time"===l?e?"":r.formatTime("yyyy/MM/dd hh:mm:ss",t):p(t),a&&n.push(a)}),n.join(", ")}var o=f(this,"data"),s=this.getRawValue(t),l=d(i.isArray(s)?a(s):p(s)),h=o.getName(t),u=o.getItemVisual(t,"color");i.isObject(u)&&u.colorStops&&(u=(u.colorStops[0]||{}).color),u=u||"transparent";var c='<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+d(u)+'"></span>',g=this.name;return"\0-"===g&&(g=""),e?c+d(this.name)+" : "+l:(g&&d(g)+"<br />")+c+(h?d(h)+" : "+l:l)},isAnimationEnabled:function(){if(h.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){c(this,"data",f(this,"dataBeforeProcessed").cloneShallow())},getColorFromPalette:function(t,e){var n=this.ecModel,i=l.getColorFromPalette.call(this,t,e);return i||(i=n.getColorFromPalette(t,e)),i},getAxisTooltipData:null,getTooltipPosition:null});i.mixin(g,o.dataFormatMixin),i.mixin(g,l),t.exports=g},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(){var t=new n(6);return i.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],a=e[0]*n[2]+e[2]*n[3],o=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t},translate:function(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t},rotate:function(t,e,n){var i=e[0],r=e[2],a=e[4],o=e[1],s=e[3],l=e[5],h=Math.sin(n),u=Math.cos(n);return t[0]=i*u+o*h,t[1]=-i*h+o*u,t[2]=r*u+s*h,t[3]=-r*h+u*s,t[4]=u*a+h*l,t[5]=u*l-h*a,t},scale:function(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t},invert:function(t,e){var n=e[0],i=e[2],r=e[4],a=e[1],o=e[3],s=e[5],l=n*o-a*i;return l?(l=1/l,t[0]=o*l,t[1]=-a*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-o*r)*l,t[5]=(a*r-n*s)*l,t):null}};t.exports=i},function(t,e,n){"use strict";function i(t){return t>-w&&t<w}function r(t){return t>w||t<-w}function a(t,e,n,i,r){var a=1-r;return a*a*(a*t+3*r*e)+r*r*(r*i+3*a*n)}function o(t,e,n,i,r){var a=1-r;return 3*(((e-t)*a+2*(n-e)*r)*a+(i-n)*r*r)}function s(t,e,n,r,a,o){var s=r+3*(e-n)-t,l=3*(n-2*e+t),h=3*(e-t),u=t-a,c=l*l-3*s*h,f=l*h-9*s*u,d=h*h-3*l*u,p=0;if(i(c)&&i(f))if(i(l))o[0]=0;else{var g=-h/l;g>=0&&g<=1&&(o[p++]=g)}else{var v=f*f-4*c*d;if(i(v)){var m=f/c,g=-l/s+m,y=-m/2;g>=0&&g<=1&&(o[p++]=g),y>=0&&y<=1&&(o[p++]=y)}else if(v>0){var x=b(v),w=c*l+1.5*s*(-f+x),M=c*l+1.5*s*(-f-x);w=w<0?-_(-w,S):_(w,S),M=M<0?-_(-M,S):_(M,S);var g=(-l-(w+M))/(3*s);g>=0&&g<=1&&(o[p++]=g)}else{var A=(2*c*l-3*s*f)/(2*b(c*c*c)),C=Math.acos(A)/3,I=b(c),P=Math.cos(C),g=(-l-2*I*P)/(3*s),y=(-l+I*(P+T*Math.sin(C)))/(3*s),L=(-l+I*(P-T*Math.sin(C)))/(3*s);g>=0&&g<=1&&(o[p++]=g),y>=0&&y<=1&&(o[p++]=y),L>=0&&L<=1&&(o[p++]=L)}}return p}function l(t,e,n,a,o){var s=6*n-12*e+6*t,l=9*e+3*a-3*t-9*n,h=3*e-3*t,u=0;if(i(l)){if(r(s)){var c=-h/s;c>=0&&c<=1&&(o[u++]=c)}}else{var f=s*s-4*l*h;if(i(f))o[0]=-s/(2*l);else if(f>0){var d=b(f),c=(-s+d)/(2*l),p=(-s-d)/(2*l);c>=0&&c<=1&&(o[u++]=c),p>=0&&p<=1&&(o[u++]=p)}}return u}function h(t,e,n,i,r,a){var o=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,h=(s-o)*r+o,u=(l-s)*r+s,c=(u-h)*r+h;a[0]=t,a[1]=o,a[2]=h,a[3]=c,a[4]=c,a[5]=u,a[6]=l,a[7]=i}function u(t,e,n,i,r,o,s,l,h,u,c){var f,d,p,g,v,m=.005,y=1/0;A[0]=h,A[1]=u;for(var _=0;_<1;_+=.05)C[0]=a(t,n,r,s,_),C[1]=a(e,i,o,l,_),g=x(A,C),g<y&&(f=_,y=g);y=1/0;for(var w=0;w<32&&!(m<M);w++)d=f-m,p=f+m,C[0]=a(t,n,r,s,d),C[1]=a(e,i,o,l,d),g=x(C,A),d>=0&&g<y?(f=d,y=g):(I[0]=a(t,n,r,s,p),I[1]=a(e,i,o,l,p),v=x(I,A),p<=1&&v<y?(f=p,y=v):m*=.5);return c&&(c[0]=a(t,n,r,s,f),c[1]=a(e,i,o,l,f)),b(y)}function c(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function f(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function d(t,e,n,a,o){var s=t-2*e+n,l=2*(e-t),h=t-a,u=0;if(i(s)){if(r(l)){var c=-h/l;c>=0&&c<=1&&(o[u++]=c)}}else{var f=l*l-4*s*h;if(i(f)){var c=-l/(2*s);c>=0&&c<=1&&(o[u++]=c)}else if(f>0){var d=b(f),c=(-l+d)/(2*s),p=(-l-d)/(2*s);c>=0&&c<=1&&(o[u++]=c),p>=0&&p<=1&&(o[u++]=p)}}return u}function p(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function g(t,e,n,i,r){var a=(e-t)*i+t,o=(n-e)*i+e,s=(o-a)*i+a;r[0]=t,r[1]=a,r[2]=s,r[3]=s,r[4]=o,r[5]=n}function v(t,e,n,i,r,a,o,s,l){var h,u=.005,f=1/0;A[0]=o,A[1]=s;for(var d=0;d<1;d+=.05){C[0]=c(t,n,r,d),C[1]=c(e,i,a,d);var p=x(A,C);p<f&&(h=d,f=p)}f=1/0;for(var g=0;g<32&&!(u<M);g++){var v=h-u,m=h+u;C[0]=c(t,n,r,v),C[1]=c(e,i,a,v);var p=x(C,A);if(v>=0&&p<f)h=v,f=p;else{I[0]=c(t,n,r,m),I[1]=c(e,i,a,m);var y=x(I,A);m<=1&&y<f?(h=m,f=y):u*=.5}}return l&&(l[0]=c(t,n,r,h),l[1]=c(e,i,a,h)),b(f)}var m=n(5),y=m.create,x=m.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,M=1e-4,T=b(3),S=1/3,A=y(),C=y(),I=y();t.exports={cubicAt:a,cubicDerivativeAt:o,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:h,cubicProjectPoint:u,quadraticAt:c,quadraticDerivativeAt:f,quadraticRootAt:d,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:v}},function(t,e,n){"use strict";function i(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function r(t,e,n,i){return n=n||{},i||!u.canvasSupported?a(t,e,n):u.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):a(t,e,n),n}function a(t,e,n){var r=i(t);n.zrX=e.clientX-r.left,n.zrY=e.clientY-r.top}function o(t,e,n){if(e=e||window.event,null!=e.zrX)return e;var i=e.type,a=i&&i.indexOf("touch")>=0;if(a){var o="touchend"!=i?e.targetTouches[0]:e.changedTouches[0];o&&r(t,o,e,n)}else r(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;return e}function s(t,e,n){c?t.addEventListener(e,n):t.attachEvent("on"+e,n)}function l(t,e,n){c?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}var h=n(23),u=n(9),c="undefined"!=typeof window&&!!window.addEventListener,f=c?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={clientToLocal:r,normalizeEvent:o,addEventListener:s,removeEventListener:l,stop:f,Dispatcher:h}},function(t,e,n){function i(t){return t=Math.round(t),t<0?0:t>255?255:t}function r(t){return t=Math.round(t),t<0?0:t>360?360:t}function a(t){return t<0?0:t>1?1:t}function o(t){return i(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function s(t){return a(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function l(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function h(t,e,n){return t+(e-t)*n}function u(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function c(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function f(t,e){A&&c(A,e),A=S.put(t,A||e.slice())}function d(t,e){if(t){e=e||[];var n=S.get(t);if(n)return c(e,n);t+="";var i=t.replace(/ /g,"").toLowerCase();if(i in T)return c(e,T[i]),f(t,e),e;if("#"!==i.charAt(0)){var r=i.indexOf("("),a=i.indexOf(")");if(r!==-1&&a+1===i.length){var l=i.substr(0,r),h=i.substr(r+1,a-(r+1)).split(","),d=1;switch(l){case"rgba":if(4!==h.length)return void u(e,0,0,0,1);d=s(h.pop());case"rgb":return 3!==h.length?void u(e,0,0,0,1):(u(e,o(h[0]),o(h[1]),o(h[2]),d),f(t,e),e);case"hsla":return 4!==h.length?void u(e,0,0,0,1):(h[3]=s(h[3]),p(h,e),f(t,e),e);case"hsl":return 3!==h.length?void u(e,0,0,0,1):(p(h,e),f(t,e),e);default:return}}u(e,0,0,0,1)}else{if(4===i.length){var g=parseInt(i.substr(1),16);return g>=0&&g<=4095?(u(e,(3840&g)>>4|(3840&g)>>8,240&g|(240&g)>>4,15&g|(15&g)<<4,1),f(t,e),e):void u(e,0,0,0,1)}if(7===i.length){var g=parseInt(i.substr(1),16);return g>=0&&g<=16777215?(u(e,(16711680&g)>>16,(65280&g)>>8,255&g,1),f(t,e),e):void u(e,0,0,0,1)}}}}function p(t,e){var n=(parseFloat(t[0])%360+360)%360/360,r=s(t[1]),a=s(t[2]),o=a<=.5?a*(r+1):a+r-a*r,h=2*a-o;return e=e||[],u(e,i(255*l(h,o,n+1/3)),i(255*l(h,o,n)),i(255*l(h,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function g(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,a=t[2]/255,o=Math.min(i,r,a),s=Math.max(i,r,a),l=s-o,h=(s+o)/2;if(0===l)e=0,n=0;else{n=h<.5?l/(s+o):l/(2-s-o);var u=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,f=((s-a)/6+l/2)/l;i===s?e=f-c:r===s?e=1/3+u-f:a===s&&(e=2/3+c-u),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,h];return null!=t[3]&&d.push(t[3]),d}}function v(t,e){var n=d(t);if(n){for(var i=0;i<3;i++)e<0?n[i]=n[i]*(1-e)|0:n[i]=(255-n[i])*e+n[i]|0;return w(n,4===n.length?"rgba":"rgb")}}function m(t,e){var n=d(t);if(n)return((1<<24)+(n[0]<<16)+(n[1]<<8)+ +n[2]).toString(16).slice(1)}function y(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var r=t*(e.length-1),o=Math.floor(r),s=Math.ceil(r),l=e[o],u=e[s],c=r-o;return n[0]=i(h(l[0],u[0],c)),n[1]=i(h(l[1],u[1],c)),n[2]=i(h(l[2],u[2],c)),n[3]=a(h(l[3],u[3],c)),n}}function x(t,e,n){if(e&&e.length&&t>=0&&t<=1){var r=t*(e.length-1),o=Math.floor(r),s=Math.ceil(r),l=d(e[o]),u=d(e[s]),c=r-o,f=w([i(h(l[0],u[0],c)),i(h(l[1],u[1],c)),i(h(l[2],u[2],c)),a(h(l[3],u[3],c))],"rgba");return n?{color:f,leftIndex:o,rightIndex:s,value:r}:f}}function _(t,e,n,i){if(t=d(t))return t=g(t),null!=e&&(t[0]=r(e)),null!=n&&(t[1]=s(n)),null!=i&&(t[2]=s(i)),w(p(t),"rgba")}function b(t,e){if(t=d(t),t&&null!=e)return t[3]=a(e),w(t,"rgba")}function w(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}var M=n(69),T={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],
-mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},S=new M(20),A=null;t.exports={parse:d,lift:v,toHex:m,fastMapToColor:y,mapToColor:x,modifyHSL:_,modifyAlpha:b,stringify:w}},function(t,e){var n=Array.prototype.slice,i=function(){this._$handlers={}};i.prototype={constructor:i,one:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!0,ctx:n||this}),this},on:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!1,ctx:n||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var n=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,a=n[t].length;r<a;r++)n[t][r].h!=e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>3&&(e=n.call(e,1));for(var r=this._$handlers[t],a=r.length,o=0;o<a;){switch(i){case 1:r[o].h.call(r[o].ctx);break;case 2:r[o].h.call(r[o].ctx,e[1]);break;case 3:r[o].h.call(r[o].ctx,e[1],e[2]);break;default:r[o].h.apply(r[o].ctx,e)}r[o].one?(r.splice(o,1),a--):o++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>4&&(e=n.call(e,1,e.length-1));for(var r=e[e.length-1],a=this._$handlers[t],o=a.length,s=0;s<o;){switch(i){case 1:a[s].h.call(r);break;case 2:a[s].h.call(r,e[1]);break;case 3:a[s].h.call(r,e[1],e[2]);break;default:a[s].h.apply(r,e)}a[s].one?(a.splice(s,1),o--):s++}}return this}},t.exports=i},function(t,e,n){"use strict";var i=n(3),r=n(11),a=i.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i+a),t.lineTo(n-r,i+a),t.closePath()}}),o=i.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i),t.lineTo(n,i+a),t.lineTo(n-r,i),t.closePath()}}),s=i.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,a=Math.max(r,e.height),o=r/2,s=o*o/(a-o),l=i-a+o+s,h=Math.asin(s/o),u=Math.cos(h)*o,c=Math.sin(h),f=Math.cos(h);t.arc(n,l,o,Math.PI-h,2*Math.PI+h);var d=.6*o,p=.7*o;t.bezierCurveTo(n+u-c*d,l+s+f*d,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-u+c*d,l+s+f*d,n-u,l+s),t.closePath()}}),l=i.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,a=e.y,o=i/3*2;t.moveTo(r,a),t.lineTo(r+o,a+n),t.lineTo(r,a+n/4*3),t.lineTo(r-o,a+n),t.lineTo(r,a),t.closePath()}}),h={line:i.Line,rect:i.Rect,roundRect:i.Rect,square:i.Rect,circle:i.Circle,diamond:o,pin:s,arrow:l,triangle:a},u={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var a=Math.min(n,i);r.x=t,r.y=e,r.width=a,r.height=a},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},c={};for(var f in h)h.hasOwnProperty(f)&&(c[f]=new h[f]);var d=i.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,n){var i=e.symbolType,r=c[i];"none"!==e.symbolType&&(r||(i="rect",r=c[i]),u[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n))}}),p=function(t){if("image"!==this.type){var e=this.style,n=this.shape;n&&"line"===n.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty(!1)}},g={createSymbol:function(t,e,n,a,o,s){var l=0===t.indexOf("empty");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var h;return h=0===t.indexOf("image://")?new i.Image({style:{image:t.slice(8),x:e,y:n,width:a,height:o}}):0===t.indexOf("path://")?i.makePath(t.slice(7),{},new r(e,n,a,o)):new d({shape:{symbolType:t,x:e,y:n,width:a,height:o}}),h.__isEmptyBrush=l,h.setColor=p,h.setColor(s),h}};t.exports=g},function(t,e,n){function i(t,e,n){if(!e)return t;n=n||{};var i=n.dimCount;if(null==i){var s=r(e[0]);i=a.isArray(s)&&s.length||1}for(var l=n.defaultNames||[],h=n.extraPrefix||"extra",u=0;u<i;u++)if(!t[u]){var c=l[u]||h+(u-l.length);t[u]=o(e,u)?{type:"ordinal",name:c}:c}return t}function r(t){return a.isArray(t)?t:a.isObject(t)?t.value:t}var a=n(1),o=i.guessOrdinal=function(t,e){for(var n=0,i=t.length;n<i;n++){var o=r(t[n]);if(!a.isArray(o))return!1;var o=o[e];if(null!=o&&isFinite(o))return!1;if(a.isString(o)&&"-"!==o)return!0}return!1};t.exports=i},function(t,e,n){"use strict";function i(){this._coordinateSystems=[]}var r=n(1),a={};i.prototype={constructor:i,create:function(t,e){var n=[];r.each(a,function(i,r){var a=i.create(t,e);n=n.concat(a||[])}),this._coordinateSystems=n},update:function(t,e){r.each(this._coordinateSystems,function(n){n.update&&n.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},i.register=function(t,e){a[t]=e},i.get=function(t){return a[t]},t.exports=i},function(t,e,n){"use strict";var i=n(20),r=n(5),a=n(84),o=n(11),s=n(35).devicePixelRatio,l={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},h=[],u=[],c=[],f=[],d=Math.min,p=Math.max,g=Math.cos,v=Math.sin,m=Math.sqrt,y=Math.abs,x="undefined"!=typeof Float32Array,_=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};_.prototype={constructor:_,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=y(1/s/t)||0,this._uy=y(1/s/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(l.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var n=y(t-this._xi)>this._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(l.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,a){return this.addData(l.C,t,e,n,i,r,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,a):this._ctx.bezierCurveTo(t,e,n,i,r,a)),this._xi=r,this._yi=a,this},quadraticCurveTo:function(t,e,n,i){return this.addData(l.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,a){return this.addData(l.A,t,e,n,n,i,r-i,0,a?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,a),this._xi=g(r)*n+t,this._yi=v(r)*n+t,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(l.R,t,e,n,i),this},closePath:function(){this.addData(l.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!x||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();x&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(var r=0;r<e;r++)for(var a=t[r].data,o=0;o<a.length;o++)this.data[i++]=a[o];this._len=i},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var n=0;n<arguments.length;n++)e[this._len++]=arguments[n];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var n,i,r=this._dashSum,a=this._dashOffset,o=this._lineDash,s=this._ctx,l=this._xi,h=this._yi,u=t-l,c=e-h,f=m(u*u+c*c),g=l,v=h,y=o.length;for(u/=f,c/=f,a<0&&(a=r+a),a%=r,g-=a*u,v-=a*c;u>0&&g<=t||u<0&&g>=t||0==u&&(c>0&&v<=e||c<0&&v>=e);)i=this._dashIdx,n=o[i],g+=u*n,v+=c*n,this._dashIdx=(i+1)%y,u>0&&g<l||u<0&&g>l||c>0&&v<h||c<0&&v>h||s[i%2?"moveTo":"lineTo"](u>=0?d(g,t):p(g,t),c>=0?d(v,e):p(v,e));u=g-t,c=v-e,this._dashOffset=-m(u*u+c*c)},_dashedBezierTo:function(t,e,n,r,a,o){var s,l,h,u,c,f=this._dashSum,d=this._dashOffset,p=this._lineDash,g=this._ctx,v=this._xi,y=this._yi,x=i.cubicAt,_=0,b=this._dashIdx,w=p.length,M=0;for(d<0&&(d=f+d),d%=f,s=0;s<1;s+=.1)l=x(v,t,n,a,s+.1)-x(v,t,n,a,s),h=x(y,e,r,o,s+.1)-x(y,e,r,o,s),_+=m(l*l+h*h);for(;b<w&&(M+=p[b],!(M>d));b++);for(s=(M-d)/_;s<=1;)u=x(v,t,n,a,s),c=x(y,e,r,o,s),b%2?g.moveTo(u,c):g.lineTo(u,c),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(a,o),l=a-u,h=o-c,this._dashOffset=-m(l*l+h*h)},_dashedQuadraticTo:function(t,e,n,i){var r=n,a=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,x&&(this.data=new Float32Array(t)))},getBoundingRect:function(){h[0]=h[1]=c[0]=c[1]=Number.MAX_VALUE,u[0]=u[1]=f[0]=f[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,n=0,i=0,s=0,d=0;d<t.length;){var p=t[d++];switch(1==d&&(e=t[d],n=t[d+1],i=e,s=n),p){case l.M:i=t[d++],s=t[d++],e=i,n=s,c[0]=i,c[1]=s,f[0]=i,f[1]=s;break;case l.L:a.fromLine(e,n,t[d],t[d+1],c,f),e=t[d++],n=t[d++];break;case l.C:a.fromCubic(e,n,t[d++],t[d++],t[d++],t[d++],t[d],t[d+1],c,f),e=t[d++],n=t[d++];break;case l.Q:a.fromQuadratic(e,n,t[d++],t[d++],t[d],t[d+1],c,f),e=t[d++],n=t[d++];break;case l.A:var m=t[d++],y=t[d++],x=t[d++],_=t[d++],b=t[d++],w=t[d++]+b,M=(t[d++],1-t[d++]);1==d&&(i=g(b)*x+m,s=v(b)*_+y),a.fromArc(m,y,x,_,b,w,M,c,f),e=g(w)*x+m,n=v(w)*_+y;break;case l.R:i=e=t[d++],s=n=t[d++];var T=t[d++],S=t[d++];a.fromLine(i,s,i+T,s+S,c,f);break;case l.Z:e=i,n=s}r.min(h,h,c),r.max(u,u,f)}return 0===d&&(h[0]=h[1]=u[0]=u[1]=0),new o(h[0],h[1],u[0]-h[0],u[1]-h[1])},rebuildPath:function(t){for(var e,n,i,r,a,o,s=this.data,h=this._ux,u=this._uy,c=this._len,f=0;f<c;){var d=s[f++];switch(1==f&&(i=s[f],r=s[f+1],e=i,n=r),d){case l.M:e=i=s[f++],n=r=s[f++],t.moveTo(i,r);break;case l.L:a=s[f++],o=s[f++],(y(a-i)>h||y(o-r)>u||f===c-1)&&(t.lineTo(a,o),i=a,r=o);break;case l.C:t.bezierCurveTo(s[f++],s[f++],s[f++],s[f++],s[f++],s[f++]),i=s[f-2],r=s[f-1];break;case l.Q:t.quadraticCurveTo(s[f++],s[f++],s[f++],s[f++]),i=s[f-2],r=s[f-1];break;case l.A:var p=s[f++],m=s[f++],x=s[f++],_=s[f++],b=s[f++],w=s[f++],M=s[f++],T=s[f++],S=x>_?x:_,A=x>_?1:x/_,C=x>_?_/x:1,I=Math.abs(x-_)>.001,P=b+w;I?(t.translate(p,m),t.rotate(M),t.scale(A,C),t.arc(0,0,S,b,P,1-T),t.scale(1/A,1/C),t.rotate(-M),t.translate(-p,-m)):t.arc(p,m,S,b,P,1-T),1==f&&(e=g(b)*x+p,n=v(b)*_+m),i=g(P)*x+p,r=v(P)*_+m;break;case l.R:e=i=s[f],n=r=s[f+1],t.rect(s[f++],s[f++],s[f++],s[f++]);break;case l.Z:t.closePath(),i=e,r=n}}}},_.CMD=l,t.exports=_},function(t,e,n){"use strict";function i(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function r(t){var e=i(t);return null!=e&&!c.isArray(p(e))}function a(t,e,n){t=t||[];var i=e.get("coordinateSystem"),a=v[i],o=d.get(i),s=a&&a(t,e,n),m=s&&s.dimensions;m||(m=o&&(o.getDimensionsInfo?o.getDimensionsInfo():o.dimensions.slice())||["x","y"],m=u(m,t,{defaultNames:m.concat(["value"])}));var y=s?s.categoryIndex:-1,x=new h(m,e),_=l(s,t),b={},w=y>=0&&r(t)?function(t,e,n,i){return f.isDataItemOption(t)&&(x.hasItemOption=!0),i===y?n:g(p(t),m[i])}:function(t,e,n,i){var r=p(t),a=g(r&&r[i],m[i]);f.isDataItemOption(t)&&(x.hasItemOption=!0);var o=s&&s.categoryAxesModels;return o&&o[e]&&"string"==typeof a&&(b[e]=b[e]||o[e].getCategories(),a=c.indexOf(b[e],a),a<0&&!isNaN(a)&&(a=+a)),a};return x.hasItemOption=!1,x.initData(t,_,w),x}function o(t){return"category"!==t&&"time"!==t}function s(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function l(t,e){var n,i=[],r=t&&t.dimensions[t.categoryIndex];if(r&&(n=t.categoryAxesModels[r.name]),n){var a=n.getCategories();if(a){var o=e.length;if(c.isArray(e[0])&&e[0].length>1){i=[];for(var s=0;s<o;s++)i[s]=a[e[s][t.categoryIndex||0]]}else i=a.slice(0)}}return i}var h=n(14),u=n(25),c=n(1),f=n(6),d=n(26),p=f.getDataItemValue,g=f.converDataValue,v={cartesian2d:function(t,e,n){var i=c.map(["xAxis","yAxis"],function(t){return n.queryComponents({mainType:t,index:e.get(t+"Index"),id:e.get(t+"Id")})[0]}),r=i[0],a=i[1],l=r.get("type"),h=a.get("type"),f=[{name:"x",type:s(l),stackable:o(l)},{name:"y",type:s(h),stackable:o(h)}],d="category"===l,p="category"===h;u(f,t,{defaultNames:["x","y","z"]});var g={};return d&&(g.x=r),p&&(g.y=a),{dimensions:f,categoryIndex:d?0:p?1:-1,categoryAxesModels:g}},singleAxis:function(t,e,n){var i=n.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0],r=i.get("type"),a="category"===r,l=[{name:"single",type:s(r),stackable:o(r)}];u(l,t);var h={};return a&&(h.single=i),{dimensions:l,categoryIndex:a?0:-1,categoryAxesModels:h}},polar:function(t,e,n){var i=n.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0],r=i.findAxisModel("angleAxis"),a=i.findAxisModel("radiusAxis"),l=a.get("type"),h=r.get("type"),c=[{name:"radius",type:s(l),stackable:o(l)},{name:"angle",type:s(h),stackable:o(h)}],f="category"===h,d="category"===l;u(c,t,{defaultNames:["radius","angle","value"]});var p={};return d&&(p.radius=a),f&&(p.angle=r),{dimensions:c,categoryIndex:f?1:d?0:-1,categoryAxesModels:p}},geo:function(t,e,n){return{dimensions:u([{name:"lng"},{name:"lat"}],t,{defaultNames:["lng","lat","value"]})}}};t.exports=a},,function(t,e,n){function i(){this.group=new o,this.uid=s.getUID("viewChart")}function r(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var n=0;n<t.childCount();n++)r(t.childAt(n),e)}function a(t,e,n){var i=h.queryDataIndex(t,e);null!=i?u.each(h.normalizeToArray(i),function(e){r(t.getItemGraphicEl(e),n)}):t.eachItemGraphicEl(function(t){r(t,n)})}var o=n(36),s=n(49),l=n(15),h=n(6),u=n(1);i.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){a(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){a(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){}};var c=i.prototype;c.updateView=c.updateLayout=c.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},l.enableClassExtend(i,["dispose"]),l.enableClassManagement(i,{registerWhenExtend:!0}),t.exports=i},function(t,e,n){var i=n(1);t.exports=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e,n){for(var r={},a=0;a<t.length;a++){var o=t[a][1];if(!(e&&i.indexOf(e,o)>=0||n&&i.indexOf(n,o)<0)){var s=this.getShallow(o);null!=s&&(r[t[a][0]]=s)}}return r}}},function(t,e,n){"use strict";var i=n(3),r=n(1),a=n(2);n(56),n(116),a.extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new i.Rect({shape:t.coordinateSystem.getRect(),style:r.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),a.registerPreprocessor(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})})},function(t,e,n){function i(t,e){var n=t[1]-t[0],i=e,r=n/i/2;t[0]+=r,t[1]-=r}var r=n(4),a=r.linearMap,o=n(1),s=[0,1],l=function(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1};l.prototype={constructor:l,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){var t=this._extent.slice();return t},getPixelPrecision:function(t){return r.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,r=this.scale;return t=r.normalize(t),this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count())),a(t,s,n,e)},coordToData:function(t,e){var n=this._extent,r=this.scale;this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count()));var o=a(t,n,s,e);return this.scale.scale(o)},pointToData:function(t,e){},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),n=[],i=0;i<e.length;i++)n.push(e[i][0]);return e[i-1]&&n.push(e[i-1][1]),n}return o.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return o.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],n=this.scale.count(),i=t[0],r=t[1],a=r-i,o=0;o<n;o++)e.push([a*o/n+i,a*(o+1)/n+i]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n}},t.exports=l},function(t,e,n){function i(t){this._setting=t||{},this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var r=n(15),a=i.prototype;a.parse=function(t){return t},a.getSetting=function(t){return this._setting[t]},a.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},a.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},a.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},a.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},a.unionExtentFromData=function(t,e){this.unionExtent(t.getDataExtent(e,!0))},a.getExtent=function(){return this._extent.slice()},a.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},a.getTicksLabels=function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},a.isBlank=function(){return this._isBlank},a.setBlank=function(t){this._isBlank=t},r.enableClassExtend(i),r.enableClassManagement(i,{registerWhenExtend:!0}),t.exports=i},function(t,e){var n=1;"undefined"!=typeof window&&(n=Math.max(window.devicePixelRatio||1,1));var i={debugMode:0,devicePixelRatio:n};t.exports=i},function(t,e,n){var i=n(1),r=n(65),a=n(11),o=function(t){t=t||{},r.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};o.prototype={constructor:o,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof o&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,r=this._children,a=i.indexOf(r,t);return a<0?this:(r.splice(a,1),t.parent=null,n&&(n.delFromStorage(t),t instanceof o&&t.delChildrenFromStorage(n)),e&&e.refresh(),this)},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;e<n.length;e++)t=n[e],i&&(i.delFromStorage(t),t instanceof o&&t.delChildrenFromStorage(i)),t.parent=null;return n.length=0,this},eachChild:function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},traverse:function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n];t.call(e,i),"group"===i.type&&i.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.addToStorage(n),n instanceof o&&n.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.delFromStorage(n),n instanceof o&&n.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,n=new a(0,0,0,0),i=t||this._children,r=[],o=0;o<i.length;o++){var s=i[o];if(!s.ignore&&!s.invisible){var l=s.getBoundingRect(),h=s.getLocalTransform(r);h?(n.copy(l),n.applyTransform(h),e=e||n.clone(),e.union(n)):(e=e||l.clone(),e.union(l))}}return e||n}},i.inherits(o,r),t.exports=o},function(t,e){var n={},i="\0__throttleOriginMethod",r="\0__throttleRate",a="\0__throttleType";n.throttle=function(t,e,n){function i(){u=(new Date).getTime(),c=null,t.apply(o,s||[])}var r,a,o,s,l,h=0,u=0,c=null;e=e||0;var f=function(){r=(new Date).getTime(),o=this,s=arguments;var t=l||e,f=l||n;l=null,a=r-(f?h:u)-t,clearTimeout(c),f?c=setTimeout(i,t):a>=0?i():c=setTimeout(i,-a),h=r};return f.clear=function(){c&&(clearTimeout(c),c=null)},f.debounceNextCall=function(t){l=t},f},n.createOrUpdate=function(t,e,o,s){var l=t[e];if(l){var h=l[i]||l,u=l[a],c=l[r];if(c!==o||u!==s){if(null==o||!s)return t[e]=h;l=t[e]=n.throttle(h,o,"debounce"===s),l[i]=h,l[a]=s,l[r]=o}return l}},n.clear=function(t,e){var n=t[e];n&&n[i]&&(t[e]=n[i])},t.exports=n},function(t,e,n){function i(t){t=t||{},o.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new a(t.style),this._rect=null,this.__clipPaths=[]}var r=n(1),a=n(72),o=n(65),s=n(86);i.prototype={constructor:i,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return i.contain(n[0],n[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?o.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new a(t),this.dirty(!1),this}},r.inherits(i,o),r.mixin(i,s),t.exports=i},function(t,e){var n=function(t){this.colorStops=t||[]};n.prototype={constructor:n,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=n},function(t,e,n){function i(t){var e={componentType:t.mainType};return e[t.mainType+"Index"]=t.componentIndex,e}function r(t,e,n,i){var r,a,o=d(n-t.rotation),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;return p(o-x/2)?(a=l?"bottom":"top",r="center"):p(o-1.5*x)?(a=l?"top":"bottom",r="center"):(a="middle",r=o<1.5*x&&o>x/2?l?"left":"right":l?"right":"left"),{rotation:o,textAlign:r,textVerticalAlign:a}}function a(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function o(t,e){var n=t.get("axisLabel.showMinLabel"),i=t.get("axisLabel.showMaxLabel"),r=e[0],a=e[1],o=e[e.length-1],l=e[e.length-2];n===!1?r.ignore=!0:null!=t.getMin()&&s(r,a)&&(n?a.ignore=!0:r.ignore=!0),i===!1?o.ignore=!0:null!=t.getMax()&&s(l,o)&&(i?l.ignore=!0:o.ignore=!0)}function s(t,e,n){var i=t&&t.getBoundingRect().clone(),r=e&&e.getBoundingRect().clone();if(i&&r){var a=v.identity([]);return v.rotate(a,a,-t.rotation),i.applyTransform(v.mul([],a,t.getLocalTransform())),r.applyTransform(v.mul([],a,e.getLocalTransform())),i.intersect(r)}}var l=n(1),h=n(7),u=n(3),c=n(10),f=n(4),d=f.remRadian,p=f.isRadianAroundZero,g=n(5),v=n(19),m=g.applyTransform,y=l.retrieve,x=Math.PI,_=function(t,e){this.opt=e,this.axisModel=t,l.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new u.Group;var n=new u.Group({position:e.position.slice(),rotation:e.rotation});n.updateTransform(),this._transform=n.transform,this._dumbGroup=n};_.prototype={constructor:_,hasBuilder:function(t){return!!b[t]},add:function(t){b[t].call(this)},getGroup:function(){return this.group}};var b={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var n=this.axisModel.axis.getExtent(),i=this._transform,r=[n[0],0],a=[n[1],0];i&&(m(r,r,i),m(a,a,i)),this.group.add(new u.Line(u.subPixelOptimizeLine({anid:"line",shape:{x1:r[0],y1:r[1],x2:a[0],y2:a[1]},style:l.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})))}},axisTick:function(){var t=this.axisModel,e=t.axis;if(t.get("axisTick.show")&&!e.scale.isBlank())for(var n=t.getModel("axisTick"),i=this.opt,r=n.getModel("lineStyle"),a=n.get("length"),o=T(n,i.labelInterval),s=e.getTicksCoords(n.get("alignWithLabel")),h=e.scale.getTicks(),c=[],f=[],d=this._transform,p=0;p<s.length;p++)if(!M(e,p,o)){var g=s[p];c[0]=g,c[1]=0,f[0]=g,f[1]=i.tickDirection*a,d&&(m(c,c,d),m(f,f,d)),this.group.add(new u.Line(u.subPixelOptimizeLine({anid:"tick_"+h[p],shape:{x1:c[0],y1:c[1],x2:f[0],y2:f[1]},style:l.defaults(r.getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")}),z2:2,silent:!0})))}},axisLabel:function(){var t=this.opt,e=this.axisModel,n=e.axis,r=y(t.axisLabelShow,e.get("axisLabel.show"));if(r&&!n.scale.isBlank()){var s=e.getModel("axisLabel"),h=s.getModel("textStyle"),f=s.get("margin"),d=n.scale.getTicks(),p=e.getFormattedLabels(),g=(y(t.labelRotate,s.get("rotate"))||0)*x/180,v=w(t.rotation,g,t.labelDirection),m=e.get("data"),_=[],b=a(e),T=e.get("triggerEvent");l.each(d,function(r,a){if(!M(n,a,t.labelInterval)){var o=h;m&&m[r]&&m[r].textStyle&&(o=new c(m[r].textStyle,h,e.ecModel));var s=o.getTextColor()||e.get("axisLine.lineStyle.color"),l=n.dataToCoord(r),d=[l,t.labelOffset+t.labelDirection*f],g=n.scale.getLabel(r),y=new u.Text({anid:"label_"+r,style:{text:p[a],textAlign:o.get("align",!0)||v.textAlign,textVerticalAlign:o.get("baseline",!0)||v.textVerticalAlign,textFont:o.getFont(),fill:"function"==typeof s?s("category"===n.type?g:"value"===n.type?r+"":r,a):s},position:d,rotation:v.rotation,silent:b,z2:10});T&&(y.eventData=i(e),y.eventData.targetType="axisLabel",y.eventData.value=g),this._dumbGroup.add(y),y.updateTransform(),_.push(y),this.group.add(y),y.decomposeTransform()}},this),o(e,_)}},axisName:function(){var t=this.opt,e=this.axisModel,n=y(t.axisName,e.get("name"));if(n){var o,s=e.get("nameLocation"),c=t.nameDirection,f=e.getModel("nameTextStyle"),d=e.get("nameGap")||0,p=this.axisModel.axis.getExtent(),g=p[0]>p[1]?-1:1,v=["start"===s?p[0]-g*d:"end"===s?p[1]+g*d:(p[0]+p[1])/2,"middle"===s?t.labelOffset+c*d:0],m=e.get("nameRotate");null!=m&&(m=m*x/180);var _;"middle"===s?o=w(t.rotation,null!=m?m:t.rotation,c):(o=r(t,s,m||0,p),_=t.axisNameAvailableWidth,null!=_&&(_=Math.abs(_/Math.sin(o.rotation)),!isFinite(_)&&(_=null)));var b=f.getFont(),M=e.get("nameTruncate",!0)||{},T=M.ellipsis,S=y(t.nameTruncateMaxWidth,M.maxWidth,_),A=null!=T&&null!=S?h.truncateText(n,S,b,T,{minChar:2,placeholder:M.placeholder}):n,C=e.get("tooltip",!0),I=e.mainType,P={componentType:I,name:n,$vars:["name"]};P[I+"Index"]=e.componentIndex;var L=new u.Text({anid:"name",__fullText:n,__truncatedText:A,style:{text:A,textFont:b,fill:f.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:o.textAlign,textVerticalAlign:o.textVerticalAlign},position:v,rotation:o.rotation,silent:a(e),z2:1,tooltip:C&&C.show?l.extend({content:n,formatter:function(){return n},formatterParams:P},C):null});e.get("triggerEvent")&&(L.eventData=i(e),L.eventData.targetType="axisName",L.eventData.name=n),this._dumbGroup.add(L),L.updateTransform(),this.group.add(L),L.decomposeTransform()}}},w=_.innerTextLayout=function(t,e,n){var i,r,a=d(e-t);return p(a)?(r=n>0?"top":"bottom",i="center"):p(a-x)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=a>0&&a<x?n>0?"right":"left":n>0?"left":"right"),{rotation:a,textAlign:i,textVerticalAlign:r}},M=_.ifIgnoreOnTick=function(t,e,n){var i,r=t.scale;return"ordinal"===r.type&&("function"==typeof n?(i=r.getTicks()[e],!n(i,r.getLabel(i))):e%(n+1))},T=_.getInterval=function(t,e){var n=t.get("interval");return null!=n&&"auto"!=n||(n=e),n};t.exports=_},function(t,e,n){function i(t,e,n,i,s,l){var h=o.getAxisPointerClass(t.axisPointerClass);if(h){var u=a.getAxisPointerModel(e);u?(t._axisPointer||(t._axisPointer=new h)).render(e,u,i,l):r(t,i)}}function r(t,e,n){var i=t._axisPointer;i&&i.dispose(e,n),t._axisPointer=null}var a=n(45),o=n(2).extendComponentView({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,n,r){this.axisPointerClass&&a.fixValue(t),o.superApply(this,"render",arguments),i(this,t,e,n,r,!0)},updateAxisPointer:function(t,e,n,r,a){i(this,t,e,n,r,!1)},remove:function(t,e){var n=this._axisPointer;n&&n.remove(e),o.superApply(this,"remove",arguments)},dispose:function(t,e){r(this,e),o.superApply(this,"dispose",arguments)}}),s=[];o.registerAxisPointerClass=function(t,e){s[t]=e},o.getAxisPointerClass=function(t){return t&&s[t]},t.exports=o},function(t,e,n){function i(t){return r.isObject(t)&&null!=t.value?t.value:t}var r=n(1),a=n(17);t.exports={getFormattedLabels:function(){return a.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))},getCategories:function(){return"category"===this.get("type")&&r.map(this.get("data"),i)},getMin:function(t){var e=this.option,n=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=n&&"dataMin"!==n&&!r.eqNaN(n)&&(n=this.axis.scale.parse(n)),n},getMax:function(t){var e=this.option,n=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=n&&"dataMax"!==n&&!r.eqNaN(n)&&(n=this.axis.scale.parse(n)),n},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:r.noop,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}}},function(t,e,n){var i=n(4),r=n(7),a=n(34),o=n(63),s=i.round,l=a.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),
-l.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval||this.niceTicks(),this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){return this._interval||this.niceTicks(),o.intervalScaleGetTicks(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},getLabel:function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=i.getPrecisionSafe(t)||0:"auto"===n&&(n=this._intervalPrecision),t=s(t,n,!0),r.addCommas(t)},niceTicks:function(t){t=t||5;var e=this._extent,n=e[1]-e[0];if(isFinite(n)){n<0&&(n=-n,e.reverse());var i=o.intervalScaleNiceTicks(e,t);this._intervalPrecision=i.intervalPrecision,this._interval=i.interval,this._niceExtent=i.niceTickExtent}},niceExtent:function(t,e,n){var i=this._extent;if(i[0]===i[1])if(0!==i[0]){var r=i[0];n?i[0]-=r/2:(i[1]+=r/2,i[0]-=r/2)}else i[1]=1;var a=i[1]-i[0];isFinite(a)||(i[0]=0,i[1]=1),this.niceTicks(t);var o=this._interval;e||(i[0]=s(Math.floor(i[0]/o)*o)),n||(i[1]=s(Math.ceil(i[1]/o)*o))}});l.create=function(){return new l},t.exports=l},function(t,e,n){function i(t){this.group=new a.Group,this._symbolCtor=t||o}function r(t,e,n){var i=t.getItemLayout(e);return i&&!isNaN(i[0])&&!isNaN(i[1])&&!(n&&n(e))&&"none"!==t.getItemVisual(e,"symbol")}var a=n(3),o=n(54),s=i.prototype;s.updateData=function(t,e){var n=this.group,i=t.hostModel,o=this._data,s=this._symbolCtor,l={itemStyle:i.getModel("itemStyle.normal").getItemStyle(["color"]),hoverItemStyle:i.getModel("itemStyle.emphasis").getItemStyle(),symbolRotate:i.get("symbolRotate"),symbolOffset:i.get("symbolOffset"),hoverAnimation:i.get("hoverAnimation"),labelModel:i.getModel("label.normal"),hoverLabelModel:i.getModel("label.emphasis")};t.diff(o).add(function(i){var a=t.getItemLayout(i);if(r(t,i,e)){var o=new s(t,i,l);o.attr("position",a),t.setItemGraphicEl(i,o),n.add(o)}}).update(function(h,u){var c=o.getItemGraphicEl(u),f=t.getItemLayout(h);return r(t,h,e)?(c?(c.updateData(t,h,l),a.updateProps(c,{position:f},i)):(c=new s(t,h),c.attr("position",f)),n.add(c),void t.setItemGraphicEl(h,c)):void n.remove(c)}).remove(function(t){var e=o.getItemGraphicEl(t);e&&e.fadeOut(function(){n.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,n){var i=t.getItemLayout(n);e.attr("position",i)})},s.remove=function(t){var e=this.group,n=this._data;n&&(t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=i},function(t,e,n){function i(t,e,n){var i=e.getComponent("tooltip"),a=e.getComponent("axisPointer"),s=a.get("link",!0)||[],h=[];c(n.getCoordinateSystems(),function(n){function u(i,u,c){var f=c.model.getModel("axisPointer",a),d=f.get("show");if(d&&("auto"!==d||i||l(f))){null==u&&(u=f.get("triggerTooltip")),f=i?r(c,m,a,e,i,u):f;var v=f.get("snap"),y=p(c.model),x=u||v||"category"===c.type,_=t.axesInfo[y]={key:y,axis:c,coordSys:n,axisPointerModel:f,triggerTooltip:u,involveSeries:x,snap:v,useHandle:l(f),seriesModels:[]};g[y]=_,t.seriesInvolved|=x;var b=o(s,c);if(null!=b){var w=h[b]||(h[b]={axesInfo:{}});w.axesInfo[y]=_,w.mapper=s[b].mapper,_.linkGroup=w}}}if(n.axisPointerEnabled){var d=p(n.model),g=t.coordSysAxesInfo[d]={};t.coordSysMap[d]=n;var v=n.model,m=v.getModel("tooltip",i);if(c(n.getAxes(),f(u,!1,null)),n.getTooltipAxes&&i&&m.get("show")){var y="axis"===m.get("trigger"),x="cross"===m.get("axisPointer.type"),_=n.getTooltipAxes(m.get("axisPointer.axis"));(y||x)&&c(_.baseAxes,f(u,!x||"cross",y)),x&&c(_.otherAxes,f(u,"cross",!1))}}})}function r(t,e,n,i,r,a){var o=e.getModel("axisPointer"),s={};c(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(t){s[t]=h.clone(o.get(t))}),s.snap="category"!==t.type&&!!a,"cross"===o.get("type")&&(s.type="line");var l=s.label||(s.label={});if(null==l.show&&(l.show=!1),"cross"===r&&(l.show=!0,!a)){var f=s.lineStyle=o.get("crossStyle");f&&h.defaults(l.textStyle||(l.textStyle={}),f.textStyle)}return t.model.getModel("axisPointer",new u(s,n,i))}function a(t,e){e.eachSeries(function(e){var n=e.coordinateSystem,i=e.get("tooltip.trigger",!0);n&&"none"!==i&&i!==!1&&"item"!==i&&e.get("axisPointer.show",!0)!==!1&&c(t.coordSysAxesInfo[p(n.model)],function(t){var i=t.axis;n.getAxis(i.dim)===i&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())})},this)}function o(t,e){for(var n=e.model,i=e.dim,r=0;r<t.length;r++){var a=t[r]||{};if(s(a[i+"AxisId"],n.id)||s(a[i+"AxisIndex"],n.componentIndex)||s(a[i+"AxisName"],n.name))return r}}function s(t,e){return"all"===t||h.isArray(t)&&h.indexOf(t,e)>=0||t===e}function l(t){return!!t.get("handle.show")}var h=n(1),u=n(10),c=h.each,f=h.curry,d={};d.collect=function(t,e){var n={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return i(n,t,e),n.seriesInvolved&&a(n,t),n},d.fixValue=function(t){var e=d.getAxisInfo(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,a=n.get("status"),o=n.get("value");null!=o&&(o=i.parse(o));var s=l(n);null==a&&(r.status=s?"show":"hide");var h=i.getExtent().slice();h[0]>h[1]&&h.reverse(),(null==o||o>h[1])&&(o=h[1]),o<h[0]&&(o=h[0]),r.value=o,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}},d.getAxisInfo=function(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[p(t)]},d.getAxisPointerModel=function(t){var e=d.getAxisInfo(t);return e&&e.axisPointerModel};var p=d.makeKey=function(t){return t.type+"||"+t.id};t.exports=d},,,function(t,e){"use strict";function n(t){return t}function i(t,e,i,r){this._old=t,this._new=e,this._oldKeyGetter=i||n,this._newKeyGetter=r||n}function r(t,e,n,i){for(var r=0;r<t.length;r++){var a=i(t[r],r),o=e[a];null==o?(n.push(a),e[a]=r):(o.length||(e[a]=o=[o]),o.push(r))}}i.prototype={constructor:i,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,n=this._new,i=this._oldKeyGetter,a=this._newKeyGetter,o={},s={},l=[],h=[];for(r(e,o,l,i),r(n,s,h,a),t=0;t<e.length;t++){var u=l[t],c=s[u];if(null!=c){var f=c.length;f?(1===f&&(s[u]=null),c=c.unshift()):s[u]=null,this._update&&this._update(c,t)}else this._remove&&this._remove(t)}for(var t=0;t<h.length;t++){var u=h[t];if(s.hasOwnProperty(u)){var c=s[u];if(null==c)continue;if(c.length)for(var d=0,f=c.length;d<f;d++)this._add&&this._add(c[d]);else this._add&&this._add(c)}}}},t.exports=i},function(t,e,n){var i=n(1),r=n(15),a=r.parseClassType,o=0,s={},l="_";s.getUID=function(t){return[t||"",o++,Math.random()].join(l)},s.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,n){t=a(t),e[t.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=a(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r},t},s.enableTopologicalTravel=function(t,e){function n(t){var n={},o=[];return i.each(t,function(s){var l=r(n,s),h=l.originalDeps=e(s),u=a(h,t);l.entryCount=u.length,0===l.entryCount&&o.push(s),i.each(u,function(t){i.indexOf(l.predecessor,t)<0&&l.predecessor.push(t);var e=r(n,t);i.indexOf(e.successor,t)<0&&e.successor.push(s)})}),{graph:n,noEntryList:o}}function r(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function a(t,e){var n=[];return i.each(t,function(t){i.indexOf(e,t)>=0&&n.push(t)}),n}t.topologicalTravel=function(t,e,r,a){function o(t){h[t].entryCount--,0===h[t].entryCount&&u.push(t)}function s(t){c[t]=!0,o(t)}if(t.length){var l=n(e),h=l.graph,u=l.noEntryList,c={};for(i.each(t,function(t){c[t]=!0});u.length;){var f=u.pop(),d=h[f],p=!!c[f];p&&(r.call(a,f,d.originalDeps.slice()),delete c[f]),i.each(d.successor,p?s:o)}i.each(c,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){t.exports=function(t,e,n,i,r){i.eachRawSeriesByType(t,function(t){var r=t.getData(),a=t.get("symbol")||e,o=t.get("symbolSize");r.setVisual({legendSymbol:n||a,symbol:a,symbolSize:o}),i.isSeriesFiltered(t)||("function"==typeof o&&r.each(function(e){var n=t.getRawValue(e),i=t.getDataParams(e);r.setItemVisual(e,"symbolSize",o(n,i))}),r.each(function(t){var e=r.getItemModel(t),n=e.getShallow("symbol",!0),i=e.getShallow("symbolSize",!0);null!=n&&r.setItemVisual(t,"symbol",n),null!=i&&r.setItemVisual(t,"symbolSize",i)}))})}},function(t,e){function n(t){for(var e=0;t>=u;)e|=1&t,t>>=1;return t+e}function i(t,e,n,i){var a=e+1;if(a===n)return 1;if(i(t[a++],t[e])<0){for(;a<n&&i(t[a],t[a-1])<0;)a++;r(t,e,a)}else for(;a<n&&i(t[a],t[a-1])>=0;)a++;return a-e}function r(t,e,n){for(n--;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}function a(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var a,o=t[i],s=e,l=i;s<l;)a=s+l>>>1,r(o,t[a])<0?l=a:s=a+1;var h=i-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;h>0;)t[s+h]=t[s+h-1],h--}t[s]=o}}function o(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])>0){for(s=i-r;l<s&&a(t,e[n+r+l])>0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),o+=r,l+=r}else{for(s=r+1;l<s&&a(t,e[n+r-l])<=0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var h=o;o=r-l,l=r-h}for(o++;o<l;){var u=o+(l-o>>>1);a(t,e[n+u])>0?o=u+1:l=u}return l}function s(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])<0){for(s=r+1;l<s&&a(t,e[n+r-l])<0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var h=o;o=r-l,l=r-h}else{for(s=i-r;l<s&&a(t,e[n+r+l])>=0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),o+=r,l+=r}for(o++;o<l;){var u=o+(l-o>>>1);a(t,e[n+u])<0?l=u:o=u+1}return l}function l(t,e){function n(t,e){u[y]=t,d[y]=e,y+=1}function i(){for(;y>1;){var t=y-2;if(t>=1&&d[t-1]<=d[t]+d[t+1]||t>=2&&d[t-2]<=d[t]+d[t-1])d[t-1]<d[t+1]&&t--;else if(d[t]>d[t+1])break;a(t)}}function r(){for(;y>1;){var t=y-2;t>0&&d[t-1]<d[t+1]&&t--,a(t)}}function a(n){var i=u[n],r=d[n],a=u[n+1],c=d[n+1];d[n]=r+c,n===y-3&&(u[n+1]=u[n+2],d[n+1]=d[n+2]),y--;var f=s(t[a],t,i,r,0,e);i+=f,r-=f,0!==r&&(c=o(t[i+r-1],t,a,c,c-1,e),0!==c&&(r<=c?l(i,r,a,c):h(i,r,a,c)))}function l(n,i,r,a){var l=0;for(l=0;l<i;l++)x[l]=t[n+l];var h=0,u=r,f=n;if(t[f++]=t[u++],0!==--a){if(1===i){for(l=0;l<a;l++)t[f+l]=t[u+l];return void(t[f+a]=x[h])}for(var d,g,v,m=p;;){d=0,g=0,v=!1;do if(e(t[u],x[h])<0){if(t[f++]=t[u++],g++,d=0,0===--a){v=!0;break}}else if(t[f++]=x[h++],d++,g=0,1===--i){v=!0;break}while((d|g)<m);if(v)break;do{if(d=s(t[u],x,h,i,0,e),0!==d){for(l=0;l<d;l++)t[f+l]=x[h+l];if(f+=d,h+=d,i-=d,i<=1){v=!0;break}}if(t[f++]=t[u++],0===--a){v=!0;break}if(g=o(x[h],t,u,a,0,e),0!==g){for(l=0;l<g;l++)t[f+l]=t[u+l];if(f+=g,u+=g,a-=g,0===a){v=!0;break}}if(t[f++]=x[h++],1===--i){v=!0;break}m--}while(d>=c||g>=c);if(v)break;m<0&&(m=0),m+=2}if(p=m,p<1&&(p=1),1===i){for(l=0;l<a;l++)t[f+l]=t[u+l];t[f+a]=x[h]}else{if(0===i)throw new Error;for(l=0;l<i;l++)t[f+l]=x[h+l]}}else for(l=0;l<i;l++)t[f+l]=x[h+l]}function h(n,i,r,a){var l=0;for(l=0;l<a;l++)x[l]=t[r+l];var h=n+i-1,u=a-1,f=r+a-1,d=0,g=0;if(t[f--]=t[h--],0!==--i){if(1===a){for(f-=i,h-=i,g=f+1,d=h+1,l=i-1;l>=0;l--)t[g+l]=t[d+l];return void(t[f]=x[u])}for(var v=p;;){var m=0,y=0,_=!1;do if(e(x[u],t[h])<0){if(t[f--]=t[h--],m++,y=0,0===--i){_=!0;break}}else if(t[f--]=x[u--],y++,m=0,1===--a){_=!0;break}while((m|y)<v);if(_)break;do{if(m=i-s(x[u],t,n,i,i-1,e),0!==m){for(f-=m,h-=m,i-=m,g=f+1,d=h+1,l=m-1;l>=0;l--)t[g+l]=t[d+l];if(0===i){_=!0;break}}if(t[f--]=x[u--],1===--a){_=!0;break}if(y=a-o(t[h],x,0,a,a-1,e),0!==y){for(f-=y,u-=y,a-=y,g=f+1,d=u+1,l=0;l<y;l++)t[g+l]=x[d+l];if(a<=1){_=!0;break}}if(t[f--]=t[h--],0===--i){_=!0;break}v--}while(m>=c||y>=c);if(_)break;v<0&&(v=0),v+=2}if(p=v,p<1&&(p=1),1===a){for(f-=i,h-=i,g=f+1,d=h+1,l=i-1;l>=0;l--)t[g+l]=t[d+l];t[f]=x[u]}else{if(0===a)throw new Error;for(d=f-(a-1),l=0;l<a;l++)t[d+l]=x[l]}}else for(d=f-(a-1),l=0;l<a;l++)t[d+l]=x[l]}var u,d,p=c,g=0,v=f,m=0,y=0;g=t.length,g<2*f&&(v=g>>>1);var x=[];m=g<120?5:g<1542?10:g<119151?19:40,u=[],d=[],this.mergeRuns=i,this.forceMergeRuns=r,this.pushRun=n}function h(t,e,r,o){r||(r=0),o||(o=t.length);var s=o-r;if(!(s<2)){var h=0;if(s<u)return h=i(t,r,o,e),void a(t,r,o,r+h,e);var c=new l(t,e),f=n(s);do{if(h=i(t,r,o,e),h<f){var d=s;d>f&&(d=f),a(t,r,r+d,r+h,e),h=d}c.pushRun(r,h),c.mergeRuns(),s-=h,r+=h}while(0!==s);c.forceMergeRuns()}}var u=32,c=7,f=256;t.exports=h},function(t,e,n){var i=n(35);t.exports=function(){if(0!==i.debugMode)if(1==i.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(i.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,n){function i(t){r.call(this,t)}var r=n(38),a=n(11),o=n(1),s=n(69),l=new s(50);i.prototype={constructor:i,type:"image",brush:function(t,e){var n,i=this.style,r=i.image;if(i.bind(t,this,e),n="string"==typeof r?this._image:r,!n&&r){var a=l.get(r);if(!a)return n=new Image,n.onload=function(){n.onload=null;for(var t=0;t<a.pending.length;t++)a.pending[t].dirty()},a={image:n,pending:[this]},n.src=r,l.put(r,a),void(this._image=n);if(n=a.image,this._image=n,!n.width||!n.height)return void a.pending.push(this)}if(n){var o=i.x||0,s=i.y||0;if(!n.width||!n.height)return;var h=i.width,u=i.height,c=n.width/n.height;if(null==h&&null!=u?h=u*c:null==u&&null!=h?u=h/c:null==h&&null==u&&(h=n.width,u=n.height),this.setTransform(t),i.sWidth&&i.sHeight){var f=i.sx||0,d=i.sy||0;t.drawImage(n,f,d,i.sWidth,i.sHeight,o,s,h,u)}else if(i.sx&&i.sy){var f=i.sx,d=i.sy,p=h-f,g=u-d;t.drawImage(n,f,d,p,g,o,s,h,u)}else t.drawImage(n,o,s,h,u);this.restoreTransform(t),null!=i.text&&this.drawRectText(t,this.getBoundingRect())}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new a(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},o.inherits(i,r),t.exports=i},function(t,e,n){function i(t,e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array?n.slice():[+n,+n]}function r(t){return[t[0]/2,t[1]/2]}function a(t,e,n){h.Group.call(this),this.updateData(t,e,n)}function o(t,e){this.parent.drift(t,e)}var s=n(1),l=n(24),h=n(3),u=n(4),c=a.prototype;c._createSymbol=function(t,e,n,i){this.removeAll();var a=e.hostModel,s=e.getItemVisual(n,"color"),u=l.createSymbol(t,-1,-1,2,2,s);u.attr({z2:100,culling:!0,scale:[0,0]}),u.drift=o,h.initProps(u,{scale:r(i)},a,n),this._symbolType=t,this.add(u)},c.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},c.getSymbolPath=function(){return this.childAt(0)},c.getScale=function(){return this.childAt(0).scale},c.highlight=function(){this.childAt(0).trigger("emphasis")},c.downplay=function(){this.childAt(0).trigger("normal")},c.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},c.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},c.updateData=function(t,e,n){this.silent=!1;var a=t.getItemVisual(e,"symbol")||"circle",o=t.hostModel,s=i(t,e);if(a!==this._symbolType)this._createSymbol(a,t,e,s);else{var l=this.childAt(0);l.silent=!1,h.updateProps(l,{scale:r(s)},o,e)}this._updateCommon(t,e,s,n),this._seriesModel=o};var f=["itemStyle","normal"],d=["itemStyle","emphasis"],p=["label","normal"],g=["label","emphasis"];c._updateCommon=function(t,e,n,i){var a=this.childAt(0),o=t.hostModel,l=t.getItemVisual(e,"color");"image"!==a.type&&a.useStyle({strokeNoScale:!0}),i=i||null;var c=i&&i.itemStyle,v=i&&i.hoverItemStyle,m=i&&i.symbolRotate,y=i&&i.symbolOffset,x=i&&i.labelModel,_=i&&i.hoverLabelModel,b=i&&i.hoverAnimation;if(!i||t.hasItemOption){var w=t.getItemModel(e);c=w.getModel(f).getItemStyle(["color"]),v=w.getModel(d).getItemStyle(),m=w.getShallow("symbolRotate"),y=w.getShallow("symbolOffset"),x=w.getModel(p),_=w.getModel(g),b=w.getShallow("hoverAnimation")}else v=s.extend({},v);var M=a.style;a.attr("rotation",(m||0)*Math.PI/180||0),y&&a.attr("position",[u.parsePercent(y[0],n[0]),u.parsePercent(y[1],n[1])]),a.setColor(l),a.setStyle(c);var T=t.getItemVisual(e,"opacity");null!=T&&(M.opacity=T);for(var S,A,C=t.dimensions.slice();C.length&&(S=C.pop(),A=t.getDimensionInfo(S).type,"ordinal"===A||"time"===A););null!=S&&x.getShallow("show")?(h.setText(M,x,l),M.text=s.retrieve(o.getFormattedLabel(e,"normal"),t.get(S,e))):M.text="",null!=S&&_.getShallow("show")?(h.setText(v,_,l),v.text=s.retrieve(o.getFormattedLabel(e,"emphasis"),t.get(S,e))):v.text="",a.off("mouseover").off("mouseout").off("emphasis").off("normal"),a.hoverStyle=v,h.setHoverStyle(a);var I=r(n);if(b&&o.isAnimationEnabled()){var P=function(){var t=I[1]/I[0];this.animateTo({scale:[Math.max(1.1*I[0],I[0]+3),Math.max(1.1*I[1],I[1]+3*t)]},400,"elasticOut")},L=function(){this.animateTo({scale:I},400,"elasticOut")};a.on("mouseover",P).on("mouseout",L).on("emphasis",P).on("normal",L)}},c.fadeOut=function(t){var e=this.childAt(0);this.silent=e.silent=!0,e.style.text="",h.updateProps(e,{scale:[0,0]},this._seriesModel,this.dataIndex,t)},s.inherits(a,h.Group),t.exports=a},,function(t,e,n){function i(t,e,n){return t.getCoordSysModel()===e}function r(t){var e,n=t.model,i=n.getFormattedLabels(),r=n.getModel("axisLabel.textStyle"),a=1,o=i.length;o>40&&(a=Math.ceil(o/40));for(var s=0;s<o;s+=a)if(!t.isLabelIgnored(s)){var l=r.getTextRect(i[s]);e?e.union(l):e=l}return e}function a(t,e,n){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,n),this.model=t}function o(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}function s(t,e){return c.map(y,function(e){var n=t.getReferringComponents(e)[0];return n})}function l(t){return"cartesian2d"===t.get("coordinateSystem")}var h=n(12),u=n(17),c=n(1),f=n(132),d=n(130),p=c.each,g=u.ifAxisCrossZero,v=u.niceScaleExtent;n(133);var m=a.prototype;m.type="grid",m.axisPointerEnabled=!0,m.getRect=function(){return this._rect},m.update=function(t,e){function n(t){var e=i[t];for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(r&&("category"===r.type||!g(r)))return!0}return!1}var i=this._axesMap;this._updateScale(t,this.model),p(i.x,function(t){v(t.scale,t.model)}),p(i.y,function(t){v(t.scale,t.model)}),p(i.x,function(t){n("y")&&(t.onZero=!1)}),p(i.y,function(t){n("x")&&(t.onZero=!1)}),this.resize(this.model,e)},m.resize=function(t,e){function n(){p(a,function(t){var e=t.isHorizontal(),n=e?[0,i.width]:[0,i.height],r=t.inverse?1:0;t.setExtent(n[r],n[1-r]),o(t,e?i.x:i.y)})}var i=h.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=i;var a=this._axesList;n(),t.get("containLabel")&&(p(a,function(t){if(!t.model.get("axisLabel.inside")){var e=r(t);if(e){var n=t.isHorizontal()?"height":"width",a=t.model.get("axisLabel.margin");i[n]-=e[n]+a,"top"===t.position?i.y+=e.height+a:"left"===t.position&&(i.x+=e.width+a)}}}),n())},m.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)if(n.hasOwnProperty(i))return n[i];return n[e]}},m.getAxes=function(){return this._axesList.slice()},m.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}c.isObject(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},m.getCartesians=function(){return this._coordsList.slice()},m.convertToPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},m.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},m._findConvertTarget=function(t,e){var n,i,r=e.seriesModel,a=e.xAxisModel||r&&r.getReferringComponents("xAxis")[0],o=e.yAxisModel||r&&r.getReferringComponents("yAxis")[0],s=e.gridModel,l=this._coordsList;if(r)n=r.coordinateSystem,c.indexOf(l,n)<0&&(n=null);else if(a&&o)n=this.getCartesian(a.componentIndex,o.componentIndex);else if(a)i=this.getAxis("x",a.componentIndex);else if(o)i=this.getAxis("y",o.componentIndex);else if(s){var h=s.coordinateSystem;h===this&&(n=this._coordsList[0])}return{cartesian:n,axis:i}},m.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},m._initCartesian=function(t,e,n){function r(n){return function(r,l){if(i(r,t,e)){var h=r.get("position");"x"===n?"top"!==h&&"bottom"!==h&&(h="bottom",a[h]&&(h="top"===h?"bottom":"top")):"left"!==h&&"right"!==h&&(h="left",a[h]&&(h="left"===h?"right":"left")),a[h]=!0;var c=new d(n,u.createScaleByModel(r),[0,0],r.get("type"),h),f="category"===c.type;c.onBand=f&&r.get("boundaryGap"),c.inverse=r.get("inverse"),c.onZero=r.get("axisLine.onZero"),r.axis=c,c.model=r,c.grid=this,c.index=l,this._axesList.push(c),o[n][l]=c,s[n]++}}}var a={left:!1,right:!1,top:!1,bottom:!1},o={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",r("x"),this),e.eachComponent("yAxis",r("y"),this),s.x&&s.y?(this._axesMap=o,void p(o.x,function(e,n){p(o.y,function(i,r){var a="x"+n+"y"+r,o=new f(a);o.grid=this,o.model=t,this._coordsMap[a]=o,this._coordsList.push(o),o.addAxis(e),o.addAxis(i)},this)},this)):(this._axesMap={},void(this._axesList=[]))},m._updateScale=function(t,e){function n(t,e,n){p(n.coordDimToDataDim(e.dim),function(n){e.scale.unionExtentFromData(t,n)})}c.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(r){if(l(r)){var a=s(r,t),o=a[0],h=a[1];if(!i(o,e,t)||!i(h,e,t))return;var u=this.getCartesian(o.componentIndex,h.componentIndex),c=r.getData(),f=u.getAxis("x"),d=u.getAxis("y");"list"===c.type&&(n(c,f,r),n(c,d,r))}},this)},m.getTooltipAxes=function(t){var e=[],n=[];return p(this.getCartesians(),function(i){var r=null!=t&&"auto"!==t?i.getAxis(t):i.getBaseAxis(),a=i.getOtherAxis(r);c.indexOf(e,r)<0&&e.push(r),c.indexOf(n,a)<0&&n.push(a)}),{baseAxes:e,otherAxes:n}};var y=["xAxis","yAxis"];a.create=function(t,e){var n=[];return t.eachComponent("grid",function(i,r){var o=new a(i,t,e);o.name="grid_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)}),t.eachSeries(function(e){if(l(e)){var n=s(e,t),i=n[0],r=n[1],a=i.getCoordSysModel(),o=a.coordinateSystem;e.coordinateSystem=o.getCartesian(i.componentIndex,r.componentIndex)}}),n},a.dimensions=a.prototype.dimensions=f.prototype.dimensions,n(26).register("cartesian2d",a),t.exports=a},function(t,e,n){"use strict";function i(t){return t>s||t<-s}var r=n(19),a=n(5),o=r.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},h=l.prototype;h.transform=null,h.needLocalTransform=function(){return i(this.rotation)||i(this.position[0])||i(this.position[1])||i(this.scale[0]-1)||i(this.scale[1]-1)},h.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;return n||e?(i=i||r.create(),n?this.getLocalTransform(i):o(i),e&&(n?r.mul(i,t.transform,i):r.copy(i,t.transform)),this.transform=i,this.invTransform=this.invTransform||r.create(),void r.invert(this.invTransform,i)):void(i&&o(i))},h.getLocalTransform=function(t){return l.getLocalTransform(this,t)},h.setTransform=function(t){var e=this.transform,n=t.dpr||1;e?t.setTransform(n*e[0],n*e[1],n*e[2],n*e[3],n*e[4],n*e[5]):t.setTransform(n,0,0,n,0,0)},h.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var u=[];h.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(r.mul(u,t.invTransform,e),e=u);var n=e[0]*e[0]+e[1]*e[1],a=e[2]*e[2]+e[3]*e[3],o=this.position,s=this.scale;i(n-1)&&(n=Math.sqrt(n)),i(a-1)&&(a=Math.sqrt(a)),e[0]<0&&(n=-n),e[3]<0&&(a=-a),o[0]=e[4],o[1]=e[5],s[0]=n,s[1]=a,this.rotation=Math.atan2(-e[1]/a,e[0]/n)}},h.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),n=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(n=-n),[e,n]},h.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&a.applyTransform(n,n,i),n},h.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&a.applyTransform(n,n,i),n},l.getLocalTransform=function(t,e){e=e||[],o(e);var n=t.origin,i=t.scale||[1,1],a=t.rotation||0,s=t.position||[0,0];return n&&(e[4]-=n[0],e[5]-=n[1]),r.scale(e,e,i),a&&r.rotate(e,e,a),n&&(e[4]+=n[0],e[5]+=n[1]),e[4]+=s[0],e[5]+=s[1],e},t.exports=l},function(t,e,n){var i=n(94),r=n(1),a=n(13),o=n(12),s=["value","category","time","log"];t.exports=function(t,e,n,l){r.each(s,function(a){e.extend({type:t+"Axis."+a,mergeDefaultAndTheme:function(e,i){var s=this.layoutMode,l=s?o.getLayoutParams(e):{},h=i.getTheme();r.merge(e,h.get(a+"Axis")),r.merge(e,this.getDefaultOption()),e.type=n(t,e),s&&o.mergeLayoutParam(e,l,s)},defaultOption:r.mergeAll([{},i[a+"Axis"],l],!0)})}),a.registerSubTypeDefaulter(t+"Axis",r.curry(n,t))}},function(t,e,n){"use strict";function i(t,e){return e.type||(e.data?"category":"value")}var r=n(13),a=n(1),o=n(58),s=r.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});a.merge(s.prototype,n(42));var l={offset:0};o("x",s,i,l),o("y",s,i,l),t.exports=s},function(t,e){t.exports=function(t,e){e.eachSeriesByType(t,function(t){var e=t.getData(),n=t.coordinateSystem;if(n){var i=n.dimensions;1===i.length?e.each(i[0],function(t,i){e.setItemLayout(i,isNaN(t)?[NaN,NaN]:n.dataToPoint(t))}):2===i.length&&e.each(i,function(t,i,r){e.setItemLayout(r,isNaN(t)||isNaN(i)?[NaN,NaN]:n.dataToPoint([t,i]))},!0)}})}},function(t,e,n){var i=n(15),r=i.set,a=i.get;t.exports={clearColorPalette:function(){r(this,"colorIdx",0),r(this,"colorNameMap",{})},getColorFromPalette:function(t,e){e=e||this;var n=a(e,"colorIdx")||0,i=a(e,"colorNameMap")||r(e,"colorNameMap",{});if(i[t])return i[t];var o=this.get("color",!0)||[];if(o.length){var s=o[n];return t&&(i[t]=s),r(e,"colorIdx",(n+1)%o.length),s}}}},function(t,e){t.exports=function(t,e){var n=e.findComponents({mainType:"legend"});n&&n.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var i=e.getName(t),r=0;r<n.length;r++)if(!n[r].isSelected(i))return!1;return!0},this)},this)}},function(t,e,n){function i(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}var r=n(4),a=r.round,o={};o.intervalScaleNiceTicks=function(t,e){var n={},i=t[1]-t[0],s=n.interval=r.nice(i/e,!0),l=n.intervalPrecision=r.getPrecisionSafe(s)+2,h=n.niceTickExtent=[a(Math.ceil(t[0]/s)*s,l),a(Math.floor(t[1]/s)*s,l)];return o.fixExtent(h,t),n},o.fixExtent=function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),i(t,0,e),i(t,1,e),t[0]>t[1]&&(t[0]=t[1])},o.intervalScaleGetTicks=function(t,e,n,i){var r=[];if(!t)return r;var o=1e4;e[0]<n[0]&&r.push(e[0]);for(var s=n[0];s<=n[1]&&(r.push(s),s=a(s+t,i),s!==r[r.length-1]);)if(r.length>o)return[];return e[1]>(r.length?r[r.length-1]:n[1])&&r.push(e[1]),r},t.exports=o},function(t,e,n){var i=n(36),r=n(49),a=n(15),o=function(){this.group=new i,this.uid=r.getUID("viewComponent")};o.prototype={constructor:o,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){}};var s=o.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,n,i){},a.enableClassExtend(o),a.enableClassManagement(o,{registerWhenExtend:!0}),t.exports=o},function(t,e,n){"use strict";var i=n(70),r=n(23),a=n(57),o=n(178),s=n(1),l=function(t){a.call(this,t),r.call(this,t),o.call(this,t),this.id=t.id||i()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;n||(n=this.transform=[1,0,0,1,0,0]),n[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];n||(n=this[t]=[]),n[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},s.mixin(l,o),s.mixin(l,a),s.mixin(l,r),t.exports=l},function(t,e,n){function i(t,e){return t[e]}function r(t,e,n){t[e]=n}function a(t,e,n){return(e-t)*n+t}function o(t,e,n){return n>.5?e:t}function s(t,e,n,i,r){var o=t.length;if(1==r)for(var s=0;s<o;s++)i[s]=a(t[s],e[s],n);else for(var l=t[0].length,s=0;s<o;s++)for(var h=0;h<l;h++)i[s][h]=a(t[s][h],e[s][h],n)}function l(t,e,n){var i=t.length,r=e.length;if(i!==r){var a=i>r;if(a)t.length=r;else for(var o=i;o<r;o++)t.push(1===n?e[o]:x.call(e[o]))}for(var s=t[0]&&t[0].length,o=0;o<t.length;o++)if(1===n)isNaN(t[o])&&(t[o]=e[o]);else for(var l=0;l<s;l++)isNaN(t[o][l])&&(t[o][l]=e[o][l])}function h(t,e,n){if(t===e)return!0;var i=t.length;if(i!==e.length)return!1;if(1===n){for(var r=0;r<i;r++)if(t[r]!==e[r])return!1}else for(var a=t[0].length,r=0;r<i;r++)for(var o=0;o<a;o++)if(t[r][o]!==e[r][o])return!1;return!0}function u(t,e,n,i,r,a,o,s,l){var h=t.length;if(1==l)for(var u=0;u<h;u++)s[u]=c(t[u],e[u],n[u],i[u],r,a,o);else for(var f=t[0].length,u=0;u<h;u++)for(var d=0;d<f;d++)s[u][d]=c(t[u][d],e[u][d],n[u][d],i[u][d],r,a,o)}function c(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function f(t){if(y(t)){var e=t.length;if(y(t[0])){for(var n=[],i=0;i<e;i++)n.push(x.call(t[i]));return n}return x.call(t)}return t}function d(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t,e,n,i,r){var f=t._getter,p=t._setter,m="spline"===e,x=i.length;if(x){var _,b=i[0].value,w=y(b),M=!1,T=!1,S=w&&y(b[0])?2:1;i.sort(function(t,e){return t.time-e.time}),_=i[x-1].time;for(var A=[],C=[],I=i[0].value,P=!0,L=0;L<x;L++){A.push(i[L].time/_);var k=i[L].value;if(w&&h(k,I,S)||!w&&k===I||(P=!1),I=k,"string"==typeof k){var O=v.parse(k);O?(k=O,M=!0):T=!0}C.push(k)}if(!P){for(var D=C[x-1],L=0;L<x-1;L++)w?l(C[L],D,S):!isNaN(C[L])||isNaN(D)||T||M||(C[L]=D);w&&l(f(t._target,r),D,S);var E,z,N,R,B,F,G=0,V=0;if(M)var q=[0,0,0,0];var H=function(t,e){var n;if(e<0)n=0;else if(e<V){for(E=Math.min(G+1,x-1),n=E;n>=0&&!(A[n]<=e);n--);n=Math.min(n,x-2)}else{for(n=G;n<x&&!(A[n]>e);n++);n=Math.min(n-1,x-2)}G=n,V=e;var i=A[n+1]-A[n];if(0!==i)if(z=(e-A[n])/i,m)if(R=C[n],N=C[0===n?n:n-1],B=C[n>x-2?x-1:n+1],F=C[n>x-3?x-1:n+2],w)u(N,R,B,F,z,z*z,z*z*z,f(t,r),S);else{var l;if(M)l=u(N,R,B,F,z,z*z,z*z*z,q,1),l=d(q);else{if(T)return o(R,B,z);l=c(N,R,B,F,z,z*z,z*z*z)}p(t,r,l)}else if(w)s(C[n],C[n+1],z,f(t,r),S);else{var l;if(M)s(C[n],C[n+1],z,q,1),l=d(q);else{if(T)return o(C[n],C[n+1],z);l=a(C[n],C[n+1],z)}p(t,r,l)}},W=new g({target:t._target,life:_,loop:t._loop,delay:t._delay,onframe:H,ondestroy:n});return e&&"spline"!==e&&(W.easing=e),W}}}var g=n(157),v=n(22),m=n(1),y=m.isArrayLike,x=Array.prototype.slice,_=function(t,e,n,a){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||i,this._setter=a||r,
-this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var n=this._tracks;for(var i in e)if(e.hasOwnProperty(i)){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:f(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,n=0;n<e;n++)t[n].call(this)},start:function(t){var e,n=this,i=0,r=function(){i--,i||n._doneCallback()};for(var a in this._tracks)if(this._tracks.hasOwnProperty(a)){var o=p(this,t,r,this._tracks[a],a);o&&(this._clipList.push(o),i++,this.animation&&this.animation.addClip(o),e=o)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var i=0;i<n._onframeList.length;i++)n._onframeList[i](t,e)}}return i||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,n=this.animation,i=0;i<e.length;i++){var r=e[i];t&&r.onframe(this._target,1),n&&n.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}},t.exports=_},function(t,e){t.exports="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)}},function(t,e){var n=2*Math.PI;t.exports={normalizeRadian:function(t){return t%=n,t<0&&(t+=n),t}}},function(t,e){var n=function(){this.head=null,this.tail=null,this._len=0},i=n.prototype;i.insert=function(t){var e=new r(t);return this.insertEntry(e),e},i.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},i.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},i.len=function(){return this._len},i.clear=function(){this.head=this.tail=null,this._len=0};var r=function(t){this.value=t,this.next,this.prev},a=function(t){this._list=new n,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},o=a.prototype;o.put=function(t,e){var n=this._list,i=this._map,a=null;if(null==i[t]){var o=n.len(),s=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var l=n.head;n.remove(l),delete i[l.key],a=l.value,this._lastRemovedEntry=l}s?s.value=e:s=new r(e),s.key=t,n.insertEntry(s),i[t]=s}return a},o.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},o.clear=function(){this._list.clear(),this._map={}},t.exports=a},function(t,e){var n=2311;t.exports=function(){return n++}},function(t,e){var n=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};n.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")},t.exports=n},function(t,e){function n(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,a=null==e.y?0:e.y,o=null==e.y2?0:e.y2;e.global||(i=i*n.width+n.x,r=r*n.width+n.x,a=a*n.height+n.y,o=o*n.height+n.y);var s=t.createLinearGradient(i,a,r,o);return s}function i(t,e,n){var i=n.width,r=n.height,a=Math.min(i,r),o=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;e.global||(o=o*i+n.x,s=s*r+n.y,l*=a);var h=t.createRadialGradient(o,s,0,o,s,l);return h}var r=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],a=function(t){this.extendFrom(t)};a.prototype={constructor:a,fill:"#000000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,textFill:"#000",textStroke:null,textPosition:"inside",textOffset:null,textBaseline:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textTransform:!1,textRotation:0,blend:null,bind:function(t,e,n){for(var i=this,a=n&&n.style,o=!a,s=0;s<r.length;s++){var l=r[s],h=l[0];(o||i[h]!==a[h])&&(t[h]=i[h]||l[1])}if((o||i.fill!==a.fill)&&(t.fillStyle=i.fill),(o||i.stroke!==a.stroke)&&(t.strokeStyle=i.stroke),(o||i.opacity!==a.opacity)&&(t.globalAlpha=null==i.opacity?1:i.opacity),(o||i.blend!==a.blend)&&(t.globalCompositeOperation=i.blend||"source-over"),this.hasStroke()){var u=i.lineWidth;t.lineWidth=u/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t){var n=this;for(var i in t)!t.hasOwnProperty(i)||!e&&n.hasOwnProperty(i)||(n[i]=t[i])}},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,r){for(var a="radial"===e.type?i:n,o=a(t,e,r),s=e.colorStops,l=0;l<s.length;l++)o.addColorStop(s[l].offset,s[l].color);return o}};for(var o=a.prototype,s=0;s<r.length;s++){var l=r[s];l[0]in o||(o[l[0]]=l[1])}a.getGradient=o.getGradient,t.exports=a},function(t,e,n){var i=n(168),r=n(167);t.exports={buildPath:function(t,e,n){var a=e.points,o=e.smooth;if(a&&a.length>=2){if(o&&"spline"!==o){var s=r(a,o,n,e.smoothConstraint);t.moveTo(a[0][0],a[0][1]);for(var l=a.length,h=0;h<(n?l:l-1);h++){var u=s[2*h],c=s[2*h+1],f=a[(h+1)%l];t.bezierCurveTo(u[0],u[1],c[0],c[1],f[0],f[1])}}else{"spline"===o&&(a=i(a,n)),t.moveTo(a[0][0],a[0][1]);for(var h=1,d=a.length;h<d;h++)t.lineTo(a[h][0],a[h][1])}n&&t.closePath()}}}},function(t,e,n){var i=n(1),r={};r.layout=function(t,e,n){function r(t,e){var n=a.getAxis(t);return n.toGlobalCoord(n.dataToCoord(0))}n=n||{};var a=t.coordinateSystem,o=e.axis,s={},l=o.position,h=o.onZero?"onZero":l,u=o.dim,c=a.getRect(),f=[c.x,c.x+c.width,c.y,c.y+c.height],d=e.get("offset")||0,p={x:{top:f[2]-d,bottom:f[3]+d},y:{left:f[0]-d,right:f[1]+d}};p.x.onZero=Math.max(Math.min(r("y"),p.x.bottom),p.x.top),p.y.onZero=Math.max(Math.min(r("x"),p.y.right),p.y.left),s.position=["y"===u?p.y[h]:f[0],"x"===u?p.x[h]:f[3]],s.rotation=Math.PI/2*("x"===u?0:1);var g={top:-1,bottom:1,left:-1,right:1};s.labelDirection=s.tickDirection=s.nameDirection=g[l],s.labelOffset=o.onZero?p[u][l]-p[u].onZero:0,e.get("axisTick.inside")&&(s.tickDirection=-s.tickDirection),i.retrieve(n.labelInside,e.get("axisLabel.inside"))&&(s.labelDirection=-s.labelDirection);var v=e.get("axisLabel.rotate");return s.labelRotate="top"===h?-v:v,s.labelInterval=o.getLabelInterval(),s.z2=1,s},t.exports=r},,,function(t,e,n){var i=n(1);t.exports={updateSelectedMap:function(t){this._selectTargetMap=i.reduce(t||[],function(t,e){return t[e.name]=e,t},{})},select:function(t){var e=this._selectTargetMap,n=e[t],r=this.get("selectedMode");"single"===r&&i.each(e,function(t){t.selected=!1}),n&&(n.selected=!0)},unSelect:function(t){var e=this._selectTargetMap[t];e&&(e.selected=!1)},toggleSelected:function(t){var e=this._selectTargetMap[t];if(null!=e)return this[e.selected?"unSelect":"select"](t),e.selected},isSelected:function(t){var e=this._selectTargetMap[t];return e&&e.selected}}},,,,,,function(t,e){t.exports=function(t,e){var n={};e.eachRawSeriesByType(t,function(t){var i=t.getRawData(),r={};if(!e.isSeriesFiltered(t)){var a=t.getData();a.each(function(t){var e=a.getRawIndex(t);r[e]=t}),i.each(function(e){var o=r[e],s=null!=o&&a.getItemVisual(o,"color",!0);if(s)i.setItemVisual(e,"color",s);else{var l=i.getItemModel(e),h=l.get("itemStyle.normal.color")||t.getColorFromPalette(i.getName(e),n);i.setItemVisual(e,"color",h),null!=o&&a.setItemVisual(o,"color",h)}})}})}},function(t,e,n){var i=n(5),r=n(20),a={},o=Math.min,s=Math.max,l=Math.sin,h=Math.cos,u=i.create(),c=i.create(),f=i.create(),d=2*Math.PI;a.fromPoints=function(t,e,n){if(0!==t.length){var i,r=t[0],a=r[0],l=r[0],h=r[1],u=r[1];for(i=1;i<t.length;i++)r=t[i],a=o(a,r[0]),l=s(l,r[0]),h=o(h,r[1]),u=s(u,r[1]);e[0]=a,e[1]=h,n[0]=l,n[1]=u}},a.fromLine=function(t,e,n,i,r,a){r[0]=o(t,n),r[1]=o(e,i),a[0]=s(t,n),a[1]=s(e,i)};var p=[],g=[];a.fromCubic=function(t,e,n,i,a,l,h,u,c,f){var d,v=r.cubicExtrema,m=r.cubicAt,y=v(t,n,a,h,p);for(c[0]=1/0,c[1]=1/0,f[0]=-(1/0),f[1]=-(1/0),d=0;d<y;d++){var x=m(t,n,a,h,p[d]);c[0]=o(x,c[0]),f[0]=s(x,f[0])}for(y=v(e,i,l,u,g),d=0;d<y;d++){var _=m(e,i,l,u,g[d]);c[1]=o(_,c[1]),f[1]=s(_,f[1])}c[0]=o(t,c[0]),f[0]=s(t,f[0]),c[0]=o(h,c[0]),f[0]=s(h,f[0]),c[1]=o(e,c[1]),f[1]=s(e,f[1]),c[1]=o(u,c[1]),f[1]=s(u,f[1])},a.fromQuadratic=function(t,e,n,i,a,l,h,u){var c=r.quadraticExtremum,f=r.quadraticAt,d=s(o(c(t,n,a),1),0),p=s(o(c(e,i,l),1),0),g=f(t,n,a,d),v=f(e,i,l,p);h[0]=o(t,a,g),h[1]=o(e,l,v),u[0]=s(t,a,g),u[1]=s(e,l,v)},a.fromArc=function(t,e,n,r,a,o,s,p,g){var v=i.min,m=i.max,y=Math.abs(a-o);if(y%d<1e-4&&y>1e-4)return p[0]=t-n,p[1]=e-r,g[0]=t+n,void(g[1]=e+r);if(u[0]=h(a)*n+t,u[1]=l(a)*r+e,c[0]=h(o)*n+t,c[1]=l(o)*r+e,v(p,u,c),m(g,u,c),a%=d,a<0&&(a+=d),o%=d,o<0&&(o+=d),a>o&&!s?o+=d:a<o&&s&&(a+=d),s){var x=o;o=a,a=x}for(var _=0;_<o;_+=Math.PI/2)_>a&&(f[0]=h(_)*n+t,f[1]=l(_)*r+e,v(p,f,p),m(g,f,g))},t.exports=a},function(t,e,n){var i=n(38),r=n(1),a=n(16),o=function(t){i.call(this,t)};o.prototype={constructor:o,type:"text",brush:function(t,e){var n=this.style,i=n.x||0,r=n.y||0,o=n.text;if(null!=o&&(o+=""),n.bind(t,this,e),o){this.setTransform(t);var s,l=n.textAlign,h=n.textFont||n.font;if(n.textVerticalAlign){var u=a.getBoundingRect(o,h,n.textAlign,"top");switch(s="middle",n.textVerticalAlign){case"middle":r-=u.height/2-u.lineHeight/2;break;case"bottom":r-=u.height-u.lineHeight/2;break;default:r+=u.lineHeight/2}}else s=n.textBaseline;t.font=h||"12px sans-serif",t.textAlign=l||"left",t.textAlign!==l&&(t.textAlign="left"),t.textBaseline=s||"alphabetic",t.textBaseline!==s&&(t.textBaseline="alphabetic");for(var c=a.measureText("国",t.font).width,f=o.split("\n"),d=0;d<f.length;d++)n.hasStroke()&&t.strokeText(f[d],i,r),n.hasFill()&&t.fillText(f[d],i,r),r+=c;this.restoreTransform(t)}},getBoundingRect:function(){var t=this.style;if(!this._rect){var e=t.textVerticalAlign,n=a.getBoundingRect(t.text+"",t.textFont||t.font,t.textAlign,e?"top":t.textBaseline);switch(e){case"middle":n.y-=n.height/2;break;case"bottom":n.y-=n.height}if(n.x+=t.x||0,n.y+=t.y||0,t.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect}},r.inherits(o,i),t.exports=o},function(t,e,n){function i(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}var r=n(16),a=n(11),o=new a,s=function(){};s.prototype={constructor:s,drawRectText:function(t,e,n){var a=this.style,s=a.text;if(null!=s&&(s+=""),s){t.save();var l,h,u=a.textPosition,c=a.textOffset,f=a.textDistance,d=a.textAlign,p=a.textFont||a.font,g=a.textBaseline,v=a.textVerticalAlign;n=n||r.getBoundingRect(s,p,d,g);var m=this.transform;if(a.textTransform?this.setTransform(t):m&&(o.copy(e),o.applyTransform(m),e=o),u instanceof Array){if(l=e.x+i(u[0],e.width),h=e.y+i(u[1],e.height),d=d||"left",g=g||"top",v){switch(v){case"middle":h-=n.height/2-n.lineHeight/2;break;case"bottom":h-=n.height-n.lineHeight/2;break;default:h+=n.lineHeight/2}g="middle"}}else{var y=r.adjustTextPositionOnRect(u,e,n,f);l=y.x,h=y.y,d=d||y.textAlign,g=g||y.textBaseline}c&&(l+=c[0],h+=c[1]),t.textAlign=d||"left",t.textBaseline=g||"alphabetic";var x=a.textFill,_=a.textStroke;x&&(t.fillStyle=x),_&&(t.strokeStyle=_),t.font=p||"12px sans-serif",t.shadowBlur=a.textShadowBlur,t.shadowColor=a.textShadowColor||"transparent",t.shadowOffsetX=a.textShadowOffsetX,t.shadowOffsetY=a.textShadowOffsetY;var b=s.split("\n");a.textRotation&&(m&&t.translate(m[4],m[5]),t.rotate(a.textRotation),m&&t.translate(-m[4],-m[5]));for(var w=0;w<b.length;w++)_&&t.strokeText(b[w],l,h),x&&t.fillText(b[w],l,h),h+=n.lineHeight;t.restore()}}},t.exports=s},function(t,e,n){function i(t){delete d[t]}/*!
+var M=n(9),T=n(137),S=n(101),A=n(26),I=n(138),C=n(13),P=n(17),L=n(65),k=n(30),D=n(3),O=n(5),E=n(37),z=n(88),N=n(1),R=n(22),B=n(23),F=n(51),G=N.each,V=C.parseClassType,H=1e3,q=5e3,W=1e3,j=2e3,U=3e3,Z=4e3,X=5e3,Y="__flagInMainProcess",$="__hasGradientOrPatternBg",Q="__optionUpdated",K=/^[a-zA-Z0-9_]+$/;r.prototype.on=i("on"),r.prototype.off=i("off"),r.prototype.one=i("one"),N.mixin(r,B);var J=a.prototype;J._onframe=function(){if(this[Q]){var t=this[Q].silent;this[Y]=!0,tt.prepareAndUpdate.call(this),this[Y]=!1,this[Q]=!1,h.call(this,t),u.call(this,t)}},J.getDom=function(){return this._dom},J.getZr=function(){return this._zr},J.setOption=function(t,e,n){var i;if(N.isObject(e)&&(n=e.lazyUpdate,i=e.silent,e=e.notMerge),this[Y]=!0,!this._model||e){var r=new I(this._api),a=this._theme,o=this._model=new T(null,null,a,r);o.init(null,null,a,r)}this._model.setOption(t,at),n?(this[Q]={silent:i},this[Y]=!1):(tt.prepareAndUpdate.call(this),this._zr.flush(),this[Q]=!1,this[Y]=!1,h.call(this,i),u.call(this,i))},J.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},J.getModel=function(){return this._model},J.getOption=function(){return this._model&&this._model.getOption()},J.getWidth=function(){return this._zr.getWidth()},J.getHeight=function(){return this._zr.getHeight()},J.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},J.getRenderedCanvas=function(t){if(M.canvasSupported){t=t||{},t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr,n=e.storage.getDisplayList();return N.each(n,function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},J.getDataURL=function(t){t=t||{};var e=t.excludeComponents,n=this._model,i=[],r=this;G(e,function(t){n.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)})});var a=this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return G(i,function(t){t.group.ignore=!1}),a},J.getConnectedDataURL=function(t){if(M.canvasSupported){var e=this.group,n=Math.min,i=Math.max,r=1/0;if(ct[e]){var a=r,o=r,s=-r,l=-r,h=[],u=t&&t.pixelRatio||1;N.each(ut,function(r,u){if(r.group===e){var c=r.getRenderedCanvas(N.clone(t)),f=r.getDom().getBoundingClientRect();a=n(f.left,a),o=n(f.top,o),s=i(f.right,s),l=i(f.bottom,l),h.push({dom:c,left:f.left,top:f.top})}}),a*=u,o*=u,s*=u,l*=u;var c=s-a,f=l-o,d=N.createCanvas();d.width=c,d.height=f;var p=z.init(d);return G(h,function(t){var e=new D.Image({style:{x:t.left*u-a,y:t.top*u-o,image:t.dom}});p.add(e)}),p.refreshImmediately(),d.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},J.convertToPixel=N.curry(o,"convertToPixel"),J.convertFromPixel=N.curry(o,"convertFromPixel"),J.containPixel=function(t,e){var n,i=this._model;return t=O.parseFinder(i,t),N.each(t,function(t,i){i.indexOf("Models")>=0&&N.each(t,function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n|=!!r.containPoint(e);else if("seriesModels"===i){var a=this._chartsMap[t.__viewId];a&&a.containPoint&&(n|=a.containPoint(e,t))}},this)},this),!!n},J.getVisual=function(t,e){var n=this._model;t=O.parseFinder(n,t,{defaultMainType:"series"});var i=t.seriesModel,r=i.getData(),a=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?r.indexOfRawIndex(t.dataIndex):null;return null!=a?r.getItemVisual(a,e):r.getVisual(e)},J.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},J.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var tt={update:function(t){var e=this._model,n=this._api,i=this._coordSysMgr,r=this._zr;if(e){e.restoreData(),i.create(this._model,this._api),d.call(this,e,n),p.call(this,e),i.update(e,n),v.call(this,e,t),m.call(this,e,t);var a=e.get("backgroundColor")||"transparent",o=r.painter;if(o.isSingleCanvas&&o.isSingleCanvas())r.configLayer(0,{clearColor:a});else{if(!M.canvasSupported){var s=R.parse(a);a=R.stringify(s,"rgb"),0===s[3]&&(a="transparent")}a.colorStops||a.image?(r.configLayer(0,{clearColor:a}),this[$]=!0,this._dom.style.background="transparent"):(this[$]&&r.configLayer(0,{clearColor:null}),this[$]=!1,this._dom.style.background=a)}G(ot,function(t){t(e,n)})}},updateView:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),v.call(this,e,t),c.call(this,"updateView",e,t))},updateVisual:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),v.call(this,e,t,!0),c.call(this,"updateVisual",e,t))},updateLayout:function(t){var e=this._model;e&&(g.call(this,e,t),c.call(this,"updateLayout",e,t))},prepareAndUpdate:function(t){var e=this._model;f.call(this,"component",e),f.call(this,"chart",e),tt.update.call(this,t)}};J.resize=function(t){this[Y]=!0,this._zr.resize(t);var e=this._model&&this._model.resetOption("media"),n=e?"prepareAndUpdate":"update";tt[n].call(this),this._loadingFX&&this._loadingFX.resize(),this[Y]=!1;var i=t&&t.silent;h.call(this,i),u.call(this,i)},J.showLoading=function(t,e){if(N.isObject(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),ht[t]){var n=ht[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},J.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},J.makeActionFromEvent=function(t){var e=N.extend({},t);return e.type=it[t.type],e},J.dispatchAction=function(t,e){if(N.isObject(e)||(e={silent:!!e}),nt[t.type]){if(this[Y])return void this._pendingActions.push(t);l.call(this,t,e.silent),e.flush?this._zr.flush(!0):e.flush!==!1&&M.browser.weChat&&this._throttledZrFlush(),h.call(this,e.silent),u.call(this,e.silent)}},J.on=i("on"),J.off=i("off"),J.one=i("one");var et=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];J._initEvents=function(){G(et,function(t){this._zr.on(t,function(e){var n,i=this.getModel(),r=e.target;if("globalout"===t)n={};else if(r&&null!=r.dataIndex){var a=r.dataModel||i.getSeriesByIndex(r.seriesIndex);n=a&&a.getDataParams(r.dataIndex,r.dataType)||{}}else r&&r.eventData&&(n=N.extend({},r.eventData));n&&(n.event=e,n.type=t,this.trigger(t,n))},this)},this),G(it,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},J.isDisposed=function(){return this._disposed},J.clear=function(){this.setOption({series:[]},!0)},J.dispose=function(){if(!this._disposed){this._disposed=!0;var t=this._api,e=this._model;G(this._componentsViews,function(n){n.dispose(e,t)}),G(this._chartsViews,function(n){n.dispose(e,t)}),this._zr.dispose(),delete ut[this.id]}},N.mixin(a,B);var nt={},it={},rt=[],at=[],ot=[],st=[],lt={},ht={},ut={},ct={},ft=new Date-0,dt=new Date-0,pt="_echarts_instance_",gt={version:"3.6.0",dependencies:{zrender:"3.5.0"}};gt.init=function(t,e,n){var i=gt.getInstanceByDom(t);if(i)return i;var r=new a(t,e,n);return r.id="ec_"+ft++,ut[r.id]=r,t.setAttribute?t.setAttribute(pt,r.id):t[pt]=r.id,w(r),r},gt.connect=function(t){if(N.isArray(t)){var e=t;t=null,N.each(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+dt++,N.each(e,function(e){e.group=t})}return ct[t]=!0,t},gt.disConnect=function(t){ct[t]=!1},gt.disconnect=gt.disConnect,gt.dispose=function(t){"string"==typeof t?t=ut[t]:t instanceof a||(t=gt.getInstanceByDom(t)),t instanceof a&&!t.isDisposed()&&t.dispose()},gt.getInstanceByDom=function(t){var e;return e=t.getAttribute?t.getAttribute(pt):t[pt],ut[e]},gt.getInstanceById=function(t){return ut[t]},gt.registerTheme=function(t,e){lt[t]=e},gt.registerPreprocessor=function(t){at.push(t)},gt.registerProcessor=function(t,e){"function"==typeof t&&(e=t,t=H),rt.push({prio:t,func:e})},gt.registerPostUpdate=function(t){ot.push(t)},gt.registerAction=function(t,e,n){"function"==typeof e&&(n=e,e="");var i=N.isObject(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,N.assert(K.test(i)&&K.test(e)),nt[i]||(nt[i]={action:n,actionInfo:t}),it[e]=i},gt.registerCoordinateSystem=function(t,e){A.register(t,e)},gt.registerLayout=function(t,e){"function"==typeof t&&(e=t,t=W),st.push({prio:t,func:e,isLayout:!0})},gt.registerVisual=function(t,e){"function"==typeof t&&(e=t,t=U),st.push({prio:t,func:e})},gt.registerLoading=function(t,e){ht[t]=e},gt.extendComponentModel=function(t){return C.extend(t)},gt.extendComponentView=function(t){return L.extend(t)},gt.extendSeriesModel=function(t){return P.extend(t)},gt.extendChartView=function(t){return k.extend(t)},gt.setCanvasCreator=function(t){N.createCanvas=t},gt.registerVisual(j,n(151)),gt.registerPreprocessor(n(145)),gt.registerLoading("default",n(136)),gt.registerAction({type:"highlight",event:"highlight",update:"highlight"},N.noop),gt.registerAction({type:"downplay",event:"downplay",update:"downplay"},N.noop),gt.zrender=z,gt.List=n(14),gt.Model=n(10),gt.Axis=n(33),gt.graphic=n(3),gt.number=n(4),gt.format=n(7),gt.throttle=E.throttle,gt.matrix=n(19),gt.vector=n(6),gt.color=n(22),gt.util={},G(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){gt.util[t]=N[t]}),gt.helper=n(135),gt.PRIORITY={PROCESSOR:{FILTER:H,STATISTIC:q},VISUAL:{LAYOUT:W,GLOBAL:j,CHART:U,COMPONENT:Z,BRUSH:X}},t.exports=gt},function(t,e,n){"use strict";function i(t){return null!=t&&"none"!=t}function r(t){return"string"==typeof t?x.lift(t,-.1):t}function a(t){if(t.__hoverStlDirty){var e=t.style.stroke,n=t.style.fill,a=t.__hoverStl;a.fill=a.fill||(i(n)?r(n):null),a.stroke=a.stroke||(i(e)?r(e):null);var o={};for(var s in a)a.hasOwnProperty(s)&&(o[s]=t.style[s]);t.__normalStl=o,t.__hoverStlDirty=!1}}function o(t){t.__isHover||(a(t),t.useHoverLayer?t.__zr&&t.__zr.addHover(t,t.__hoverStl):(t.setStyle(t.__hoverStl),t.z2+=1),t.__isHover=!0)}function s(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function l(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&o(t)}):o(t)}function h(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&s(t)}):s(t)}function u(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&a(t)}function c(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&l(this)}function f(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&h(this)}function d(){this.__isEmphasis=!0,l(this)}function p(){this.__isEmphasis=!1,h(this)}function g(t,e,n,i,r,a){"function"==typeof r&&(a=r,r=null);var o=i&&i.isAnimationEnabled();if(o){var s=t?"Update":"",l=i.getShallow("animationDuration"+s),h=i.getShallow("animationEasing"+s),u=i.getShallow("animationDelay"+s);"function"==typeof u&&(u=u(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof l&&(l=l(r)),l>0?e.animateTo(n,l,u||0,h,a):(e.stopAnimation(),e.attr(n),a&&a())}else e.stopAnimation(),e.attr(n),a&&a()}var v=n(1),m=n(180),y=n(8),x=n(22),_=n(19),b=n(6),w=n(58),M=n(11),T=Math.round,S=Math.max,A=Math.min,I={};I.Group=n(36),I.Image=n(53),I.Text=n(86),I.Circle=n(171),I.Sector=n(177),I.Ring=n(176),I.Polygon=n(173),I.Polyline=n(174),I.Rect=n(175),I.Line=n(172),I.BezierCurve=n(170),I.Arc=n(169),I.CompoundPath=n(164),I.LinearGradient=n(100),I.RadialGradient=n(165),I.BoundingRect=M,I.extendShape=function(t){return y.extend(t)},I.extendPath=function(t,e){return m.extendFromString(t,e)},I.makePath=function(t,e,n,i){var r=m.createFromString(t,e),a=r.getBoundingRect();if(n){var o=a.width/a.height;if("center"===i){var s,l=n.height*o;l<=n.width?s=n.height:(l=n.width,s=l/o);var h=n.x+n.width/2,u=n.y+n.height/2;n.x=h-l/2,n.y=u-s/2,n.width=l,n.height=s}I.resizePath(r,n)}return r},I.mergePath=m.mergePath,I.resizePath=function(t,e){if(t.applyTransform){var n=t.getBoundingRect(),i=n.calculateTransform(e);t.applyTransform(i)}},I.subPixelOptimizeLine=function(t){var e=I.subPixelOptimize,n=t.shape,i=t.style.lineWidth;return T(2*n.x1)===T(2*n.x2)&&(n.x1=n.x2=e(n.x1,i,!0)),T(2*n.y1)===T(2*n.y2)&&(n.y1=n.y2=e(n.y1,i,!0)),t},I.subPixelOptimizeRect=function(t){var e=I.subPixelOptimize,n=t.shape,i=t.style.lineWidth,r=n.x,a=n.y,o=n.width,s=n.height;return n.x=e(n.x,i,!0),n.y=e(n.y,i,!0),n.width=Math.max(e(r+o,i,!1)-n.x,0===o?0:1),n.height=Math.max(e(a+s,i,!1)-n.y,0===s?0:1),t},I.subPixelOptimize=function(t,e,n){var i=T(2*t);return(i+T(e))%2===0?i/2:(i+(n?1:-1))/2},I.setHoverStyle=function(t,e,n){t.__hoverSilentOnTouch=n&&n.hoverSilentOnTouch,"group"===t.type?t.traverse(function(t){"group"!==t.type&&u(t,e)}):u(t,e),t.on("mouseover",c).on("mouseout",f),t.on("emphasis",d).on("normal",p)},I.setText=function(t,e,n){var i=e.getShallow("position")||"inside",r=e.getShallow("offset"),a=i.indexOf("inside")>=0?"white":n,o=e.getModel("textStyle");v.extend(t,{textDistance:e.getShallow("distance")||5,textFont:o.getFont(),textPosition:i,textOffset:r,textFill:o.getTextColor()||a})},I.getFont=function(t,e){var n=e&&e.getModel("textStyle");return[t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" ")},I.updateProps=function(t,e,n,i,r){g(!0,t,e,n,i,r)},I.initProps=function(t,e,n,i,r){g(!1,t,e,n,i,r)},I.getTransform=function(t,e){for(var n=_.identity([]);t&&t!==e;)_.mul(n,t.getLocalTransform(),n),t=t.parent;return n},I.applyTransform=function(t,e,n){return e&&!v.isArrayLike(e)&&(e=w.getLocalTransform(e)),n&&(e=_.invert([],e)),b.applyTransform([],t,e)},I.transformDirection=function(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return a=I.applyTransform(a,e,n),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?"bottom":"top"},I.groupTransition=function(t,e,n,i){function r(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}function a(t){var e={position:b.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=v.extend({},t.shape)),e}if(t&&e){var o=r(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=o[t.anid];if(e){var i=a(t);t.attr(a(e)),I.updateProps(t,i,n,t.dataIndex)}}})}},I.clipPointsByRect=function(t,e){return v.map(t,function(t){var n=t[0];n=S(n,e.x),n=A(n,e.x+e.width);var i=t[1];return i=S(i,e.y),i=A(i,e.y+e.height),[n,i]})},I.clipRectByRect=function(t,e){var n=S(t.x,e.x),i=A(t.x+t.width,e.x+e.width),r=S(t.y,e.y),a=A(t.y+t.height,e.y+e.height);if(i>=n&&a>=r)return{x:n,y:r,width:i-n,height:a-r}},t.exports=I},function(t,e){function n(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function i(t){return Math.floor(Math.log(t)/Math.LN10)}var r={},a=1e-4;r.linearMap=function(t,e,n,i){var r=e[1]-e[0],a=n[1]-n[0];if(0===r)return 0===a?n[0]:(n[0]+n[1])/2;if(i)if(r>0){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*a+n[0]},r.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?n(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},r.round=function(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t},r.asc=function(t){return t.sort(function(t,e){return t-e}),t},r.getPrecision=function(t){if(t=+t,isNaN(t))return 0;for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n},r.getPrecisionSafe=function(t){var e=t.toString(),n=e.indexOf("e");if(n>0){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r},r.getPixelPrecision=function(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),a=Math.round(n(Math.abs(e[1]-e[0]))/i),o=Math.min(Math.max(-r+a,0),20);return isFinite(o)?o:20},r.MAX_SAFE_INTEGER=9007199254740991,r.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},r.isRadianAroundZero=function(t){return t>-a&&t<a};var o=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;r.getTimezoneOffset=function(){return(new Date).getTimezoneOffset()},r.parseDate=function(t){if(t instanceof Date)return t;if("string"==typeof t){var e=o.exec(t);if(!e)return new Date(NaN);var n=r.getTimezoneOffset(),i=e[8]?"Z"===e[8].toUpperCase()?n:60*+e[8].slice(0,3)+n:0;return new Date((+e[1]),+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0)-i,+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))},r.quantity=function(t){return Math.pow(10,i(t))},r.nice=function(t,e){var n,r=i(t),a=Math.pow(10,r),o=t/a;return n=e?o<1.5?1:o<2.5?2:o<4?3:o<7?5:10:o<1?1:o<2?2:o<3?3:o<5?5:10,t=n*a,r>=-20?+t.toFixed(r<0?-r:0):t},r.reformIntervals=function(t){function e(t,n,i){return t.interval[i]<n.interval[i]||t.interval[i]===n.interval[i]&&(t.close[i]-n.close[i]===(i?-1:1)||!i&&e(t,n,1))}t.sort(function(t,n){return e(t,n,0)?-1:1});for(var n=-(1/0),i=1,r=0;r<t.length;){for(var a=t[r].interval,o=t[r].close,s=0;s<2;s++)a[s]<=n&&(a[s]=n,o[s]=s?1:1-i),n=a[s],i=o[s];a[0]===a[1]&&o[0]*o[1]!==1?t.splice(r,1):r++}return t},r.isNumeric=function(t){return t-parseFloat(t)>=0},t.exports=r},function(t,e,n){function i(t,e){return t&&t.hasOwnProperty(e)}var r=n(7),a=n(4),o=n(10),s=n(1),l=s.each,h=s.isObject,u={};u.normalizeToArray=function(t){return t instanceof Array?t:null==t?[]:[t]},u.defaultEmphasis=function(t,e){if(t){var n=t.emphasis=t.emphasis||{},i=t.normal=t.normal||{};l(e,function(t){var e=s.retrieve(n[t],i[t]);null!=e&&(n[t]=e)})}},u.LABEL_OPTIONS=["position","offset","show","textStyle","distance","formatter"],u.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},u.isDataItemOption=function(t){return h(t)&&!(t instanceof Array)},u.converDataValue=function(t,e){var n=e&&e.type;return"ordinal"===n?t:("time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+a.parseDate(t)),null==t||""===t?NaN:+t)},u.createDataFormatModel=function(t,e){var n=new o;return s.mixin(n,u.dataFormatMixin),n.seriesIndex=e.seriesIndex,n.name=e.name||"",n.mainType=e.mainType,n.subType=e.subType,n.getData=function(){return t},n},u.dataFormatMixin={getDataParams:function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),a=n.getRawIndex(t),o=n.getName(t,!0),s=n.getRawDataItem(t),l=n.getItemVisual(t,"color");return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:this.seriesIndex,seriesId:this.id,seriesName:this.name,name:o,dataIndex:a,data:s,dataType:e,value:i,color:l,marker:r.getTooltipMarker(l),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,n,i){e=e||"normal";var a=this.getData(n),o=a.getItemModel(t),s=this.getDataParams(t,n);null!=i&&s.value instanceof Array&&(s.value=s.value[i]);var l=o.get(["label",e,"formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?r.formatTpl(l,s):void 0},getRawValue:function(t,e){var n=this.getData(e),i=n.getRawDataItem(t);if(null!=i)return!h(i)||i instanceof Array?i:i.value},formatTooltip:s.noop},u.mappingToExists=function(t,e){e=(e||[]).slice();var n=s.map(t||[],function(t,e){return{exist:t}});return l(e,function(t,i){if(h(t)){for(var r=0;r<n.length;r++)if(!n[r].option&&null!=t.id&&n[r].exist.id===t.id+"")return n[r].option=t,void(e[i]=null);for(var r=0;r<n.length;r++){var a=n[r].exist;if(!(n[r].option||null!=a.id&&null!=t.id||null==t.name||u.isIdInner(t)||u.isIdInner(a)||a.name!==t.name+""))return n[r].option=t,void(e[i]=null)}}}),l(e,function(t,e){if(h(t)){for(var i=0;i<n.length;i++){var r=n[i].exist;if(!n[i].option&&!u.isIdInner(r)&&null==t.id){n[i].option=t;break}}i>=n.length&&n.push({option:t})}}),n},u.makeIdAndName=function(t){var e=s.createHashMap();l(t,function(t,n){var i=t.exist;i&&e.set(i.id,t)}),l(t,function(t,n){var i=t.option;s.assert(!i||null==i.id||!e.get(i.id)||e.get(i.id)===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&e.set(i.id,t),!t.keyInfo&&(t.keyInfo={})}),l(t,function(t,n){var i=t.exist,r=t.option,a=t.keyInfo;if(h(r)){if(a.name=null!=r.name?r.name+"":i?i.name:"\0-",i)a.id=i.id;else if(null!=r.id)a.id=r.id+"";else{var o=0;do a.id="\0"+a.name+"\0"+o++;while(e.get(a.id))}e.set(a.id,t)}})},u.isIdInner=function(t){return h(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")},u.compressBatches=function(t,e){function n(t,e,n){for(var i=0,r=t.length;i<r;i++)for(var a=t[i].seriesId,o=u.normalizeToArray(t[i].dataIndex),s=n&&n[a],l=0,h=o.length;l<h;l++){var c=o[l];s&&s[c]?s[c]=null:(e[a]||(e[a]={}))[c]=1}}function i(t,e){var n=[];for(var r in t)if(t.hasOwnProperty(r)&&null!=t[r])if(e)n.push(+r);else{var a=i(t[r],!0);a.length&&n.push({seriesId:r,dataIndex:a})}return n}var r={},a={};return n(t||[],r),n(e||[],a,r),[i(r),i(a)]},u.queryDataIndex=function(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?s.isArray(e.dataIndex)?s.map(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?s.isArray(e.name)?s.map(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0},u.makeGetter=function(){var t=0;return function(){var e="\0__ec_prop_getter_"+t++;return function(t){return t[e]||(t[e]={})}}}(),u.parseFinder=function(t,e,n){if(s.isString(e)){var r={};r[e+"Index"]=0,e=r}var a=n&&n.defaultMainType;!a||i(e,a+"Index")||i(e,a+"Id")||i(e,a+"Name")||(e[a+"Index"]=0);var o={};return l(e,function(i,r){var i=e[r];if("dataIndex"===r||"dataIndexInside"===r)return void(o[r]=i);var a=r.match(/^(\w+)(Index|Id|Name)$/)||[],l=a[1],h=(a[2]||"").toLowerCase();if(!(!l||!h||null==i||"index"===h&&"none"===i||n&&n.includeMainTypes&&s.indexOf(n.includeMainTypes,l)<0)){var u={mainType:l};"index"===h&&"all"===i||(u[h]=i);var c=t.queryComponents(u);o[l+"Models"]=c,o[l+"Model"]=c[0]}}),o},u.dataDimToCoordDim=function(t,e){var n=t.dimensions;e=t.getDimension(e);for(var i=0;i<n.length;i++){var r=t.getDimensionInfo(n[i]);if(r.name===e)return r.coordDim}},u.coordDimToDataDim=function(t,e){var n=[];return l(t.dimensions,function(i){var r=t.getDimensionInfo(i);r.coordDim===e&&(n[r.coordDimIndex]=r.name)}),n},u.otherDimToDataDim=function(t,e){var n=[];return l(t.dimensions,function(i){var r=t.getDimensionInfo(i),a=r.otherDims,o=a[e];null!=o&&o!==!1&&(n[o]=r.name)}),n},t.exports=u},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(t,e){var i=new n(2);return null==t&&(t=0),null==e&&(e=0),i[0]=t,i[1]=e,i},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new n(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,n){return t[0]=e,t[1]=n,t},add:function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t},scaleAndAdd:function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},sub:function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t},normalize:function(t,e){var n=i.len(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t},applyTransform:function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t},min:function(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t},max:function(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}};i.length=i.len,i.lengthSquare=i.lenSquare,i.dist=i.distance,i.distSquare=i.distanceSquare,t.exports=i},function(t,e,n){var i=n(1),r=n(4),a=n(16),o={};o.addCommas=function(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))},o.toCamelCase=function(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t},o.normalizeCssArray=function(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t};var s=o.encodeHTML=function(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")},l=["a","b","c","d","e","f","g"],h=function(t,e){return"{"+t+(null==e?"":e)+"}"};o.formatTpl=function(t,e,n){i.isArray(e)||(e=[e]);var r=e.length;if(!r)return"";for(var a=e[0].$vars||[],o=0;o<a.length;o++){var u=l[o],c=h(u,0);t=t.replace(h(u),n?s(c):c)}for(var f=0;f<r;f++)for(var d=0;d<a.length;d++){var c=e[f][a[d]];t=t.replace(h(l[d],f),n?s(c):c)}return t},o.formatTplSimple=function(t,e,n){return i.each(e,function(e,i){t=t.replace("{"+i+"}",n?s(e):e)}),t},o.getTooltipMarker=function(t,e){return t?'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+o.encodeHTML(t)+";"+(e||"")+'"></span>':""};var u=function(t){return t<10?"0"+t:t};o.formatTime=function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=r.parseDate(e),a=n?"UTC":"",o=i["get"+a+"FullYear"](),s=i["get"+a+"Month"]()+1,l=i["get"+a+"Date"](),h=i["get"+a+"Hours"](),c=i["get"+a+"Minutes"](),f=i["get"+a+"Seconds"]();return t=t.replace("MM",u(s)).toLowerCase().replace("yyyy",o).replace("yy",o%100).replace("dd",u(l)).replace("d",l).replace("hh",u(h)).replace("h",h).replace("mm",u(c)).replace("m",c).replace("ss",u(f)).replace("s",f)},o.capitalFirst=function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},o.truncateText=a.truncateText,t.exports=o},function(t,e,n){function i(t){r.call(this,t),this.path=null}var r=n(38),a=n(1),o=n(27),s=n(161),l=n(72),h=l.prototype.getCanvasPattern,u=Math.abs,c=new o((!0));i.prototype={constructor:i,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var n=this.style,i=this.path||c,r=n.hasStroke(),a=n.hasFill(),o=n.fill,s=n.stroke,l=a&&!!o.colorStops,u=r&&!!s.colorStops,f=a&&!!o.image,d=r&&!!s.image;if(n.bind(t,this,e),this.setTransform(t),this.__dirty){var p;l&&(p=p||this.getBoundingRect(),this._fillGradient=n.getGradient(t,o,p)),u&&(p=p||this.getBoundingRect(),this._strokeGradient=n.getGradient(t,s,p))}l?t.fillStyle=this._fillGradient:f&&(t.fillStyle=h.call(o,t)),u?t.strokeStyle=this._strokeGradient:d&&(t.strokeStyle=h.call(s,t));var g=n.lineDash,v=n.lineDashOffset,m=!!t.setLineDash,y=this.getGlobalScale();i.setScale(y[0],y[1]),this.__dirtyPath||g&&!m&&r?(i.beginPath(t),g&&!m&&(i.setLineDash(g),i.setLineDashOffset(v)),this.buildPath(i,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),a&&i.fill(t),g&&m&&(t.setLineDash(g),t.lineDashOffset=v),r&&i.stroke(t),g&&m&&t.setLineDash([]),this.restoreTransform(t),null!=n.text&&this.drawRectText(t,this.getBoundingRect())},buildPath:function(t,e,n){},createPathProxy:function(){this.path=new o},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var i=this.path;i||(i=this.path=new o),this.__dirtyPath&&(i.beginPath(),this.buildPath(i,this.shape,!1)),t=i.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){r.copy(t);var a=e.lineWidth,s=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(a=Math.max(a,this.strokeContainThreshold||4)),s>1e-10&&(r.width+=a/s,r.height+=a/s,r.x-=a/s/2,r.y-=a/s/2)}return r}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var a=this.path.data;if(r.hasStroke()){var o=r.lineWidth,l=r.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(r.hasFill()||(o=Math.max(o,this.strokeContainThreshold)),s.containStroke(a,o/l,t,e)))return!0}if(r.hasFill())return s.contain(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):r.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(a.isObject(t))for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&u(t[0]-1)>1e-10&&u(t[3]-1)>1e-10?Math.sqrt(u(t[0]*t[3]-t[2]*t[1])):1}},i.extend=function(t){var e=function(e){i.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var n=t.shape;if(n){this.shape=this.shape||{};var r=this.shape;for(var a in n)!r.hasOwnProperty(a)&&n.hasOwnProperty(a)&&(r[a]=n[a])}t.init&&t.init.call(this,e)};a.inherits(e,i);for(var n in t)"style"!==n&&"shape"!==n&&(e.prototype[n]=t[n]);return e},a.inherits(i,r),t.exports=i},function(t,e){function n(t){var e={},n={},i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),a=t.match(/Edge\/([\d.]+)/),o=/micromessenger/i.test(t);return i&&(n.firefox=!0,n.version=i[1]),r&&(n.ie=!0,n.version=r[1]),a&&(n.edge=!0,n.version=a[1]),o&&(n.weChat=!0),{browser:n,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!n.ie&&!n.edge,pointerEventsSupported:"onpointerdown"in window&&(n.edge||n.ie&&n.version>=11)}}var i={};i="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:n(navigator.userAgent),t.exports=i},function(t,e,n){function i(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}function r(t,e,n){for(var i=0;i<e.length&&(!e[i]||(t=t&&"object"==typeof t?t[e[i]]:null,null!=t));i++);return null==t&&n&&(t=n.get(e)),t}function a(t,e){var n=s.get(t,"getParent");return n?n.call(t,e):t.parentModel}var o=n(1),s=n(15),l=n(9);i.prototype={constructor:i,init:null,mergeOption:function(t){o.merge(this.option,t,!0)},get:function(t,e){return null==t?this.option:r(this.option,this.parsePath(t),!e&&a(this,t))},getShallow:function(t,e){var n=this.option,i=null==n?n:n[t],r=!e&&a(this,t);return null==i&&r&&(i=r.getShallow(t)),i},getModel:function(t,e){var n,o=null==t?this.option:r(this.option,t=this.parsePath(t));return e=e||(n=a(this,t))&&n.getModel(t),new i(o,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){var t=this.constructor;return new t(o.clone(this.option))},setReadOnly:function(t){s.setReadOnly(this,t)},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){s.set(this,"getParent",t)},isAnimationEnabled:function(){if(!l.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},s.enableClassExtend(i);var h=o.mixin;h(i,n(143)),h(i,n(140)),h(i,n(144)),h(i,n(142)),t.exports=i},function(t,e,n){"use strict";function i(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}var r=n(6),a=n(19),o=r.applyTransform,s=Math.min,l=Math.max;i.prototype={constructor:i,union:function(t){var e=s(t.x,this.x),n=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-n,this.x=e,this.y=n},applyTransform:function(){var t=[],e=[],n=[],i=[];return function(r){if(r){t[0]=n[0]=this.x,t[1]=i[1]=this.y,e[0]=i[0]=this.x+this.width,e[1]=n[1]=this.y+this.height,o(t,t,r),o(e,e,r),o(n,n,r),o(i,i,r),this.x=s(t[0],e[0],n[0],i[0]),this.y=s(t[1],e[1],n[1],i[1]);var a=l(t[0],e[0],n[0],i[0]),h=l(t[1],e[1],n[1],i[1]);this.width=a-this.x,this.height=h-this.y}}}(),calculateTransform:function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=a.create();return a.translate(r,r,[-e.x,-e.y]),a.scale(r,r,[n,i]),a.translate(r,r,[t.x,t.y]),
+r},intersect:function(t){if(!t)return!1;t instanceof i||(t=i.create(t));var e=this,n=e.x,r=e.x+e.width,a=e.y,o=e.y+e.height,s=t.x,l=t.x+t.width,h=t.y,u=t.y+t.height;return!(r<s||l<n||o<h||u<a)},contain:function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new i(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},i.create=function(t){return new i(t.x,t.y,t.width,t.height)},t.exports=i},function(t,e,n){"use strict";function i(t,e,n,i,r){var a=0,o=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,h){var u,c,f=l.position,d=l.getBoundingRect(),p=e.childAt(h+1),g=p&&p.getBoundingRect();if("horizontal"===t){var v=d.width+(g?-g.x+d.x:0);u=a+v,u>i||l.newline?(a=0,u=v,o+=s+n,s=d.height):s=Math.max(s,d.height)}else{var m=d.height+(g?-g.y+d.y:0);c=o+m,c>r||l.newline?(a+=s+n,o=0,c=m,s=d.width):s=Math.max(s,d.width)}l.newline||(f[0]=a,f[1]=o,"horizontal"===t?a=u+n:o=c+n)})}var r=n(1),a=n(11),o=n(4),s=n(7),l=o.parsePercent,h=r.each,u={},c=u.LOCATION_PARAMS=["left","right","top","bottom","width","height"],f=u.HV_NAMES=[["width","left","right"],["height","top","bottom"]];u.box=i,u.vbox=r.curry(i,"vertical"),u.hbox=r.curry(i,"horizontal"),u.getAvailableSize=function(t,e,n){var i=e.width,r=e.height,a=l(t.x,i),o=l(t.y,r),h=l(t.x2,i),u=l(t.y2,r);return(isNaN(a)||isNaN(parseFloat(t.x)))&&(a=0),(isNaN(h)||isNaN(parseFloat(t.x2)))&&(h=i),(isNaN(o)||isNaN(parseFloat(t.y)))&&(o=0),(isNaN(u)||isNaN(parseFloat(t.y2)))&&(u=r),n=s.normalizeCssArray(n||0),{width:Math.max(h-a-n[1]-n[3],0),height:Math.max(u-o-n[0]-n[2],0)}},u.getLayoutRect=function(t,e,n){n=s.normalizeCssArray(n||0);var i=e.width,r=e.height,o=l(t.left,i),h=l(t.top,r),u=l(t.right,i),c=l(t.bottom,r),f=l(t.width,i),d=l(t.height,r),p=n[2]+n[0],g=n[1]+n[3],v=t.aspect;switch(isNaN(f)&&(f=i-u-g-o),isNaN(d)&&(d=r-c-p-h),isNaN(f)&&isNaN(d)&&(v>i/r?f=.8*i:d=.8*r),null!=v&&(isNaN(f)&&(f=v*d),isNaN(d)&&(d=f/v)),isNaN(o)&&(o=i-u-f-g),isNaN(h)&&(h=r-c-d-p),t.left||t.right){case"center":o=i/2-f/2-n[3];break;case"right":o=i-f-g}switch(t.top||t.bottom){case"middle":case"center":h=r/2-d/2-n[0];break;case"bottom":h=r-d-p}o=o||0,h=h||0,isNaN(f)&&(f=i-o-(u||0)),isNaN(d)&&(d=r-h-(c||0));var m=new a(o+n[3],h+n[0],f,d);return m.margin=n,m},u.positionElement=function(t,e,n,i,o){var s=!o||!o.hv||o.hv[0],l=!o||!o.hv||o.hv[1],h=o&&o.boundingMode||"all";if(s||l){var c;if("raw"===h)c="group"===t.type?new a(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(c=t.getBoundingRect(),t.needLocalTransform()){var f=t.getLocalTransform();c=c.clone(),c.applyTransform(f)}e=u.getLayoutRect(r.defaults({width:c.width,height:c.height},e),n,i);var d=t.position,p=s?e.x-c.x:0,g=l?e.y-c.y:0;t.attr("position","raw"===h?[p,g]:[d[0]+p,d[1]+g])}},u.sizeCalculable=function(t,e){return null!=t[f[e][0]]||null!=t[f[e][1]]&&null!=t[f[e][2]]},u.mergeLayoutParam=function(t,e,n){function i(n,i){var r={},s=0,u={},c=0,f=2;if(h(n,function(e){u[e]=t[e]}),h(n,function(t){a(e,t)&&(r[t]=u[t]=e[t]),o(r,t)&&s++,o(u,t)&&c++}),l[i])return o(e,n[1])?u[n[2]]=null:o(e,n[2])&&(u[n[1]]=null),u;if(c!==f&&s){if(s>=f)return r;for(var d=0;d<n.length;d++){var p=n[d];if(!a(r,p)&&a(t,p)){r[p]=t[p];break}}return r}return u}function a(t,e){return t.hasOwnProperty(e)}function o(t,e){return null!=t[e]&&"auto"!==t[e]}function s(t,e,n){h(t,function(t){e[t]=n[t]})}!r.isObject(n)&&(n={});var l=n.ignoreSize;!r.isArray(l)&&(l=[l,l]);var u=i(f[0],0),c=i(f[1],1);s(f[0],t,u),s(f[1],t,c)},u.getLayoutParams=function(t){return u.copyLayoutParams({},t)},u.copyLayoutParams=function(t,e){return e&&t&&h(c,function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t},t.exports=u},function(t,e,n){function i(t){var e=[];return a.each(u.getClassesByMainType(t),function(t){o.apply(e,t.prototype.dependencies||[])}),a.map(e,function(t){return l.parseClassType(t).main})}var r=n(10),a=n(1),o=Array.prototype.push,s=n(49),l=n(15),h=n(12),u=r.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,n,i){r.call(this,t,e,n,i),this.uid=s.getUID("componentModel")},init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?h.getLayoutParams(t):{},r=e.getTheme();a.merge(t,r.get(this.mainType)),a.merge(t,this.getDefaultOption()),n&&h.mergeLayoutParam(t,i,n)},mergeOption:function(t,e){a.merge(this.option,t,!0);var n=this.layoutMode;n&&h.mergeLayoutParam(this.option,t,n)},optionUpdated:function(t,e){},getDefaultOption:function(){if(!l.hasOwn(this,"__defaultOption")){for(var t=[],e=this.constructor;e;){var n=e.prototype.defaultOption;n&&t.push(n),e=e.superClass}for(var i={},r=t.length-1;r>=0;r--)i=a.merge(i,t[r],!0);l.set(this,"__defaultOption",i)}return l.get(this,"__defaultOption")},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});l.enableClassManagement(u,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(u),s.enableTopologicalTravel(u,i),a.mixin(u,n(141)),t.exports=u},function(t,e,n){(function(e){function i(t,e){p.each(m.concat(e.__wrappedMethods||[]),function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t.__wrappedMethods=e.__wrappedMethods}function r(t){this._array=t||[]}function a(t){return p.isArray(t)||(t=[t]),t}function o(t,e){var n=t.dimensions,r=new y(p.map(n,t.getDimensionInfo,t),t.hostModel);i(r,t);for(var a=r._storage={},o=t._storage,s=0;s<n.length;s++){var l=n[s],h=o[l];p.indexOf(e,l)>=0?a[l]=new h.constructor(o[l].length):a[l]=o[l]}return r}var s="undefined",l="undefined"==typeof window?e:window,h=typeof l.Float64Array===s?Array:l.Float64Array,u=typeof l.Int32Array===s?Array:l.Int32Array,c={"float":h,"int":u,ordinal:Array,number:Array,time:Array},f=n(10),d=n(48),p=n(1),g=n(5),v=p.isObject,m=["stackedOn","hasItemOption","_nameList","_idList","_rawData"];r.prototype.pure=!1,r.prototype.count=function(){return this._array.length},r.prototype.getItem=function(t){return this._array[t]};var y=function(t,e){t=t||["x","y"];for(var n={},i=[],r=0;r<t.length;r++){var a,o={};"string"==typeof t[r]?(a=t[r],o={name:a,coordDim:a,coordDimIndex:0,stackable:!1,type:"number"}):(o=t[r],a=o.name,o.type=o.type||"number",o.coordDim||(o.coordDim=a,o.coordDimIndex=0)),o.otherDims=o.otherDims||{},i.push(a),n[a]=o}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this.dataType,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData,this._extent},x=y.prototype;x.type="list",x.hasItemOption=!0,x.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},x.getDimensionInfo=function(t){return p.clone(this._dimensionInfos[this.getDimension(t)])},x.initData=function(t,e,n){t=t||[];var i=p.isArray(t);i&&(t=new r(t)),this._rawData=t;var a,o=this._storage={},s=this.indices=[],l=this.dimensions,h=this._dimensionInfos,u=t.count(),f=[],d={};e=e||[];for(var v=0;v<l.length;v++){var m=h[l[v]];0===m.otherDims.itemName&&(a=v);var y=c[m.type];o[l[v]]=new y(u)}var x=this;n||(x.hasItemOption=!1),n=n||function(t,e,n,i){var r=g.getDataItemValue(t);return g.isDataItemOption(t)&&(x.hasItemOption=!0),g.converDataValue(r instanceof Array?r[i]:r,h[e])};for(var v=0;v<u;v++){for(var _=t.getItem(v),b=0;b<l.length;b++){var w=l[b],M=o[w];M[v]=n(_,w,v,b)}s.push(v)}for(var v=0;v<u;v++){var _=t.getItem(v);!e[v]&&_&&(null!=_.name?e[v]=_.name:null!=a&&(e[v]=o[l[a]][v]));var T=e[v]||"",S=_&&_.id;!S&&T&&(d[T]=d[T]||0,S=T,d[T]>0&&(S+="__ec__"+d[T]),d[T]++),S&&(f[v]=S)}this._nameList=e,this._idList=f},x.count=function(){return this.indices.length},x.get=function(t,e,n){var i=this._storage,r=this.indices[e];if(null==r||!i[t])return NaN;var a=i[t][r];if(n){var o=this._dimensionInfos[t];if(o&&o.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(a>=0&&l>0||a<=0&&l<0)&&(a+=l),s=s.stackedOn}}return a},x.getValues=function(t,e,n){var i=[];p.isArray(t)||(n=e,e=t,t=this.dimensions);for(var r=0,a=t.length;r<a;r++)i.push(this.get(t[r],e,n));return i},x.hasValue=function(t){for(var e=this.dimensions,n=this._dimensionInfos,i=0,r=e.length;i<r;i++)if("ordinal"!==n[e[i]].type&&isNaN(this.get(e[i],t)))return!1;return!0},x.getDataExtent=function(t,e,n){t=this.getDimension(t);var i=this._storage[t],r=this.getDimensionInfo(t);e=r&&r.stackable&&e;var a,o=(this._extent||(this._extent={}))[t+!!e];if(o)return o;if(i){for(var s=1/0,l=-(1/0),h=0,u=this.count();h<u;h++)a=this.get(t,h,e),n&&!n(a,t,h)||(a<s&&(s=a),a>l&&(l=a));return this._extent[t+!!e]=[s,l]}return[1/0,-(1/0)]},x.getSum=function(t,e){var n=this._storage[t],i=0;if(n)for(var r=0,a=this.count();r<a;r++){var o=this.get(t,r,e);isNaN(o)||(i+=o)}return i},x.indexOf=function(t,e){var n=this._storage,i=n[t],r=this.indices;if(i)for(var a=0,o=r.length;a<o;a++){var s=r[a];if(i[s]===e)return a}return-1},x.indexOfName=function(t){for(var e=this.indices,n=this._nameList,i=0,r=e.length;i<r;i++){var a=e[i];if(n[a]===t)return i}return-1},x.indexOfRawIndex=function(t){var e=this.indices,n=e[t];if(null!=n&&n===t)return t;for(var i=0,r=e.length-1;i<=r;){var a=(i+r)/2|0;if(e[a]<t)i=a+1;else{if(!(e[a]>t))return a;r=a-1}}return-1},x.indicesOfNearest=function(t,e,n,i){var r=this._storage,a=r[t],o=[];if(!a)return o;null==i&&(i=1/0);for(var s=Number.MAX_VALUE,l=-1,h=0,u=this.count();h<u;h++){var c=e-this.get(t,h,n),f=Math.abs(c);c<=i&&f<=s&&((f<s||c>=0&&l<0)&&(s=f,l=c,o.length=0),o.push(h))}return o},x.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},x.getRawDataItem=function(t){return this._rawData.getItem(this.getRawIndex(t))},x.getName=function(t){return this._nameList[this.indices[t]]||""},x.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},x.each=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]),t=p.map(a(t),this.getDimension,this);var r=[],o=t.length,s=this.indices;i=i||this;for(var l=0;l<s.length;l++)switch(o){case 0:e.call(i,l);break;case 1:e.call(i,this.get(t[0],l,n),l);break;case 2:e.call(i,this.get(t[0],l,n),this.get(t[1],l,n),l);break;default:for(var h=0;h<o;h++)r[h]=this.get(t[h],l,n);r[h]=l,e.apply(i,r)}},x.filterSelf=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]),t=p.map(a(t),this.getDimension,this);var r=[],o=[],s=t.length,l=this.indices;i=i||this;for(var h=0;h<l.length;h++){var u;if(s)if(1===s)u=e.call(i,this.get(t[0],h,n),h);else{for(var c=0;c<s;c++)o[c]=this.get(t[c],h,n);o[c]=h,u=e.apply(i,o)}else u=e.call(i,h);u&&r.push(l[h])}return this.indices=r,this._extent={},this},x.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n,i),r},x.map=function(t,e,n,i){t=p.map(a(t),this.getDimension,this);var r=o(this,t),s=r.indices=this.indices,l=r._storage,h=[];return this.each(t,function(){var n=arguments[arguments.length-1],i=e&&e.apply(this,arguments);if(null!=i){"number"==typeof i&&(h[0]=i,i=h);for(var r=0;r<i.length;r++){var a=t[r],o=l[a],u=s[n];o&&(o[u]=i[r])}}},n,i),r},x.downSample=function(t,e,n,i){for(var r=o(this,[t]),a=this._storage,s=r._storage,l=this.indices,h=r.indices=[],u=[],c=[],f=Math.floor(1/e),d=s[t],p=this.count(),g=0;g<a[t].length;g++)s[t][g]=a[t][g];for(var g=0;g<p;g+=f){f>p-g&&(f=p-g,u.length=f);for(var v=0;v<f;v++){var m=l[g+v];u[v]=d[m],c[v]=m}var y=n(u),m=c[i(u,y)||0];d[m]=y,h.push(m)}return r},x.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new f(this._rawData.getItem(t),e,e&&e.ecModel)},x.diff=function(t){var e,n=this._idList,i=t&&t._idList,r="e\0\0";return new d(t?t.indices:[],this.indices,function(t){return null!=(e=i[t])?e:r+t},function(t){return null!=(e=n[t])?e:r+t})},x.getVisual=function(t){var e=this._visual;return e&&e[t]},x.setVisual=function(t,e){if(v(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},x.setLayout=function(t,e){if(v(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},x.getLayout=function(t){return this._layout[t]},x.getItemLayout=function(t){return this._itemLayouts[t]},x.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?p.extend(this._itemLayouts[t]||{},e):e},x.clearItemLayouts=function(){this._itemLayouts.length=0},x.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},x.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};if(this._itemVisuals[t]=i,v(e))for(var r in e)e.hasOwnProperty(r)&&(i[r]=e[r]);else i[e]=n},x.clearAllVisual=function(){this._visual={},this._itemVisuals=[]};var _=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};x.setItemGraphicEl=function(t,e){var n=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(_,e)),this._graphicEls[t]=e},x.getItemGraphicEl=function(t){return this._graphicEls[t]},x.eachItemGraphicEl=function(t,e){p.each(this._graphicEls,function(n,i){n&&t&&t.call(e,n,i)})},x.cloneShallow=function(){var t=p.map(this.dimensions,this.getDimensionInfo,this),e=new y(t,this.hostModel);return e._storage=this._storage,i(e,this),e.indices=this.indices.slice(),this._extent&&(e._extent=p.extend({},this._extent)),e},x.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(p.slice(arguments)))})},x.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],x.CHANGABLE_METHODS=["filterSelf"],t.exports=y}).call(e,function(){return this}())},function(t,e,n){function i(t){o.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function r(t,e){var n=o.slice(arguments,2);return this.superClass.prototype[e].apply(t,n)}function a(t,e,n){return this.superClass.prototype[e].apply(t,n)}var o=n(1),s={},l=".",h="___EC__COMPONENT__CONTAINER___",u="\0ec_\0";s.set=function(t,e,n){return t[u+e]=n},s.get=function(t,e){return t[u+e]},s.hasOwn=function(t,e){return t.hasOwnProperty(u+e)};var c=s.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(l),e.main=t[0]||"",e.sub=t[1]||""),e};s.enableClassExtend=function(t,e){t.$constructor=t,t.extend=function(t){var e=this,n=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return o.extend(n.prototype,t),n.extend=this.extend,n.superCall=r,n.superApply=a,o.inherits(n,this),n.superClass=e,n}},s.enableClassManagement=function(t,e){function n(t){var e=r[t.main];return e&&e[h]||(e=r[t.main]={},e[h]=!0),e}e=e||{};var r={};if(t.registerClass=function(t,e){if(e)if(i(e),e=c(e),e.sub){if(e.sub!==h){var a=n(e);a[e.sub]=t}}else r[e.main]=t;return t},t.getClass=function(t,e,n){var i=r[t];if(i&&i[h]&&(i=e?i[e]:null),n&&!i)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return i},t.getClassesByMainType=function(t){t=c(t);var e=[],n=r[t.main];return n&&n[h]?o.each(n,function(t,n){n!==h&&e.push(t)}):e.push(n),e},t.hasClass=function(t){return t=c(t),!!r[t.main]},t.getAllClassMainTypes=function(){var t=[];return o.each(r,function(e,n){t.push(n)}),t},t.hasSubTypes=function(t){t=c(t);var e=r[t.main];return e&&e[h]},t.parseClassType=c,e.registerWhenExtend){var a=t.extend;a&&(t.extend=function(e){var n=a.call(this,e);return t.registerClass(n,e.type)})}return t},s.setReadOnly=function(t,e){},t.exports=s},function(t,e,n){function i(t,e){var n=t+":"+e;if(l[n])return l[n];for(var i=(t+"").split("\n"),r=0,a=0,o=i.length;a<o;a++)r=Math.max(p.measureText(i[a],e).width,r);return h>u&&(h=0,l={}),h++,l[n]=r,r}function r(t,e,n,r){var a=((t||"")+"").split("\n").length,o=i(t,e),s=i("国",e),l=a*s,h=new f(0,0,o,l);switch(h.lineHeight=s,r){case"bottom":case"alphabetic":h.y-=s;break;case"middle":h.y-=s/2}switch(n){case"end":case"right":h.x-=h.width;break;case"center":h.x-=h.width/2}return h}function a(t,e,n,i){var r=e.x,a=e.y,o=e.height,s=e.width,l=n.height,h=n.lineHeight,u=o/2-l/2+h,c="left";switch(t){case"left":r-=i,a+=u,c="right";break;case"right":r+=i+s,a+=u,c="left";break;case"top":r+=s/2,a-=i+l-h,c="center";break;case"bottom":r+=s/2,a+=o+i+h,c="center";break;case"inside":r+=s/2,a+=u,c="center";break;case"insideLeft":r+=i,a+=u,c="left";break;case"insideRight":r+=s-i,a+=u,c="right";break;case"insideTop":r+=s/2,a+=i+h,c="center";break;case"insideBottom":r+=s/2,a+=o-l-i+h,c="center";break;case"insideTopLeft":r+=i,a+=i+h,c="left";break;case"insideTopRight":r+=s-i,a+=i+h,c="right";break;case"insideBottomLeft":r+=i,a+=o-l-i+h;break;case"insideBottomRight":r+=s-i,a+=o-l-i+h,c="right"}return{x:r,y:a,textAlign:c,textBaseline:"alphabetic"}}function o(t,e,n,r,a){if(!e)return"";a=a||{},r=d(r,"...");for(var o=d(a.maxIterations,2),l=d(a.minChar,0),h=i("国",n),u=i("a",n),c=d(a.placeholder,""),f=e=Math.max(0,e-1),p=0;p<l&&f>=u;p++)f-=u;var g=i(r);g>f&&(r="",g=0),f=e-g;for(var v=(t+"").split("\n"),p=0,m=v.length;p<m;p++){var y=v[p],x=i(y,n);if(!(x<=e)){for(var _=0;;_++){if(x<=f||_>=o){y+=r;break}var b=0===_?s(y,f,u,h):x>0?Math.floor(y.length*f/x):0;y=y.substr(0,b),x=i(y,n)}""===y&&(y=c),v[p]=y}}return v.join("\n")}function s(t,e,n,i){for(var r=0,a=0,o=t.length;a<o&&r<e;a++){var s=t.charCodeAt(a);r+=0<=s&&s<=127?n:i}return a}var l={},h=0,u=5e3,c=n(1),f=n(11),d=c.retrieve,p={getWidth:i,getBoundingRect:r,adjustTextPositionOnRect:a,truncateText:o,measureText:function(t,e){var n=c.getContext();return n.font=e||"12px sans-serif",n.measureText(t)}};t.exports=p},function(t,e,n){"use strict";var i=n(1),r=n(7),a=n(15),o=n(5),s=n(13),l=n(62),h=n(9),u=n(12),c=a.set,f=a.get,d=r.encodeHTML,p=r.addCommas,g=s.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.normal.color",layoutMode:null,init:function(t,e,n,i){this.seriesIndex=this.componentIndex,this.mergeDefaultAndTheme(t,n);var r=this.getInitialData(t,n);c(this,"dataBeforeProcessed",r),this.restoreData()},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,r=n?u.getLayoutParams(t):{};i.merge(t,e.getTheme().get(this.subType)),i.merge(t,this.getDefaultOption()),o.defaultEmphasis(t.label,o.LABEL_OPTIONS),this.fillDataTextStyle(t.data),n&&u.mergeLayoutParam(t,r,n)},mergeOption:function(t,e){t=i.merge(this.option,t,!0),this.fillDataTextStyle(t.data);var n=this.layoutMode;n&&u.mergeLayoutParam(this.option,t,n);var r=this.getInitialData(t,e);r&&(c(this,"data",r),c(this,"dataBeforeProcessed",r.cloneShallow()))},fillDataTextStyle:function(t){if(t)for(var e=0;e<t.length;e++)t[e]&&t[e].label&&o.defaultEmphasis(t[e].label,o.LABEL_OPTIONS)},getInitialData:function(){},getData:function(t){var e=f(this,"data");return null==t?e:e.getLinkedData(t)},setData:function(t){c(this,"data",t)},getRawData:function(){return f(this,"dataBeforeProcessed")},coordDimToDataDim:function(t){return o.coordDimToDataDim(this.getData(),t)},dataDimToCoordDim:function(t){return o.dataDimToCoordDim(this.getData(),t)},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,n){function a(n){function a(t,n){var i=s.getDimensionInfo(n);if(i&&i.otherDims.tooltip!==!1){var a=i.type,o=(l?"- "+(i.tooltipName||i.name)+": ":"")+("ordinal"===a?t+"":"time"===a?e?"":r.formatTime("yyyy/MM/dd hh:mm:ss",t):p(t));o&&h.push(d(o))}}var l=i.reduce(n,function(t,e,n){var i=s.getDimensionInfo(n);return t|=i.tooltip!==!1&&null!=i.tooltipName},0),h=[],u=o.otherDimToDataDim(s,"tooltip");return u.length?i.each(u,function(e){a(s.get(e,t),e)}):i.each(n,a),(l?"<br/>":"")+h.join(l?"<br/>":", ")}var s=f(this,"data"),l=this.getRawValue(t),h=i.isArray(l)?a(l):d(p(l)),u=s.getName(t),c=s.getItemVisual(t,"color");i.isObject(c)&&c.colorStops&&(c=(c.colorStops[0]||{}).color),c=c||"transparent";var g=r.getTooltipMarker(c),v=this.name;return"\0-"===v&&(v=""),v=v?d(v)+(e?": ":"<br/>"):"",e?g+v+h:v+g+(u?d(u)+": "+h:h)},isAnimationEnabled:function(){if(h.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){c(this,"data",f(this,"dataBeforeProcessed").cloneShallow())},getColorFromPalette:function(t,e){var n=this.ecModel,i=l.getColorFromPalette.call(this,t,e);return i||(i=n.getColorFromPalette(t,e)),i},getAxisTooltipData:null,getTooltipPosition:null});i.mixin(g,o.dataFormatMixin),i.mixin(g,l),t.exports=g},function(t,e,n){var i=n(149),r=n(43);n(150),n(148);var a=n(34),o=n(4),s=n(1),l=n(16),h={};h.getScaleExtent=function(t,e){var n,i,r,a=t.type,l=e.getMin(),h=e.getMax(),u=null!=l,c=null!=h,f=t.getExtent();return"ordinal"===a?n=(e.get("data")||[]).length:(i=e.get("boundaryGap"),s.isArray(i)||(i=[i||0,i||0]),"boolean"==typeof i[0]&&(i=[0,0]),i[0]=o.parsePercent(i[0],1),i[1]=o.parsePercent(i[1],1),r=f[1]-f[0]||Math.abs(f[0])),null==l&&(l="ordinal"===a?n?0:NaN:f[0]-i[0]*r),null==h&&(h="ordinal"===a?n?n-1:NaN:f[1]+i[1]*r),"dataMin"===l&&(l=f[0]),"dataMax"===h&&(h=f[1]),(null==l||!isFinite(l))&&(l=NaN),(null==h||!isFinite(h))&&(h=NaN),t.setBlank(s.eqNaN(l)||s.eqNaN(h)),e.getNeedCrossZero()&&(l>0&&h>0&&!u&&(l=0),l<0&&h<0&&!c&&(h=0)),[l,h]},h.niceScaleExtent=function(t,e){var n=h.getScaleExtent(t,e),i=null!=e.getMin(),r=null!=e.getMax(),a=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase")),t.setExtent(n[0],n[1]),t.niceExtent({splitNumber:a,fixMin:i,fixMax:r,minInterval:"interval"===t.type?e.get("minInterval"):null});var o=e.get("interval");null!=o&&t.setInterval&&t.setInterval(o)},h.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new i(t.getCategories(),[1/0,-(1/0)]);case"value":return new r;default:return(a.getClass(e)||r).create(t)}},h.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)},h.getAxisLabelInterval=function(t,e,n,i){var r,a=0,o=0,s=1;e.length>40&&(s=Math.floor(e.length/40));for(var h=0;h<t.length;h+=s){var u=t[h],c=l.getBoundingRect(e[h],n,"center","top");c[i?"x":"y"]+=u,c[i?"width":"height"]*=1.3,r?r.intersect(c)?(o++,a=Math.max(a,o)):(r.union(c),o=0):r=c.clone()}return 0===a&&s>1?s:(a+1)*s-1},h.getFormattedLabels=function(t,e){var n=t.scale,i=n.getTicksLabels(),r=n.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),s.map(i,e)):"function"==typeof e?s.map(r,function(n,i){return e(h.getAxisRawValue(t,n),i)},this):i},h.getAxisRawValue=function(t,e){return"category"===t.type?t.scale.getLabel(e):e},t.exports=h},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(){var t=new n(6);return i.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],a=e[0]*n[2]+e[2]*n[3],o=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t},translate:function(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t},rotate:function(t,e,n){var i=e[0],r=e[2],a=e[4],o=e[1],s=e[3],l=e[5],h=Math.sin(n),u=Math.cos(n);return t[0]=i*u+o*h,t[1]=-i*h+o*u,t[2]=r*u+s*h,t[3]=-r*h+u*s,t[4]=u*a+h*l,t[5]=u*l-h*a,t},scale:function(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t},invert:function(t,e){var n=e[0],i=e[2],r=e[4],a=e[1],o=e[3],s=e[5],l=n*o-a*i;return l?(l=1/l,t[0]=o*l,t[1]=-a*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-o*r)*l,t[5]=(a*r-n*s)*l,t):null}};t.exports=i},function(t,e,n){"use strict";function i(t){return t>-w&&t<w}function r(t){return t>w||t<-w}function a(t,e,n,i,r){var a=1-r;return a*a*(a*t+3*r*e)+r*r*(r*i+3*a*n)}function o(t,e,n,i,r){var a=1-r;return 3*(((e-t)*a+2*(n-e)*r)*a+(i-n)*r*r)}function s(t,e,n,r,a,o){var s=r+3*(e-n)-t,l=3*(n-2*e+t),h=3*(e-t),u=t-a,c=l*l-3*s*h,f=l*h-9*s*u,d=h*h-3*l*u,p=0;if(i(c)&&i(f))if(i(l))o[0]=0;else{var g=-h/l;g>=0&&g<=1&&(o[p++]=g)}else{var v=f*f-4*c*d;if(i(v)){var m=f/c,g=-l/s+m,y=-m/2;g>=0&&g<=1&&(o[p++]=g),y>=0&&y<=1&&(o[p++]=y)}else if(v>0){var x=b(v),w=c*l+1.5*s*(-f+x),M=c*l+1.5*s*(-f-x);w=w<0?-_(-w,S):_(w,S),M=M<0?-_(-M,S):_(M,S);var g=(-l-(w+M))/(3*s);g>=0&&g<=1&&(o[p++]=g)}else{var A=(2*c*l-3*s*f)/(2*b(c*c*c)),I=Math.acos(A)/3,C=b(c),P=Math.cos(I),g=(-l-2*C*P)/(3*s),y=(-l+C*(P+T*Math.sin(I)))/(3*s),L=(-l+C*(P-T*Math.sin(I)))/(3*s);g>=0&&g<=1&&(o[p++]=g),y>=0&&y<=1&&(o[p++]=y),L>=0&&L<=1&&(o[p++]=L)}}return p}function l(t,e,n,a,o){var s=6*n-12*e+6*t,l=9*e+3*a-3*t-9*n,h=3*e-3*t,u=0;if(i(l)){if(r(s)){var c=-h/s;c>=0&&c<=1&&(o[u++]=c)}}else{var f=s*s-4*l*h;if(i(f))o[0]=-s/(2*l);else if(f>0){var d=b(f),c=(-s+d)/(2*l),p=(-s-d)/(2*l);c>=0&&c<=1&&(o[u++]=c),p>=0&&p<=1&&(o[u++]=p)}}return u}function h(t,e,n,i,r,a){var o=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,h=(s-o)*r+o,u=(l-s)*r+s,c=(u-h)*r+h;a[0]=t,a[1]=o,a[2]=h,a[3]=c,a[4]=c,a[5]=u,a[6]=l,a[7]=i}function u(t,e,n,i,r,o,s,l,h,u,c){var f,d,p,g,v,m=.005,y=1/0;A[0]=h,A[1]=u;for(var _=0;_<1;_+=.05)I[0]=a(t,n,r,s,_),I[1]=a(e,i,o,l,_),g=x(A,I),g<y&&(f=_,y=g);y=1/0;for(var w=0;w<32&&!(m<M);w++)d=f-m,p=f+m,I[0]=a(t,n,r,s,d),I[1]=a(e,i,o,l,d),g=x(I,A),d>=0&&g<y?(f=d,y=g):(C[0]=a(t,n,r,s,p),C[1]=a(e,i,o,l,p),v=x(C,A),p<=1&&v<y?(f=p,y=v):m*=.5);return c&&(c[0]=a(t,n,r,s,f),c[1]=a(e,i,o,l,f)),b(y)}function c(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function f(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function d(t,e,n,a,o){var s=t-2*e+n,l=2*(e-t),h=t-a,u=0;if(i(s)){if(r(l)){var c=-h/l;c>=0&&c<=1&&(o[u++]=c)}}else{var f=l*l-4*s*h;if(i(f)){var c=-l/(2*s);c>=0&&c<=1&&(o[u++]=c)}else if(f>0){var d=b(f),c=(-l+d)/(2*s),p=(-l-d)/(2*s);c>=0&&c<=1&&(o[u++]=c),p>=0&&p<=1&&(o[u++]=p)}}return u}function p(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function g(t,e,n,i,r){var a=(e-t)*i+t,o=(n-e)*i+e,s=(o-a)*i+a;r[0]=t,r[1]=a,r[2]=s,r[3]=s,r[4]=o,r[5]=n}function v(t,e,n,i,r,a,o,s,l){var h,u=.005,f=1/0;A[0]=o,A[1]=s;for(var d=0;d<1;d+=.05){I[0]=c(t,n,r,d),I[1]=c(e,i,a,d);var p=x(A,I);p<f&&(h=d,f=p)}f=1/0;for(var g=0;g<32&&!(u<M);g++){var v=h-u,m=h+u;I[0]=c(t,n,r,v),I[1]=c(e,i,a,v);var p=x(I,A);if(v>=0&&p<f)h=v,f=p;else{C[0]=c(t,n,r,m),C[1]=c(e,i,a,m);var y=x(C,A);m<=1&&y<f?(h=m,f=y):u*=.5}}return l&&(l[0]=c(t,n,r,h),l[1]=c(e,i,a,h)),b(f)}var m=n(6),y=m.create,x=m.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,M=1e-4,T=b(3),S=1/3,A=y(),I=y(),C=y();t.exports={cubicAt:a,cubicDerivativeAt:o,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:h,cubicProjectPoint:u,quadraticAt:c,quadraticDerivativeAt:f,quadraticRootAt:d,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:v}},function(t,e,n){"use strict";function i(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function r(t,e,n,i){return n=n||{},i||!u.canvasSupported?a(t,e,n):u.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):a(t,e,n),n}function a(t,e,n){var r=i(t);n.zrX=e.clientX-r.left,n.zrY=e.clientY-r.top}function o(t,e,n){if(e=e||window.event,null!=e.zrX)return e;var i=e.type,a=i&&i.indexOf("touch")>=0;if(a){var o="touchend"!=i?e.targetTouches[0]:e.changedTouches[0];o&&r(t,o,e,n)}else r(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;return e}function s(t,e,n){c?t.addEventListener(e,n):t.attachEvent("on"+e,n)}function l(t,e,n){c?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}var h=n(23),u=n(9),c="undefined"!=typeof window&&!!window.addEventListener,f=c?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={clientToLocal:r,normalizeEvent:o,addEventListener:s,removeEventListener:l,stop:f,Dispatcher:h}},function(t,e,n){function i(t){return t=Math.round(t),t<0?0:t>255?255:t}function r(t){return t=Math.round(t),t<0?0:t>360?360:t}function a(t){return t<0?0:t>1?1:t}function o(t){return i(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function s(t){return a(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function l(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function h(t,e,n){return t+(e-t)*n}function u(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function c(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function f(t,e){A&&c(A,e),A=S.put(t,A||e.slice())}function d(t,e){if(t){e=e||[];var n=S.get(t);if(n)return c(e,n);t+="";var i=t.replace(/ /g,"").toLowerCase();if(i in T)return c(e,T[i]),f(t,e),e;if("#"!==i.charAt(0)){var r=i.indexOf("("),a=i.indexOf(")");if(r!==-1&&a+1===i.length){var l=i.substr(0,r),h=i.substr(r+1,a-(r+1)).split(","),d=1;switch(l){case"rgba":if(4!==h.length)return void u(e,0,0,0,1);d=s(h.pop());case"rgb":return 3!==h.length?void u(e,0,0,0,1):(u(e,o(h[0]),o(h[1]),o(h[2]),d),f(t,e),e);case"hsla":return 4!==h.length?void u(e,0,0,0,1):(h[3]=s(h[3]),p(h,e),f(t,e),e);case"hsl":return 3!==h.length?void u(e,0,0,0,1):(p(h,e),f(t,e),e);default:return}}u(e,0,0,0,1)}else{if(4===i.length){var g=parseInt(i.substr(1),16);return g>=0&&g<=4095?(u(e,(3840&g)>>4|(3840&g)>>8,240&g|(240&g)>>4,15&g|(15&g)<<4,1),f(t,e),e):void u(e,0,0,0,1)}if(7===i.length){var g=parseInt(i.substr(1),16);return g>=0&&g<=16777215?(u(e,(16711680&g)>>16,(65280&g)>>8,255&g,1),f(t,e),e):void u(e,0,0,0,1)}}}}function p(t,e){var n=(parseFloat(t[0])%360+360)%360/360,r=s(t[1]),a=s(t[2]),o=a<=.5?a*(r+1):a+r-a*r,h=2*a-o;return e=e||[],u(e,i(255*l(h,o,n+1/3)),i(255*l(h,o,n)),i(255*l(h,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function g(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,a=t[2]/255,o=Math.min(i,r,a),s=Math.max(i,r,a),l=s-o,h=(s+o)/2;if(0===l)e=0,n=0;else{n=h<.5?l/(s+o):l/(2-s-o);var u=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,f=((s-a)/6+l/2)/l;i===s?e=f-c:r===s?e=1/3+u-f:a===s&&(e=2/3+c-u),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,h];return null!=t[3]&&d.push(t[3]),d}}function v(t,e){var n=d(t);if(n){for(var i=0;i<3;i++)e<0?n[i]=n[i]*(1-e)|0:n[i]=(255-n[i])*e+n[i]|0;return w(n,4===n.length?"rgba":"rgb")}}function m(t,e){var n=d(t);if(n)return((1<<24)+(n[0]<<16)+(n[1]<<8)+ +n[2]).toString(16).slice(1)}function y(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var r=t*(e.length-1),o=Math.floor(r),s=Math.ceil(r),l=e[o],u=e[s],c=r-o;return n[0]=i(h(l[0],u[0],c)),n[1]=i(h(l[1],u[1],c)),n[2]=i(h(l[2],u[2],c)),n[3]=a(h(l[3],u[3],c)),n}}function x(t,e,n){if(e&&e.length&&t>=0&&t<=1){var r=t*(e.length-1),o=Math.floor(r),s=Math.ceil(r),l=d(e[o]),u=d(e[s]),c=r-o,f=w([i(h(l[0],u[0],c)),i(h(l[1],u[1],c)),i(h(l[2],u[2],c)),a(h(l[3],u[3],c))],"rgba");return n?{color:f,leftIndex:o,rightIndex:s,value:r}:f}}function _(t,e,n,i){if(t=d(t))return t=g(t),null!=e&&(t[0]=r(e)),null!=n&&(t[1]=s(n)),null!=i&&(t[2]=s(i)),w(p(t),"rgba")}function b(t,e){if(t=d(t),t&&null!=e)return t[3]=a(e),w(t,"rgba")}function w(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}var M=n(70),T={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],
+darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},S=new M(20),A=null;t.exports={parse:d,lift:v,toHex:m,fastMapToColor:y,mapToColor:x,modifyHSL:_,modifyAlpha:b,stringify:w}},function(t,e){var n=Array.prototype.slice,i=function(){this._$handlers={}};i.prototype={constructor:i,one:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!0,ctx:n||this}),this},on:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!1,ctx:n||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var n=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,a=n[t].length;r<a;r++)n[t][r].h!=e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>3&&(e=n.call(e,1));for(var r=this._$handlers[t],a=r.length,o=0;o<a;){switch(i){case 1:r[o].h.call(r[o].ctx);break;case 2:r[o].h.call(r[o].ctx,e[1]);break;case 3:r[o].h.call(r[o].ctx,e[1],e[2]);break;default:r[o].h.apply(r[o].ctx,e)}r[o].one?(r.splice(o,1),a--):o++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>4&&(e=n.call(e,1,e.length-1));for(var r=e[e.length-1],a=this._$handlers[t],o=a.length,s=0;s<o;){switch(i){case 1:a[s].h.call(r);break;case 2:a[s].h.call(r,e[1]);break;case 3:a[s].h.call(r,e[1],e[2]);break;default:a[s].h.apply(r,e)}a[s].one?(a.splice(s,1),o--):s++}}return this}},t.exports=i},function(t,e,n){"use strict";var i=n(3),r=n(11),a=i.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i+a),t.lineTo(n-r,i+a),t.closePath()}}),o=i.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i),t.lineTo(n,i+a),t.lineTo(n-r,i),t.closePath()}}),s=i.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,a=Math.max(r,e.height),o=r/2,s=o*o/(a-o),l=i-a+o+s,h=Math.asin(s/o),u=Math.cos(h)*o,c=Math.sin(h),f=Math.cos(h);t.arc(n,l,o,Math.PI-h,2*Math.PI+h);var d=.6*o,p=.7*o;t.bezierCurveTo(n+u-c*d,l+s+f*d,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-u+c*d,l+s+f*d,n-u,l+s),t.closePath()}}),l=i.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,a=e.y,o=i/3*2;t.moveTo(r,a),t.lineTo(r+o,a+n),t.lineTo(r,a+n/4*3),t.lineTo(r-o,a+n),t.lineTo(r,a),t.closePath()}}),h={line:i.Line,rect:i.Rect,roundRect:i.Rect,square:i.Rect,circle:i.Circle,diamond:o,pin:s,arrow:l,triangle:a},u={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var a=Math.min(n,i);r.x=t,r.y=e,r.width=a,r.height=a},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},c={};for(var f in h)h.hasOwnProperty(f)&&(c[f]=new h[f]);var d=i.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,n){var i=e.symbolType,r=c[i];"none"!==e.symbolType&&(r||(i="rect",r=c[i]),u[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n))}}),p=function(t){if("image"!==this.type){var e=this.style,n=this.shape;n&&"line"===n.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty(!1)}},g={createSymbol:function(t,e,n,a,o,s){var l=0===t.indexOf("empty");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var h;return h=0===t.indexOf("image://")?new i.Image({style:{image:t.slice(8),x:e,y:n,width:a,height:o}}):0===t.indexOf("path://")?i.makePath(t.slice(7),{},new r(e,n,a,o)):new d({shape:{symbolType:t,x:e,y:n,width:a,height:o}}),h.__isEmptyBrush=l,h.setColor=p,h.setColor(s),h}};t.exports=g},function(t,e,n){function i(t,e,n){function i(t,e,n){c[e]?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,v.set(e,!0))}function o(t,e,n){if(n||null!=e.get(t)){for(var i=0;null!=e.get(t+i);)i++;t+=i}return e.set(t,!0),t}e=e||[],n=n||{},t=(t||[]).slice();var d=(n.dimsDef||[]).slice(),p=a.createHashMap(n.encodeDef),g=a.createHashMap(),v=a.createHashMap(),m=[],y=n.dimCount;if(null==y){var x=r(e[0]);y=Math.max(a.isArray(x)&&x.length||1,t.length,d.length),s(t,function(t){var e=t.dimsDef;e&&(y=Math.max(y,e.length))})}for(var _=0;_<y;_++){var b=l(d[_])?{name:d[_]}:d[_]||{},w=b.name,M=m[_]={otherDims:{}};null!=w&&null==g.get(w)&&(M.name=M.tooltipName=w,g.set(w,_)),null!=b.type&&(M.type=b.type)}p.each(function(t,e){t=p.set(e,u(t).slice()),s(t,function(n,r){l(n)&&(n=g.get(n)),null!=n&&n<y&&(t[r]=n,i(m[n],e,r))})});var T=0;s(t,function(t,e){var n,t,r,o;l(t)?(n=t,t={}):(n=t.name,t=a.clone(t),r=t.dimsDef,o=t.otherDims,t.name=t.coordDim=t.coordDimIndex=t.dimsDef=t.otherDims=null);var c=u(p.get(n));if(!c.length)for(var f=0;f<(r&&r.length||1);f++){for(;T<m.length&&null!=m[T].coordDim;)T++;T<m.length&&c.push(T++)}s(c,function(e,a){var s=m[e];i(h(s,t),n,a),null==s.name&&r&&(s.name=s.tooltipName=r[a]),o&&h(s.otherDims,o)})});for(var S=n.extraPrefix||"value",A=0;A<y;A++){var M=m[A]=m[A]||{},I=M.coordDim;null==I&&(M.coordDim=o(S,v,n.extraFromZero),M.coordDimIndex=0,M.isExtraCoord=!0),null==M.name&&(M.name=o(M.coordDim,g)),null==M.type&&f(e,A)&&(M.type="ordinal")}return m}function r(t){return a.isArray(t)?t:a.isObject(t)?t.value:t}var a=n(1),o=n(5),s=a.each,l=a.isString,h=a.defaults,u=o.normalizeToArray,c={tooltip:1,label:1,itemName:1},f=i.guessOrdinal=function(t,e){for(var n=0,i=t.length;n<i;n++){var o=r(t[n]);if(!a.isArray(o))return!1;var o=o[e];if(null!=o&&isFinite(o))return!1;if(l(o)&&"-"!==o)return!0}return!1};t.exports=i},function(t,e,n){"use strict";function i(){this._coordinateSystems=[]}var r=n(1),a={};i.prototype={constructor:i,create:function(t,e){var n=[];r.each(a,function(i,r){var a=i.create(t,e);n=n.concat(a||[])}),this._coordinateSystems=n},update:function(t,e){r.each(this._coordinateSystems,function(n){n.update&&n.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},i.register=function(t,e){a[t]=e},i.get=function(t){return a[t]},t.exports=i},function(t,e,n){"use strict";var i=n(20),r=n(6),a=n(85),o=n(11),s=n(35).devicePixelRatio,l={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},h=[],u=[],c=[],f=[],d=Math.min,p=Math.max,g=Math.cos,v=Math.sin,m=Math.sqrt,y=Math.abs,x="undefined"!=typeof Float32Array,_=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};_.prototype={constructor:_,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=y(1/s/t)||0,this._uy=y(1/s/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(l.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var n=y(t-this._xi)>this._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(l.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,a){return this.addData(l.C,t,e,n,i,r,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,a):this._ctx.bezierCurveTo(t,e,n,i,r,a)),this._xi=r,this._yi=a,this},quadraticCurveTo:function(t,e,n,i){return this.addData(l.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,a){return this.addData(l.A,t,e,n,n,i,r-i,0,a?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,a),this._xi=g(r)*n+t,this._yi=v(r)*n+t,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(l.R,t,e,n,i),this},closePath:function(){this.addData(l.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!x||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();x&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(var r=0;r<e;r++)for(var a=t[r].data,o=0;o<a.length;o++)this.data[i++]=a[o];this._len=i},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var n=0;n<arguments.length;n++)e[this._len++]=arguments[n];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var n,i,r=this._dashSum,a=this._dashOffset,o=this._lineDash,s=this._ctx,l=this._xi,h=this._yi,u=t-l,c=e-h,f=m(u*u+c*c),g=l,v=h,y=o.length;for(u/=f,c/=f,a<0&&(a=r+a),a%=r,g-=a*u,v-=a*c;u>0&&g<=t||u<0&&g>=t||0==u&&(c>0&&v<=e||c<0&&v>=e);)i=this._dashIdx,n=o[i],g+=u*n,v+=c*n,this._dashIdx=(i+1)%y,u>0&&g<l||u<0&&g>l||c>0&&v<h||c<0&&v>h||s[i%2?"moveTo":"lineTo"](u>=0?d(g,t):p(g,t),c>=0?d(v,e):p(v,e));u=g-t,c=v-e,this._dashOffset=-m(u*u+c*c)},_dashedBezierTo:function(t,e,n,r,a,o){var s,l,h,u,c,f=this._dashSum,d=this._dashOffset,p=this._lineDash,g=this._ctx,v=this._xi,y=this._yi,x=i.cubicAt,_=0,b=this._dashIdx,w=p.length,M=0;for(d<0&&(d=f+d),d%=f,s=0;s<1;s+=.1)l=x(v,t,n,a,s+.1)-x(v,t,n,a,s),h=x(y,e,r,o,s+.1)-x(y,e,r,o,s),_+=m(l*l+h*h);for(;b<w&&(M+=p[b],!(M>d));b++);for(s=(M-d)/_;s<=1;)u=x(v,t,n,a,s),c=x(y,e,r,o,s),b%2?g.moveTo(u,c):g.lineTo(u,c),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(a,o),l=a-u,h=o-c,this._dashOffset=-m(l*l+h*h)},_dashedQuadraticTo:function(t,e,n,i){var r=n,a=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,x&&(this.data=new Float32Array(t)))},getBoundingRect:function(){h[0]=h[1]=c[0]=c[1]=Number.MAX_VALUE,u[0]=u[1]=f[0]=f[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,n=0,i=0,s=0,d=0;d<t.length;){var p=t[d++];switch(1==d&&(e=t[d],n=t[d+1],i=e,s=n),p){case l.M:i=t[d++],s=t[d++],e=i,n=s,c[0]=i,c[1]=s,f[0]=i,f[1]=s;break;case l.L:a.fromLine(e,n,t[d],t[d+1],c,f),e=t[d++],n=t[d++];break;case l.C:a.fromCubic(e,n,t[d++],t[d++],t[d++],t[d++],t[d],t[d+1],c,f),e=t[d++],n=t[d++];break;case l.Q:a.fromQuadratic(e,n,t[d++],t[d++],t[d],t[d+1],c,f),e=t[d++],n=t[d++];break;case l.A:var m=t[d++],y=t[d++],x=t[d++],_=t[d++],b=t[d++],w=t[d++]+b,M=(t[d++],1-t[d++]);1==d&&(i=g(b)*x+m,s=v(b)*_+y),a.fromArc(m,y,x,_,b,w,M,c,f),e=g(w)*x+m,n=v(w)*_+y;break;case l.R:i=e=t[d++],s=n=t[d++];var T=t[d++],S=t[d++];a.fromLine(i,s,i+T,s+S,c,f);break;case l.Z:e=i,n=s}r.min(h,h,c),r.max(u,u,f)}return 0===d&&(h[0]=h[1]=u[0]=u[1]=0),new o(h[0],h[1],u[0]-h[0],u[1]-h[1])},rebuildPath:function(t){for(var e,n,i,r,a,o,s=this.data,h=this._ux,u=this._uy,c=this._len,f=0;f<c;){var d=s[f++];switch(1==f&&(i=s[f],r=s[f+1],e=i,n=r),d){case l.M:e=i=s[f++],n=r=s[f++],t.moveTo(i,r);break;case l.L:a=s[f++],o=s[f++],(y(a-i)>h||y(o-r)>u||f===c-1)&&(t.lineTo(a,o),i=a,r=o);break;case l.C:t.bezierCurveTo(s[f++],s[f++],s[f++],s[f++],s[f++],s[f++]),i=s[f-2],r=s[f-1];break;case l.Q:t.quadraticCurveTo(s[f++],s[f++],s[f++],s[f++]),i=s[f-2],r=s[f-1];break;case l.A:var p=s[f++],m=s[f++],x=s[f++],_=s[f++],b=s[f++],w=s[f++],M=s[f++],T=s[f++],S=x>_?x:_,A=x>_?1:x/_,I=x>_?_/x:1,C=Math.abs(x-_)>.001,P=b+w;C?(t.translate(p,m),t.rotate(M),t.scale(A,I),t.arc(0,0,S,b,P,1-T),t.scale(1/A,1/I),t.rotate(-M),t.translate(-p,-m)):t.arc(p,m,S,b,P,1-T),1==f&&(e=g(b)*x+p,n=v(b)*_+m),i=g(P)*x+p,r=v(P)*_+m;break;case l.R:e=i=s[f],n=r=s[f+1],t.rect(s[f++],s[f++],s[f++],s[f++]);break;case l.Z:t.closePath(),i=e,r=n}}}},_.CMD=l,t.exports=_},function(t,e,n){"use strict";function i(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function r(t){var e=i(t);return null!=e&&!c.isArray(p(e))}function a(t,e,n){t=t||[];var i=e.get("coordinateSystem"),a=v[i],o=d.get(i),s={encodeDef:e.get("encode"),dimsDef:e.get("dimensions")},m=a&&a(t,e,n,s),y=m&&m.dimensions;y||(y=o&&(o.getDimensionsInfo?o.getDimensionsInfo():o.dimensions.slice())||["x","y"],y=u(y,t,s));var x=m?m.categoryIndex:-1,_=new h(y,e),b=l(m,t),w={},M=x>=0&&r(t)?function(t,e,n,i){return f.isDataItemOption(t)&&(_.hasItemOption=!0),i===x?n:g(p(t),y[i])}:function(t,e,n,i){var r=p(t),a=g(r&&r[i],y[i]);f.isDataItemOption(t)&&(_.hasItemOption=!0);var o=m&&m.categoryAxesModels;return o&&o[e]&&"string"==typeof a&&(w[e]=w[e]||o[e].getCategories(),a=c.indexOf(w[e],a),a<0&&!isNaN(a)&&(a=+a)),a};return _.hasItemOption=!1,_.initData(t,b,M),_}function o(t){return"category"!==t&&"time"!==t}function s(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function l(t,e){var n,i=[],r=t&&t.dimensions[t.categoryIndex];if(r&&(n=t.categoryAxesModels[r.name]),n){var a=n.getCategories();if(a){var o=e.length;if(c.isArray(e[0])&&e[0].length>1){i=[];for(var s=0;s<o;s++)i[s]=a[e[s][t.categoryIndex||0]]}else i=a.slice(0)}}return i}var h=n(14),u=n(25),c=n(1),f=n(5),d=n(26),p=f.getDataItemValue,g=f.converDataValue,v={cartesian2d:function(t,e,n,i){var r=c.map(["xAxis","yAxis"],function(t){return n.queryComponents({mainType:t,index:e.get(t+"Index"),id:e.get(t+"Id")})[0]}),a=r[0],l=r[1],h=a.get("type"),f=l.get("type"),d=[{name:"x",type:s(h),stackable:o(h)},{name:"y",type:s(f),stackable:o(f)}],p="category"===h,g="category"===f;d=u(d,t,i);var v={};return p&&(v.x=a),g&&(v.y=l),{dimensions:d,categoryIndex:p?0:g?1:-1,categoryAxesModels:v}},singleAxis:function(t,e,n,i){var r=n.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0],a=r.get("type"),l="category"===a,h=[{name:"single",type:s(a),stackable:o(a)}];h=u(h,t,i);var c={};return l&&(c.single=r),{dimensions:h,categoryIndex:l?0:-1,categoryAxesModels:c}},polar:function(t,e,n,i){var r=n.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0],a=r.findAxisModel("angleAxis"),l=r.findAxisModel("radiusAxis"),h=l.get("type"),c=a.get("type"),f=[{name:"radius",type:s(h),stackable:o(h)},{name:"angle",type:s(c),stackable:o(c)}],d="category"===c,p="category"===h;f=u(f,t,i);var g={};return p&&(g.radius=l),d&&(g.angle=a),{dimensions:f,categoryIndex:d?1:p?0:-1,categoryAxesModels:g}},geo:function(t,e,n,i){return{dimensions:u([{name:"lng"},{name:"lat"}],t,i)}}};t.exports=a},,function(t,e,n){function i(){this.group=new o,this.uid=s.getUID("viewChart")}function r(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var n=0;n<t.childCount();n++)r(t.childAt(n),e)}function a(t,e,n){var i=h.queryDataIndex(t,e);null!=i?u.each(h.normalizeToArray(i),function(e){r(t.getItemGraphicEl(e),n)}):t.eachItemGraphicEl(function(t){r(t,n)})}var o=n(36),s=n(49),l=n(15),h=n(5),u=n(1);i.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){a(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){a(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){}};var c=i.prototype;c.updateView=c.updateLayout=c.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},l.enableClassExtend(i,["dispose"]),l.enableClassManagement(i,{registerWhenExtend:!0}),t.exports=i},function(t,e,n){var i=n(1);t.exports=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e,n){for(var r={},a=0;a<t.length;a++){var o=t[a][1];if(!(e&&i.indexOf(e,o)>=0||n&&i.indexOf(n,o)<0)){var s=this.getShallow(o);null!=s&&(r[t[a][0]]=s)}}return r}}},function(t,e,n){"use strict";var i=n(3),r=n(1),a=n(2);n(57),n(117),a.extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new i.Rect({shape:t.coordinateSystem.getRect(),style:r.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),a.registerPreprocessor(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})})},function(t,e,n){function i(t,e){var n=t[1]-t[0],i=e,r=n/i/2;t[0]+=r,t[1]-=r}var r=n(4),a=r.linearMap,o=n(1),s=n(18),l=[0,1],h=function(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1,this._labelInterval};h.prototype={constructor:h,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return r.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,r=this.scale;return t=r.normalize(t),this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count())),a(t,l,n,e)},coordToData:function(t,e){var n=this._extent,r=this.scale;this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count()));var o=a(t,n,l,e);return this.scale.scale(o)},pointToData:function(t,e){},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),n=[],i=0;i<e.length;i++)n.push(e[i][0]);return e[i-1]&&n.push(e[i-1][1]),n}return o.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return o.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],n=this.scale.count(),i=t[0],r=t[1],a=r-i,o=0;o<n;o++)e.push([a*o/n+i,a*(o+1)/n+i]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},getLabelInterval:function(){var t=this._labelInterval;if(!t){var e=this.model,n=e.getModel("axisLabel"),i=n.get("interval");"category"!==this.type||"auto"!==i?t="auto"===i?0:i:this.isHorizontal&&(t=s.getAxisLabelInterval(o.map(this.scale.getTicks(),this.dataToCoord,this),e.getFormattedLabels(),n.getModel("textStyle").getFont(),this.isHorizontal())),this._labelInterval=t}return t}},t.exports=h},function(t,e,n){function i(t){this._setting=t||{},this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var r=n(15),a=i.prototype;a.parse=function(t){return t},a.getSetting=function(t){return this._setting[t]},a.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},a.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},a.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},a.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},a.unionExtentFromData=function(t,e){this.unionExtent(t.getDataExtent(e,!0))},a.getExtent=function(){return this._extent.slice()},a.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},a.getTicksLabels=function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},a.isBlank=function(){return this._isBlank},a.setBlank=function(t){this._isBlank=t},r.enableClassExtend(i),r.enableClassManagement(i,{registerWhenExtend:!0}),t.exports=i},function(t,e){var n=1;"undefined"!=typeof window&&(n=Math.max(window.devicePixelRatio||1,1));var i={debugMode:0,devicePixelRatio:n};t.exports=i},function(t,e,n){var i=n(1),r=n(66),a=n(11),o=function(t){t=t||{},r.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};o.prototype={constructor:o,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof o&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,r=this._children,a=i.indexOf(r,t);return a<0?this:(r.splice(a,1),t.parent=null,n&&(n.delFromStorage(t),t instanceof o&&t.delChildrenFromStorage(n)),e&&e.refresh(),this)},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;e<n.length;e++)t=n[e],i&&(i.delFromStorage(t),t instanceof o&&t.delChildrenFromStorage(i)),t.parent=null;return n.length=0,this},eachChild:function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},traverse:function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n];t.call(e,i),"group"===i.type&&i.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.addToStorage(n),n instanceof o&&n.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.delFromStorage(n),n instanceof o&&n.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,n=new a(0,0,0,0),i=t||this._children,r=[],o=0;o<i.length;o++){var s=i[o];if(!s.ignore&&!s.invisible){var l=s.getBoundingRect(),h=s.getLocalTransform(r);h?(n.copy(l),n.applyTransform(h),e=e||n.clone(),e.union(n)):(e=e||l.clone(),e.union(l))}}return e||n}},i.inherits(o,r),t.exports=o},function(t,e){var n={},i="\0__throttleOriginMethod",r="\0__throttleRate",a="\0__throttleType";n.throttle=function(t,e,n){function i(){u=(new Date).getTime(),c=null,t.apply(o,s||[])}var r,a,o,s,l,h=0,u=0,c=null;e=e||0;var f=function(){r=(new Date).getTime(),o=this,s=arguments;var t=l||e,f=l||n;l=null,a=r-(f?h:u)-t,clearTimeout(c),f?c=setTimeout(i,t):a>=0?i():c=setTimeout(i,-a),h=r};return f.clear=function(){c&&(clearTimeout(c),c=null)},f.debounceNextCall=function(t){l=t},f},n.createOrUpdate=function(t,e,o,s){var l=t[e];if(l){var h=l[i]||l,u=l[a],c=l[r];if(c!==o||u!==s){if(null==o||!s)return t[e]=h;l=t[e]=n.throttle(h,o,"debounce"===s),l[i]=h,l[a]=s,l[r]=o}return l}},n.clear=function(t,e){var n=t[e];n&&n[i]&&(t[e]=n[i])},t.exports=n},function(t,e,n){function i(t){t=t||{},o.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new a(t.style),this._rect=null,this.__clipPaths=[]}var r=n(1),a=n(73),o=n(66),s=n(87);i.prototype={constructor:i,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return i.contain(n[0],n[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?o.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new a(t),this.dirty(!1),this}},r.inherits(i,o),r.mixin(i,s),t.exports=i},function(t,e){var n=function(t){this.colorStops=t||[]};n.prototype={constructor:n,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=n},function(t,e,n){function i(t){var e={componentType:t.mainType};return e[t.mainType+"Index"]=t.componentIndex,e}function r(t,e,n,i){var r,a,o=d(n-t.rotation),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;return p(o-x/2)?(a=l?"bottom":"top",r="center"):p(o-1.5*x)?(a=l?"top":"bottom",r="center"):(a="middle",r=o<1.5*x&&o>x/2?l?"left":"right":l?"right":"left"),{rotation:o,textAlign:r,textVerticalAlign:a}}function a(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function o(t,e){var n=t.get("axisLabel.showMinLabel"),i=t.get("axisLabel.showMaxLabel"),r=e[0],a=e[1],o=e[e.length-1],l=e[e.length-2];n===!1?r.ignore=!0:null!=t.getMin()&&s(r,a)&&(n?a.ignore=!0:r.ignore=!0),i===!1?o.ignore=!0:null!=t.getMax()&&s(l,o)&&(i?l.ignore=!0:o.ignore=!0)}function s(t,e,n){var i=t&&t.getBoundingRect().clone(),r=e&&e.getBoundingRect().clone();if(i&&r){var a=v.identity([]);return v.rotate(a,a,-t.rotation),i.applyTransform(v.mul([],a,t.getLocalTransform())),r.applyTransform(v.mul([],a,e.getLocalTransform())),i.intersect(r)}}var l=n(1),h=n(7),u=n(3),c=n(10),f=n(4),d=f.remRadian,p=f.isRadianAroundZero,g=n(6),v=n(19),m=g.applyTransform,y=l.retrieve,x=Math.PI,_=function(t,e){this.opt=e,this.axisModel=t,l.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new u.Group;var n=new u.Group({position:e.position.slice(),rotation:e.rotation});n.updateTransform(),this._transform=n.transform,this._dumbGroup=n};_.prototype={constructor:_,hasBuilder:function(t){return!!b[t]},add:function(t){b[t].call(this)},getGroup:function(){return this.group}};var b={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var n=this.axisModel.axis.getExtent(),i=this._transform,r=[n[0],0],a=[n[1],0];i&&(m(r,r,i),m(a,a,i)),this.group.add(new u.Line(u.subPixelOptimizeLine({anid:"line",shape:{x1:r[0],y1:r[1],x2:a[0],y2:a[1]},style:l.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})))}},axisTick:function(){var t=this.axisModel,e=t.axis;if(t.get("axisTick.show")&&!e.scale.isBlank())for(var n=t.getModel("axisTick"),i=this.opt,r=n.getModel("lineStyle"),a=n.get("length"),o=T(n,i.labelInterval),s=e.getTicksCoords(n.get("alignWithLabel")),h=e.scale.getTicks(),c=[],f=[],d=this._transform,p=0;p<s.length;p++)if(!M(e,p,o)){var g=s[p];c[0]=g,c[1]=0,f[0]=g,f[1]=i.tickDirection*a,d&&(m(c,c,d),m(f,f,d)),this.group.add(new u.Line(u.subPixelOptimizeLine({anid:"tick_"+h[p],shape:{x1:c[0],y1:c[1],x2:f[0],y2:f[1]},style:l.defaults(r.getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")}),z2:2,silent:!0})))}},axisLabel:function(){var t=this.opt,e=this.axisModel,n=e.axis,r=y(t.axisLabelShow,e.get("axisLabel.show"));if(r&&!n.scale.isBlank()){var s=e.getModel("axisLabel"),h=s.getModel("textStyle"),f=s.get("margin"),d=n.scale.getTicks(),p=e.getFormattedLabels(),g=(y(t.labelRotate,s.get("rotate"))||0)*x/180,v=w(t.rotation,g,t.labelDirection),m=e.get("data"),_=[],b=a(e),T=e.get("triggerEvent");l.each(d,function(r,a){if(!M(n,a,t.labelInterval)){var o=h;m&&m[r]&&m[r].textStyle&&(o=new c(m[r].textStyle,h,e.ecModel));var s=o.getTextColor()||e.get("axisLine.lineStyle.color"),l=n.dataToCoord(r),d=[l,t.labelOffset+t.labelDirection*f],g=n.scale.getLabel(r),y=new u.Text({anid:"label_"+r,style:{text:p[a],textAlign:o.get("align",!0)||v.textAlign,textVerticalAlign:o.get("baseline",!0)||v.textVerticalAlign,textFont:o.getFont(),fill:"function"==typeof s?s("category"===n.type?g:"value"===n.type?r+"":r,a):s},position:d,rotation:v.rotation,silent:b,z2:10});T&&(y.eventData=i(e),y.eventData.targetType="axisLabel",y.eventData.value=g),this._dumbGroup.add(y),y.updateTransform(),_.push(y),this.group.add(y),y.decomposeTransform()}},this),o(e,_)}},axisName:function(){var t=this.opt,e=this.axisModel,n=y(t.axisName,e.get("name"));if(n){var o,s=e.get("nameLocation"),c=t.nameDirection,f=e.getModel("nameTextStyle"),d=e.get("nameGap")||0,p=this.axisModel.axis.getExtent(),g=p[0]>p[1]?-1:1,v=["start"===s?p[0]-g*d:"end"===s?p[1]+g*d:(p[0]+p[1])/2,"middle"===s?t.labelOffset+c*d:0],m=e.get("nameRotate");null!=m&&(m=m*x/180);var _;"middle"===s?o=w(t.rotation,null!=m?m:t.rotation,c):(o=r(t,s,m||0,p),_=t.axisNameAvailableWidth,
+null!=_&&(_=Math.abs(_/Math.sin(o.rotation)),!isFinite(_)&&(_=null)));var b=f.getFont(),M=e.get("nameTruncate",!0)||{},T=M.ellipsis,S=y(t.nameTruncateMaxWidth,M.maxWidth,_),A=null!=T&&null!=S?h.truncateText(n,S,b,T,{minChar:2,placeholder:M.placeholder}):n,I=e.get("tooltip",!0),C=e.mainType,P={componentType:C,name:n,$vars:["name"]};P[C+"Index"]=e.componentIndex;var L=new u.Text({anid:"name",__fullText:n,__truncatedText:A,style:{text:A,textFont:b,fill:f.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:o.textAlign,textVerticalAlign:o.textVerticalAlign},position:v,rotation:o.rotation,silent:a(e),z2:1,tooltip:I&&I.show?l.extend({content:n,formatter:function(){return n},formatterParams:P},I):null});e.get("triggerEvent")&&(L.eventData=i(e),L.eventData.targetType="axisName",L.eventData.name=n),this._dumbGroup.add(L),L.updateTransform(),this.group.add(L),L.decomposeTransform()}}},w=_.innerTextLayout=function(t,e,n){var i,r,a=d(e-t);return p(a)?(r=n>0?"top":"bottom",i="center"):p(a-x)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=a>0&&a<x?n>0?"right":"left":n>0?"left":"right"),{rotation:a,textAlign:i,textVerticalAlign:r}},M=_.ifIgnoreOnTick=function(t,e,n){var i,r=t.scale;return"ordinal"===r.type&&("function"==typeof n?(i=r.getTicks()[e],!n(i,r.getLabel(i))):e%(n+1))},T=_.getInterval=function(t,e){var n=t.get("interval");return null!=n&&"auto"!=n||(n=e),n};t.exports=_},function(t,e,n){function i(t,e,n,i,s,l){var h=o.getAxisPointerClass(t.axisPointerClass);if(h){var u=a.getAxisPointerModel(e);u?(t._axisPointer||(t._axisPointer=new h)).render(e,u,i,l):r(t,i)}}function r(t,e,n){var i=t._axisPointer;i&&i.dispose(e,n),t._axisPointer=null}var a=n(45),o=n(2).extendComponentView({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,n,r){this.axisPointerClass&&a.fixValue(t),o.superApply(this,"render",arguments),i(this,t,e,n,r,!0)},updateAxisPointer:function(t,e,n,r,a){i(this,t,e,n,r,!1)},remove:function(t,e){var n=this._axisPointer;n&&n.remove(e),o.superApply(this,"remove",arguments)},dispose:function(t,e){r(this,e),o.superApply(this,"dispose",arguments)}}),s=[];o.registerAxisPointerClass=function(t,e){s[t]=e},o.getAxisPointerClass=function(t){return t&&s[t]},t.exports=o},function(t,e,n){function i(t){return r.isObject(t)&&null!=t.value?t.value:t+""}var r=n(1),a=n(18);t.exports={getFormattedLabels:function(){return a.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))},getCategories:function(){return"category"===this.get("type")&&r.map(this.get("data"),i)},getMin:function(t){var e=this.option,n=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=n&&"dataMin"!==n&&!r.eqNaN(n)&&(n=this.axis.scale.parse(n)),n},getMax:function(t){var e=this.option,n=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=n&&"dataMax"!==n&&!r.eqNaN(n)&&(n=this.axis.scale.parse(n)),n},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:r.noop,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}}},function(t,e,n){var i=n(4),r=n(7),a=n(34),o=n(64),s=i.round,l=a.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),l.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){return o.intervalScaleGetTicks(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},getLabel:function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=i.getPrecisionSafe(t)||0:"auto"===n&&(n=this._intervalPrecision),t=s(t,n,!0),r.addCommas(t)},niceTicks:function(t,e){t=t||5;var n=this._extent,i=n[1]-n[0];if(isFinite(i)){i<0&&(i=-i,n.reverse());var r=o.intervalScaleNiceTicks(n,t,e);this._intervalPrecision=r.intervalPrecision,this._interval=r.interval,this._niceExtent=r.niceTickExtent}},niceExtent:function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax?e[0]-=n/2:(e[1]+=n/2,e[0]-=n/2)}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval);var r=this._interval;t.fixMin||(e[0]=s(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=s(Math.ceil(e[1]/r)*r))}});l.create=function(){return new l},t.exports=l},function(t,e,n){function i(t){this.group=new a.Group,this._symbolCtor=t||o}function r(t,e,n){var i=t.getItemLayout(e);return i&&!isNaN(i[0])&&!isNaN(i[1])&&!(n&&n(e))&&"none"!==t.getItemVisual(e,"symbol")}var a=n(3),o=n(54),s=i.prototype;s.updateData=function(t,e){var n=this.group,i=t.hostModel,o=this._data,s=this._symbolCtor,l={itemStyle:i.getModel("itemStyle.normal").getItemStyle(["color"]),hoverItemStyle:i.getModel("itemStyle.emphasis").getItemStyle(),symbolRotate:i.get("symbolRotate"),symbolOffset:i.get("symbolOffset"),hoverAnimation:i.get("hoverAnimation"),labelModel:i.getModel("label.normal"),hoverLabelModel:i.getModel("label.emphasis")};t.diff(o).add(function(i){var a=t.getItemLayout(i);if(r(t,i,e)){var o=new s(t,i,l);o.attr("position",a),t.setItemGraphicEl(i,o),n.add(o)}}).update(function(h,u){var c=o.getItemGraphicEl(u),f=t.getItemLayout(h);return r(t,h,e)?(c?(c.updateData(t,h,l),a.updateProps(c,{position:f},i)):(c=new s(t,h),c.attr("position",f)),n.add(c),void t.setItemGraphicEl(h,c)):void n.remove(c)}).remove(function(t){var e=o.getItemGraphicEl(t);e&&e.fadeOut(function(){n.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,n){var i=t.getItemLayout(n);e.attr("position",i)})},s.remove=function(t){var e=this.group,n=this._data;n&&(t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=i},function(t,e,n){function i(t,e,n){var i=e.getComponent("tooltip"),a=e.getComponent("axisPointer"),s=a.get("link",!0)||[],h=[];c(n.getCoordinateSystems(),function(n){function u(i,u,c){var f=c.model.getModel("axisPointer",a),d=f.get("show");if(d&&("auto"!==d||i||l(f))){null==u&&(u=f.get("triggerTooltip")),f=i?r(c,m,a,e,i,u):f;var v=f.get("snap"),y=p(c.model),x=u||v||"category"===c.type,_=t.axesInfo[y]={key:y,axis:c,coordSys:n,axisPointerModel:f,triggerTooltip:u,involveSeries:x,snap:v,useHandle:l(f),seriesModels:[]};g[y]=_,t.seriesInvolved|=x;var b=o(s,c);if(null!=b){var w=h[b]||(h[b]={axesInfo:{}});w.axesInfo[y]=_,w.mapper=s[b].mapper,_.linkGroup=w}}}if(n.axisPointerEnabled){var d=p(n.model),g=t.coordSysAxesInfo[d]={};t.coordSysMap[d]=n;var v=n.model,m=v.getModel("tooltip",i);if(c(n.getAxes(),f(u,!1,null)),n.getTooltipAxes&&i&&m.get("show")){var y="axis"===m.get("trigger"),x="cross"===m.get("axisPointer.type"),_=n.getTooltipAxes(m.get("axisPointer.axis"));(y||x)&&c(_.baseAxes,f(u,!x||"cross",y)),x&&c(_.otherAxes,f(u,"cross",!1))}}})}function r(t,e,n,i,r,a){var o=e.getModel("axisPointer"),s={};c(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(t){s[t]=h.clone(o.get(t))}),s.snap="category"!==t.type&&!!a,"cross"===o.get("type")&&(s.type="line");var l=s.label||(s.label={});if(null==l.show&&(l.show=!1),"cross"===r&&(l.show=!0,!a)){var f=s.lineStyle=o.get("crossStyle");f&&h.defaults(l.textStyle||(l.textStyle={}),f.textStyle)}return t.model.getModel("axisPointer",new u(s,n,i))}function a(t,e){e.eachSeries(function(e){var n=e.coordinateSystem,i=e.get("tooltip.trigger",!0);n&&"none"!==i&&i!==!1&&"item"!==i&&e.get("axisPointer.show",!0)!==!1&&c(t.coordSysAxesInfo[p(n.model)],function(t){var i=t.axis;n.getAxis(i.dim)===i&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())})},this)}function o(t,e){for(var n=e.model,i=e.dim,r=0;r<t.length;r++){var a=t[r]||{};if(s(a[i+"AxisId"],n.id)||s(a[i+"AxisIndex"],n.componentIndex)||s(a[i+"AxisName"],n.name))return r}}function s(t,e){return"all"===t||h.isArray(t)&&h.indexOf(t,e)>=0||t===e}function l(t){return!!t.get("handle.show")}var h=n(1),u=n(10),c=h.each,f=h.curry,d={};d.collect=function(t,e){var n={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return i(n,t,e),n.seriesInvolved&&a(n,t),n},d.fixValue=function(t){var e=d.getAxisInfo(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,a=n.get("status"),o=n.get("value");null!=o&&(o=i.parse(o));var s=l(n);null==a&&(r.status=s?"show":"hide");var h=i.getExtent().slice();h[0]>h[1]&&h.reverse(),(null==o||o>h[1])&&(o=h[1]),o<h[0]&&(o=h[0]),r.value=o,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}},d.getAxisInfo=function(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[p(t)]},d.getAxisPointerModel=function(t){var e=d.getAxisInfo(t);return e&&e.axisPointerModel};var p=d.makeKey=function(t){return t.type+"||"+t.id};t.exports=d},,,function(t,e){"use strict";function n(t){return t}function i(t,e,i,r){this._old=t,this._new=e,this._oldKeyGetter=i||n,this._newKeyGetter=r||n}function r(t,e,n,i){for(var r=0;r<t.length;r++){var a="_ec_"+i(t[r],r),o=e[a];null==o?(n.push(a),e[a]=r):(o.length||(e[a]=o=[o]),o.push(r))}}i.prototype={constructor:i,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,n=this._new,i=this._oldKeyGetter,a=this._newKeyGetter,o={},s={},l=[],h=[];for(r(e,o,l,i),r(n,s,h,a),t=0;t<e.length;t++){var u=l[t],c=s[u];if(null!=c){var f=c.length;f?(1===f&&(s[u]=null),c=c.unshift()):s[u]=null,this._update&&this._update(c,t)}else this._remove&&this._remove(t)}for(var t=0;t<h.length;t++){var u=h[t];if(s.hasOwnProperty(u)){var c=s[u];if(null==c)continue;if(c.length)for(var d=0,f=c.length;d<f;d++)this._add&&this._add(c[d]);else this._add&&this._add(c)}}}},t.exports=i},function(t,e,n){var i=n(1),r=n(15),a=r.parseClassType,o=0,s={},l="_";s.getUID=function(t){return[t||"",o++,Math.random()].join(l)},s.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,n){t=a(t),e[t.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=a(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r},t},s.enableTopologicalTravel=function(t,e){function n(t){var n={},o=[];return i.each(t,function(s){var l=r(n,s),h=l.originalDeps=e(s),u=a(h,t);l.entryCount=u.length,0===l.entryCount&&o.push(s),i.each(u,function(t){i.indexOf(l.predecessor,t)<0&&l.predecessor.push(t);var e=r(n,t);i.indexOf(e.successor,t)<0&&e.successor.push(s)})}),{graph:n,noEntryList:o}}function r(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function a(t,e){var n=[];return i.each(t,function(t){i.indexOf(e,t)>=0&&n.push(t)}),n}t.topologicalTravel=function(t,e,r,a){function o(t){h[t].entryCount--,0===h[t].entryCount&&u.push(t)}function s(t){c[t]=!0,o(t)}if(t.length){var l=n(e),h=l.graph,u=l.noEntryList,c={};for(i.each(t,function(t){c[t]=!0});u.length;){var f=u.pop(),d=h[f],p=!!c[f];p&&(r.call(a,f,d.originalDeps.slice()),delete c[f]),i.each(d.successor,p?s:o)}i.each(c,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){t.exports=function(t,e,n,i,r){i.eachRawSeriesByType(t,function(t){var r=t.getData(),a=t.get("symbol")||e,o=t.get("symbolSize");r.setVisual({legendSymbol:n||a,symbol:a,symbolSize:o}),i.isSeriesFiltered(t)||("function"==typeof o&&r.each(function(e){var n=t.getRawValue(e),i=t.getDataParams(e);r.setItemVisual(e,"symbolSize",o(n,i))}),r.each(function(t){var e=r.getItemModel(t),n=e.getShallow("symbol",!0),i=e.getShallow("symbolSize",!0);null!=n&&r.setItemVisual(t,"symbol",n),null!=i&&r.setItemVisual(t,"symbolSize",i)}))})}},function(t,e){function n(t){for(var e=0;t>=u;)e|=1&t,t>>=1;return t+e}function i(t,e,n,i){var a=e+1;if(a===n)return 1;if(i(t[a++],t[e])<0){for(;a<n&&i(t[a],t[a-1])<0;)a++;r(t,e,a)}else for(;a<n&&i(t[a],t[a-1])>=0;)a++;return a-e}function r(t,e,n){for(n--;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}function a(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var a,o=t[i],s=e,l=i;s<l;)a=s+l>>>1,r(o,t[a])<0?l=a:s=a+1;var h=i-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;h>0;)t[s+h]=t[s+h-1],h--}t[s]=o}}function o(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])>0){for(s=i-r;l<s&&a(t,e[n+r+l])>0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),o+=r,l+=r}else{for(s=r+1;l<s&&a(t,e[n+r-l])<=0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var h=o;o=r-l,l=r-h}for(o++;o<l;){var u=o+(l-o>>>1);a(t,e[n+u])>0?o=u+1:l=u}return l}function s(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])<0){for(s=r+1;l<s&&a(t,e[n+r-l])<0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var h=o;o=r-l,l=r-h}else{for(s=i-r;l<s&&a(t,e[n+r+l])>=0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),o+=r,l+=r}for(o++;o<l;){var u=o+(l-o>>>1);a(t,e[n+u])<0?l=u:o=u+1}return l}function l(t,e){function n(t,e){u[y]=t,d[y]=e,y+=1}function i(){for(;y>1;){var t=y-2;if(t>=1&&d[t-1]<=d[t]+d[t+1]||t>=2&&d[t-2]<=d[t]+d[t-1])d[t-1]<d[t+1]&&t--;else if(d[t]>d[t+1])break;a(t)}}function r(){for(;y>1;){var t=y-2;t>0&&d[t-1]<d[t+1]&&t--,a(t)}}function a(n){var i=u[n],r=d[n],a=u[n+1],c=d[n+1];d[n]=r+c,n===y-3&&(u[n+1]=u[n+2],d[n+1]=d[n+2]),y--;var f=s(t[a],t,i,r,0,e);i+=f,r-=f,0!==r&&(c=o(t[i+r-1],t,a,c,c-1,e),0!==c&&(r<=c?l(i,r,a,c):h(i,r,a,c)))}function l(n,i,r,a){var l=0;for(l=0;l<i;l++)x[l]=t[n+l];var h=0,u=r,f=n;if(t[f++]=t[u++],0!==--a){if(1===i){for(l=0;l<a;l++)t[f+l]=t[u+l];return void(t[f+a]=x[h])}for(var d,g,v,m=p;;){d=0,g=0,v=!1;do if(e(t[u],x[h])<0){if(t[f++]=t[u++],g++,d=0,0===--a){v=!0;break}}else if(t[f++]=x[h++],d++,g=0,1===--i){v=!0;break}while((d|g)<m);if(v)break;do{if(d=s(t[u],x,h,i,0,e),0!==d){for(l=0;l<d;l++)t[f+l]=x[h+l];if(f+=d,h+=d,i-=d,i<=1){v=!0;break}}if(t[f++]=t[u++],0===--a){v=!0;break}if(g=o(x[h],t,u,a,0,e),0!==g){for(l=0;l<g;l++)t[f+l]=t[u+l];if(f+=g,u+=g,a-=g,0===a){v=!0;break}}if(t[f++]=x[h++],1===--i){v=!0;break}m--}while(d>=c||g>=c);if(v)break;m<0&&(m=0),m+=2}if(p=m,p<1&&(p=1),1===i){for(l=0;l<a;l++)t[f+l]=t[u+l];t[f+a]=x[h]}else{if(0===i)throw new Error;for(l=0;l<i;l++)t[f+l]=x[h+l]}}else for(l=0;l<i;l++)t[f+l]=x[h+l]}function h(n,i,r,a){var l=0;for(l=0;l<a;l++)x[l]=t[r+l];var h=n+i-1,u=a-1,f=r+a-1,d=0,g=0;if(t[f--]=t[h--],0!==--i){if(1===a){for(f-=i,h-=i,g=f+1,d=h+1,l=i-1;l>=0;l--)t[g+l]=t[d+l];return void(t[f]=x[u])}for(var v=p;;){var m=0,y=0,_=!1;do if(e(x[u],t[h])<0){if(t[f--]=t[h--],m++,y=0,0===--i){_=!0;break}}else if(t[f--]=x[u--],y++,m=0,1===--a){_=!0;break}while((m|y)<v);if(_)break;do{if(m=i-s(x[u],t,n,i,i-1,e),0!==m){for(f-=m,h-=m,i-=m,g=f+1,d=h+1,l=m-1;l>=0;l--)t[g+l]=t[d+l];if(0===i){_=!0;break}}if(t[f--]=x[u--],1===--a){_=!0;break}if(y=a-o(t[h],x,0,a,a-1,e),0!==y){for(f-=y,u-=y,a-=y,g=f+1,d=u+1,l=0;l<y;l++)t[g+l]=x[d+l];if(a<=1){_=!0;break}}if(t[f--]=t[h--],0===--i){_=!0;break}v--}while(m>=c||y>=c);if(_)break;v<0&&(v=0),v+=2}if(p=v,p<1&&(p=1),1===a){for(f-=i,h-=i,g=f+1,d=h+1,l=i-1;l>=0;l--)t[g+l]=t[d+l];t[f]=x[u]}else{if(0===a)throw new Error;for(d=f-(a-1),l=0;l<a;l++)t[d+l]=x[l]}}else for(d=f-(a-1),l=0;l<a;l++)t[d+l]=x[l]}var u,d,p=c,g=0,v=f,m=0,y=0;g=t.length,g<2*f&&(v=g>>>1);var x=[];m=g<120?5:g<1542?10:g<119151?19:40,u=[],d=[],this.mergeRuns=i,this.forceMergeRuns=r,this.pushRun=n}function h(t,e,r,o){r||(r=0),o||(o=t.length);var s=o-r;if(!(s<2)){var h=0;if(s<u)return h=i(t,r,o,e),void a(t,r,o,r+h,e);var c=new l(t,e),f=n(s);do{if(h=i(t,r,o,e),h<f){var d=s;d>f&&(d=f),a(t,r,r+d,r+h,e),h=d}c.pushRun(r,h),c.mergeRuns(),s-=h,r+=h}while(0!==s);c.forceMergeRuns()}}var u=32,c=7,f=256;t.exports=h},function(t,e,n){var i=n(35);t.exports=function(){if(0!==i.debugMode)if(1==i.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(i.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,n){function i(t){r.call(this,t)}var r=n(38),a=n(11),o=n(1),s=n(70),l=new s(50);i.prototype={constructor:i,type:"image",brush:function(t,e){var n,i=this.style,r=i.image;if(i.bind(t,this,e),n="string"==typeof r?this._image:r,!n&&r){var a=l.get(r);if(!a)return n=new Image,n.onload=function(){n.onload=null;for(var t=0;t<a.pending.length;t++)a.pending[t].dirty()},a={image:n,pending:[this]},n.src=r,l.put(r,a),void(this._image=n);if(n=a.image,this._image=n,!n.width||!n.height)return void a.pending.push(this)}if(n){var o=i.x||0,s=i.y||0;if(!n.width||!n.height)return;var h=i.width,u=i.height,c=n.width/n.height;if(null==h&&null!=u?h=u*c:null==u&&null!=h?u=h/c:null==h&&null==u&&(h=n.width,u=n.height),this.setTransform(t),i.sWidth&&i.sHeight){var f=i.sx||0,d=i.sy||0;t.drawImage(n,f,d,i.sWidth,i.sHeight,o,s,h,u)}else if(i.sx&&i.sy){var f=i.sx,d=i.sy,p=h-f,g=u-d;t.drawImage(n,f,d,p,g,o,s,h,u)}else t.drawImage(n,o,s,h,u);this.restoreTransform(t),null!=i.text&&this.drawRectText(t,this.getBoundingRect())}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new a(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},o.inherits(i,r),t.exports=i},function(t,e,n){function i(t,e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array?n.slice():[+n,+n]}function r(t){return[t[0]/2,t[1]/2]}function a(t,e,n){h.Group.call(this),this.updateData(t,e,n)}function o(t,e){this.parent.drift(t,e)}var s=n(1),l=n(24),h=n(3),u=n(4),c=n(92),f=a.prototype;f._createSymbol=function(t,e,n,i){this.removeAll();var a=e.hostModel,s=e.getItemVisual(n,"color"),u=l.createSymbol(t,-1,-1,2,2,s);u.attr({z2:100,culling:!0,scale:[0,0]}),u.drift=o,h.initProps(u,{scale:r(i)},a,n),this._symbolType=t,this.add(u)},f.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},f.getSymbolPath=function(){return this.childAt(0)},f.getScale=function(){return this.childAt(0).scale},f.highlight=function(){this.childAt(0).trigger("emphasis")},f.downplay=function(){this.childAt(0).trigger("normal")},f.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},f.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},f.updateData=function(t,e,n){this.silent=!1;var a=t.getItemVisual(e,"symbol")||"circle",o=t.hostModel,s=i(t,e);if(a!==this._symbolType)this._createSymbol(a,t,e,s);else{var l=this.childAt(0);l.silent=!1,h.updateProps(l,{scale:r(s)},o,e)}this._updateCommon(t,e,s,n),this._seriesModel=o};var d=["itemStyle","normal"],p=["itemStyle","emphasis"],g=["label","normal"],v=["label","emphasis"];f._updateCommon=function(t,e,n,i){var a=this.childAt(0),o=t.hostModel,l=t.getItemVisual(e,"color");"image"!==a.type&&a.useStyle({strokeNoScale:!0}),i=i||null;var f=i&&i.itemStyle,m=i&&i.hoverItemStyle,y=i&&i.symbolRotate,x=i&&i.symbolOffset,_=i&&i.labelModel,b=i&&i.hoverLabelModel,w=i&&i.hoverAnimation;if(!i||t.hasItemOption){var M=t.getItemModel(e);f=M.getModel(d).getItemStyle(["color"]),m=M.getModel(p).getItemStyle(),y=M.getShallow("symbolRotate"),x=M.getShallow("symbolOffset"),_=M.getModel(g),b=M.getModel(v),w=M.getShallow("hoverAnimation")}else m=s.extend({},m);var T=a.style;a.attr("rotation",(y||0)*Math.PI/180||0),x&&a.attr("position",[u.parsePercent(x[0],n[0]),u.parsePercent(x[1],n[1])]),a.setColor(l),a.setStyle(f);var S=t.getItemVisual(e,"opacity");null!=S&&(T.opacity=S);var A=c.findLabelValueDim(t);c.setTextToStyle(t,e,A,T,o,_,l),c.setTextToStyle(t,e,A,m,o,b,l),a.off("mouseover").off("mouseout").off("emphasis").off("normal"),a.hoverStyle=m,h.setHoverStyle(a);var I=r(n);if(w&&o.isAnimationEnabled()){var C=function(){var t=I[1]/I[0];this.animateTo({scale:[Math.max(1.1*I[0],I[0]+3),Math.max(1.1*I[1],I[1]+3*t)]},400,"elasticOut")},P=function(){this.animateTo({scale:I},400,"elasticOut")};a.on("mouseover",C).on("mouseout",P).on("emphasis",C).on("normal",P)}},f.fadeOut=function(t){var e=this.childAt(0);this.silent=e.silent=!0,e.style.text="",h.updateProps(e,{scale:[0,0]},this._seriesModel,this.dataIndex,t)},s.inherits(a,h.Group),t.exports=a},,,function(t,e,n){function i(t,e,n){return t.getCoordSysModel()===e}function r(t){var e,n=t.model,i=n.getFormattedLabels(),r=n.getModel("axisLabel.textStyle"),a=1,o=i.length;o>40&&(a=Math.ceil(o/40));for(var s=0;s<o;s+=a)if(!t.isLabelIgnored(s)){var l=r.getTextRect(i[s]);e?e.union(l):e=l}return e}function a(t,e,n){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,n),this.model=t}function o(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}function s(t,e){return c.map(y,function(e){var n=t.getReferringComponents(e)[0];return n})}function l(t){return"cartesian2d"===t.get("coordinateSystem")}var h=n(12),u=n(18),c=n(1),f=n(133),d=n(131),p=c.each,g=u.ifAxisCrossZero,v=u.niceScaleExtent;n(134);var m=a.prototype;m.type="grid",m.axisPointerEnabled=!0,m.getRect=function(){return this._rect},m.update=function(t,e){function n(t){var e=i[t];for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(r&&("category"===r.type||"time"===r.type||!g(r)))return!0}return!1}var i=this._axesMap;this._updateScale(t,this.model),p(i.x,function(t){v(t.scale,t.model)}),p(i.y,function(t){v(t.scale,t.model)}),p(i.x,function(t){n("y")&&(t.onZero=!1)}),p(i.y,function(t){n("x")&&(t.onZero=!1)}),this.resize(this.model,e)},m.resize=function(t,e){function n(){p(a,function(t){var e=t.isHorizontal(),n=e?[0,i.width]:[0,i.height],r=t.inverse?1:0;t.setExtent(n[r],n[1-r]),o(t,e?i.x:i.y)})}var i=h.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=i;var a=this._axesList;n(),t.get("containLabel")&&(p(a,function(t){if(!t.model.get("axisLabel.inside")){var e=r(t);if(e){var n=t.isHorizontal()?"height":"width",a=t.model.get("axisLabel.margin");i[n]-=e[n]+a,"top"===t.position?i.y+=e.height+a:"left"===t.position&&(i.x+=e.width+a)}}}),n())},m.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)if(n.hasOwnProperty(i))return n[i];return n[e]}},m.getAxes=function(){return this._axesList.slice()},m.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}c.isObject(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},m.getCartesians=function(){return this._coordsList.slice()},m.convertToPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},m.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},m._findConvertTarget=function(t,e){var n,i,r=e.seriesModel,a=e.xAxisModel||r&&r.getReferringComponents("xAxis")[0],o=e.yAxisModel||r&&r.getReferringComponents("yAxis")[0],s=e.gridModel,l=this._coordsList;if(r)n=r.coordinateSystem,c.indexOf(l,n)<0&&(n=null);else if(a&&o)n=this.getCartesian(a.componentIndex,o.componentIndex);else if(a)i=this.getAxis("x",a.componentIndex);else if(o)i=this.getAxis("y",o.componentIndex);else if(s){var h=s.coordinateSystem;h===this&&(n=this._coordsList[0])}return{cartesian:n,axis:i}},m.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},m._initCartesian=function(t,e,n){function r(n){return function(r,l){if(i(r,t,e)){var h=r.get("position");"x"===n?"top"!==h&&"bottom"!==h&&(h="bottom",a[h]&&(h="top"===h?"bottom":"top")):"left"!==h&&"right"!==h&&(h="left",a[h]&&(h="left"===h?"right":"left")),a[h]=!0;var c=new d(n,u.createScaleByModel(r),[0,0],r.get("type"),h),f="category"===c.type;c.onBand=f&&r.get("boundaryGap"),c.inverse=r.get("inverse"),c.onZero=r.get("axisLine.onZero"),r.axis=c,c.model=r,c.grid=this,c.index=l,this._axesList.push(c),o[n][l]=c,s[n]++}}}var a={left:!1,right:!1,top:!1,bottom:!1},o={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",r("x"),this),e.eachComponent("yAxis",r("y"),this),s.x&&s.y?(this._axesMap=o,void p(o.x,function(e,n){p(o.y,function(i,r){var a="x"+n+"y"+r,o=new f(a);o.grid=this,o.model=t,this._coordsMap[a]=o,this._coordsList.push(o),o.addAxis(e),o.addAxis(i)},this)},this)):(this._axesMap={},void(this._axesList=[]))},m._updateScale=function(t,e){function n(t,e,n){p(n.coordDimToDataDim(e.dim),function(n){e.scale.unionExtentFromData(t,n)})}c.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(r){if(l(r)){var a=s(r,t),o=a[0],h=a[1];if(!i(o,e,t)||!i(h,e,t))return;var u=this.getCartesian(o.componentIndex,h.componentIndex),c=r.getData(),f=u.getAxis("x"),d=u.getAxis("y");"list"===c.type&&(n(c,f,r),n(c,d,r))}},this)},m.getTooltipAxes=function(t){var e=[],n=[];return p(this.getCartesians(),function(i){var r=null!=t&&"auto"!==t?i.getAxis(t):i.getBaseAxis(),a=i.getOtherAxis(r);c.indexOf(e,r)<0&&e.push(r),c.indexOf(n,a)<0&&n.push(a)}),{baseAxes:e,otherAxes:n}};var y=["xAxis","yAxis"];a.create=function(t,e){var n=[];return t.eachComponent("grid",function(i,r){var o=new a(i,t,e);o.name="grid_"+r,i.coordinateSystem=o,n.push(o)}),t.eachSeries(function(e){if(l(e)){var n=s(e,t),i=n[0],r=n[1],a=i.getCoordSysModel(),o=a.coordinateSystem;e.coordinateSystem=o.getCartesian(i.componentIndex,r.componentIndex)}}),n},a.dimensions=a.prototype.dimensions=f.prototype.dimensions,n(26).register("cartesian2d",a),t.exports=a},function(t,e,n){"use strict";function i(t){return t>s||t<-s}var r=n(19),a=n(6),o=r.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},h=l.prototype;h.transform=null,h.needLocalTransform=function(){return i(this.rotation)||i(this.position[0])||i(this.position[1])||i(this.scale[0]-1)||i(this.scale[1]-1)},h.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;return n||e?(i=i||r.create(),n?this.getLocalTransform(i):o(i),e&&(n?r.mul(i,t.transform,i):r.copy(i,t.transform)),this.transform=i,this.invTransform=this.invTransform||r.create(),void r.invert(this.invTransform,i)):void(i&&o(i))},h.getLocalTransform=function(t){return l.getLocalTransform(this,t)},h.setTransform=function(t){var e=this.transform,n=t.dpr||1;e?t.setTransform(n*e[0],n*e[1],n*e[2],n*e[3],n*e[4],n*e[5]):t.setTransform(n,0,0,n,0,0)},h.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var u=[];h.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(r.mul(u,t.invTransform,e),e=u);var n=e[0]*e[0]+e[1]*e[1],a=e[2]*e[2]+e[3]*e[3],o=this.position,s=this.scale;i(n-1)&&(n=Math.sqrt(n)),i(a-1)&&(a=Math.sqrt(a)),e[0]<0&&(n=-n),e[3]<0&&(a=-a),o[0]=e[4],o[1]=e[5],s[0]=n,s[1]=a,this.rotation=Math.atan2(-e[1]/a,e[0]/n)}},h.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),n=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(n=-n),[e,n]},h.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&a.applyTransform(n,n,i),n},h.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&a.applyTransform(n,n,i),n},l.getLocalTransform=function(t,e){e=e||[],o(e);var n=t.origin,i=t.scale||[1,1],a=t.rotation||0,s=t.position||[0,0];return n&&(e[4]-=n[0],e[5]-=n[1]),r.scale(e,e,i),a&&r.rotate(e,e,a),n&&(e[4]+=n[0],e[5]+=n[1]),e[4]+=s[0],e[5]+=s[1],e},t.exports=l},function(t,e,n){var i=n(96),r=n(1),a=n(13),o=n(12),s=["value","category","time","log"];t.exports=function(t,e,n,l){r.each(s,function(a){e.extend({type:t+"Axis."+a,mergeDefaultAndTheme:function(e,i){var s=this.layoutMode,l=s?o.getLayoutParams(e):{},h=i.getTheme();r.merge(e,h.get(a+"Axis")),r.merge(e,this.getDefaultOption()),e.type=n(t,e),s&&o.mergeLayoutParam(e,l,s)},defaultOption:r.mergeAll([{},i[a+"Axis"],l],!0)})}),a.registerSubTypeDefaulter(t+"Axis",r.curry(n,t))}},function(t,e,n){"use strict";function i(t,e){return e.type||(e.data?"category":"value")}var r=n(13),a=n(1),o=n(59),s=r.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});a.merge(s.prototype,n(42));var l={offset:0};o("x",s,i,l),o("y",s,i,l),t.exports=s},function(t,e){t.exports=function(t,e){e.eachSeriesByType(t,function(t){var e=t.getData(),n=t.coordinateSystem;if(n){for(var i=[],r=n.dimensions,a=0;a<r.length;a++)i.push(t.coordDimToDataDim(n.dimensions[a])[0]);1===i.length?e.each(i[0],function(t,i){e.setItemLayout(i,isNaN(t)?[NaN,NaN]:n.dataToPoint(t))}):2===i.length&&e.each(i,function(t,i,r){e.setItemLayout(r,isNaN(t)||isNaN(i)?[NaN,NaN]:n.dataToPoint([t,i]))},!0)}})}},function(t,e,n){var i=n(15),r=i.set,a=i.get;t.exports={clearColorPalette:function(){r(this,"colorIdx",0),r(this,"colorNameMap",{})},getColorFromPalette:function(t,e){e=e||this;var n=a(e,"colorIdx")||0,i=a(e,"colorNameMap")||r(e,"colorNameMap",{});if(i.hasOwnProperty(t))return i[t];var o=this.get("color",!0)||[];if(o.length){var s=o[n];return t&&(i[t]=s),r(e,"colorIdx",(n+1)%o.length),s}}}},function(t,e){t.exports=function(t,e){var n=e.findComponents({mainType:"legend"});n&&n.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var i=e.getName(t),r=0;r<n.length;r++)if(!n[r].isSelected(i))return!1;return!0},this)},this)}},function(t,e,n){function i(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}var r=n(4),a=r.round,o={};o.intervalScaleNiceTicks=function(t,e,n){var i={},s=t[1]-t[0],l=i.interval=r.nice(s/e,!0);null!=n&&l<n&&(l=i.interval=n);var h=i.intervalPrecision=r.getPrecisionSafe(l)+2,u=i.niceTickExtent=[a(Math.ceil(t[0]/l)*l,h),a(Math.floor(t[1]/l)*l,h)];return o.fixExtent(u,t),i},o.fixExtent=function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),i(t,0,e),i(t,1,e),t[0]>t[1]&&(t[0]=t[1])},o.intervalScaleGetTicks=function(t,e,n,i){var r=[];if(!t)return r;var o=1e4;e[0]<n[0]&&r.push(e[0]);for(var s=n[0];s<=n[1]&&(r.push(s),s=a(s+t,i),s!==r[r.length-1]);)if(r.length>o)return[];return e[1]>(r.length?r[r.length-1]:n[1])&&r.push(e[1]),r},t.exports=o},function(t,e,n){var i=n(36),r=n(49),a=n(15),o=function(){this.group=new i,this.uid=r.getUID("viewComponent")};o.prototype={constructor:o,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){}};var s=o.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,n,i){},a.enableClassExtend(o),a.enableClassManagement(o,{registerWhenExtend:!0}),t.exports=o},function(t,e,n){"use strict";var i=n(71),r=n(23),a=n(58),o=n(178),s=n(1),l=function(t){a.call(this,t),r.call(this,t),o.call(this,t),this.id=t.id||i()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;n||(n=this.transform=[1,0,0,1,0,0]),n[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];n||(n=this[t]=[]),n[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){
+var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},s.mixin(l,o),s.mixin(l,a),s.mixin(l,r),t.exports=l},function(t,e,n){function i(t,e){return t[e]}function r(t,e,n){t[e]=n}function a(t,e,n){return(e-t)*n+t}function o(t,e,n){return n>.5?e:t}function s(t,e,n,i,r){var o=t.length;if(1==r)for(var s=0;s<o;s++)i[s]=a(t[s],e[s],n);else for(var l=o&&t[0].length,s=0;s<o;s++)for(var h=0;h<l;h++)i[s][h]=a(t[s][h],e[s][h],n)}function l(t,e,n){var i=t.length,r=e.length;if(i!==r){var a=i>r;if(a)t.length=r;else for(var o=i;o<r;o++)t.push(1===n?e[o]:_.call(e[o]))}for(var s=t[0]&&t[0].length,o=0;o<t.length;o++)if(1===n)isNaN(t[o])&&(t[o]=e[o]);else for(var l=0;l<s;l++)isNaN(t[o][l])&&(t[o][l]=e[o][l])}function h(t,e,n){if(t===e)return!0;var i=t.length;if(i!==e.length)return!1;if(1===n){for(var r=0;r<i;r++)if(t[r]!==e[r])return!1}else for(var a=t[0].length,r=0;r<i;r++)for(var o=0;o<a;o++)if(t[r][o]!==e[r][o])return!1;return!0}function u(t,e,n,i,r,a,o,s,l){var h=t.length;if(1==l)for(var u=0;u<h;u++)s[u]=c(t[u],e[u],n[u],i[u],r,a,o);else for(var f=t[0].length,u=0;u<h;u++)for(var d=0;d<f;d++)s[u][d]=c(t[u][d],e[u][d],n[u][d],i[u][d],r,a,o)}function c(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function f(t){if(x(t)){var e=t.length;if(x(t[0])){for(var n=[],i=0;i<e;i++)n.push(_.call(t[i]));return n}return _.call(t)}return t}function d(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t){var e=t[t.length-1].value;return x(e&&e[0])?2:1}function g(t,e,n,i,r){var f=t._getter,g=t._setter,y="spline"===e,_=i.length;if(_){var b,w=i[0].value,M=x(w),T=!1,S=!1,A=M?p(i):0;i.sort(function(t,e){return t.time-e.time}),b=i[_-1].time;for(var I=[],C=[],P=i[0].value,L=!0,k=0;k<_;k++){I.push(i[k].time/b);var D=i[k].value;if(M&&h(D,P,A)||!M&&D===P||(L=!1),P=D,"string"==typeof D){var O=m.parse(D);O?(D=O,T=!0):S=!0}C.push(D)}if(!L){for(var E=C[_-1],k=0;k<_-1;k++)M?l(C[k],E,A):!isNaN(C[k])||isNaN(E)||S||T||(C[k]=E);M&&l(f(t._target,r),E,A);var z,N,R,B,F,G,V=0,H=0;if(T)var q=[0,0,0,0];var W=function(t,e){var n;if(e<0)n=0;else if(e<H){for(z=Math.min(V+1,_-1),n=z;n>=0&&!(I[n]<=e);n--);n=Math.min(n,_-2)}else{for(n=V;n<_&&!(I[n]>e);n++);n=Math.min(n-1,_-2)}V=n,H=e;var i=I[n+1]-I[n];if(0!==i)if(N=(e-I[n])/i,y)if(B=C[n],R=C[0===n?n:n-1],F=C[n>_-2?_-1:n+1],G=C[n>_-3?_-1:n+2],M)u(R,B,F,G,N,N*N,N*N*N,f(t,r),A);else{var l;if(T)l=u(R,B,F,G,N,N*N,N*N*N,q,1),l=d(q);else{if(S)return o(B,F,N);l=c(R,B,F,G,N,N*N,N*N*N)}g(t,r,l)}else if(M)s(C[n],C[n+1],N,f(t,r),A);else{var l;if(T)s(C[n],C[n+1],N,q,1),l=d(q);else{if(S)return o(C[n],C[n+1],N);l=a(C[n],C[n+1],N)}g(t,r,l)}},j=new v({target:t._target,life:b,loop:t._loop,delay:t._delay,onframe:W,ondestroy:n});return e&&"spline"!==e&&(j.easing=e),j}}}var v=n(157),m=n(22),y=n(1),x=y.isArrayLike,_=Array.prototype.slice,b=function(t,e,n,a){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||i,this._setter=a||r,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};b.prototype={when:function(t,e){var n=this._tracks;for(var i in e)if(e.hasOwnProperty(i)){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:f(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,n=0;n<e;n++)t[n].call(this)},start:function(t){var e,n=this,i=0,r=function(){i--,i||n._doneCallback()};for(var a in this._tracks)if(this._tracks.hasOwnProperty(a)){var o=g(this,t,r,this._tracks[a],a);o&&(this._clipList.push(o),i++,this.animation&&this.animation.addClip(o),e=o)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var i=0;i<n._onframeList.length;i++)n._onframeList[i](t,e)}}return i||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,n=this.animation,i=0;i<e.length;i++){var r=e[i];t&&r.onframe(this._target,1),n&&n.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}},t.exports=b},function(t,e){t.exports="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)}},function(t,e){var n=2*Math.PI;t.exports={normalizeRadian:function(t){return t%=n,t<0&&(t+=n),t}}},function(t,e){var n=function(){this.head=null,this.tail=null,this._len=0},i=n.prototype;i.insert=function(t){var e=new r(t);return this.insertEntry(e),e},i.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},i.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},i.len=function(){return this._len},i.clear=function(){this.head=this.tail=null,this._len=0};var r=function(t){this.value=t,this.next,this.prev},a=function(t){this._list=new n,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},o=a.prototype;o.put=function(t,e){var n=this._list,i=this._map,a=null;if(null==i[t]){var o=n.len(),s=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var l=n.head;n.remove(l),delete i[l.key],a=l.value,this._lastRemovedEntry=l}s?s.value=e:s=new r(e),s.key=t,n.insertEntry(s),i[t]=s}return a},o.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},o.clear=function(){this._list.clear(),this._map={}},t.exports=a},function(t,e){var n=2311;t.exports=function(){return n++}},function(t,e){var n=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};n.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")},t.exports=n},function(t,e){function n(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,a=null==e.y?0:e.y,o=null==e.y2?0:e.y2;e.global||(i=i*n.width+n.x,r=r*n.width+n.x,a=a*n.height+n.y,o=o*n.height+n.y);var s=t.createLinearGradient(i,a,r,o);return s}function i(t,e,n){var i=n.width,r=n.height,a=Math.min(i,r),o=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;e.global||(o=o*i+n.x,s=s*r+n.y,l*=a);var h=t.createRadialGradient(o,s,0,o,s,l);return h}var r=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],a=function(t){this.extendFrom(t)};a.prototype={constructor:a,fill:"#000000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,textFill:"#000",textStroke:null,textPosition:"inside",textOffset:null,textBaseline:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textTransform:!1,textRotation:0,blend:null,bind:function(t,e,n){for(var i=this,a=n&&n.style,o=!a,s=0;s<r.length;s++){var l=r[s],h=l[0];(o||i[h]!==a[h])&&(t[h]=i[h]||l[1])}if((o||i.fill!==a.fill)&&(t.fillStyle=i.fill),(o||i.stroke!==a.stroke)&&(t.strokeStyle=i.stroke),(o||i.opacity!==a.opacity)&&(t.globalAlpha=null==i.opacity?1:i.opacity),(o||i.blend!==a.blend)&&(t.globalCompositeOperation=i.blend||"source-over"),this.hasStroke()){var u=i.lineWidth;t.lineWidth=u/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t){var n=this;for(var i in t)!t.hasOwnProperty(i)||!e&&n.hasOwnProperty(i)||(n[i]=t[i])}},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,r){for(var a="radial"===e.type?i:n,o=a(t,e,r),s=e.colorStops,l=0;l<s.length;l++)o.addColorStop(s[l].offset,s[l].color);return o}};for(var o=a.prototype,s=0;s<r.length;s++){var l=r[s];l[0]in o||(o[l[0]]=l[1])}a.getGradient=o.getGradient,t.exports=a},function(t,e,n){var i=n(168),r=n(167);t.exports={buildPath:function(t,e,n){var a=e.points,o=e.smooth;if(a&&a.length>=2){if(o&&"spline"!==o){var s=r(a,o,n,e.smoothConstraint);t.moveTo(a[0][0],a[0][1]);for(var l=a.length,h=0;h<(n?l:l-1);h++){var u=s[2*h],c=s[2*h+1],f=a[(h+1)%l];t.bezierCurveTo(u[0],u[1],c[0],c[1],f[0],f[1])}}else{"spline"===o&&(a=i(a,n)),t.moveTo(a[0][0],a[0][1]);for(var h=1,d=a.length;h<d;h++)t.lineTo(a[h][0],a[h][1])}n&&t.closePath()}}}},function(t,e,n){var i=n(1),r={};r.layout=function(t,e,n){function r(t,e){var n=a.getAxis(t);return n.toGlobalCoord(n.dataToCoord(0))}n=n||{};var a=t.coordinateSystem,o=e.axis,s={},l=o.position,h=o.onZero?"onZero":l,u=o.dim,c=a.getRect(),f=[c.x,c.x+c.width,c.y,c.y+c.height],d=e.get("offset")||0,p={x:{top:f[2]-d,bottom:f[3]+d},y:{left:f[0]-d,right:f[1]+d}};p.x.onZero=Math.max(Math.min(r("y"),p.x.bottom),p.x.top),p.y.onZero=Math.max(Math.min(r("x"),p.y.right),p.y.left),s.position=["y"===u?p.y[h]:f[0],"x"===u?p.x[h]:f[3]],s.rotation=Math.PI/2*("x"===u?0:1);var g={top:-1,bottom:1,left:-1,right:1};s.labelDirection=s.tickDirection=s.nameDirection=g[l],s.labelOffset=o.onZero?p[u][l]-p[u].onZero:0,e.get("axisTick.inside")&&(s.tickDirection=-s.tickDirection),i.retrieve(n.labelInside,e.get("axisLabel.inside"))&&(s.labelDirection=-s.labelDirection);var v=e.get("axisLabel.rotate");return s.labelRotate="top"===h?-v:v,s.labelInterval=o.getLabelInterval(),s.z2=1,s},t.exports=r},,,function(t,e,n){var i=n(1);t.exports={updateSelectedMap:function(t){this._selectTargetMap=i.reduce(t||[],function(t,e){return t.set(e.name,e),t},i.createHashMap())},select:function(t){var e=this._selectTargetMap,n=e.get(t),i=this.get("selectedMode");"single"===i&&e.each(function(t){t.selected=!1}),n&&(n.selected=!0)},unSelect:function(t){var e=this._selectTargetMap.get(t);e&&(e.selected=!1)},toggleSelected:function(t){var e=this._selectTargetMap.get(t);if(null!=e)return this[e.selected?"unSelect":"select"](t),e.selected},isSelected:function(t){var e=this._selectTargetMap.get(t);return e&&e.selected}}},,,,function(t,e,n){"use strict";function i(t){return t.get("stack")||f+t.seriesIndex}function r(t){return t.dim+t.index}function a(t,e){var n=[],i=t.axis,r="axis0";if("category"===i.type){for(var a=i.getBandWidth(),o=0;o<t.count;o++)n.push(h.defaults({bandWidth:a,axisKey:r,stackId:f+o},t));for(var l=s(n,e),u=[],o=0;o<t.count;o++){var c=l[r][f+o];c.offsetCenter=c.offset+c.width/2,u.push(c)}return u}}function o(t,e){var n=h.map(t,function(t){var e=t.getData(),n=t.coordinateSystem,a=n.getBaseAxis(),o=a.getExtent(),s="category"===a.type?a.getBandWidth():Math.abs(o[1]-o[0])/e.count(),l=c(t.get("barWidth"),s),h=c(t.get("barMaxWidth"),s),u=t.get("barGap"),f=t.get("barCategoryGap");return{bandWidth:s,barWidth:l,barMaxWidth:h,barGap:u,barCategoryGap:f,axisKey:r(a),stackId:i(t)}});return s(n,e)}function s(t,e){var n={};h.each(t,function(t,e){var i=t.axisKey,r=t.bandWidth,a=n[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},o=a.stacks;n[i]=a;var s=t.stackId;o[s]||a.autoWidthCount++,o[s]=o[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!o[s].width&&(l=Math.min(a.remainedWidth,l),o[s].width=l,a.remainedWidth-=l);var h=t.barMaxWidth;h&&(o[s].maxWidth=h);var u=t.barGap;null!=u&&(a.gap=u);var c=t.barCategoryGap;null!=c&&(a.categoryGap=c)});var i={};return h.each(n,function(t,e){i[e]={};var n=t.stacks,r=t.bandWidth,a=c(t.categoryGap,r),o=c(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,u=(s-a)/(l+(l-1)*o);u=Math.max(u,0),h.each(n,function(t,e){var n=t.maxWidth;n&&n<u&&(n=Math.min(n,s),t.width&&(n=Math.min(n,t.width)),s-=n,t.width=n,l--)}),u=(s-a)/(l+(l-1)*o),u=Math.max(u,0);var f,d=0;h.each(n,function(t,e){t.width||(t.width=u),f=t,d+=t.width*(1+o)}),f&&(d-=f.width*o);var p=-d/2;h.each(n,function(t,n){i[e][n]=i[e][n]||{offset:p,width:t.width},p+=t.width*(1+o)})}),i}function l(t,e,n){var a=o(h.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),s={},l={};e.eachSeriesByType(t,function(t){if("cartesian2d"===t.coordinateSystem.type){var e=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),h=i(t),u=a[r(o)][h],c=u.offset,f=u.width,d=n.getOtherAxis(o),p=t.get("barMinHeight")||0,g=o.onZero?d.toGlobalCoord(d.dataToCoord(0)):d.getGlobalExtent()[0],v=n.dataToPoints(e,!0);s[h]=s[h]||[],l[h]=l[h]||[],e.setLayout({offset:c,size:f}),e.each(d.dim,function(t,n){if(!isNaN(t)){s[h][n]||(s[h][n]={p:g,n:g},l[h][n]={p:g,n:g});var i,r,a,o,u=t>=0?"p":"n",m=v[n],y=s[h][n][u],x=l[h][n][u];d.isHorizontal()?(i=y,r=m[1]+c,a=m[0]-x,o=f,l[h][n][u]+=a,Math.abs(a)<p&&(a=(a<0?-1:1)*p),s[h][n][u]+=a):(i=m[0]+c,r=y,a=f,o=m[1]-x,l[h][n][u]+=o,Math.abs(o)<p&&(o=(o<=0?-1:1)*p),s[h][n][u]+=o),e.setItemLayout(n,{x:i,y:r,width:a,height:o})}},!0)}},this)}var h=n(1),u=n(4),c=u.parsePercent,f="__ec_stack_";l.getLayoutOnAxis=a,t.exports=l},,function(t,e){t.exports=function(t,e){var n={};e.eachRawSeriesByType(t,function(t){var i=t.getRawData(),r={};if(!e.isSeriesFiltered(t)){var a=t.getData();a.each(function(t){var e=a.getRawIndex(t);r[e]=t}),i.each(function(e){var o=r[e],s=null!=o&&a.getItemVisual(o,"color",!0);if(s)i.setItemVisual(e,"color",s);else{var l=i.getItemModel(e),h=l.get("itemStyle.normal.color")||t.getColorFromPalette(i.getName(e),n);i.setItemVisual(e,"color",h),null!=o&&a.setItemVisual(o,"color",h)}})}})}},function(t,e,n){var i=n(6),r=n(20),a={},o=Math.min,s=Math.max,l=Math.sin,h=Math.cos,u=i.create(),c=i.create(),f=i.create(),d=2*Math.PI;a.fromPoints=function(t,e,n){if(0!==t.length){var i,r=t[0],a=r[0],l=r[0],h=r[1],u=r[1];for(i=1;i<t.length;i++)r=t[i],a=o(a,r[0]),l=s(l,r[0]),h=o(h,r[1]),u=s(u,r[1]);e[0]=a,e[1]=h,n[0]=l,n[1]=u}},a.fromLine=function(t,e,n,i,r,a){r[0]=o(t,n),r[1]=o(e,i),a[0]=s(t,n),a[1]=s(e,i)};var p=[],g=[];a.fromCubic=function(t,e,n,i,a,l,h,u,c,f){var d,v=r.cubicExtrema,m=r.cubicAt,y=v(t,n,a,h,p);for(c[0]=1/0,c[1]=1/0,f[0]=-(1/0),f[1]=-(1/0),d=0;d<y;d++){var x=m(t,n,a,h,p[d]);c[0]=o(x,c[0]),f[0]=s(x,f[0])}for(y=v(e,i,l,u,g),d=0;d<y;d++){var _=m(e,i,l,u,g[d]);c[1]=o(_,c[1]),f[1]=s(_,f[1])}c[0]=o(t,c[0]),f[0]=s(t,f[0]),c[0]=o(h,c[0]),f[0]=s(h,f[0]),c[1]=o(e,c[1]),f[1]=s(e,f[1]),c[1]=o(u,c[1]),f[1]=s(u,f[1])},a.fromQuadratic=function(t,e,n,i,a,l,h,u){var c=r.quadraticExtremum,f=r.quadraticAt,d=s(o(c(t,n,a),1),0),p=s(o(c(e,i,l),1),0),g=f(t,n,a,d),v=f(e,i,l,p);h[0]=o(t,a,g),h[1]=o(e,l,v),u[0]=s(t,a,g),u[1]=s(e,l,v)},a.fromArc=function(t,e,n,r,a,o,s,p,g){var v=i.min,m=i.max,y=Math.abs(a-o);if(y%d<1e-4&&y>1e-4)return p[0]=t-n,p[1]=e-r,g[0]=t+n,void(g[1]=e+r);if(u[0]=h(a)*n+t,u[1]=l(a)*r+e,c[0]=h(o)*n+t,c[1]=l(o)*r+e,v(p,u,c),m(g,u,c),a%=d,a<0&&(a+=d),o%=d,o<0&&(o+=d),a>o&&!s?o+=d:a<o&&s&&(a+=d),s){var x=o;o=a,a=x}for(var _=0;_<o;_+=Math.PI/2)_>a&&(f[0]=h(_)*n+t,f[1]=l(_)*r+e,v(p,f,p),m(g,f,g))},t.exports=a},function(t,e,n){var i=n(38),r=n(1),a=n(16),o=function(t){i.call(this,t)};o.prototype={constructor:o,type:"text",brush:function(t,e){var n=this.style,i=n.x||0,r=n.y||0,o=n.text;if(null!=o&&(o+=""),n.bind(t,this,e),o){this.setTransform(t);var s,l=n.textAlign,h=n.textFont||n.font;if(n.textVerticalAlign){var u=a.getBoundingRect(o,h,n.textAlign,"top");switch(s="middle",n.textVerticalAlign){case"middle":r-=u.height/2-u.lineHeight/2;break;case"bottom":r-=u.height-u.lineHeight/2;break;default:r+=u.lineHeight/2}}else s=n.textBaseline;t.font=h||"12px sans-serif",t.textAlign=l||"left",t.textAlign!==l&&(t.textAlign="left"),t.textBaseline=s||"alphabetic",t.textBaseline!==s&&(t.textBaseline="alphabetic");for(var c=a.measureText("国",t.font).width,f=o.split("\n"),d=0;d<f.length;d++)n.hasStroke()&&t.strokeText(f[d],i,r),n.hasFill()&&t.fillText(f[d],i,r),r+=c;this.restoreTransform(t)}},getBoundingRect:function(){var t=this.style;if(!this._rect){var e=t.textVerticalAlign,n=a.getBoundingRect(t.text+"",t.textFont||t.font,t.textAlign,e?"top":t.textBaseline);switch(e){case"middle":n.y-=n.height/2;break;case"bottom":n.y-=n.height}if(n.x+=t.x||0,n.y+=t.y||0,t.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect}},r.inherits(o,i),t.exports=o},function(t,e,n){function i(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}var r=n(16),a=n(11),o=new a,s=function(){};s.prototype={constructor:s,drawRectText:function(t,e,n){var a=this.style,s=a.text;if(null!=s&&(s+=""),s){t.save();var l,h,u=a.textPosition,c=a.textOffset,f=a.textDistance,d=a.textAlign,p=a.textFont||a.font,g=a.textBaseline,v=a.textVerticalAlign;n=n||r.getBoundingRect(s,p,d,g);var m=this.transform;if(a.textTransform?this.setTransform(t):m&&(o.copy(e),o.applyTransform(m),e=o),u instanceof Array){if(l=e.x+i(u[0],e.width),h=e.y+i(u[1],e.height),d=d||"left",g=g||"top",v){switch(v){case"middle":h-=n.height/2-n.lineHeight/2;break;case"bottom":h-=n.height-n.lineHeight/2;break;default:h+=n.lineHeight/2}g="middle"}}else{var y=r.adjustTextPositionOnRect(u,e,n,f);l=y.x,h=y.y,d=d||y.textAlign,g=g||y.textBaseline}c&&(l+=c[0],h+=c[1]),t.textAlign=d||"left",t.textBaseline=g||"alphabetic";var x=a.textFill,_=a.textStroke;x&&(t.fillStyle=x),_&&(t.strokeStyle=_),t.font=p||"12px sans-serif",t.shadowBlur=a.textShadowBlur,t.shadowColor=a.textShadowColor||"transparent",t.shadowOffsetX=a.textShadowOffsetX,t.shadowOffsetY=a.textShadowOffsetY;var b=s.split("\n");a.textRotation&&(m&&t.translate(m[4],m[5]),t.rotate(a.textRotation),m&&t.translate(-m[4],-m[5]));for(var w=0;w<b.length;w++)_&&t.strokeText(b[w],l,h),x&&t.fillText(b[w],l,h),h+=n.lineHeight;t.restore()}}},t.exports=s},function(t,e,n){function i(t){delete d[t]}/*!
 	 * ZRender, a high performance 2d drawing library.
 	 *
 	 * Copyright (c) 2013, Baidu Inc.
@@ -20,7 +20,6 @@
 	 * LICENSE
 	 * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt
 	 */
-var r=n(70),a=n(9),o=n(1),s=n(152),l=n(155),h=n(156),u=n(163),c=!a.canvasSupported,f={canvas:n(154)},d={},p={};p.version="3.4.4",p.init=function(t,e){var n=new g(r(),t,e);return d[n.id]=n,n},p.dispose=function(t){if(t)t.dispose();else{for(var e in d)d.hasOwnProperty(e)&&d[e].dispose();d={}}return p},p.getInstance=function(t){return d[t]},p.registerPainter=function(t,e){f[t]=e};var g=function(t,e,n){n=n||{},this.dom=e,this.id=t;var i=this,r=new l,d=n.renderer;if(c){if(!f.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");d="vml"}else d&&f[d]||(d="canvas");var p=new f[d](e,r,n);this.storage=r,this.painter=p;var g=a.node?null:new u(p.getViewportRoot());this.handler=new s(r,p,g,p.root),this.animation=new h({stage:{update:o.bind(this.flush,this)}}),this.animation.start(),this._needsRefresh;var v=r.delFromStorage,m=r.addToStorage;r.delFromStorage=function(t){v.call(r,t),t&&t.removeSelfFromZr(i)},r.addToStorage=function(t){m.call(r,t),t.addSelfToZr(i)}};g.prototype={constructor:g,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,n){this.handler.on(t,e,n)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,i(this.id)}},t.exports=p},function(t,e,n){var i=n(2),r=n(1);t.exports=function(t,e){r.each(e,function(e){e.update="updateView",i.registerAction(e,function(n,i){var r={};return i.eachComponent({mainType:"series",subType:t,query:n},function(t){t[e.method]&&t[e.method](n.name);var i=t.getData();i.each(function(e){var n=i.getName(e);r[n]=t.isSelected(n)||!1})}),{name:n.name,selected:r}})})}},function(t,e,n){"use strict";var i=n(18),r=n(28);t.exports=i.extend({type:"series.__base_bar__",getInitialData:function(t,e){return r(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(t,!0),i=this.getData(),r=i.getLayout("offset"),a=i.getLayout("size"),o=e.getBaseAxis().isHorizontal()?0:1;return n[o]+=r+a/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,itemStyle:{normal:{},emphasis:{}}}})},function(t,e,n){function i(t,e,n,i,r){a.setText(t,e,n),t.text=i,"outside"===t.textPosition&&(t.textPosition=r)}var r=n(1),a=n(3),o={};o.setLabel=function(t,e,n,a,o,s,l){var h=n.getModel("label.normal"),u=n.getModel("label.emphasis");h.get("show")?i(t,h,a,r.retrieve(o.getFormattedLabel(s,"normal"),o.getRawValue(s)),l):t.text="",u.get("show")?i(e,u,a,r.retrieve(o.getFormattedLabel(s,"emphasis"),o.getRawValue(s)),l):e.text=""},t.exports=o},function(t,e,n){function i(t){return isNaN(t[0])||isNaN(t[1])}function r(t,e,n,r,a,o,g,v,m,y,x){for(var _=0,b=n,w=0;w<r;w++){var M=e[b];if(b>=a||b<0)break;if(i(M)){if(x){b+=o;continue}break}if(b===n)t[o>0?"moveTo":"lineTo"](M[0],M[1]),c(d,M);else if(m>0){var T=b+o,S=e[T];if(x)for(;S&&i(e[T]);)T+=o,S=e[T];var A=.5,C=e[_],S=e[T];if(!S||i(S))c(p,M);else{i(S)&&!x&&(S=M),s.sub(f,S,C);var I,P;if("x"===y||"y"===y){var L="x"===y?0:1;I=Math.abs(M[L]-C[L]),P=Math.abs(M[L]-S[L])}else I=s.dist(M,C),P=s.dist(M,S);A=P/(P+I),u(p,M,f,-m*(1-A))}l(d,d,v),h(d,d,g),l(p,p,v),h(p,p,g),t.bezierCurveTo(d[0],d[1],p[0],p[1],M[0],M[1]),u(d,M,f,m*A)}else t.lineTo(M[0],M[1]);_=b,b+=o}return w}function a(t,e){var n=[1/0,1/0],i=[-(1/0),-(1/0)];if(e)for(var r=0;r<t.length;r++){var a=t[r];a[0]<n[0]&&(n[0]=a[0]),a[1]<n[1]&&(n[1]=a[1]),a[0]>i[0]&&(i[0]=a[0]),a[1]>i[1]&&(i[1]=a[1])}return{min:e?n:i,max:e?i:n}}var o=n(8),s=n(5),l=s.min,h=s.max,u=s.scaleAndAdd,c=s.copy,f=[],d=[],p=[];t.exports={Polyline:o.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},buildPath:function(t,e){var n=e.points,o=0,s=n.length,l=a(n,e.smoothConstraint);if(e.connectNulls){for(;s>0&&i(n[s-1]);s--);for(;o<s&&i(n[o]);o++);}for(;o<s;)o+=r(t,n,o,s,s,1,l.min,l.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),Polygon:o.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},buildPath:function(t,e){var n=e.points,o=e.stackedOnPoints,s=0,l=n.length,h=e.smoothMonotone,u=a(n,e.smoothConstraint),c=a(o,e.smoothConstraint);if(e.connectNulls){for(;l>0&&i(n[l-1]);l--);for(;s<l&&i(n[s]);s++);}for(;s<l;){var f=r(t,n,s,l,l,1,u.min,u.max,e.smooth,h,e.connectNulls);r(t,o,s+f-1,f,l,-1,c.min,c.max,e.stackedOnSmooth,h,e.connectNulls),s+=f+1,t.closePath()}}})}},,,function(t,e,n){var i=n(1),r={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,textStyle:{fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},a=i.merge({boundaryGap:!0,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},r),o=i.merge({boundaryGap:[0,0],splitNumber:5},r),s=i.defaults({scale:!0,min:"dataMin",max:"dataMax"},o),l=i.defaults({logBase:10},o);l.scale=!0,t.exports={categoryAxis:a,valueAxis:o,timeAxis:s,logAxis:l}},function(t,e,n){"use strict";function i(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}function r(t){return t.dim+t.index}function a(t,e){var n={};s.each(t,function(t,e){var a=t.getData(),o=t.coordinateSystem,s=o.getBaseAxis(),l=s.getExtent(),u="category"===s.type?s.getBandWidth():Math.abs(l[1]-l[0])/a.count(),c=n[r(s)]||{bandWidth:u,remainedWidth:u,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},f=c.stacks;n[r(s)]=c;var d=i(t);f[d]||c.autoWidthCount++,f[d]=f[d]||{width:0,maxWidth:0};var p=h(t.get("barWidth"),u),g=h(t.get("barMaxWidth"),u),v=t.get("barGap"),m=t.get("barCategoryGap");p&&!f[d].width&&(p=Math.min(c.remainedWidth,p),f[d].width=p,c.remainedWidth-=p),g&&(f[d].maxWidth=g),null!=v&&(c.gap=v),null!=m&&(c.categoryGap=m)});var a={};return s.each(n,function(t,e){a[e]={};var n=t.stacks,i=t.bandWidth,r=h(t.categoryGap,i),o=h(t.gap,1),l=t.remainedWidth,u=t.autoWidthCount,c=(l-r)/(u+(u-1)*o);c=Math.max(c,0),s.each(n,function(t,e){var n=t.maxWidth;n&&n<c&&(n=Math.min(n,l),t.width&&(n=Math.min(n,t.width)),l-=n,t.width=n,u--)}),c=(l-r)/(u+(u-1)*o),c=Math.max(c,0);var f,d=0;s.each(n,function(t,e){t.width||(t.width=c),f=t,d+=t.width*(1+o)}),f&&(d-=f.width*o);var p=-d/2;s.each(n,function(t,n){a[e][n]=a[e][n]||{offset:p,width:t.width},p+=t.width*(1+o)})}),a}function o(t,e,n){var o=a(s.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),l={},h={};e.eachSeriesByType(t,function(t){var e=t.getData(),n=t.coordinateSystem,a=n.getBaseAxis(),s=i(t),u=o[r(a)][s],c=u.offset,f=u.width,d=n.getOtherAxis(a),p=t.get("barMinHeight")||0,g=a.onZero?d.toGlobalCoord(d.dataToCoord(0)):d.getGlobalExtent()[0],v=n.dataToPoints(e,!0);l[s]=l[s]||[],h[s]=h[s]||[],e.setLayout({offset:c,size:f}),e.each(d.dim,function(t,n){if(!isNaN(t)){l[s][n]||(l[s][n]={p:g,n:g},h[s][n]={p:g,n:g});var i,r,a,o,u=t>=0?"p":"n",m=v[n],y=l[s][n][u],x=h[s][n][u];d.isHorizontal()?(i=y,r=m[1]+c,a=m[0]-x,o=f,h[s][n][u]+=a,Math.abs(a)<p&&(a=(a<0?-1:1)*p),l[s][n][u]+=a):(i=m[0]+c,r=y,a=f,o=m[1]-x,h[s][n][u]+=o,Math.abs(o)<p&&(o=(o<=0?-1:1)*p),l[s][n][u]+=o),e.setItemLayout(n,{x:i,y:r,width:a,height:o})}},!0)},this)}var s=n(1),l=n(4),h=l.parsePercent;t.exports=o},function(t,e){t.exports={containStroke:function(t,e,n,i,r,a,o){if(0===r)return!1;var s=r,l=0,h=t;if(o>e+s&&o>i+s||o<e-s&&o<i-s||a>t+s&&a>n+s||a<t-s&&a<n-s)return!1;if(t===n)return Math.abs(a-t)<=s/2;l=(e-i)/(t-n),h=(t*i-n*e)/(t-n);var u=l*a-o+h,c=u*u/(l*l+1);return c<=s/2*s/2}}},function(t,e,n){var i=n(20);t.exports={containStroke:function(t,e,n,r,a,o,s,l,h){if(0===s)return!1;var u=s;if(h>e+u&&h>r+u&&h>o+u||h<e-u&&h<r-u&&h<o-u||l>t+u&&l>n+u&&l>a+u||l<t-u&&l<n-u&&l<a-u)return!1;var c=i.quadraticProjectPoint(t,e,n,r,a,o,l,h,null);return c<=u/2}}},function(t,e){t.exports=function(t,e,n,i,r,a){if(a>e&&a>i||a<e&&a<i)return 0;if(i===e)return 0;var o=i<e?1:-1,s=(a-e)/(i-e);1!==s&&0!==s||(o=i<e?.5:-.5);var l=s*(n-t)+t;return l>r?o:0}},function(t,e,n){"use strict";var i=n(1),r=n(39),a=function(t,e,n,i,a,o){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==i?0:i,this.type="linear",this.global=o||!1,r.call(this,a)};a.prototype={constructor:a},i.inherits(a,r),t.exports=a},function(t,e,n){"use strict";function i(t){r.each(a,function(e){this[e]=r.bind(t[e],t)},this)}var r=n(1),a=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"];t.exports=i},function(t,e,n){var i=n(1);n(56),n(102),n(103);var r=n(95),a=n(2);a.registerLayout(i.curry(r,"bar")),a.registerVisual(function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),n(32)},function(t,e,n){t.exports=n(89).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"})},function(t,e,n){"use strict";function i(t,e,n,i,r,a,o){var s=new h.Rect({shape:l.extend({},i)});if(a){var u=s.shape,c=r?"height":"width",f={};u[c]=0,f[c]=i[c],h[o?"updateProps":"initProps"](s,{shape:f},a,e)}return s}function r(t,e,n){n.style.text="",h.updateProps(n,{shape:{width:0}},e,t,function(){n.parent&&n.parent.remove(n)})}function a(t,e,n){var i=t.getItemLayout(e),r=s(n,i),a=i.width>0?1:-1,o=i.height>0?1:-1;return{x:i.x+a*r/2,y:i.y+o*r/2,width:i.width-a*r,height:i.height-o*r}}function o(t,e,n,i,r,a,o){var s=e.getItemVisual(n,"color"),c=e.getItemVisual(n,"opacity"),f=i.getModel("itemStyle.normal"),d=i.getModel("itemStyle.emphasis").getBarItemStyle();t.setShape("r",f.get("barBorderRadius")||0),t.useStyle(l.defaults({fill:s,opacity:c},f.getBarItemStyle()));var p=o?r.height>0?"bottom":"top":r.width>0?"left":"right";u.setLabel(t.style,d,i,s,a,n,p),h.setHoverStyle(t,d)}function s(t,e){var n=t.get(c)||0;return Math.min(n,Math.abs(e.width),Math.abs(e.height))}var l=n(1),h=n(3),u=n(90),c=["itemStyle","normal","barBorderWidth"];l.extend(n(10).prototype,n(104));var f=n(2).extendChartView({type:"bar",render:function(t,e,n){var i=t.get("coordinateSystem");return"cartesian2d"===i&&this._renderOnCartesian(t,e,n),this.group},dispose:l.noop,_renderOnCartesian:function(t,e,n){var s=this.group,l=t.getData(),u=this._data,c=t.coordinateSystem,f=c.getBaseAxis(),d=f.isHorizontal(),p=t.isAnimationEnabled()?t:null;l.diff(u).add(function(e){if(l.hasValue(e)){var n=l.getItemModel(e),r=a(l,e,n),h=i(l,e,n,r,d,p);l.setItemGraphicEl(e,h),s.add(h),o(h,l,e,n,r,t,d)}}).update(function(e,n){var r=u.getItemGraphicEl(n);if(!l.hasValue(e))return void s.remove(r);var c=l.getItemModel(e),f=a(l,e,c);r?h.updateProps(r,{shape:f},p,e):r=i(l,e,c,f,d,p,!0),l.setItemGraphicEl(e,r),s.add(r),o(r,l,e,c,f,t,d)}).remove(function(t){var e=u.getItemGraphicEl(t);e&&r(t,p,e)}).execute(),this._data=l},remove:function(t,e){var n=this.group,i=this._data;t.get("animation")?i&&i.eachItemGraphicEl(function(e){r(e.dataIndex,t,e)}):n.removeAll()}});t.exports=f},function(t,e,n){var i=n(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getBarItemStyle:function(t){var e=i.call(this,t);if(this.getBorderLineDash){var n=this.getBorderLineDash();n&&(e.lineDash=n)}return e}}},,,function(t,e,n){var i=n(1),r=n(2),a=r.PRIORITY;n(108),n(109),r.registerVisual(i.curry(n(50),"line","circle","line")),r.registerLayout(i.curry(n(60),"line")),r.registerProcessor(a.PROCESSOR.STATISTIC,i.curry(n(147),"line")),n(32)},function(t,e,n){"use strict";var i=n(28),r=n(18);t.exports=r.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return i(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}})},function(t,e,n){"use strict";function i(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++){var i=t[n],r=e[n];if(i[0]!==r[0]||i[1]!==r[1])return}return!0}}function r(t){return"number"==typeof t?t:t?.3:0}function a(t){var e=t.getGlobalExtent();if(t.onBand){var n=t.getBandWidth()/2-1,i=e[1]>e[0]?1:-1;e[0]+=i*n,e[1]-=i*n}return e}function o(t){return t>=0?1:-1}function s(t,e){var n=t.getBaseAxis(),i=t.getOtherAxis(n),r=n.onZero?0:i.scale.getExtent()[0],a=i.dim,s="x"===a||"radius"===a?1:0;return e.mapArray([a],function(i,l){for(var h,u=e.stackedOn;u&&o(u.get(a,l))===o(i);){h=u;break}var c=[];return c[s]=e.get(n.dim,l),c[1-s]=h?h.get(a,l,!0):r,t.dataToPoint(c)},!0)}function l(t,e,n){var i=a(t.getAxis("x")),r=a(t.getAxis("y")),o=t.getBaseAxis().isHorizontal(),s=Math.min(i[0],i[1]),l=Math.min(r[0],r[1]),h=Math.max(i[0],i[1])-s,u=Math.max(r[0],r[1])-l,c=n.get("lineStyle.normal.width")||2,f=n.get("clipOverflow")?c/2:Math.max(h,u);o?(l-=f,u+=2*f):(s-=f,h+=2*f);var d=new m.Rect({shape:{x:s,y:l,width:h,height:u}});return e&&(d.shape[o?"width":"height"]=0,m.initProps(d,{shape:{width:h,height:u}},n)),d}function h(t,e,n){var i=t.getAngleAxis(),r=t.getRadiusAxis(),a=r.getExtent(),o=i.getExtent(),s=Math.PI/180,l=new m.Sector({shape:{cx:t.cx,cy:t.cy,r0:a[0],r:a[1],startAngle:-o[0]*s,endAngle:-o[1]*s,clockwise:i.inverse}});return e&&(l.shape.endAngle=-o[0]*s,m.initProps(l,{shape:{endAngle:-o[1]*s}},n)),l}function u(t,e,n){return"polar"===t.type?h(t,e,n):l(t,e,n)}function c(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,a=[],o=0;o<t.length-1;o++){var s=t[o+1],l=t[o];a.push(l);var h=[];switch(n){case"end":h[r]=s[r],h[1-r]=l[1-r],a.push(h);break;case"middle":var u=(l[r]+s[r])/2,c=[];h[r]=c[r]=u,h[1-r]=l[1-r],c[1-r]=s[1-r],a.push(h),a.push(c);break;default:h[r]=l[r],h[1-r]=s[1-r],a.push(h)}}return t[o]&&a.push(t[o]),a}function f(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()){for(var i,r=n.length-1;r>=0;r--)if(n[r].dimension<2){i=n[r];break}if(i&&"cartesian2d"===e.type){var a=i.dimension,o=t.dimensions[a],s=e.getAxis(o),l=d.map(i.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),h=l.length,u=i.outerColors.slice();h&&l[0].coord>l[h-1].coord&&(l.reverse(),u.reverse());var c=10,f=l[0].coord-c,p=l[h-1].coord+c,g=p-f;if(g<.001)return"transparent";d.each(l,function(t){t.offset=(t.coord-f)/g}),l.push({offset:h?l[h-1].offset:.5,color:u[1]||"transparent"}),l.unshift({offset:h?l[0].offset:.5,color:u[0]||"transparent"});var v=new m.LinearGradient(0,0,0,0,l,(!0));return v[o]=f,v[o+"2"]=p,v}}}var d=n(1),p=n(44),g=n(54),v=n(110),m=n(3),y=n(6),x=n(91),_=n(30);t.exports=_.extend({type:"line",init:function(){var t=new m.Group,e=new p;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var a=t.coordinateSystem,o=this.group,l=t.getData(),h=t.getModel("lineStyle.normal"),p=t.getModel("areaStyle.normal"),g=l.mapArray(l.getItemLayout,!0),v="polar"===a.type,m=this._coordSys,y=this._symbolDraw,x=this._polyline,_=this._polygon,b=this._lineGroup,w=t.get("animation"),M=!p.isEmpty(),T=s(a,l),S=t.get("showSymbol"),A=S&&!v&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,a),C=this._data;C&&C.eachItemGraphicEl(function(t,e){t.__temp&&(o.remove(t),C.setItemGraphicEl(e,null))}),S||y.remove(),o.add(b);var I=!v&&t.get("step");x&&m.type===a.type&&I===this._step?(M&&!_?_=this._newPolygon(g,T,a,w):_&&!M&&(b.remove(_),_=this._polygon=null),b.setClipPath(u(a,!1,t)),S&&y.updateData(l,A),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),i(this._stackedOnPoints,T)&&i(this._points,g)||(w?this._updateAnimation(l,T,a,n,I):(I&&(g=c(g,a,I),T=c(T,a,I)),x.setShape({points:g}),_&&_.setShape({points:g,stackedOnPoints:T})))):(S&&y.updateData(l,A),I&&(g=c(g,a,I),T=c(T,a,I)),x=this._newPolyline(g,a,w),M&&(_=this._newPolygon(g,T,a,w)),b.setClipPath(u(a,!0,t)));var P=f(l,a)||l.getVisual("color");x.useStyle(d.defaults(h.getLineStyle(),{fill:"none",stroke:P,lineJoin:"bevel"}));var L=t.get("smooth");if(L=r(t.get("smooth")),x.setShape({smooth:L,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),_){var k=l.stackedOn,O=0;if(_.useStyle(d.defaults(p.getAreaStyle(),{fill:P,opacity:.7,lineJoin:"bevel"})),k){var D=k.hostModel;O=r(D.get("smooth"))}_.setShape({smooth:L,stackedOnSmooth:O,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=l,this._coordSys=a,this._stackedOnPoints=T,this._points=g,this._step=I},dispose:function(){},highlight:function(t,e,n,i){var r=t.getData(),a=y.queryDataIndex(r,i);if(!(a instanceof Array)&&null!=a&&a>=0){var o=r.getItemGraphicEl(a);if(!o){var s=r.getItemLayout(a);if(!s)return;o=new g(r,a),o.position=s,o.setZ(t.get("zlevel"),t.get("z")),o.ignore=isNaN(s[0])||isNaN(s[1]),o.__temp=!0,r.setItemGraphicEl(a,o),o.stopSymbolAnimation(!0),this.group.add(o)}o.highlight()}else _.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),a=y.queryDataIndex(r,i);if(null!=a&&a>=0){var o=r.getItemGraphicEl(a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group.remove(o)):o.downplay())}else _.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new x.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new x.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n,n},_getSymbolIgnoreFunc:function(t,e){var n=e.getAxesByScale("ordinal")[0];if(n&&n.isLabelIgnored)return d.bind(n.isLabelIgnored,n)},_updateAnimation:function(t,e,n,i,r){var a=this._polyline,o=this._polygon,s=t.hostModel,l=v(this._data,t,this._stackedOnPoints,e,this._coordSys,n),h=l.current,u=l.stackedOnCurrent,f=l.next,d=l.stackedOnNext;r&&(h=c(l.current,n,r),u=c(l.stackedOnCurrent,n,r),f=c(l.next,n,r),d=c(l.stackedOnNext,n,r)),a.shape.__points=l.current,a.shape.points=h,m.updateProps(a,{shape:{points:f}},s),o&&(o.setShape({points:h,stackedOnPoints:u}),m.updateProps(o,{shape:{points:f,stackedOnPoints:d}},s));for(var p=[],g=l.status,y=0;y<g.length;y++){var x=g[y].cmd;if("="===x){var _=t.getItemGraphicEl(g[y].idx1);_&&p.push({el:_,ptIdx:y})}}a.animators&&a.animators.length&&a.animators[0].during(function(){for(var t=0;t<p.length;t++){var e=p[t].el;e.attr("position",a.shape.__points[p[t].ptIdx])}})},remove:function(t){var e=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl(function(t,i){t.__temp&&(e.remove(t),n.setItemGraphicEl(i,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}})},function(t,e){function n(t){return t>=0?1:-1}function i(t,e,i){for(var r,a=t.getBaseAxis(),o=t.getOtherAxis(a),s=a.onZero?0:o.scale.getExtent()[0],l=o.dim,h="x"===l||"radius"===l?1:0,u=e.stackedOn,c=e.get(l,i);u&&n(u.get(l,i))===n(c);){r=u;break}var f=[];return f[h]=e.get(a.dim,i),f[1-h]=r?r.get(l,i,!0):s,t.dataToPoint(f)}function r(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}t.exports=function(t,e,n,a,o,s){for(var l=r(t,e),h=[],u=[],c=[],f=[],d=[],p=[],g=[],v=s.dimensions,m=0;m<l.length;m++){var y=l[m],x=!0;switch(y.cmd){case"=":var _=t.getItemLayout(y.idx),b=e.getItemLayout(y.idx1);(isNaN(_[0])||isNaN(_[1]))&&(_=b.slice()),h.push(_),u.push(b),c.push(n[y.idx]),f.push(a[y.idx1]),g.push(e.getRawIndex(y.idx1));break;case"+":var w=y.idx;h.push(o.dataToPoint([e.get(v[0],w,!0),e.get(v[1],w,!0)])),u.push(e.getItemLayout(w).slice()),c.push(i(o,e,w)),f.push(a[w]),g.push(e.getRawIndex(w));break;case"-":var w=y.idx,M=t.getRawIndex(w);M!==w?(h.push(t.getItemLayout(w)),u.push(s.dataToPoint([t.get(v[0],w,!0),t.get(v[1],w,!0)])),c.push(n[w]),f.push(i(s,t,w)),g.push(M)):x=!1}x&&(d.push(y),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});for(var T=[],S=[],A=[],C=[],I=[],m=0;m<p.length;m++){var w=p[m];T[m]=h[w],S[m]=u[w],A[m]=c[w],C[m]=f[w],I[m]=d[w]}return{current:T,next:S,stackedOnCurrent:A,stackedOnNext:C,status:I}}},function(t,e,n){var i=n(1),r=n(2);n(112),n(113),n(88)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),r.registerVisual(i.curry(n(83),"pie")),r.registerLayout(i.curry(n(115),"pie")),r.registerProcessor(i.curry(n(62),"pie"))},function(t,e,n){"use strict";var i=n(14),r=n(1),a=n(6),o=n(25),s=n(77),l=n(2).extendSeriesModel({type:"series.pie",init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(t.data),this._defaultLabelLine(t)},mergeOption:function(t){l.superCall(this,"mergeOption",t),this.updateSelectedMap(this.option.data)},getInitialData:function(t,e){var n=o(["value"],t.data),r=new i(n,this);return r.initData(t.data),r},getDataParams:function(t){var e=this.getData(),n=l.superCall(this,"getDataParams",t),i=e.getSum("value");return n.percent=i?+(e.get("value",t)/i*100).toFixed(2):0,n.$vars.push("percent"),n},_defaultLabelLine:function(t){a.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,n=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,n.show=n.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,stillShowZeroSum:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderWidth:1},emphasis:{}},animationType:"expansion",animationEasing:"cubicOut",data:[]}});r.mixin(l,s),t.exports=l},function(t,e,n){function i(t,e,n,i){var a=e.getData(),o=this.dataIndex,s=a.getName(o),l=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),a.each(function(t){r(a.getItemGraphicEl(t),a.getItemLayout(t),e.isSelected(a.getName(t)),l,n)})}function r(t,e,n,i,r){var a=(e.startAngle+e.endAngle)/2,o=Math.cos(a),s=Math.sin(a),l=n?i:0,h=[o*l,s*l];r?t.animate().when(200,{position:h}).start("bounceOut"):t.attr("position",h)}function a(t,e){function n(){a.ignore=a.hoverIgnore,o.ignore=o.hoverIgnore}function i(){a.ignore=a.normalIgnore,o.ignore=o.normalIgnore}s.Group.call(this);var r=new s.Sector({z2:2}),a=new s.Polyline,o=new s.Text;this.add(r),this.add(a),this.add(o),this.updateData(t,e,!0),this.on("emphasis",n).on("normal",i).on("mouseover",n).on("mouseout",i)}function o(t,e,n,i,r){var a=i.getModel("textStyle"),o="inside"===r||"inner"===r;return{fill:a.getTextColor()||(o?"#fff":t.getItemVisual(e,"color")),opacity:t.getItemVisual(e,"opacity"),textFont:a.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,n),t.getName(e))}}var s=n(3),l=n(1),h=a.prototype;h.updateData=function(t,e,n){function i(){o.stopAnimation(!0),o.animateTo({shape:{r:c.r+10}},300,"elasticOut")}function a(){o.stopAnimation(!0),o.animateTo({shape:{r:c.r}},300,"elasticOut")}var o=this.childAt(0),h=t.hostModel,u=t.getItemModel(e),c=t.getItemLayout(e),f=l.extend({},c);if(f.label=null,n){o.setShape(f);var d=h.getShallow("animationType");"scale"===d?(o.shape.r=c.r0,s.initProps(o,{shape:{r:c.r}},h,e)):(o.shape.endAngle=c.startAngle,s.updateProps(o,{shape:{endAngle:c.endAngle}},h,e))}else s.updateProps(o,{shape:f},h,e);var p=u.getModel("itemStyle"),g=t.getItemVisual(e,"color");o.useStyle(l.defaults({lineJoin:"bevel",fill:g},p.getModel("normal").getItemStyle())),o.hoverStyle=p.getModel("emphasis").getItemStyle(),r(this,t.getItemLayout(e),u.get("selected"),h.get("selectedOffset"),h.get("animation")),o.off("mouseover").off("mouseout").off("emphasis").off("normal"),u.get("hoverAnimation")&&h.isAnimationEnabled()&&o.on("mouseover",i).on("mouseout",a).on("emphasis",i).on("normal",a),this._updateLabel(t,e),s.setHoverStyle(this)},h._updateLabel=function(t,e){var n=this.childAt(1),i=this.childAt(2),r=t.hostModel,a=t.getItemModel(e),l=t.getItemLayout(e),h=l.label,u=t.getItemVisual(e,"color");s.updateProps(n,{shape:{points:h.linePoints||[[h.x,h.y],[h.x,h.y],[h.x,h.y]]}},r,e),s.updateProps(i,{style:{x:h.x,y:h.y}},r,e),i.attr({style:{textVerticalAlign:h.verticalAlign,textAlign:h.textAlign,textFont:h.font},rotation:h.rotation,origin:[h.x,h.y],z2:10});var c=a.getModel("label.normal"),f=a.getModel("label.emphasis"),d=a.getModel("labelLine.normal"),p=a.getModel("labelLine.emphasis"),g=c.get("position")||f.get("position");i.setStyle(o(t,e,"normal",c,g)),i.ignore=i.normalIgnore=!c.get("show"),i.hoverIgnore=!f.get("show"),n.ignore=n.normalIgnore=!d.get("show"),n.hoverIgnore=!p.get("show"),n.setStyle({stroke:u,opacity:t.getItemVisual(e,"opacity")}),n.setStyle(d.getModel("lineStyle").getLineStyle()),i.hoverStyle=o(t,e,"emphasis",f,g),n.hoverStyle=p.getModel("lineStyle").getLineStyle();var v=d.get("smooth");v&&v===!0&&(v=.4),n.setShape({smooth:v})},l.inherits(a,s.Group);var u=n(30).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,n,r){if(!r||r.from!==this.uid){var o=t.getData(),s=this._data,h=this.group,u=e.get("animation"),c=!s,f=t.get("animationType"),d=l.curry(i,this.uid,t,u,n),p=t.get("selectedMode");if(o.diff(s).add(function(t){var e=new a(o,t);c&&"scale"!==f&&e.eachChild(function(t){t.stopAnimation(!0)}),p&&e.on("click",d),o.setItemGraphicEl(t,e),h.add(e)}).update(function(t,e){var n=s.getItemGraphicEl(e);n.updateData(o,t),n.off("click"),p&&n.on("click",d),h.add(n),o.setItemGraphicEl(t,n)}).remove(function(t){var e=s.getItemGraphicEl(t);h.remove(e)}).execute(),u&&c&&o.count()>0&&"scale"!==f){var g=o.getItemLayout(0),v=Math.max(n.getWidth(),n.getHeight())/2,m=l.bind(h.removeClipPath,h);h.setClipPath(this._createClipPath(g.cx,g.cy,v,g.startAngle,g.clockwise,m,t))}this._data=o}},dispose:function(){},_createClipPath:function(t,e,n,i,r,a,o){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return s.initProps(l,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},o,a),l},containPoint:function(t,e){var n=e.getData(),i=n.getItemLayout(0);if(i){var r=t[0]-i.cx,a=t[1]-i.cy,o=Math.sqrt(r*r+a*a);return o<=i.r&&o>=i.r0}}});t.exports=u},function(t,e,n){"use strict";function i(t,e,n,i,r,a,o){function s(e,n,i,r){for(var a=e;a<n;a++)if(t[a].y+=i,a>e&&a+1<n&&t[a+1].y>t[a].y+t[a].height)return void l(a,i/2);l(n-1,i/2)}function l(e,n){for(var i=e;i>=0&&(t[i].y-=n,!(i>0&&t[i].y>t[i-1].y+t[i-1].height));i--);}function h(t,e,n,i,r,a){for(var o=a>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var h=Math.abs(t[s].y-i),u=t[s].len,c=t[s].len2,f=h<r+u?Math.sqrt((r+u+c)*(r+u+c)-h*h):Math.abs(t[s].x-n);e&&f>=o&&(f=o-10),!e&&f<=o&&(f=o+10),t[s].x=n+f*a,o=f}}t.sort(function(t,e){return t.y-e.y});for(var u,c=0,f=t.length,d=[],p=[],g=0;g<f;g++)u=t[g].y-c,u<0&&s(g,f,-u,r),c=t[g].y+t[g].height;o-c<0&&l(f-1,c-o);for(var g=0;g<f;g++)t[g].y>=n?p.push(t[g]):d.push(t[g]);h(d,!1,e,n,i,r),h(p,!0,e,n,i,r)}function r(t,e,n,r,a,o){for(var s=[],l=[],h=0;h<t.length;h++)t[h].x<e?s.push(t[h]):l.push(t[h]);i(l,e,n,r,1,a,o),i(s,e,n,r,-1,a,o);for(var h=0;h<t.length;h++){var u=t[h].linePoints;if(u){var c=u[1][0]-u[2][0];t[h].x<e?u[2][0]=t[h].x+3:u[2][0]=t[h].x-3,u[1][1]=u[2][1]=t[h].y,u[1][0]=u[2][0]+c}}}var a=n(16);t.exports=function(t,e,n,i){var o,s,l=t.getData(),h=[],u=!1;l.each(function(n){var i,r,c,f,d=l.getItemLayout(n),p=l.getItemModel(n),g=p.getModel("label.normal"),v=g.get("position")||p.get("label.emphasis.position"),m=p.getModel("labelLine.normal"),y=m.get("length"),x=m.get("length2"),_=(d.startAngle+d.endAngle)/2,b=Math.cos(_),w=Math.sin(_);o=d.cx,s=d.cy;var M="inside"===v||"inner"===v;if("center"===v)i=d.cx,r=d.cy,f="center";else{var T=(M?(d.r+d.r0)/2*b:d.r*b)+o,S=(M?(d.r+d.r0)/2*w:d.r*w)+s;if(i=T+3*b,r=S+3*w,!M){var A=T+b*(y+e-d.r),C=S+w*(y+e-d.r),I=A+(b<0?-1:1)*x,P=C;i=I+(b<0?-5:5),r=P,c=[[T,S],[A,C],[I,P]]}f=M?"center":b>0?"left":"right"}var L=g.getModel("textStyle").getFont(),k=g.get("rotate")?b<0?-_+Math.PI:-_:0,O=t.getFormattedLabel(n,"normal")||l.getName(n),D=a.getBoundingRect(O,L,f,"top");u=!!k,d.label={x:i,y:r,position:v,height:D.height,len:y,len2:x,linePoints:c,textAlign:f,verticalAlign:"middle",font:L,rotation:k},M||h.push(d.label)}),!u&&t.get("avoidLabelOverlap")&&r(h,o,s,e,n,i)}},function(t,e,n){var i=n(4),r=i.parsePercent,a=n(114),o=n(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,n,h){e.eachSeriesByType(t,function(t){var e=t.get("center"),h=t.get("radius");o.isArray(h)||(h=[0,h]),o.isArray(e)||(e=[e,e]);var u=n.getWidth(),c=n.getHeight(),f=Math.min(u,c),d=r(e[0],u),p=r(e[1],c),g=r(h[0],f/2),v=r(h[1],f/2),m=t.getData(),y=-t.get("startAngle")*l,x=t.get("minAngle")*l,_=m.getSum("value"),b=Math.PI/(_||m.count())*2,w=t.get("clockwise"),M=t.get("roseType"),T=t.get("stillShowZeroSum"),S=m.getDataExtent("value");S[0]=0;var A=s,C=0,I=y,P=w?1:-1;if(m.each("value",function(t,e){var n;if(isNaN(t))return void m.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:w,cx:d,cy:p,r0:g,r:M?NaN:v});n="area"!==M?0===_&&T?b:t*b:s/(m.count()||1),n<x?(n=x,A-=x):C+=t;var r=I+P*n;m.setItemLayout(e,{angle:n,startAngle:I,endAngle:r,clockwise:w,cx:d,cy:p,r0:g,r:M?i.linearMap(t,S,[g,v]):v}),I=r},!0),A<s)if(A<=.001){var L=s/m.count();m.each(function(t){var e=m.getItemLayout(t);e.startAngle=y+P*t*L,e.endAngle=y+P*(t+1)*L})}else b=A/C,I=y,m.each("value",function(t,e){var n=m.getItemLayout(e),i=n.angle===x?x:t*b;n.startAngle=I,n.endAngle=I+P*i,I+=P*i});a(t,v,u,c)})}},function(t,e,n){"use strict";n(59),n(117)},function(t,e,n){var i=n(1),r=n(3),a=n(40),o=n(41),s=n(74),l=a.ifIgnoreOnTick,h=a.getInterval,u=["axisLine","axisLabel","axisTick","axisName"],c=["splitArea","splitLine"],f=o.extend({
-type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,n,o){this.group.removeAll();var l=this._axisGroup;if(this._axisGroup=new r.Group,this.group.add(this._axisGroup),t.get("show")){var h=t.getCoordSysModel(),d=s.layout(h,t),p=new a(t,d);i.each(u,p.add,p),this._axisGroup.add(p.getGroup()),i.each(c,function(e){t.get(e+".show")&&this["_"+e](t,h,d.labelInterval)},this),r.groupTransition(l,this._axisGroup,t),f.superCall(this,"render",t,e,n,o)}},_splitLine:function(t,e,n){var a=t.axis;if(!a.scale.isBlank()){var o=t.getModel("splitLine"),s=o.getModel("lineStyle"),u=s.get("color"),c=h(o,n);u=i.isArray(u)?u:[u];for(var f=e.coordinateSystem.getRect(),d=a.isHorizontal(),p=0,g=a.getTicksCoords(),v=a.scale.getTicks(),m=[],y=[],x=s.getLineStyle(),_=0;_<g.length;_++)if(!l(a,_,c)){var b=a.toGlobalCoord(g[_]);d?(m[0]=b,m[1]=f.y,y[0]=b,y[1]=f.y+f.height):(m[0]=f.x,m[1]=b,y[0]=f.x+f.width,y[1]=b);var w=p++%u.length;this._axisGroup.add(new r.Line(r.subPixelOptimizeLine({anid:"line_"+v[_],shape:{x1:m[0],y1:m[1],x2:y[0],y2:y[1]},style:i.defaults({stroke:u[w]},x),silent:!0})))}}},_splitArea:function(t,e,n){var a=t.axis;if(!a.scale.isBlank()){var o=t.getModel("splitArea"),s=o.getModel("areaStyle"),u=s.get("color"),c=e.coordinateSystem.getRect(),f=a.getTicksCoords(),d=a.scale.getTicks(),p=a.toGlobalCoord(f[0]),g=a.toGlobalCoord(f[0]),v=0,m=h(o,n),y=s.getAreaStyle();u=i.isArray(u)?u:[u];for(var x=1;x<f.length;x++)if(!l(a,x,m)){var _,b,w,M,T=a.toGlobalCoord(f[x]);a.isHorizontal()?(_=p,b=c.y,w=T-_,M=c.height):(_=c.x,b=g,w=c.width,M=T-b);var S=v++%u.length;this._axisGroup.add(new r.Rect({anid:"area_"+d[x],shape:{x:_,y:b,width:w,height:M},style:i.defaults({fill:u[S]},y),silent:!0})),p=_+w,g=b+M}}}});f.extend({type:"xAxis"}),f.extend({type:"yAxis"})},,,,,,,,,,,,,function(t,e,n){var i=n(1),r=n(33),a=n(134),o=function(t,e,n,i,a){r.call(this,t,e,n),this.type=i||"value",this.position=a||"bottom"};o.prototype={constructor:o,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},getLabelInterval:function(){var t=this._labelInterval;return t||(t=this._labelInterval=a(this)),t},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},i.inherits(o,r),t.exports=o},function(t,e,n){"use strict";function i(t){return this._axes[t]}var r=n(1),a=function(t){this._axes={},this._dimList=[],this.name=t||""};a.prototype={constructor:a,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return r.map(this._dimList,i,this)},getAxesByScale:function(t){return t=t.toLowerCase(),r.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var n=this._dimList,i=t instanceof Array?[]:{},r=0;r<n.length;r++){var a=n[r],o=this._axes[a];i[a]=o[e](t[a])}return i}},t.exports=a},function(t,e,n){"use strict";function i(t){a.call(this,t)}var r=n(1),a=n(131);i.prototype={constructor:i,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoints:function(t,e){return t.mapArray(["x","y"],function(t,e){return this.dataToPoint([t,e])},e,this)},dataToPoint:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return[n.toGlobalCoord(n.dataToCoord(t[0],e)),i.toGlobalCoord(i.dataToCoord(t[1],e))]},pointToData:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return[n.coordToData(n.toLocalCoord(t[0]),e),i.coordToData(i.toLocalCoord(t[1]),e)]},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},r.inherits(i,a),t.exports=i},function(t,e,n){"use strict";n(59);var i=n(13);t.exports=i.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}})},function(t,e,n){"use strict";var i=n(1),r=n(17);t.exports=function(t){var e=t.model,n=e.getModel("axisLabel"),a=n.get("interval");return"category"!==t.type||"auto"!==a?"auto"===a?0:a:r.getAxisLabelInterval(i.map(t.scale.getTicks(),t.dataToCoord,t),e.getFormattedLabels(),n.getModel("textStyle").getFont(),t.isHorizontal())}},function(t,e,n){var i=n(28),r=n(24),a=n(17),o=n(42),s=n(10),l=n(1);t.exports={createList:function(t){var e=t.get("data");return i(e,t,t.ecModel)},completeDimensions:n(25),createSymbol:r.createSymbol,createScale:function(t,e){var n=e;e instanceof s||(n=new s(e),l.mixin(n,o));var i=a.createScaleByModel(n);return i.setExtent(t[0],t[1]),a.niceScaleExtent(i,n),i},mixinAxisModelCommonMethods:function(t){l.mixin(t,o)}}},function(t,e,n){var i=n(3),r=n(1),a=Math.PI;t.exports=function(t,e){e=e||{},r.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var n=new i.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),o=new i.Arc({shape:{startAngle:-a/2,endAngle:-a/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new i.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});o.animateShape(!0).when(1e3,{endAngle:3*a/2}).start("circularInOut"),o.animateShape(!0).when(1e3,{startAngle:3*a/2}).delay(300).start("circularInOut");var l=new i.Group;return l.add(o),l.add(s),l.add(n),l.resize=function(){var e=t.getWidth()/2,i=t.getHeight()/2;o.setShape({cx:e,cy:i});var r=o.shape.r;s.setShape({x:e-r,y:i-r,width:2*r,height:2*r}),n.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,n){function i(t,e){u.each(e,function(e,n){x.hasClass(n)||("object"==typeof e?t[n]=t[n]?u.merge(t[n],e,!1):u.clone(e):null==t[n]&&(t[n]=e))})}function r(t){t=t,this.option={},this.option[b]=1,this._componentsMap={series:[]},this._seriesIndices=null,i(t,this._theme.option),u.merge(t,_,!1),this.mergeOption(t)}function a(t,e){u.isArray(e)||(e=e?[e]:[]);var n={};return d(e,function(e){n[e]=(t[e]||[]).slice()}),n}function o(t,e,n){var i=e.type?e.type:n?n.subType:x.determineSubType(t,e);return i}function s(t){return g(t,function(t){return t.componentIndex})||[]}function l(t,e){return e.hasOwnProperty("subType")?p(t,function(t){return t.subType===e.subType}):t}function h(t){}var u=n(1),c=n(6),f=n(10),d=u.each,p=u.filter,g=u.map,v=u.isArray,m=u.indexOf,y=u.isObject,x=n(13),_=n(139),b="\0_ec_inner",w=f.extend({constructor:w,init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new f(n),this._optionManager=i},setOption:function(t,e,n){u.assert(!(b in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null,n)},resetOption:function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var a=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(!e&&this.restoreData(),this.mergeOption(a)):r.call(this,a),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(this.mergeOption(o),n=!0)}if(!t||"recreate"===t||"media"===t){var s=i.getMediaOption(this,this._api);s.length&&d(s,function(t){this.mergeOption(t,n=!0)},this)}return n},mergeOption:function(t){function e(e,r){var l=c.normalizeToArray(t[e]),h=c.mappingToExists(i[e],l);c.makeIdAndName(h),d(h,function(t,n){var i=t.option;y(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=o(e,i,t.exist))});var f=a(i,r);n[e]=[],i[e]=[],d(h,function(t,r){var a=t.exist,o=t.option;if(u.assert(y(o)||a,"Empty component definition"),o){var s=x.getClass(e,t.keyInfo.subType,!0);if(a&&a instanceof s)a.name=t.keyInfo.name,a.mergeOption(o,this),a.optionUpdated(o,!1);else{var l=u.extend({dependentModels:f,componentIndex:r},t.keyInfo);a=new s(o,this,this,l),u.extend(a,l),a.init(o,this,this,l),a.optionUpdated(null,!0)}}else a.mergeOption({},this),a.optionUpdated({},!1);i[e][r]=a,n[e][r]=a.option},this),"series"===e&&(this._seriesIndices=s(i.series))}var n=this.option,i=this._componentsMap,r=[];d(t,function(t,e){null!=t&&(x.hasClass(e)?r.push(e):n[e]=null==n[e]?u.clone(t):u.merge(n[e],t,!0))}),x.topologicalTravel(r,x.getAllClassMainTypes(),e,this),this._seriesIndices=this._seriesIndices||[]},getOption:function(){var t=u.clone(this.option);return d(t,function(e,n){if(x.hasClass(n)){for(var e=c.normalizeToArray(e),i=e.length-1;i>=0;i--)c.isIdInner(e[i])&&e.splice(i,1);t[n]=e}}),delete t[b],t},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap[t];if(n)return n[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n=t.index,i=t.id,r=t.name,a=this._componentsMap[e];if(!a||!a.length)return[];var o;if(null!=n)v(n)||(n=[n]),o=p(g(n,function(t){return a[t]}),function(t){return!!t});else if(null!=i){var s=v(i);o=p(a,function(t){return s&&m(i,t.id)>=0||!s&&t.id===i})}else if(null!=r){var h=v(r);o=p(a,function(t){return h&&m(r,t.name)>=0||!h&&t.name===r})}else o=a.slice();return l(o,t)},findComponents:function(t){function e(t){var e=r+"Index",n=r+"Id",i=r+"Name";return!t||null==t[e]&&null==t[n]&&null==t[i]?null:{mainType:r,index:t[e],id:t[n],name:t[i]}}function n(e){return t.filter?p(e,t.filter):e}var i=t.query,r=t.mainType,a=e(i),o=a?this.queryComponents(a):this._componentsMap[r];return n(l(o,t))},eachComponent:function(t,e,n){var i=this._componentsMap;if("function"==typeof t)n=e,e=t,d(i,function(t,i){d(t,function(t,r){e.call(n,i,t,r)})});else if(u.isString(t))d(i[t],e,n);else if(y(t)){var r=this.findComponents(t);d(r,e,n)}},getSeriesByName:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.series[t]},getSeriesByType:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.series.slice()},eachSeries:function(t,e){h(this),d(this._seriesIndices,function(n){var i=this._componentsMap.series[n];t.call(e,i,n)},this)},eachRawSeries:function(t,e){d(this._componentsMap.series,t,e)},eachSeriesByType:function(t,e,n){h(this),d(this._seriesIndices,function(i){var r=this._componentsMap.series[i];r.subType===t&&e.call(n,r,i)},this)},eachRawSeriesByType:function(t,e,n){return d(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return h(this),u.indexOf(this._seriesIndices,t.componentIndex)<0},filterSeries:function(t,e){h(this);var n=p(this._componentsMap.series,t,e);this._seriesIndices=s(n)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=s(t.series);var e=[];d(t,function(t,n){e.push(n)}),x.topologicalTravel(e,x.getAllClassMainTypes(),function(e,n){d(t[e],function(t){t.restoreData()})})}});u.mixin(w,n(61)),t.exports=w},function(t,e,n){function i(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function r(t,e,n){var i,r,a=[],o=[],s=t.timeline;if(t.baseOption&&(r=t.baseOption),(s||t.options)&&(r=r||{},a=(t.options||[]).slice()),t.media){r=r||{};var l=t.media;f(l,function(t){t&&t.option&&(t.query?o.push(t):i||(i=t))})}return r||(r=t),r.timeline||(r.timeline=s),f([r].concat(a).concat(h.map(o,function(t){return t.option})),function(t){f(e,function(e){e(t,n)})}),{baseOption:r,timelineOptions:a,mediaDefault:i,mediaList:o}}function a(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return h.each(t,function(t,e){var n=e.match(v);if(n&&n[1]&&n[2]){var a=n[1],s=n[2].toLowerCase();o(i[s],t,a)||(r=!1)}}),r}function o(t,e,n){return"min"===n?t>=e:"max"===n?t<=e:t===e}function s(t,e){return t.join(",")===e.join(",")}function l(t,e){e=e||{},f(e,function(e,n){if(null!=e){var i=t[n];if(c.hasClass(n)){e=u.normalizeToArray(e),i=u.normalizeToArray(i);var r=u.mappingToExists(i,e);t[n]=p(r,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[n]=g(i,e,!0)}})}var h=n(1),u=n(6),c=n(13),f=h.each,d=h.clone,p=h.map,g=h.merge,v=/^(min|max)?(.+)$/;i.prototype={constructor:i,setOption:function(t,e){t=d(t,!0);var n=this._optionBackup,i=r.call(this,t,e,!n);this._newBaseOption=i.baseOption,n?(l(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=p(e.timelineOptions,d),this._mediaList=p(e.mediaList,d),this._mediaDefault=d(e.mediaDefault),this._currentMediaIndices=[],d(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=d(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,o=[],l=[];if(!i.length&&!r)return l;for(var h=0,u=i.length;h<u;h++)a(i[h].query,e,n)&&o.push(h);return!o.length&&r&&(o=[-1]),o.length&&!s(o,this._currentMediaIndices)&&(l=p(o,function(t){return d(t===-1?r.option:i[t].option)})),this._currentMediaIndices=o,l}},t.exports=i},function(t,e){var n="";"undefined"!=typeof navigator&&(n=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],textStyle:{fontFamily:n.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1}},function(t,e,n){t.exports={getAreaStyle:n(31)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,n){var i=n(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]);t.exports={getItemStyle:function(t,e){var n=i.call(this,t,e),r=this.getBorderLineDash();return r&&(n.lineDash=r),n},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,n){var i=n(31)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=i.call(this,t),n=this.getLineDash(e.lineWidth);return n&&(e.lineDash=n),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),n=Math.max(t,2),i=4*t;return"solid"===e||null==e?null:"dashed"===e?[i,i]:[n,n]}}},function(t,e,n){function i(t,e){return t&&t.getShallow(e)}var r=n(16);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){var t=this.ecModel,e=t&&t.getModel("textStyle");return[this.getShallow("fontStyle")||i(e,"fontStyle"),this.getShallow("fontWeight")||i(e,"fontWeight"),(this.getShallow("fontSize")||i(e,"fontSize")||12)+"px",this.getShallow("fontFamily")||i(e,"fontFamily")||"sans-serif"].join(" ")},getTextRect:function(t){return r.getBoundingRect(t,this.getFont(),this.getShallow("align"),this.getShallow("baseline"))},truncateText:function(t,e,n,i){return r.truncateText(t,e,this.getFont(),n,i)}}},function(t,e,n){function i(t,e){e=e.split(",");for(var n=t,i=0;i<e.length&&(n=n&&n[e[i]],null!=n);i++);return n}function r(t,e,n,i){e=e.split(",");for(var r,a=t,o=0;o<e.length-1;o++)r=e[o],null==a[r]&&(a[r]={}),a=a[r];(i||null==a[e[o]])&&(a[e[o]]=n)}function a(t){c(l,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}var o=n(1),s=n(146),l=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],h=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],u=["bar","boxplot","candlestick","chord","effectScatter","funnel","gauge","lines","graph","heatmap","line","map","parallel","pie","radar","sankey","scatter","treemap"],c=o.each;t.exports=function(t){c(t.series,function(t){if(o.isObject(t)){var e=t.type;if(s(t),"pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var n=i(t,"pointer.color");null!=n&&r(t,"itemStyle.normal.color",n)}for(var l=0;l<u.length;l++)if(u[l]===t.type){a(t);break}}}),t.dataRange&&(t.visualMap=t.dataRange),c(h,function(e){var n=t[e];n&&(o.isArray(n)||(n=[n]),c(n,function(t){a(t)}))})}},function(t,e,n){function i(t){var e=t&&t.itemStyle;e&&r.each(a,function(n){var i=e.normal,a=e.emphasis;i&&i[n]&&(t[n]=t[n]||{},t[n].normal?r.merge(t[n].normal,i[n]):t[n].normal=i[n],i[n]=null),a&&a[n]&&(t[n]=t[n]||{},t[n].emphasis?r.merge(t[n].emphasis,a[n]):t[n].emphasis=a[n],a[n]=null)})}var r=n(1),a=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];t.exports=function(t){if(t){i(t),i(t.markPoint),i(t.markLine);var e=t.data;if(e){for(var n=0;n<e.length;n++)i(e[n]);var a=t.markPoint;if(a&&a.data)for(var o=a.data,n=0;n<o.length;n++)i(o[n]);var s=t.markLine;if(s&&s.data)for(var l=s.data,n=0;n<l.length;n++)r.isArray(l[n])?(i(l[n][0]),i(l[n][1])):i(l[n])}}}},function(t,e){var n={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-(1/0),n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return e},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return e},nearest:function(t){return t[0]}},i=function(t,e){return Math.round(t.length/2)};t.exports=function(t,e,r){e.eachSeriesByType(t,function(t){var e=t.getData(),r=t.get("sampling"),a=t.coordinateSystem;if("cartesian2d"===a.type&&r){var o=a.getBaseAxis(),s=a.getOtherAxis(o),l=o.getExtent(),h=l[1]-l[0],u=Math.round(e.count()/h);if(u>1){var c;"string"==typeof r?c=n[r]:"function"==typeof r&&(c=r),c&&(e=e.downSample(s.dim,1/u,c,i),t.setData(e))}}},this)}},function(t,e,n){function i(t,e){return c(t,u(e))}var r=n(1),a=n(34),o=n(4),s=n(43),l=a.prototype,h=s.prototype,u=o.getPrecisionSafe,c=o.round,f=Math.floor,d=Math.ceil,p=Math.pow,g=Math.log,v=a.extend({type:"log",base:10,$constructor:function(){a.apply(this,arguments),this._originalScale=new s},getTicks:function(){var t=this._originalScale,e=this._extent,n=t.getExtent();return r.map(h.getTicks.call(this),function(r){var a=o.round(p(this.base,r));return a=r===e[0]&&t.__fixMin?i(a,n[0]):a,a=r===e[1]&&t.__fixMax?i(a,n[1]):a},this)},getLabel:h.getLabel,scale:function(t){return t=l.scale.call(this,t),p(this.base,t)},setExtent:function(t,e){var n=this.base;t=g(t)/g(n),e=g(e)/g(n),h.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=l.getExtent.call(this);e[0]=p(t,e[0]),e[1]=p(t,e[1]);var n=this._originalScale,r=n.getExtent();return n.__fixMin&&(e[0]=i(e[0],r[0])),n.__fixMax&&(e[1]=i(e[1],r[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=g(t[0])/g(e),t[1]=g(t[1])/g(e),l.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=o.quantity(n),r=t/n*i;for(r<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var a=[o.round(d(e[0]/i)*i),o.round(f(e[1]/i)*i)];this._interval=i,this._niceExtent=a}},niceExtent:function(t,e,n){h.niceExtent.call(this,t,e,n);var i=this._originalScale;i.__fixMin=e,i.__fixMax=n}});r.each(["contain","normalize"],function(t){v.prototype[t]=function(e){return e=g(e)/g(this.base),l[t].call(this,e)}}),v.create=function(){return new v},t.exports=v},function(t,e,n){var i=n(1),r=n(34),a=r.prototype,o=r.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?i.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),a.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return a.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(a.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!1))},niceTicks:i.noop,niceExtent:i.noop});o.create=function(){return new o},t.exports=o},function(t,e,n){var i=n(1),r=n(4),a=n(7),o=n(63),s=n(43),l=s.prototype,h=Math.ceil,u=Math.floor,c=1e3,f=60*c,d=60*f,p=24*d,g=function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][2]<e?n=r+1:i=r}return n},v=s.extend({type:"time",getLabel:function(t){var e=this._stepLvl,n=new Date(t);return a.formatTime(e[0],n,this.getSetting("useUTC"))},niceExtent:function(t,e,n){var i=this._extent;if(i[0]===i[1]&&(i[0]-=p,i[1]+=p),i[1]===-(1/0)&&i[0]===1/0){var a=new Date;i[1]=new Date(a.getFullYear(),a.getMonth(),a.getDate()),i[0]=i[1]-p}this.niceTicks(t);var o=this._interval;e||(i[0]=r.round(u(i[0]/o)*o)),n||(i[1]=r.round(h(i[1]/o)*o))},niceTicks:function(t){var e=this.getSetting("useUTC")?0:60*r.getTimezoneOffset()*1e3;t=t||10;var n=this._extent,i=n[1]-n[0],a=i/t,s=m.length,l=g(m,a,0,s),c=m[Math.min(l,s-1)],f=c[2];if("year"===c[0]){var d=i/f,p=r.nice(d/t,!0);f*=p}var v=[Math.round(h((n[0]-e)/f)*f+e),Math.round(u((n[1]-e)/f)*f+e)];o.fixExtent(v,n),this._stepLvl=c,this._interval=f,this._niceExtent=v},parse:function(t){return+r.parseDate(t)}});i.each(["contain","normalize"],function(t){v.prototype[t]=function(e){return l[t].call(this,this.parse(e))}});var m=[["hh:mm:ss",1,c],["hh:mm:ss",5,5*c],["hh:mm:ss",10,10*c],["hh:mm:ss",15,15*c],["hh:mm:ss",30,30*c],["hh:mm\nMM-dd",1,f],["hh:mm\nMM-dd",5,5*f],["hh:mm\nMM-dd",10,10*f],["hh:mm\nMM-dd",15,15*f],["hh:mm\nMM-dd",30,30*f],["hh:mm\nMM-dd",1,d],["hh:mm\nMM-dd",2,2*d],["hh:mm\nMM-dd",6,6*d],["hh:mm\nMM-dd",12,12*d],["MM-dd\nyyyy",1,p],["week",7,7*p],["month",1,31*p],["quarter",3,380*p/4],["half-year",6,380*p/2],["year",1,380*p]];v.create=function(t){return new v({useUTC:t.ecModel.get("useUTC")})},t.exports=v},function(t,e,n){var i=n(39);t.exports=function(t){function e(e){var n=(e.visualColorAccessPath||"itemStyle.normal.color").split("."),r=e.getData(),a=e.get(n)||e.getColorFromPalette(e.get("name"));r.setVisual("color",a),t.isSeriesFiltered(e)||("function"!=typeof a||a instanceof i||r.each(function(t){r.setItemVisual(t,"color",a(e.getDataParams(t)))}),r.each(function(t){var e=r.getItemModel(t),i=e.get(n,!0);null!=i&&r.setItemVisual(t,"color",i)}))}t.eachRawSeries(e)}},function(t,e,n){"use strict";function i(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch}}function r(){}function a(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i,r=t;r;){if(r.clipPath&&!r.clipPath.contain(e,n))return!1;r.silent&&(i=!0),r=r.parent}return!i||h}return!1}var o=n(1),s=n(179),l=n(23),h="silent";r.prototype.dispose=function(){};var u=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],c=function(t,e,n,i){l.call(this),this.storage=t,this.painter=e,this.painterRoot=i,n=n||new r,this.proxy=n,n.handler=this,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,s.call(this),o.each(u,function(t){n.on&&n.on(t,this[t],this)},this)};c.prototype={constructor:c,mousemove:function(t){var e=t.zrX,n=t.zrY,i=this._hovered,r=this._hovered=this.findHover(e,n),a=r.target,o=i.target,s=this.proxy;s.setCursor&&s.setCursor(a?a.cursor:"default"),o&&a!==o&&o.__zr&&this.dispatchToElement(i,"mouseout",t),this.dispatchToElement(r,"mousemove",t),a&&a!==o&&this.dispatchToElement(r,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,n=t.toElement||t.relatedTarget;do n=n&&n.parentNode;while(n&&9!=n.nodeType&&!(e=n===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var n=this[t];n&&n.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,n){t=t||{};for(var r="on"+e,a=i(e,t,n),o=t.target;o&&(o[r]&&(a.cancelBubble=o[r].call(o,a)),o.trigger(e,a),o=o.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,a),t.trigger&&t.trigger(e,a)}))},findHover:function(t,e,n){for(var i=this.storage.getDisplayList(),r={},o=i.length-1;o>=0;o--){var s;if(i[o]!==n&&!i[o].ignore&&(s=a(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),s!==h)){r.target=i[o];break}}return r}},o.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){c.prototype[t]=function(e){var n=this.findHover(e.zrX,e.zrY),i=n.target;if("mousedown"===t)this._downel=i,this._upel=i;else if("mosueup"===t)this._upel=i;else if("click"===t&&this._downel!==this._upel)return;this.dispatchToElement(n,t,e)}}),o.mixin(c,l),o.mixin(c,s),t.exports=c},function(t,e,n){function i(){return!1}function r(t,e,n,i){var r=document.createElement(e),a=n.getWidth(),o=n.getHeight(),s=r.style;return s.position="absolute",s.left=0,s.top=0,s.width=a+"px",s.height=o+"px",r.width=a*i,r.height=o*i,r.setAttribute("data-zr-dom-id",t),r}var a=n(1),o=n(35),s=n(72),l=n(71),h=function(t,e,n){var s;n=n||o.devicePixelRatio,"string"==typeof t?s=r(t,"canvas",e,n):a.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=i,l["-webkit-user-select"]="none",l["user-select"]="none",l["-webkit-touch-callout"]="none",l["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",l.padding=0,l.margin=0,l["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=n};h.prototype={constructor:h,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=r("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var n=this.dpr,i=this.dom,r=i.style,a=this.domBack;r.width=t+"px",r.height=e+"px",i.width=t*n,i.height=e*n,a&&(a.width=t*n,a.height=e*n,1!=n&&this.ctxBack.scale(n,n))},clear:function(t){var e=this.dom,n=this.ctx,i=e.width,r=e.height,a=this.clearColor,o=this.motionBlur&&!t,h=this.lastFrameAlpha,u=this.dpr;if(o&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,i/u,r/u)),n.clearRect(0,0,i,r),a){var c;a.colorStops?(c=a.__canvasGradient||s.getGradient(n,a,{x:0,y:0,width:i,height:r}),a.__canvasGradient=c):a.image&&(c=l.prototype.getCanvasPattern.call(a,n)),n.save(),n.fillStyle=c||a,n.fillRect(0,0,i,r),n.restore()}if(o){var f=this.domBack;n.save(),n.globalAlpha=h,n.drawImage(f,0,0,i,r),n.restore()}}},t.exports=h},function(t,e,n){"use strict";function i(t){return parseInt(t,10)}function r(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function a(t){t.__unusedCount++}function o(t){1==t.__unusedCount&&t.clear()}function s(t,e,n){return x.copy(t.getBoundingRect()),t.transform&&x.applyTransform(t.transform),_.width=e,_.height=n,!x.intersect(_)}function l(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0}function h(t,e){for(var n=0;n<t.length;n++){var i=t[n];i.setTransform(e),e.beginPath(),i.buildPath(e,i.shape),e.clip(),i.restoreTransform(e)}}function u(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}var c=n(35),f=n(1),d=n(52),p=n(11),g=n(51),v=n(153),m=n(67),y=5,x=new p(0,0,0,0),_=new p(0,0,0,0),b=function(t,e,n){var i=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=f.extend({},n||{}),this.dpr=n.devicePixelRatio||c.devicePixelRatio,this._singleCanvas=i,this.root=t;var r=t.style;r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]=r["user-select"]=r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var a=this._zlevelList=[],o=this._layers={};if(this._layerConfig={},i){null!=n.width&&(t.width=n.width),null!=n.height&&(t.height=n.height);var s=t.width,l=t.height;this._width=s,this._height=l;var h=new v(t,this,1);h.initContext(),o[0]=h,a.push(0),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var d=this._domRoot=u(this._width,this._height);t.appendChild(d)}this._progressiveLayers=[],this._hoverlayer,this._hoverElements=[]};b.prototype={constructor:b,isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},refresh:function(t){var e=this.storage.getDisplayList(!0),n=this._zlevelList;this._paintList(e,t);for(var i=0;i<n.length;i++){var r=n[i],a=this._layers[r];!a.__builtin__&&a.refresh&&a.refresh()}return this.refreshHover(),this._progressiveLayers.length&&this._startProgessive(),this},addHover:function(t,e){if(!t.__hoverMir){var n=new t.constructor({style:t.style,shape:t.shape});n.__from=t,t.__hoverMir=n,n.setStyle(e),this._hoverElements.push(n)}},removeHover:function(t){var e=t.__hoverMir,n=this._hoverElements,i=f.indexOf(n,e);i>=0&&n.splice(i,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,n=0;n<e.length;n++){var i=e[n].__from;i&&(i.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){g(t,this.storage.displayableSortFunc),n||(n=this._hoverlayer=this.getLayer(1e5));var i={};n.ctx.save();for(var r=0;r<e;){var a=t[r],o=a.__from;o&&o.__zr?(r++,o.invisible||(a.transform=o.transform,a.invTransform=o.invTransform,a.__clipPaths=o.__clipPaths,this._doPaintEl(a,n,!0,i))):(t.splice(r,1),o.__hoverMir=null,e--)}n.ctx.restore()}},_startProgessive:function(){function t(){n===e._progressiveToken&&e.storage&&(e._doPaintList(e.storage.getDisplayList()),e._furtherProgressive?(e._progress++,m(t)):e._progressiveToken=-1)}var e=this;if(e._furtherProgressive){var n=e._progressiveToken=+new Date;e._progress++,m(t)}},_clearProgressive:function(){this._progressiveToken=-1,this._progress=0,f.each(this._progressiveLayers,function(t){t.__dirty&&t.clear()})},_paintList:function(t,e){null==e&&(e=!1),this._updateLayerStatus(t),this._clearProgressive(),this.eachBuiltinLayer(a),this._doPaintList(t,e),this.eachBuiltinLayer(o)},_doPaintList:function(t,e){function n(t){var e=a.dpr||1;a.save(),a.globalAlpha=1,a.shadowBlur=0,i.__dirty=!0,a.setTransform(1,0,0,1,0,0),a.drawImage(t.dom,0,0,u*e,c*e),a.restore()}for(var i,r,a,o,s,l,h=0,u=this._width,c=this._height,p=this._progress,g=0,v=t.length;g<v;g++){
-var m=t[g],x=this._singleCanvas?0:m.zlevel,_=m.__frame;if(_<0&&s&&(n(s),s=null),r!==x&&(a&&a.restore(),o={},r=x,i=this.getLayer(r),i.__builtin__||d("ZLevel "+r+" has been used by unkown layer "+i.id),a=i.ctx,a.save(),i.__unusedCount=0,(i.__dirty||e)&&i.clear()),i.__dirty||e){if(_>=0){if(!s){if(s=this._progressiveLayers[Math.min(h++,y-1)],s.ctx.save(),s.renderScope={},s&&s.__progress>s.__maxProgress){g=s.__nextIdxNotProg-1;continue}l=s.__progress,s.__dirty||(p=l),s.__progress=p+1}_===p&&this._doPaintEl(m,s,!0,s.renderScope)}else this._doPaintEl(m,i,e,o);m.__dirty=!1}}s&&n(s),a&&a.restore(),this._furtherProgressive=!1,f.each(this._progressiveLayers,function(t){t.__maxProgress>=t.__progress&&(this._furtherProgressive=!0)},this)},_doPaintEl:function(t,e,n,i){var r=e.ctx,a=t.transform;if((e.__dirty||n)&&!t.invisible&&0!==t.style.opacity&&(!a||a[0]||a[3])&&(!t.culling||!s(t,this._width,this._height))){var o=t.__clipPaths;(i.prevClipLayer!==e||l(o,i.prevElClipPaths))&&(i.prevElClipPaths&&(i.prevClipLayer.ctx.restore(),i.prevClipLayer=i.prevElClipPaths=null,i.prevEl=null),o&&(r.save(),h(o,r),i.prevClipLayer=e,i.prevElClipPaths=o)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,i.prevEl||null),i.prevEl=t,t.afterBrush&&t.afterBrush(r)}},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new v("zr_"+t,this,this.dpr),e.__builtin__=!0,this._layerConfig[t]&&f.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var n=this._layers,i=this._zlevelList,a=i.length,o=null,s=-1,l=this._domRoot;if(n[t])return void d("ZLevel "+t+" has been used already");if(!r(e))return void d("Layer of zlevel "+t+" is not valid");if(a>0&&t>i[0]){for(s=0;s<a-1&&!(i[s]<t&&i[s+1]>t);s++);o=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(o){var h=o.dom;h.nextSibling?l.insertBefore(e.dom,h.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom)},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i<r.length;i++)n=r[i],t.call(e,this._layers[n],n)},eachBuiltinLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],n=this._layers[i],n.__builtin__&&t.call(e,n,i)},eachOtherLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],n=this._layers[i],n.__builtin__||t.call(e,n,i)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){var e=this._layers,n=this._progressiveLayers,i={},r={};this.eachBuiltinLayer(function(t,e){i[e]=t.elCount,t.elCount=0,t.__dirty=!1}),f.each(n,function(t,e){r[e]=t.elCount,t.elCount=0,t.__dirty=!1});for(var a,o,s=0,l=0,h=0,u=t.length;h<u;h++){var c=t[h],d=this._singleCanvas?0:c.zlevel,p=e[d],g=c.progressive;if(p&&(p.elCount++,p.__dirty=p.__dirty||c.__dirty),g>=0){o!==g&&(o=g,l++);var m=c.__frame=l-1;if(!a){var x=Math.min(s,y-1);a=n[x],a||(a=n[x]=new v("progressive",this,this.dpr),a.initContext()),a.__maxProgress=0}a.__dirty=a.__dirty||c.__dirty,a.elCount++,a.__maxProgress=Math.max(a.__maxProgress,m),a.__maxProgress>=a.__progress&&(p.__dirty=!0)}else c.__frame=-1,a&&(a.__nextIdxNotProg=h,s++,a=null)}a&&(s++,a.__nextIdxNotProg=h),this.eachBuiltinLayer(function(t,e){i[e]!==t.elCount&&(t.__dirty=!0)}),n.length=Math.min(s,y),f.each(n,function(t,e){r[e]!==t.elCount&&(c.__dirty=!0),t.__dirty&&(t.__progress=0)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?f.merge(n[t],e,!0):n[t]=e;var i=this._layers[t];i&&f.merge(i,n[t],!0)}},delLayer:function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(f.indexOf(n,t),1))},resize:function(t,e){var n=this._domRoot;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!=t||e!=this._height){n.style.width=t+"px",n.style.height=e+"px";for(var r in this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(t,e);f.each(this._progressiveLayers,function(n){n.resize(t,e)}),this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas)return this._layers[0].dom;var e=new v("image",this,t.pixelRatio||this.dpr);e.initContext(),e.clearColor=t.backgroundColor,e.clear();for(var n=this.storage.getDisplayList(!0),i={},r=0;r<n.length;r++){var a=n[r];this._doPaintEl(a,e,!0,i)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],r=["clientWidth","clientHeight"][t],a=["paddingLeft","paddingTop"][t],o=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var s=this.root,l=document.defaultView.getComputedStyle(s);return(s[r]||i(l[n])||i(s.style[n]))-(i(l[a])||0)-(i(l[o])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var i=document.createElement("canvas"),r=i.getContext("2d"),a=t.getBoundingRect(),o=t.style,s=o.shadowBlur,l=o.shadowOffsetX,h=o.shadowOffsetY,u=o.hasStroke()?o.lineWidth:0,c=Math.max(u/2,-l+s),f=Math.max(u/2,l+s),d=Math.max(u/2,-h+s),p=Math.max(u/2,h+s),g=a.width+c+f,v=a.height+d+p;i.width=g*e,i.height=v*e,r.scale(e,e),r.clearRect(0,0,g,v),r.dpr=e;var m={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[c-a.x,d-a.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(r);var y=n(53),x=new y({style:{x:0,y:0,image:i}});return null!=m.position&&(x.position=t.position=m.position),null!=m.rotation&&(x.rotation=t.rotation=m.rotation),null!=m.scale&&(x.scale=t.scale=m.scale),x}},t.exports=b},function(t,e,n){"use strict";function i(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var r=n(1),a=n(9),o=n(36),s=n(51),l=function(){this._roots=[],this._displayList=[],this._displayListLen=0};l.prototype={constructor:l,traverse:function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,r=0,o=e.length;r<o;r++)this._updateAndAddDisplayable(e[r],null,t);n.length=this._displayListLen,a.canvasSupported&&s(n,i)},_updateAndAddDisplayable:function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var i=t.clipPath;if(i){e=e?e.slice():[];for(var r=i,a=t;r;)r.parent=a,r.updateTransform(),e.push(r),a=r,r=r.clipPath}if(t.isGroup){for(var o=t._children,s=0;s<o.length;s++){var l=o[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,n)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof o&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var n=this._roots[e];n instanceof o&&n.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var e=0,i=t.length;e<i;e++)this.delRoot(t[e]);else{var a=r.indexOf(this._roots,t);a>=0&&(this.delFromStorage(t),this._roots.splice(a,1),t instanceof o&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t.__storage=this,t.dirty(!1),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:i},t.exports=l},function(t,e,n){"use strict";var i=n(1),r=n(21).Dispatcher,a=n(67),o=n(66),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,r.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),n=0;n<e.length;n++)this.addClip(e[n])},removeClip:function(t){var e=i.indexOf(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;n<e.length;n++)this.removeClip(e[n]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,n=this._clips,i=n.length,r=[],a=[],o=0;o<i;o++){var s=n[o],l=s.step(t,e);l&&(r.push(l),a.push(s))}for(var o=0;o<i;)n[o]._needsRemove?(n[o]=n[i-1],n.pop(),i--):o++;i=r.length;for(var o=0;o<i;o++)a[o].fire(r[o]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(a(t),!e._paused&&e._update())}var e=this;this._running=!0,a(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var n=new o(t,e.loop,e.getter,e.setter);return this.addAnimator(n),n}},i.mixin(s,r),t.exports=s},function(t,e,n){function i(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}var r=n(158);i.prototype={constructor:i,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)return void(this._pausedTime+=e);var n=(t-this._startTime-this._pausedTime)/this._life;if(!(n<0)){n=Math.min(n,1);var i=this.easing,a="string"==typeof i?r[i]:i,o="function"==typeof a?a(n):n;return this.fire("frame",o),1==n?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}},t.exports=i},function(t,e){var n={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),-(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)))},elasticOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?-.5*(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)):n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-n.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*n.bounceIn(2*t):.5*n.bounceOut(2*t-1)+.5}};t.exports=n},function(t,e,n){var i=n(68).normalizeRadian,r=2*Math.PI;t.exports={containStroke:function(t,e,n,a,o,s,l,h,u){if(0===l)return!1;var c=l;h-=t,u-=e;var f=Math.sqrt(h*h+u*u);if(f-c>n||f+c<n)return!1;if(Math.abs(a-o)%r<1e-4)return!0;if(s){var d=a;a=i(o),o=i(d)}else a=i(a),o=i(o);a>o&&(o+=r);var p=Math.atan2(u,h);return p<0&&(p+=r),p>=a&&p<=o||p+r>=a&&p+r<=o}}},function(t,e,n){var i=n(20);t.exports={containStroke:function(t,e,n,r,a,o,s,l,h,u,c){if(0===h)return!1;var f=h;if(c>e+f&&c>r+f&&c>o+f&&c>l+f||c<e-f&&c<r-f&&c<o-f&&c<l-f||u>t+f&&u>n+f&&u>a+f&&u>s+f||u<t-f&&u<n-f&&u<a-f&&u<s-f)return!1;var d=i.cubicProjectPoint(t,e,n,r,a,o,s,l,u,c,null);return d<=f/2}}},function(t,e,n){"use strict";function i(t,e){return Math.abs(t-e)<x}function r(){var t=b[0];b[0]=b[1],b[1]=t}function a(t,e,n,i,a,o,s,l,h,u){if(u>e&&u>i&&u>o&&u>l||u<e&&u<i&&u<o&&u<l)return 0;var c=g.cubicRootAt(e,i,o,l,u,_);if(0===c)return 0;for(var f,d,p=0,v=-1,m=0;m<c;m++){var y=_[m],x=0===y||1===y?.5:1,w=g.cubicAt(t,n,a,s,y);w<h||(v<0&&(v=g.cubicExtrema(e,i,o,l,b),b[1]<b[0]&&v>1&&r(),f=g.cubicAt(e,i,o,l,b[0]),v>1&&(d=g.cubicAt(e,i,o,l,b[1]))),p+=2==v?y<b[0]?f<e?x:-x:y<b[1]?d<f?x:-x:l<d?x:-x:y<b[0]?f<e?x:-x:l<f?x:-x)}return p}function o(t,e,n,i,r,a,o,s){if(s>e&&s>i&&s>a||s<e&&s<i&&s<a)return 0;var l=g.quadraticRootAt(e,i,a,s,_);if(0===l)return 0;var h=g.quadraticExtremum(e,i,a);if(h>=0&&h<=1){for(var u=0,c=g.quadraticAt(e,i,a,h),f=0;f<l;f++){var d=0===_[f]||1===_[f]?.5:1,p=g.quadraticAt(t,n,r,_[f]);p<o||(u+=_[f]<h?c<e?d:-d:a<c?d:-d)}return u}var d=0===_[0]||1===_[0]?.5:1,p=g.quadraticAt(t,n,r,_[0]);return p<o?0:a<e?d:-d}function s(t,e,n,i,r,a,o,s){if(s-=e,s>n||s<-n)return 0;var l=Math.sqrt(n*n-s*s);_[0]=-l,_[1]=l;var h=Math.abs(i-r);if(h<1e-4)return 0;if(h%y<1e-4){i=0,r=y;var u=a?1:-1;return o>=_[0]+t&&o<=_[1]+t?u:0}if(a){var l=i;i=p(r),r=p(l)}else i=p(i),r=p(r);i>r&&(r+=y);for(var c=0,f=0;f<2;f++){var d=_[f];if(d+t>o){var g=Math.atan2(s,d),u=a?1:-1;g<0&&(g=y+g),(g>=i&&g<=r||g+y>=i&&g+y<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(u=-u),c+=u)}}return c}function l(t,e,n,r,l){for(var u=0,p=0,g=0,y=0,x=0,_=0;_<t.length;){var b=t[_++];switch(b===h.M&&_>1&&(n||(u+=v(p,g,y,x,r,l))),1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case h.M:y=t[_++],x=t[_++],p=y,g=x;break;case h.L:if(n){if(m(p,g,t[_],t[_+1],e,r,l))return!0}else u+=v(p,g,t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.C:if(n){if(c.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else u+=a(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.Q:if(n){if(f.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else u+=o(p,g,t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.A:var w=t[_++],M=t[_++],T=t[_++],S=t[_++],A=t[_++],C=t[_++],I=(t[_++],1-t[_++]),P=Math.cos(A)*T+w,L=Math.sin(A)*S+M;_>1?u+=v(p,g,P,L,r,l):(y=P,x=L);var k=(r-w)*S/T+w;if(n){if(d.containStroke(w,M,S,A,A+C,I,e,k,l))return!0}else u+=s(w,M,S,A,A+C,I,k,l);p=Math.cos(A+C)*T+w,g=Math.sin(A+C)*S+M;break;case h.R:y=p=t[_++],x=g=t[_++];var O=t[_++],D=t[_++],P=y+O,L=x+D;if(n){if(m(y,x,P,x,e,r,l)||m(P,x,P,L,e,r,l)||m(P,L,y,L,e,r,l)||m(y,L,y,x,e,r,l))return!0}else u+=v(P,x,P,L,r,l),u+=v(y,L,y,x,r,l);break;case h.Z:if(n){if(m(p,g,y,x,e,r,l))return!0}else u+=v(p,g,y,x,r,l);p=y,g=x}}return n||i(g,x)||(u+=v(p,g,y,x,r,l)||0),0!==u}var h=n(27).CMD,u=n(96),c=n(160),f=n(97),d=n(159),p=n(68).normalizeRadian,g=n(20),v=n(98),m=u.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,n){return l(t,0,!1,e,n)},containStroke:function(t,e,n,i){return l(t,e,!0,n,i)}}},function(t,e,n){"use strict";function i(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}function r(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var a=n(21),o=function(){this._track=[]};o.prototype={constructor:o,recognize:function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,s=i.length;o<s;o++){var l=i[o],h=a.clientToLocal(n,l,{});r.points.push([h.zrX,h.zrY]),r.touches.push(l)}this._track.push(r)}},_recognize:function(t){for(var e in s)if(s.hasOwnProperty(e)){var n=s[e](this._track,t);if(n)return n}}};var s={pinch:function(t,e){var n=t.length;if(n){var a=(t[n-1]||{}).points,o=(t[n-2]||{}).points||a;if(o&&o.length>1&&a&&a.length>1){var s=i(a)/i(o);!isFinite(s)&&(s=1),e.pinchScale=s;var l=r(a);return e.pinchX=l[0],e.pinchY=l[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=o},function(t,e,n){function i(t){return"mousewheel"===t&&f.browser.firefox?"DOMMouseScroll":t}function r(t,e,n){var i=t._gestureMgr;"start"===n&&i.clear();var r=i.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===n&&i.clear(),r){var a=r.type;e.gestureEvent=a,t.handler.dispatchToElement({target:r.target},a,r.event)}}function a(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function o(t){var e=t.pointerType;return"pen"===e||"touch"===e}function s(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}u.each(x,function(e){t._handlers[e]=u.bind(w[e],t)}),u.each(b,function(e){t._handlers[e]=u.bind(w[e],t)}),u.each(y,function(n){t._handlers[n]=e(w[n],t)})}function l(t){function e(e,n){u.each(e,function(e){p(t,i(e),n._handlers[e])},n)}c.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new d,this._handlers={},s(this),f.pointerEventsSupported?e(b,this):(f.touchEventsSupported&&e(x,this),e(y,this))}var h=n(21),u=n(1),c=n(23),f=n(9),d=n(162),p=h.addEventListener,g=h.removeEventListener,v=h.normalizeEvent,m=300,y=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],x=["touchstart","touchend","touchmove"],_={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},b=u.map(y,function(t){var e=t.replace("mouse","pointer");return _[e]?e:t}),w={mousemove:function(t){t=v(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){t=v(this.dom,t);var e=t.toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){t=v(this.dom,t),t.zrByTouch=!0,this._lastTouchMoment=new Date,r(this,t,"start"),w.mousemove.call(this,t),w.mousedown.call(this,t),a(this)},touchmove:function(t){t=v(this.dom,t),t.zrByTouch=!0,r(this,t,"change"),w.mousemove.call(this,t),a(this)},touchend:function(t){t=v(this.dom,t),t.zrByTouch=!0,r(this,t,"end"),w.mouseup.call(this,t),+new Date-this._lastTouchMoment<m&&w.click.call(this,t),a(this)},pointerdown:function(t){w.mousedown.call(this,t)},pointermove:function(t){o(t)||w.mousemove.call(this,t)},pointerup:function(t){w.mouseup.call(this,t)},pointerout:function(t){o(t)||w.mouseout.call(this,t)}};u.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){w[t]=function(e){e=v(this.dom,e),this.trigger(t,e)}});var M=l.prototype;M.dispose=function(){for(var t=y.concat(x),e=0;e<t.length;e++){var n=t[e];g(this.dom,i(n),this._handlers[n])}},M.setCursor=function(t){this.dom.style.cursor=t||"default"},u.mixin(l,c),t.exports=l},function(t,e,n){var i=n(8);t.exports=i.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,n=0;n<e.length;n++)t=t||e[n].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},afterBrush:function(){for(var t=this.shape.paths,e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),i.prototype.getBoundingRect.call(this)}})},function(t,e,n){"use strict";var i=n(1),r=n(39),a=function(t,e,n,i,a){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,this.type="radial",this.global=a||!1,r.call(this,i)};a.prototype={constructor:a},i.inherits(a,r),t.exports=a},function(t,e){t.exports={buildPath:function(t,e){var n,i,r,a,o=e.x,s=e.y,l=e.width,h=e.height,u=e.r;l<0&&(o+=l,l=-l),h<0&&(s+=h,h=-h),"number"==typeof u?n=i=r=a=u:u instanceof Array?1===u.length?n=i=r=a=u[0]:2===u.length?(n=r=u[0],i=a=u[1]):3===u.length?(n=u[0],i=a=u[1],r=u[2]):(n=u[0],i=u[1],r=u[2],a=u[3]):n=i=r=a=0;var c;n+i>l&&(c=n+i,n*=l/c,i*=l/c),r+a>l&&(c=r+a,r*=l/c,a*=l/c),i+r>h&&(c=i+r,i*=h/c,r*=h/c),n+a>h&&(c=n+a,n*=h/c,a*=h/c),t.moveTo(o+n,s),t.lineTo(o+l-i,s),0!==i&&t.quadraticCurveTo(o+l,s,o+l,s+i),t.lineTo(o+l,s+h-r),0!==r&&t.quadraticCurveTo(o+l,s+h,o+l-r,s+h),t.lineTo(o+a,s+h),0!==a&&t.quadraticCurveTo(o,s+h,o,s+h-a),t.lineTo(o,s+n),0!==n&&t.quadraticCurveTo(o,s,o+n,s)}}},function(t,e,n){var i=n(5),r=i.min,a=i.max,o=i.scale,s=i.distance,l=i.add;t.exports=function(t,e,n,h){var u,c,f,d,p=[],g=[],v=[],m=[];if(h){f=[1/0,1/0],d=[-(1/0),-(1/0)];for(var y=0,x=t.length;y<x;y++)r(f,f,t[y]),a(d,d,t[y]);r(f,f,h[0]),a(d,d,h[1])}for(var y=0,x=t.length;y<x;y++){var _=t[y];if(n)u=t[y?y-1:x-1],c=t[(y+1)%x];else{if(0===y||y===x-1){p.push(i.clone(t[y]));continue}u=t[y-1],c=t[y+1]}i.sub(g,c,u),o(g,g,e);var b=s(_,u),w=s(_,c),M=b+w;0!==M&&(b/=M,w/=M),o(v,g,-b),o(m,g,w);var T=l([],_,v),S=l([],_,m);h&&(a(T,T,f),r(T,T,d),a(S,S,f),r(S,S,d)),p.push(T),p.push(S)}return n&&p.push(p.shift()),p}},function(t,e,n){function i(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}var r=n(5);t.exports=function(t,e){for(var n=t.length,a=[],o=0,s=1;s<n;s++)o+=r.distance(t[s-1],t[s]);var l=o/2;l=l<n?n:l;for(var s=0;s<l;s++){var h,u,c,f=s/(l-1)*(e?n:n-1),d=Math.floor(f),p=f-d,g=t[d%n];e?(h=t[(d-1+n)%n],u=t[(d+1)%n],c=t[(d+2)%n]):(h=t[0===d?d:d-1],u=t[d>n-2?n-1:d+1],c=t[d>n-3?n-1:d+2]);var v=p*p,m=p*v;a.push([i(h[0],g[0],u[0],c[0],p,v,m),i(h[1],g[1],u[1],c[1],p,v,m)])}return a}},function(t,e,n){t.exports=n(8).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),a=e.startAngle,o=e.endAngle,s=e.clockwise,l=Math.cos(a),h=Math.sin(a);t.moveTo(l*r+n,h*r+i),t.arc(n,i,r,a,o,!s)}})},function(t,e,n){"use strict";function i(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?c:h)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?c:h)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?u:l)(t.x1,t.cpx1,t.x2,e),(n?u:l)(t.y1,t.cpy1,t.y2,e)]}var r=n(20),a=n(5),o=r.quadraticSubdivide,s=r.cubicSubdivide,l=r.quadraticAt,h=r.cubicAt,u=r.quadraticDerivativeAt,c=r.cubicDerivativeAt,f=[];t.exports=n(8).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,l=e.cpx1,h=e.cpy1,u=e.cpx2,c=e.cpy2,d=e.percent;0!==d&&(t.moveTo(n,i),null==u||null==c?(d<1&&(o(n,l,r,d,f),l=f[1],r=f[2],o(i,h,a,d,f),h=f[1],a=f[2]),t.quadraticCurveTo(l,h,r,a)):(d<1&&(s(n,l,u,r,d,f),l=f[1],u=f[2],r=f[3],s(i,h,c,a,d,f),h=f[1],c=f[2],a=f[3]),t.bezierCurveTo(l,h,u,c,r,a)))},pointAt:function(t){return i(this.shape,t,!1)},tangentAt:function(t){var e=i(this.shape,t,!0);return a.normalize(e,e)}})},function(t,e,n){"use strict";t.exports=n(8).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,n){t.exports=n(8).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,o=e.percent;0!==o&&(t.moveTo(n,i),o<1&&(r=n*(1-o)+r*o,a=i*(1-o)+a*o),t.lineTo(r,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,n){var i=n(73);t.exports=n(8).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){i.buildPath(t,e,!0)}})},function(t,e,n){var i=n(73);t.exports=n(8).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){i.buildPath(t,e,!1)}})},function(t,e,n){var i=n(166);t.exports=n(8).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,r=e.y,a=e.width,o=e.height;e.r?i.buildPath(t,e):t.rect(n,r,a,o),t.closePath()}})},function(t,e,n){t.exports=n(8).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)}})},function(t,e,n){var i=n(9),r=n(8),a=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]];t.exports=r.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:i.browser.ie&&i.browser.version>=11?function(){var t,e=this.__clipPaths,n=this.style;if(e)for(var i=0;i<e.length;i++){var o=e[i]&&e[i].shape;if(o&&o.startAngle===o.endAngle){for(var s=0;s<a.length;s++)a[s][2]=n[a[s][0]],n[a[s][0]]=a[s][1];t=!0;break}}if(r.prototype.brush.apply(this,arguments),t)for(var s=0;s<a.length;s++)n[a[s][0]]=a[s][2]}:r.prototype.brush,buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),a=Math.max(e.r,0),o=e.startAngle,s=e.endAngle,l=e.clockwise,h=Math.cos(o),u=Math.sin(o);t.moveTo(h*r+n,u*r+i),t.lineTo(h*a+n,u*a+i),t.arc(n,i,a,o,s,!l),t.lineTo(Math.cos(s)*r+n,Math.sin(s)*r+i),0!==r&&t.arc(n,i,r,s,o,l),t.closePath()}})},function(t,e,n){"use strict";var i=n(66),r=n(1),a=r.isString,o=r.isFunction,s=r.isObject,l=n(52),h=function(){this.animators=[]};h.prototype={constructor:h,animate:function(t,e){var n,a=!1,o=this,s=this.__zr;if(t){var h=t.split("."),u=o;a="shape"===h[0];for(var c=0,f=h.length;c<f;c++)u&&(u=u[h[c]]);u&&(n=u)}else n=o;if(!n)return void l('Property "'+t+'" is not existed in element '+o.id);var d=o.animators,p=new i(n,e);return p.during(function(t){o.dirty(a)}).done(function(){d.splice(r.indexOf(d,p),1)}),d.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,n=e.length,i=0;i<n;i++)e[i].stop(t);return e.length=0,this},animateTo:function(t,e,n,i,r){function s(){h--,h||r&&r()}a(n)?(r=i,i=n,n=0):o(i)?(r=i,i="linear",n=0):o(n)?(r=n,n=0):o(e)?(r=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,n,i,r);var l=this.animators.slice(),h=l.length;h||r&&r();for(var u=0;u<l.length;u++)l[u].done(s).start(i)},_animateToShallow:function(t,e,n,i,a){var o={},l=0;for(var h in n)if(n.hasOwnProperty(h))if(null!=e[h])s(n[h])&&!r.isArrayLike(n[h])?this._animateToShallow(t?t+"."+h:h,e[h],n[h],i,a):(o[h]=n[h],l++);else if(null!=n[h])if(t){var u={};u[t]={},u[t][h]=n[h],this.attr(u)}else this.attr(h,n[h]);return l>0&&this.animate(t,!1).when(null==i?500:i,o).delay(a||0),this}},t.exports=h},function(t,e){function n(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function i(t,e){return{target:t,topTarget:e&&e.topTarget}}n.prototype={constructor:n,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(i(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,r=t.offsetY,a=n-this._x,o=r-this._y;this._x=n,this._y=r,e.drift(a,o,t),this.dispatchToElement(i(e,t),"drag",t.event);var s=this.findHover(n,r,e).target,l=this._dropTarget;this._dropTarget=s,e!==s&&(l&&s!==l&&this.dispatchToElement(i(l,t),"dragleave",t.event),s&&s!==l&&this.dispatchToElement(i(s,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(i(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(i(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=n},function(t,e,n){function i(t,e,n,i,r,a,o,s,l,h,p){var m=l*(d/180),y=f(m)*(t-n)/2+c(m)*(e-i)/2,x=-1*c(m)*(t-n)/2+f(m)*(e-i)/2,_=y*y/(o*o)+x*x/(s*s);_>1&&(o*=u(_),s*=u(_));var b=(r===a?-1:1)*u((o*o*(s*s)-o*o*(x*x)-s*s*(y*y))/(o*o*(x*x)+s*s*(y*y)))||0,w=b*o*x/s,M=b*-s*y/o,T=(t+n)/2+f(m)*w-c(m)*M,S=(e+i)/2+c(m)*w+f(m)*M,A=v([1,0],[(y-w)/o,(x-M)/s]),C=[(y-w)/o,(x-M)/s],I=[(-1*y-w)/o,(-1*x-M)/s],P=v(C,I);g(C,I)<=-1&&(P=d),g(C,I)>=1&&(P=0),0===a&&P>0&&(P-=2*d),1===a&&P<0&&(P+=2*d),p.addData(h,T,S,o,s,A,P,m,a)}function r(t){if(!t)return[];var e,n=t.replace(/-/g," -").replace(/  /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e<h.length;e++)n=n.replace(new RegExp(h[e],"g"),"|"+h[e]);var r,a=n.split("|"),o=0,l=0,u=new s,c=s.CMD;for(e=1;e<a.length;e++){var f,d=a[e],p=d.charAt(0),g=0,v=d.slice(1).replace(/e,-/g,"e-").split(",");v.length>0&&""===v[0]&&v.shift();for(var m=0;m<v.length;m++)v[m]=parseFloat(v[m]);for(;g<v.length&&!isNaN(v[g])&&!isNaN(v[0]);){var y,x,_,b,w,M,T,S=o,A=l;switch(p){case"l":o+=v[g++],l+=v[g++],f=c.L,u.addData(f,o,l);break;case"L":o=v[g++],l=v[g++],f=c.L,u.addData(f,o,l);break;case"m":o+=v[g++],l+=v[g++],f=c.M,u.addData(f,o,l),p="l";break;case"M":o=v[g++],l=v[g++],f=c.M,u.addData(f,o,l),p="L";break;case"h":o+=v[g++],f=c.L,u.addData(f,o,l);break;case"H":o=v[g++],f=c.L,u.addData(f,o,l);break;case"v":l+=v[g++],f=c.L,u.addData(f,o,l);break;case"V":l=v[g++],f=c.L,u.addData(f,o,l);break;case"C":f=c.C,u.addData(f,v[g++],v[g++],v[g++],v[g++],v[g++],v[g++]),o=v[g-2],l=v[g-1];break;case"c":f=c.C,u.addData(f,v[g++]+o,v[g++]+l,v[g++]+o,v[g++]+l,v[g++]+o,v[g++]+l),o+=v[g-2],l+=v[g-1];break;case"S":y=o,x=l;var C=u.len(),I=u.data;r===c.C&&(y+=o-I[C-4],x+=l-I[C-3]),f=c.C,S=v[g++],A=v[g++],o=v[g++],l=v[g++],u.addData(f,y,x,S,A,o,l);break;case"s":y=o,x=l;var C=u.len(),I=u.data;r===c.C&&(y+=o-I[C-4],x+=l-I[C-3]),f=c.C,S=o+v[g++],A=l+v[g++],o+=v[g++],l+=v[g++],u.addData(f,y,x,S,A,o,l);break;case"Q":S=v[g++],A=v[g++],o=v[g++],l=v[g++],f=c.Q,u.addData(f,S,A,o,l);break;case"q":S=v[g++]+o,A=v[g++]+l,o+=v[g++],l+=v[g++],f=c.Q,u.addData(f,S,A,o,l);break;case"T":y=o,x=l;var C=u.len(),I=u.data;r===c.Q&&(y+=o-I[C-4],x+=l-I[C-3]),o=v[g++],l=v[g++],f=c.Q,u.addData(f,y,x,o,l);break;case"t":y=o,x=l;var C=u.len(),I=u.data;r===c.Q&&(y+=o-I[C-4],x+=l-I[C-3]),o+=v[g++],l+=v[g++],f=c.Q,u.addData(f,y,x,o,l);break;case"A":_=v[g++],b=v[g++],w=v[g++],M=v[g++],T=v[g++],S=o,A=l,o=v[g++],l=v[g++],f=c.A,i(S,A,o,l,M,T,_,b,w,f,u);break;case"a":_=v[g++],b=v[g++],w=v[g++],M=v[g++],T=v[g++],S=o,A=l,o+=v[g++],l+=v[g++],f=c.A,i(S,A,o,l,M,T,_,b,w,f,u)}}"z"!==p&&"Z"!==p||(f=c.Z,u.addData(f)),r=f}return u.toStatic(),u}function a(t,e){var n=r(t);return e=e||{},e.buildPath=function(t){if(t.setData){t.setData(n.data);var e=t.getContext();e&&t.rebuildPath(e)}else{var e=t;n.rebuildPath(e)}},e.applyTransform=function(t){l(n,t),this.dirty(!0)},e}var o=n(8),s=n(27),l=n(181),h=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],u=Math.sqrt,c=Math.sin,f=Math.cos,d=Math.PI,p=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},g=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(p(t)*p(e))},v=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(g(t,e))};t.exports={createFromString:function(t,e){return new o(a(t,e))},extendFromString:function(t,e){return o.extend(a(t,e))},mergePath:function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){
-var a=t[r];a.path||a.createPathProxy(),a.__dirtyPath&&a.buildPath(a.path,a.shape,!0),n.push(a.path)}var s=new o(e);return s.createPathProxy(),s.buildPath=function(t){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,n){function i(t,e){var n,i,a,u,c,f,d=t.data,p=r.M,g=r.C,v=r.L,m=r.R,y=r.A,x=r.Q;for(a=0,u=0;a<d.length;){switch(n=d[a++],u=a,i=0,n){case p:i=1;break;case v:i=1;break;case g:i=3;break;case x:i=2;break;case y:var _=e[4],b=e[5],w=l(e[0]*e[0]+e[1]*e[1]),M=l(e[2]*e[2]+e[3]*e[3]),T=h(-e[1]/M,e[0]/w);d[a]*=w,d[a++]+=_,d[a]*=M,d[a++]+=b,d[a++]*=w,d[a++]*=M,d[a++]+=T,d[a++]+=T,a+=2,u=a;break;case m:f[0]=d[a++],f[1]=d[a++],o(f,f,e),d[u++]=f[0],d[u++]=f[1],f[0]+=d[a++],f[1]+=d[a++],o(f,f,e),d[u++]=f[0],d[u++]=f[1]}for(c=0;c<i;c++){var f=s[c];f[0]=d[a++],f[1]=d[a++],o(f,f,e),d[u++]=f[0],d[u++]=f[1]}}}var r=n(27).CMD,a=n(5),o=a.applyTransform,s=[[],[],[]],l=Math.sqrt,h=Math.atan2;t.exports=i}])});
\ No newline at end of file
+var r=n(71),a=n(9),o=n(1),s=n(152),l=n(155),h=n(156),u=n(163),c=!a.canvasSupported,f={canvas:n(154)},d={},p={};p.version="3.5.0",p.init=function(t,e){var n=new g(r(),t,e);return d[n.id]=n,n},p.dispose=function(t){if(t)t.dispose();else{for(var e in d)d.hasOwnProperty(e)&&d[e].dispose();d={}}return p},p.getInstance=function(t){return d[t]},p.registerPainter=function(t,e){f[t]=e};var g=function(t,e,n){n=n||{},this.dom=e,this.id=t;var i=this,r=new l,d=n.renderer;if(c){if(!f.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");d="vml"}else d&&f[d]||(d="canvas");var p=new f[d](e,r,n);this.storage=r,this.painter=p;var g=a.node?null:new u(p.getViewportRoot());this.handler=new s(r,p,g,p.root),this.animation=new h({stage:{update:o.bind(this.flush,this)}}),this.animation.start(),this._needsRefresh;var v=r.delFromStorage,m=r.addToStorage;r.delFromStorage=function(t){v.call(r,t),t&&t.removeSelfFromZr(i)},r.addToStorage=function(t){m.call(r,t),t.addSelfToZr(i)}};g.prototype={constructor:g,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,n){this.handler.on(t,e,n)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,i(this.id)}},t.exports=p},function(t,e,n){var i=n(2),r=n(1);t.exports=function(t,e){r.each(e,function(e){e.update="updateView",i.registerAction(e,function(n,i){var r={};return i.eachComponent({mainType:"series",subType:t,query:n},function(t){t[e.method]&&t[e.method](n.name);var i=t.getData();i.each(function(e){var n=i.getName(e);r[n]=t.isSelected(n)||!1})}),{name:n.name,selected:r}})})}},function(t,e,n){"use strict";var i=n(17),r=n(28);t.exports=i.extend({type:"series.__base_bar__",getInitialData:function(t,e){return r(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(t,!0),i=this.getData(),r=i.getLayout("offset"),a=i.getLayout("size"),o=e.getBaseAxis().isHorizontal()?0:1;return n[o]+=r+a/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,itemStyle:{normal:{},emphasis:{}}}})},function(t,e,n){function i(t,e,n,i,r){a.setText(t,e,n),t.text=i,"outside"===t.textPosition&&(t.textPosition=r)}var r=n(1),a=n(3),o={};o.setLabel=function(t,e,n,a,o,s,l){var h=n.getModel("label.normal"),u=n.getModel("label.emphasis");h.get("show")?i(t,h,a,r.retrieve(o.getFormattedLabel(s,"normal"),o.getRawValue(s)),l):t.text="",u.get("show")?i(e,u,a,r.retrieve(o.getFormattedLabel(s,"emphasis"),o.getRawValue(s)),l):e.text=""},t.exports=o},function(t,e,n){var i=n(3),r=n(1),a=n(5),o={};o.findLabelValueDim=function(t){var e,n=a.otherDimToDataDim(t,"label");if(n.length)e=n[0];else for(var i,r=t.dimensions.slice();r.length&&(e=r.pop(),i=t.getDimensionInfo(e).type,"ordinal"===i||"time"===i););return e},o.setTextToStyle=function(t,e,n,a,o,s,l){null!=n&&s.getShallow("show")?(i.setText(a,s,l),a.text=r.retrieve(o.getFormattedLabel(e,"normal"),t.get(n,e))):a.text=""},t.exports=o},function(t,e,n){function i(t){return isNaN(t[0])||isNaN(t[1])}function r(t,e,n,r,a,o,g,v,m,y,x){for(var _=0,b=n,w=0;w<r;w++){var M=e[b];if(b>=a||b<0)break;if(i(M)){if(x){b+=o;continue}break}if(b===n)t[o>0?"moveTo":"lineTo"](M[0],M[1]),c(d,M);else if(m>0){var T=b+o,S=e[T];if(x)for(;S&&i(e[T]);)T+=o,S=e[T];var A=.5,I=e[_],S=e[T];if(!S||i(S))c(p,M);else{i(S)&&!x&&(S=M),s.sub(f,S,I);var C,P;if("x"===y||"y"===y){var L="x"===y?0:1;C=Math.abs(M[L]-I[L]),P=Math.abs(M[L]-S[L])}else C=s.dist(M,I),P=s.dist(M,S);A=P/(P+C),u(p,M,f,-m*(1-A))}l(d,d,v),h(d,d,g),l(p,p,v),h(p,p,g),t.bezierCurveTo(d[0],d[1],p[0],p[1],M[0],M[1]),u(d,M,f,m*A)}else t.lineTo(M[0],M[1]);_=b,b+=o}return w}function a(t,e){var n=[1/0,1/0],i=[-(1/0),-(1/0)];if(e)for(var r=0;r<t.length;r++){var a=t[r];a[0]<n[0]&&(n[0]=a[0]),a[1]<n[1]&&(n[1]=a[1]),a[0]>i[0]&&(i[0]=a[0]),a[1]>i[1]&&(i[1]=a[1])}return{min:e?n:i,max:e?i:n}}var o=n(8),s=n(6),l=s.min,h=s.max,u=s.scaleAndAdd,c=s.copy,f=[],d=[],p=[];t.exports={Polyline:o.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},buildPath:function(t,e){var n=e.points,o=0,s=n.length,l=a(n,e.smoothConstraint);if(e.connectNulls){for(;s>0&&i(n[s-1]);s--);for(;o<s&&i(n[o]);o++);}for(;o<s;)o+=r(t,n,o,s,s,1,l.min,l.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),Polygon:o.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},buildPath:function(t,e){var n=e.points,o=e.stackedOnPoints,s=0,l=n.length,h=e.smoothMonotone,u=a(n,e.smoothConstraint),c=a(o,e.smoothConstraint);if(e.connectNulls){for(;l>0&&i(n[l-1]);l--);for(;s<l&&i(n[s]);s++);}for(;s<l;){var f=r(t,n,s,l,l,1,u.min,u.max,e.smooth,h,e.connectNulls);r(t,o,s+f-1,f,l,-1,c.min,c.max,e.stackedOnSmooth,h,e.connectNulls),s+=f+1,t.closePath()}}})}},,,function(t,e,n){var i=n(1),r={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,textStyle:{fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},a=i.merge({boundaryGap:!0,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},r),o=i.merge({boundaryGap:[0,0],splitNumber:5},r),s=i.defaults({scale:!0,min:"dataMin",max:"dataMax"},o),l=i.defaults({scale:!0,logBase:10},o);t.exports={categoryAxis:a,valueAxis:o,timeAxis:s,logAxis:l}},function(t,e){t.exports={containStroke:function(t,e,n,i,r,a,o){if(0===r)return!1;var s=r,l=0,h=t;if(o>e+s&&o>i+s||o<e-s&&o<i-s||a>t+s&&a>n+s||a<t-s&&a<n-s)return!1;if(t===n)return Math.abs(a-t)<=s/2;l=(e-i)/(t-n),h=(t*i-n*e)/(t-n);var u=l*a-o+h,c=u*u/(l*l+1);return c<=s/2*s/2}}},function(t,e,n){var i=n(20);t.exports={containStroke:function(t,e,n,r,a,o,s,l,h){if(0===s)return!1;var u=s;if(h>e+u&&h>r+u&&h>o+u||h<e-u&&h<r-u&&h<o-u||l>t+u&&l>n+u&&l>a+u||l<t-u&&l<n-u&&l<a-u)return!1;var c=i.quadraticProjectPoint(t,e,n,r,a,o,l,h,null);return c<=u/2}}},function(t,e){t.exports=function(t,e,n,i,r,a){if(a>e&&a>i||a<e&&a<i)return 0;if(i===e)return 0;var o=i<e?1:-1,s=(a-e)/(i-e);1!==s&&0!==s||(o=i<e?.5:-.5);var l=s*(n-t)+t;return l>r?o:0}},function(t,e,n){"use strict";var i=n(1),r=n(39),a=function(t,e,n,i,a,o){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==i?0:i,this.type="linear",this.global=o||!1,r.call(this,a)};a.prototype={constructor:a},i.inherits(a,r),t.exports=a},function(t,e,n){"use strict";function i(t){r.each(a,function(e){this[e]=r.bind(t[e],t)},this)}var r=n(1),a=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"];t.exports=i},function(t,e,n){var i=n(1);n(57),n(103),n(104);var r=n(82),a=n(2);a.registerLayout(i.curry(r,"bar")),a.registerVisual(function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),n(32)},function(t,e,n){t.exports=n(90).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"})},function(t,e,n){"use strict";function i(t,e,n){n.style.text="",l.updateProps(n,{shape:{width:0}},e,t,function(){n.parent&&n.parent.remove(n)})}function r(t,e,n){n.style.text="",l.updateProps(n,{shape:{r:n.shape.r0}},e,t,function(){n.parent&&n.parent.remove(n)})}function a(t,e,n,i,r,a,o,u){var c=e.getItemVisual(n,"color"),f=e.getItemVisual(n,"opacity"),d=i.getModel("itemStyle.normal"),p=i.getModel("itemStyle.emphasis").getBarItemStyle();!u&&o&&t.setShape("r",d.get("barBorderRadius")||0),t.useStyle(s.defaults({fill:c,opacity:f},d.getBarItemStyle()));var g=o?r.height>0?"bottom":"top":r.width>0?"left":"right";u||h.setLabel(t.style,p,i,c,a,n,g),l.setHoverStyle(t,p)}function o(t,e){var n=t.get(u)||0;return Math.min(n,Math.abs(e.width),Math.abs(e.height))}var s=n(1),l=n(3),h=n(91),u=["itemStyle","normal","barBorderWidth"];s.extend(n(10).prototype,n(105));var c=n(2).extendChartView({type:"bar",render:function(t,e,n){var i=t.get("coordinateSystem");return"cartesian2d"!==i&&"polar"!==i||this._render(t,e,n),this.group},dispose:s.noop,_render:function(t,e,n){var o,s=this.group,h=t.getData(),u=this._data,c=t.coordinateSystem,p=c.getBaseAxis();"cartesian2d"===c.type?o=p.isHorizontal():"polar"===c.type&&(o="angle"===p.dim);var g=t.isAnimationEnabled()?t:null;h.diff(u).add(function(e){if(h.hasValue(e)){var n=h.getItemModel(e),i=d[c.type](h,e,n),r=f[c.type](h,e,n,i,o,g);h.setItemGraphicEl(e,r),s.add(r),a(r,h,e,n,i,t,o,"polar"===c.type)}}).update(function(e,n){var i=u.getItemGraphicEl(n);if(!h.hasValue(e))return void s.remove(i);var r=h.getItemModel(e),p=d[c.type](h,e,r);i?l.updateProps(i,{shape:p},g,e):i=f[c.type](h,e,r,p,o,g,!0),h.setItemGraphicEl(e,i),s.add(i),a(i,h,e,r,p,t,o,"polar"===c.type)}).remove(function(t){var e=u.getItemGraphicEl(t);"cartesian2d"===c.type?e&&i(t,g,e):e&&r(t,g,e)}).execute(),this._data=h},remove:function(t,e){var n=this.group,a=this._data;t.get("animation")?a&&a.eachItemGraphicEl(function(e){"sector"===e.type?r(e.dataIndex,t,e):i(e.dataIndex,t,e)}):n.removeAll()}}),f={cartesian2d:function(t,e,n,i,r,a,o){var h=new l.Rect({shape:s.extend({},i)});if(a){var u=h.shape,c=r?"height":"width",f={};u[c]=0,f[c]=i[c],l[o?"updateProps":"initProps"](h,{shape:f},a,e)}return h},polar:function(t,e,n,i,r,a,o){var h=new l.Sector({shape:s.extend({},i)});if(a){var u=h.shape,c=r?"r":"endAngle",f={};u[c]=r?0:i.startAngle,f[c]=i[c],l[o?"updateProps":"initProps"](h,{shape:f},a,e)}return h}},d={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=o(n,i),a=i.width>0?1:-1,s=i.height>0?1:-1;return{x:i.x+a*r/2,y:i.y+s*r/2,width:i.width-a*r,height:i.height-s*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle}}};t.exports=c},function(t,e,n){var i=n(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getBarItemStyle:function(t){var e=i.call(this,t);if(this.getBorderLineDash){var n=this.getBorderLineDash();n&&(e.lineDash=n)}return e}}},,,function(t,e,n){var i=n(1),r=n(2),a=r.PRIORITY;n(109),n(110),r.registerVisual(i.curry(n(50),"line","circle","line")),r.registerLayout(i.curry(n(61),"line")),r.registerProcessor(a.PROCESSOR.STATISTIC,i.curry(n(147),"line")),n(32)},function(t,e,n){"use strict";var i=n(28),r=n(17);t.exports=r.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return i(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}})},function(t,e,n){"use strict";function i(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++){var i=t[n],r=e[n];if(i[0]!==r[0]||i[1]!==r[1])return}return!0}}function r(t){return"number"==typeof t?t:t?.3:0}function a(t){var e=t.getGlobalExtent();if(t.onBand){var n=t.getBandWidth()/2-1,i=e[1]>e[0]?1:-1;e[0]+=i*n,e[1]-=i*n}return e}function o(t){return t>=0?1:-1}function s(t,e){var n=t.getBaseAxis(),i=t.getOtherAxis(n),r=n.onZero?0:i.scale.getExtent()[0],a=i.dim,s="x"===a||"radius"===a?1:0;return e.mapArray([a],function(i,l){for(var h,u=e.stackedOn;u&&o(u.get(a,l))===o(i);){h=u;break}var c=[];return c[s]=e.get(n.dim,l),c[1-s]=h?h.get(a,l,!0):r,t.dataToPoint(c)},!0)}function l(t,e,n){var i=a(t.getAxis("x")),r=a(t.getAxis("y")),o=t.getBaseAxis().isHorizontal(),s=Math.min(i[0],i[1]),l=Math.min(r[0],r[1]),h=Math.max(i[0],i[1])-s,u=Math.max(r[0],r[1])-l,c=n.get("lineStyle.normal.width")||2,f=n.get("clipOverflow")?c/2:Math.max(h,u);o?(l-=f,u+=2*f):(s-=f,h+=2*f);var d=new m.Rect({shape:{x:s,y:l,width:h,height:u}});return e&&(d.shape[o?"width":"height"]=0,m.initProps(d,{shape:{width:h,height:u}},n)),d}function h(t,e,n){var i=t.getAngleAxis(),r=t.getRadiusAxis(),a=r.getExtent(),o=i.getExtent(),s=Math.PI/180,l=new m.Sector({shape:{cx:t.cx,cy:t.cy,r0:a[0],r:a[1],startAngle:-o[0]*s,endAngle:-o[1]*s,clockwise:i.inverse}});return e&&(l.shape.endAngle=-o[0]*s,m.initProps(l,{shape:{endAngle:-o[1]*s}},n)),l}function u(t,e,n){return"polar"===t.type?h(t,e,n):l(t,e,n)}function c(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,a=[],o=0;o<t.length-1;o++){var s=t[o+1],l=t[o];a.push(l);var h=[];switch(n){case"end":h[r]=s[r],h[1-r]=l[1-r],a.push(h);break;case"middle":var u=(l[r]+s[r])/2,c=[];h[r]=c[r]=u,h[1-r]=l[1-r],c[1-r]=s[1-r],a.push(h),a.push(c);break;default:h[r]=l[r],h[1-r]=s[1-r],a.push(h)}}return t[o]&&a.push(t[o]),a}function f(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()){for(var i,r=n.length-1;r>=0;r--)if(n[r].dimension<2){i=n[r];break}if(i&&"cartesian2d"===e.type){var a=i.dimension,o=t.dimensions[a],s=e.getAxis(o),l=d.map(i.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),h=l.length,u=i.outerColors.slice();h&&l[0].coord>l[h-1].coord&&(l.reverse(),u.reverse());var c=10,f=l[0].coord-c,p=l[h-1].coord+c,g=p-f;if(g<.001)return"transparent";d.each(l,function(t){t.offset=(t.coord-f)/g}),l.push({offset:h?l[h-1].offset:.5,color:u[1]||"transparent"}),l.unshift({offset:h?l[0].offset:.5,color:u[0]||"transparent"});var v=new m.LinearGradient(0,0,0,0,l,(!0));return v[o]=f,v[o+"2"]=p,v}}}var d=n(1),p=n(44),g=n(54),v=n(111),m=n(3),y=n(5),x=n(93),_=n(30);t.exports=_.extend({type:"line",init:function(){var t=new m.Group,e=new p;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var a=t.coordinateSystem,o=this.group,l=t.getData(),h=t.getModel("lineStyle.normal"),p=t.getModel("areaStyle.normal"),g=l.mapArray(l.getItemLayout,!0),v="polar"===a.type,m=this._coordSys,y=this._symbolDraw,x=this._polyline,_=this._polygon,b=this._lineGroup,w=t.get("animation"),M=!p.isEmpty(),T=s(a,l),S=t.get("showSymbol"),A=S&&!v&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,a),I=this._data;I&&I.eachItemGraphicEl(function(t,e){t.__temp&&(o.remove(t),I.setItemGraphicEl(e,null))}),S||y.remove(),o.add(b);var C=!v&&t.get("step");x&&m.type===a.type&&C===this._step?(M&&!_?_=this._newPolygon(g,T,a,w):_&&!M&&(b.remove(_),_=this._polygon=null),b.setClipPath(u(a,!1,t)),S&&y.updateData(l,A),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),i(this._stackedOnPoints,T)&&i(this._points,g)||(w?this._updateAnimation(l,T,a,n,C):(C&&(g=c(g,a,C),T=c(T,a,C)),x.setShape({points:g}),_&&_.setShape({points:g,stackedOnPoints:T})))):(S&&y.updateData(l,A),C&&(g=c(g,a,C),T=c(T,a,C)),x=this._newPolyline(g,a,w),M&&(_=this._newPolygon(g,T,a,w)),b.setClipPath(u(a,!0,t)));var P=f(l,a)||l.getVisual("color");x.useStyle(d.defaults(h.getLineStyle(),{fill:"none",stroke:P,lineJoin:"bevel"}));var L=t.get("smooth");if(L=r(t.get("smooth")),x.setShape({smooth:L,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),_){var k=l.stackedOn,D=0;if(_.useStyle(d.defaults(p.getAreaStyle(),{fill:P,opacity:.7,lineJoin:"bevel"})),k){var O=k.hostModel;D=r(O.get("smooth"))}_.setShape({smooth:L,stackedOnSmooth:D,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=l,this._coordSys=a,this._stackedOnPoints=T,this._points=g,this._step=C},dispose:function(){},highlight:function(t,e,n,i){var r=t.getData(),a=y.queryDataIndex(r,i);if(!(a instanceof Array)&&null!=a&&a>=0){var o=r.getItemGraphicEl(a);if(!o){var s=r.getItemLayout(a);if(!s)return;o=new g(r,a),o.position=s,o.setZ(t.get("zlevel"),t.get("z")),o.ignore=isNaN(s[0])||isNaN(s[1]),o.__temp=!0,r.setItemGraphicEl(a,o),o.stopSymbolAnimation(!0),this.group.add(o)}o.highlight()}else _.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),a=y.queryDataIndex(r,i);if(null!=a&&a>=0){var o=r.getItemGraphicEl(a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group.remove(o)):o.downplay())}else _.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new x.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new x.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n,n},_getSymbolIgnoreFunc:function(t,e){var n=e.getAxesByScale("ordinal")[0];if(n&&n.isLabelIgnored)return d.bind(n.isLabelIgnored,n)},_updateAnimation:function(t,e,n,i,r){var a=this._polyline,o=this._polygon,s=t.hostModel,l=v(this._data,t,this._stackedOnPoints,e,this._coordSys,n),h=l.current,u=l.stackedOnCurrent,f=l.next,d=l.stackedOnNext;r&&(h=c(l.current,n,r),u=c(l.stackedOnCurrent,n,r),f=c(l.next,n,r),d=c(l.stackedOnNext,n,r)),a.shape.__points=l.current,a.shape.points=h,m.updateProps(a,{shape:{points:f}},s),o&&(o.setShape({points:h,stackedOnPoints:u}),m.updateProps(o,{shape:{points:f,stackedOnPoints:d}},s));for(var p=[],g=l.status,y=0;y<g.length;y++){var x=g[y].cmd;if("="===x){var _=t.getItemGraphicEl(g[y].idx1);_&&p.push({el:_,ptIdx:y})}}a.animators&&a.animators.length&&a.animators[0].during(function(){for(var t=0;t<p.length;t++){var e=p[t].el;e.attr("position",a.shape.__points[p[t].ptIdx])}})},remove:function(t){var e=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl(function(t,i){t.__temp&&(e.remove(t),n.setItemGraphicEl(i,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}})},function(t,e){function n(t){return t>=0?1:-1}function i(t,e,i){for(var r,a=t.getBaseAxis(),o=t.getOtherAxis(a),s=a.onZero?0:o.scale.getExtent()[0],l=o.dim,h="x"===l||"radius"===l?1:0,u=e.stackedOn,c=e.get(l,i);u&&n(u.get(l,i))===n(c);){r=u;break}var f=[];return f[h]=e.get(a.dim,i),f[1-h]=r?r.get(l,i,!0):s,t.dataToPoint(f)}function r(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}t.exports=function(t,e,n,a,o,s){for(var l=r(t,e),h=[],u=[],c=[],f=[],d=[],p=[],g=[],v=s.dimensions,m=0;m<l.length;m++){var y=l[m],x=!0;switch(y.cmd){case"=":var _=t.getItemLayout(y.idx),b=e.getItemLayout(y.idx1);(isNaN(_[0])||isNaN(_[1]))&&(_=b.slice()),h.push(_),u.push(b),c.push(n[y.idx]),f.push(a[y.idx1]),g.push(e.getRawIndex(y.idx1));break;case"+":var w=y.idx;h.push(o.dataToPoint([e.get(v[0],w,!0),e.get(v[1],w,!0)])),u.push(e.getItemLayout(w).slice()),c.push(i(o,e,w)),f.push(a[w]),g.push(e.getRawIndex(w));break;case"-":var w=y.idx,M=t.getRawIndex(w);M!==w?(h.push(t.getItemLayout(w)),u.push(s.dataToPoint([t.get(v[0],w,!0),t.get(v[1],w,!0)])),c.push(n[w]),f.push(i(s,t,w)),g.push(M)):x=!1}x&&(d.push(y),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});for(var T=[],S=[],A=[],I=[],C=[],m=0;m<p.length;m++){var w=p[m];T[m]=h[w],S[m]=u[w],A[m]=c[w],I[m]=f[w],C[m]=d[w]}return{current:T,next:S,stackedOnCurrent:A,stackedOnNext:I,status:C}}},function(t,e,n){var i=n(1),r=n(2);n(113),n(114),n(89)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),r.registerVisual(i.curry(n(84),"pie")),r.registerLayout(i.curry(n(116),"pie")),r.registerProcessor(i.curry(n(63),"pie"))},function(t,e,n){"use strict";var i=n(14),r=n(1),a=n(5),o=n(25),s=n(78),l=n(2).extendSeriesModel({type:"series.pie",init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(t.data),this._defaultLabelLine(t)},mergeOption:function(t){l.superCall(this,"mergeOption",t),this.updateSelectedMap(this.option.data)},getInitialData:function(t,e){var n=o(["value"],t.data),r=new i(n,this);return r.initData(t.data),r},getDataParams:function(t){var e=this.getData(),n=l.superCall(this,"getDataParams",t),i=e.getSum("value");return n.percent=i?+(e.get("value",t)/i*100).toFixed(2):0,n.$vars.push("percent"),n},_defaultLabelLine:function(t){a.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,n=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,n.show=n.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,stillShowZeroSum:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderWidth:1},emphasis:{}},animationType:"expansion",animationEasing:"cubicOut",data:[]}});r.mixin(l,s),t.exports=l},function(t,e,n){function i(t,e,n,i){var a=e.getData(),o=this.dataIndex,s=a.getName(o),l=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),a.each(function(t){r(a.getItemGraphicEl(t),a.getItemLayout(t),e.isSelected(a.getName(t)),l,n)})}function r(t,e,n,i,r){var a=(e.startAngle+e.endAngle)/2,o=Math.cos(a),s=Math.sin(a),l=n?i:0,h=[o*l,s*l];r?t.animate().when(200,{position:h}).start("bounceOut"):t.attr("position",h)}function a(t,e){function n(){a.ignore=a.hoverIgnore,o.ignore=o.hoverIgnore}function i(){a.ignore=a.normalIgnore,o.ignore=o.normalIgnore}s.Group.call(this);var r=new s.Sector({z2:2}),a=new s.Polyline,o=new s.Text;this.add(r),this.add(a),this.add(o),this.updateData(t,e,!0),this.on("emphasis",n).on("normal",i).on("mouseover",n).on("mouseout",i)}function o(t,e,n,i,r){var a=i.getModel("textStyle"),o="inside"===r||"inner"===r;return{fill:a.getTextColor()||(o?"#fff":t.getItemVisual(e,"color")),opacity:t.getItemVisual(e,"opacity"),textFont:a.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,n),t.getName(e))}}var s=n(3),l=n(1),h=a.prototype;h.updateData=function(t,e,n){function i(){o.stopAnimation(!0),o.animateTo({shape:{r:c.r+10}},300,"elasticOut")}function a(){o.stopAnimation(!0),o.animateTo({shape:{r:c.r}},300,"elasticOut")}var o=this.childAt(0),h=t.hostModel,u=t.getItemModel(e),c=t.getItemLayout(e),f=l.extend({},c);if(f.label=null,n){o.setShape(f);var d=h.getShallow("animationType");"scale"===d?(o.shape.r=c.r0,s.initProps(o,{shape:{r:c.r}},h,e)):(o.shape.endAngle=c.startAngle,s.updateProps(o,{shape:{endAngle:c.endAngle}},h,e))}else s.updateProps(o,{shape:f},h,e);var p=u.getModel("itemStyle"),g=t.getItemVisual(e,"color");o.useStyle(l.defaults({lineJoin:"bevel",fill:g},p.getModel("normal").getItemStyle())),o.hoverStyle=p.getModel("emphasis").getItemStyle(),r(this,t.getItemLayout(e),u.get("selected"),h.get("selectedOffset"),h.get("animation")),o.off("mouseover").off("mouseout").off("emphasis").off("normal"),u.get("hoverAnimation")&&h.isAnimationEnabled()&&o.on("mouseover",i).on("mouseout",a).on("emphasis",i).on("normal",a),this._updateLabel(t,e),s.setHoverStyle(this)},h._updateLabel=function(t,e){var n=this.childAt(1),i=this.childAt(2),r=t.hostModel,a=t.getItemModel(e),l=t.getItemLayout(e),h=l.label,u=t.getItemVisual(e,"color");s.updateProps(n,{shape:{points:h.linePoints||[[h.x,h.y],[h.x,h.y],[h.x,h.y]]}},r,e),s.updateProps(i,{style:{x:h.x,y:h.y}},r,e),i.attr({style:{textVerticalAlign:h.verticalAlign,textAlign:h.textAlign,textFont:h.font},rotation:h.rotation,origin:[h.x,h.y],z2:10});var c=a.getModel("label.normal"),f=a.getModel("label.emphasis"),d=a.getModel("labelLine.normal"),p=a.getModel("labelLine.emphasis"),g=c.get("position")||f.get("position");i.setStyle(o(t,e,"normal",c,g)),i.ignore=i.normalIgnore=!c.get("show"),i.hoverIgnore=!f.get("show"),n.ignore=n.normalIgnore=!d.get("show"),n.hoverIgnore=!p.get("show"),n.setStyle({stroke:u,opacity:t.getItemVisual(e,"opacity")}),n.setStyle(d.getModel("lineStyle").getLineStyle()),i.hoverStyle=o(t,e,"emphasis",f,g),n.hoverStyle=p.getModel("lineStyle").getLineStyle();var v=d.get("smooth");v&&v===!0&&(v=.4),n.setShape({smooth:v})},l.inherits(a,s.Group);var u=n(30).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,n,r){if(!r||r.from!==this.uid){var o=t.getData(),s=this._data,h=this.group,u=e.get("animation"),c=!s,f=t.get("animationType"),d=l.curry(i,this.uid,t,u,n),p=t.get("selectedMode");if(o.diff(s).add(function(t){var e=new a(o,t);c&&"scale"!==f&&e.eachChild(function(t){t.stopAnimation(!0)}),p&&e.on("click",d),o.setItemGraphicEl(t,e),h.add(e)}).update(function(t,e){var n=s.getItemGraphicEl(e);n.updateData(o,t),n.off("click"),p&&n.on("click",d),h.add(n),o.setItemGraphicEl(t,n)}).remove(function(t){var e=s.getItemGraphicEl(t);h.remove(e)}).execute(),u&&c&&o.count()>0&&"scale"!==f){var g=o.getItemLayout(0),v=Math.max(n.getWidth(),n.getHeight())/2,m=l.bind(h.removeClipPath,h);h.setClipPath(this._createClipPath(g.cx,g.cy,v,g.startAngle,g.clockwise,m,t))}this._data=o}},dispose:function(){},_createClipPath:function(t,e,n,i,r,a,o){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return s.initProps(l,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},o,a),l},containPoint:function(t,e){var n=e.getData(),i=n.getItemLayout(0);if(i){var r=t[0]-i.cx,a=t[1]-i.cy,o=Math.sqrt(r*r+a*a);return o<=i.r&&o>=i.r0}}});t.exports=u},function(t,e,n){"use strict";function i(t,e,n,i,r,a,o){function s(e,n,i,r){for(var a=e;a<n;a++)if(t[a].y+=i,a>e&&a+1<n&&t[a+1].y>t[a].y+t[a].height)return void l(a,i/2);l(n-1,i/2)}function l(e,n){for(var i=e;i>=0&&(t[i].y-=n,!(i>0&&t[i].y>t[i-1].y+t[i-1].height));i--);}function h(t,e,n,i,r,a){for(var o=a>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var h=Math.abs(t[s].y-i),u=t[s].len,c=t[s].len2,f=h<r+u?Math.sqrt((r+u+c)*(r+u+c)-h*h):Math.abs(t[s].x-n);e&&f>=o&&(f=o-10),!e&&f<=o&&(f=o+10),t[s].x=n+f*a,o=f}}t.sort(function(t,e){return t.y-e.y});for(var u,c=0,f=t.length,d=[],p=[],g=0;g<f;g++)u=t[g].y-c,u<0&&s(g,f,-u,r),c=t[g].y+t[g].height;o-c<0&&l(f-1,c-o);for(var g=0;g<f;g++)t[g].y>=n?p.push(t[g]):d.push(t[g]);h(d,!1,e,n,i,r),h(p,!0,e,n,i,r)}function r(t,e,n,r,a,o){for(var s=[],l=[],h=0;h<t.length;h++)t[h].x<e?s.push(t[h]):l.push(t[h]);i(l,e,n,r,1,a,o),i(s,e,n,r,-1,a,o);for(var h=0;h<t.length;h++){var u=t[h].linePoints;if(u){var c=u[1][0]-u[2][0];t[h].x<e?u[2][0]=t[h].x+3:u[2][0]=t[h].x-3,u[1][1]=u[2][1]=t[h].y,u[1][0]=u[2][0]+c}}}var a=n(16);t.exports=function(t,e,n,i){var o,s,l=t.getData(),h=[],u=!1;l.each(function(n){var i,r,c,f,d=l.getItemLayout(n),p=l.getItemModel(n),g=p.getModel("label.normal"),v=g.get("position")||p.get("label.emphasis.position"),m=p.getModel("labelLine.normal"),y=m.get("length"),x=m.get("length2"),_=(d.startAngle+d.endAngle)/2,b=Math.cos(_),w=Math.sin(_);o=d.cx,s=d.cy;var M="inside"===v||"inner"===v;if("center"===v)i=d.cx,r=d.cy,f="center";else{var T=(M?(d.r+d.r0)/2*b:d.r*b)+o,S=(M?(d.r+d.r0)/2*w:d.r*w)+s;if(i=T+3*b,r=S+3*w,!M){var A=T+b*(y+e-d.r),I=S+w*(y+e-d.r),C=A+(b<0?-1:1)*x,P=I;i=C+(b<0?-5:5),r=P,c=[[T,S],[A,I],[C,P]]}f=M?"center":b>0?"left":"right"}var L=g.getModel("textStyle").getFont(),k=g.get("rotate")?b<0?-_+Math.PI:-_:0,D=t.getFormattedLabel(n,"normal")||l.getName(n),O=a.getBoundingRect(D,L,f,"top");u=!!k,d.label={x:i,y:r,position:v,height:O.height,len:y,len2:x,linePoints:c,textAlign:f,verticalAlign:"middle",font:L,rotation:k},M||h.push(d.label)}),!u&&t.get("avoidLabelOverlap")&&r(h,o,s,e,n,i)}},function(t,e,n){var i=n(4),r=i.parsePercent,a=n(115),o=n(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,n,h){e.eachSeriesByType(t,function(t){var e=t.get("center"),h=t.get("radius");o.isArray(h)||(h=[0,h]),o.isArray(e)||(e=[e,e]);var u=n.getWidth(),c=n.getHeight(),f=Math.min(u,c),d=r(e[0],u),p=r(e[1],c),g=r(h[0],f/2),v=r(h[1],f/2),m=t.getData(),y=-t.get("startAngle")*l,x=t.get("minAngle")*l,_=0;m.each("value",function(t){!isNaN(t)&&_++});var b=m.getSum("value"),w=Math.PI/(b||_)*2,M=t.get("clockwise"),T=t.get("roseType"),S=t.get("stillShowZeroSum"),A=m.getDataExtent("value");A[0]=0;var I=s,C=0,P=y,L=M?1:-1;if(m.each("value",function(t,e){var n;if(isNaN(t))return void m.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:M,cx:d,cy:p,r0:g,r:T?NaN:v});n="area"!==T?0===b&&S?w:t*w:s/_,n<x?(n=x,I-=x):C+=t;var r=P+L*n;m.setItemLayout(e,{angle:n,startAngle:P,endAngle:r,clockwise:M,cx:d,cy:p,r0:g,r:T?i.linearMap(t,A,[g,v]):v}),P=r},!0),I<s&&_)if(I<=.001){var k=s/_;m.each("value",function(t,e){if(!isNaN(t)){var n=m.getItemLayout(e);n.angle=k,n.startAngle=y+L*e*k,n.endAngle=y+L*(e+1)*k}})}else w=I/C,P=y,m.each("value",function(t,e){if(!isNaN(t)){var n=m.getItemLayout(e),i=n.angle===x?x:t*w;n.startAngle=P,n.endAngle=P+L*i,P+=L*i}});a(t,v,u,c)})}},function(t,e,n){"use strict";n(60),n(118)},function(t,e,n){var i=n(1),r=n(3),a=n(40),o=n(41),s=n(75),l=a.ifIgnoreOnTick,h=a.getInterval,u=["axisLine","axisLabel","axisTick","axisName"],c=["splitArea","splitLine"],f=o.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,n,o){this.group.removeAll();var l=this._axisGroup;if(this._axisGroup=new r.Group,this.group.add(this._axisGroup),t.get("show")){var h=t.getCoordSysModel(),d=s.layout(h,t),p=new a(t,d);i.each(u,p.add,p),this._axisGroup.add(p.getGroup()),i.each(c,function(e){t.get(e+".show")&&this["_"+e](t,h,d.labelInterval)},this),r.groupTransition(l,this._axisGroup,t),f.superCall(this,"render",t,e,n,o)}},_splitLine:function(t,e,n){var a=t.axis;if(!a.scale.isBlank()){var o=t.getModel("splitLine"),s=o.getModel("lineStyle"),u=s.get("color"),c=h(o,n);u=i.isArray(u)?u:[u];for(var f=e.coordinateSystem.getRect(),d=a.isHorizontal(),p=0,g=a.getTicksCoords(),v=a.scale.getTicks(),m=[],y=[],x=s.getLineStyle(),_=0;_<g.length;_++)if(!l(a,_,c)){var b=a.toGlobalCoord(g[_]);d?(m[0]=b,m[1]=f.y,y[0]=b,y[1]=f.y+f.height):(m[0]=f.x,m[1]=b,y[0]=f.x+f.width,y[1]=b);var w=p++%u.length;this._axisGroup.add(new r.Line(r.subPixelOptimizeLine({
+anid:"line_"+v[_],shape:{x1:m[0],y1:m[1],x2:y[0],y2:y[1]},style:i.defaults({stroke:u[w]},x),silent:!0})))}}},_splitArea:function(t,e,n){var a=t.axis;if(!a.scale.isBlank()){var o=t.getModel("splitArea"),s=o.getModel("areaStyle"),u=s.get("color"),c=e.coordinateSystem.getRect(),f=a.getTicksCoords(),d=a.scale.getTicks(),p=a.toGlobalCoord(f[0]),g=a.toGlobalCoord(f[0]),v=0,m=h(o,n),y=s.getAreaStyle();u=i.isArray(u)?u:[u];for(var x=1;x<f.length;x++)if(!l(a,x,m)){var _,b,w,M,T=a.toGlobalCoord(f[x]);a.isHorizontal()?(_=p,b=c.y,w=T-_,M=c.height):(_=c.x,b=g,w=c.width,M=T-b);var S=v++%u.length;this._axisGroup.add(new r.Rect({anid:"area_"+d[x],shape:{x:_,y:b,width:w,height:M},style:i.defaults({fill:u[S]},y),silent:!0})),p=_+w,g=b+M}}}});f.extend({type:"xAxis"}),f.extend({type:"yAxis"})},,,,,,,,,,,,,function(t,e,n){var i=n(1),r=n(33),a=function(t,e,n,i,a){r.call(this,t,e,n),this.type=i||"value",this.position=a||"bottom"};a.prototype={constructor:a,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},i.inherits(a,r),t.exports=a},function(t,e,n){"use strict";function i(t){return this._axes[t]}var r=n(1),a=function(t){this._axes={},this._dimList=[],this.name=t||""};a.prototype={constructor:a,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return r.map(this._dimList,i,this)},getAxesByScale:function(t){return t=t.toLowerCase(),r.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var n=this._dimList,i=t instanceof Array?[]:{},r=0;r<n.length;r++){var a=n[r],o=this._axes[a];i[a]=o[e](t[a])}return i}},t.exports=a},function(t,e,n){"use strict";function i(t){a.call(this,t)}var r=n(1),a=n(132);i.prototype={constructor:i,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoints:function(t,e){return t.mapArray(["x","y"],function(t,e){return this.dataToPoint([t,e])},e,this)},dataToPoint:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return[n.toGlobalCoord(n.dataToCoord(t[0],e)),i.toGlobalCoord(i.dataToCoord(t[1],e))]},pointToData:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return[n.coordToData(n.toLocalCoord(t[0]),e),i.coordToData(i.toLocalCoord(t[1]),e)]},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},r.inherits(i,a),t.exports=i},function(t,e,n){"use strict";n(60);var i=n(13);t.exports=i.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}})},function(t,e,n){var i=n(28),r=n(24),a=n(18),o=n(42),s=n(10),l=n(1);t.exports={createList:function(t){var e=t.get("data");return i(e,t,t.ecModel)},completeDimensions:n(25),createSymbol:r.createSymbol,createScale:function(t,e){var n=e;e instanceof s||(n=new s(e),l.mixin(n,o));var i=a.createScaleByModel(n);return i.setExtent(t[0],t[1]),a.niceScaleExtent(i,n),i},mixinAxisModelCommonMethods:function(t){l.mixin(t,o)}}},function(t,e,n){var i=n(3),r=n(1),a=Math.PI;t.exports=function(t,e){e=e||{},r.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var n=new i.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),o=new i.Arc({shape:{startAngle:-a/2,endAngle:-a/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new i.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});o.animateShape(!0).when(1e3,{endAngle:3*a/2}).start("circularInOut"),o.animateShape(!0).when(1e3,{startAngle:3*a/2}).delay(300).start("circularInOut");var l=new i.Group;return l.add(o),l.add(s),l.add(n),l.resize=function(){var e=t.getWidth()/2,i=t.getHeight()/2;o.setShape({cx:e,cy:i});var r=o.shape.r;s.setShape({x:e-r,y:i-r,width:2*r,height:2*r}),n.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,n){function i(t,e){u.each(e,function(e,n){x.hasClass(n)||("object"==typeof e?t[n]=t[n]?u.merge(t[n],e,!1):u.clone(e):null==t[n]&&(t[n]=e))})}function r(t){t=t,this.option={},this.option[b]=1,this._componentsMap=u.createHashMap({series:[]}),this._seriesIndices=null,i(t,this._theme.option),u.merge(t,_,!1),this.mergeOption(t)}function a(t,e){u.isArray(e)||(e=e?[e]:[]);var n={};return d(e,function(e){n[e]=(t.get(e)||[]).slice()}),n}function o(t,e,n){var i=e.type?e.type:n?n.subType:x.determineSubType(t,e);return i}function s(t){return g(t,function(t){return t.componentIndex})||[]}function l(t,e){return e.hasOwnProperty("subType")?p(t,function(t){return t.subType===e.subType}):t}function h(t){}var u=n(1),c=n(5),f=n(10),d=u.each,p=u.filter,g=u.map,v=u.isArray,m=u.indexOf,y=u.isObject,x=n(13),_=n(139),b="\0_ec_inner",w=f.extend({constructor:w,init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new f(n),this._optionManager=i},setOption:function(t,e){u.assert(!(b in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,n=this._optionManager;if(!t||"recreate"===t){var i=n.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(i)):r.call(this,i),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var a=n.getTimelineOption(this);a&&(this.mergeOption(a),e=!0)}if(!t||"recreate"===t||"media"===t){var o=n.getMediaOption(this,this._api);o.length&&d(o,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,r){var l=c.normalizeToArray(t[e]),h=c.mappingToExists(i.get(e),l);c.makeIdAndName(h),d(h,function(t,n){var i=t.option;y(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=o(e,i,t.exist))});var f=a(i,r);n[e]=[],i.set(e,[]),d(h,function(t,r){var a=t.exist,o=t.option;if(u.assert(y(o)||a,"Empty component definition"),o){var s=x.getClass(e,t.keyInfo.subType,!0);if(a&&a instanceof s)a.name=t.keyInfo.name,a.mergeOption(o,this),a.optionUpdated(o,!1);else{var l=u.extend({dependentModels:f,componentIndex:r},t.keyInfo);a=new s(o,this,this,l),u.extend(a,l),a.init(o,this,this,l),a.optionUpdated(null,!0)}}else a.mergeOption({},this),a.optionUpdated({},!1);i.get(e)[r]=a,n[e][r]=a.option},this),"series"===e&&(this._seriesIndices=s(i.get("series")))}var n=this.option,i=this._componentsMap,r=[];d(t,function(t,e){null!=t&&(x.hasClass(e)?r.push(e):n[e]=null==n[e]?u.clone(t):u.merge(n[e],t,!0))}),x.topologicalTravel(r,x.getAllClassMainTypes(),e,this),this._seriesIndices=this._seriesIndices||[]},getOption:function(){var t=u.clone(this.option);return d(t,function(e,n){if(x.hasClass(n)){for(var e=c.normalizeToArray(e),i=e.length-1;i>=0;i--)c.isIdInner(e[i])&&e.splice(i,1);t[n]=e}}),delete t[b],t},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap.get(t);if(n)return n[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n=t.index,i=t.id,r=t.name,a=this._componentsMap.get(e);if(!a||!a.length)return[];var o;if(null!=n)v(n)||(n=[n]),o=p(g(n,function(t){return a[t]}),function(t){return!!t});else if(null!=i){var s=v(i);o=p(a,function(t){return s&&m(i,t.id)>=0||!s&&t.id===i})}else if(null!=r){var h=v(r);o=p(a,function(t){return h&&m(r,t.name)>=0||!h&&t.name===r})}else o=a.slice();return l(o,t)},findComponents:function(t){function e(t){var e=r+"Index",n=r+"Id",i=r+"Name";return!t||null==t[e]&&null==t[n]&&null==t[i]?null:{mainType:r,index:t[e],id:t[n],name:t[i]}}function n(e){return t.filter?p(e,t.filter):e}var i=t.query,r=t.mainType,a=e(i),o=a?this.queryComponents(a):this._componentsMap.get(r);return n(l(o,t))},eachComponent:function(t,e,n){var i=this._componentsMap;if("function"==typeof t)n=e,e=t,i.each(function(t,i){d(t,function(t,r){e.call(n,i,t,r)})});else if(u.isString(t))d(i.get(t),e,n);else if(y(t)){var r=this.findComponents(t);d(r,e,n)}},getSeriesByName:function(t){var e=this._componentsMap.get("series");return p(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(t){var e=this._componentsMap.get("series");return p(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.get("series").slice()},eachSeries:function(t,e){h(this),d(this._seriesIndices,function(n){var i=this._componentsMap.get("series")[n];t.call(e,i,n)},this)},eachRawSeries:function(t,e){d(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(t,e,n){h(this),d(this._seriesIndices,function(i){var r=this._componentsMap.get("series")[i];r.subType===t&&e.call(n,r,i)},this)},eachRawSeriesByType:function(t,e,n){return d(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return h(this),u.indexOf(this._seriesIndices,t.componentIndex)<0},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){h(this);var n=p(this._componentsMap.get("series"),t,e);this._seriesIndices=s(n)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=s(t.get("series"));var e=[];t.each(function(t,n){e.push(n)}),x.topologicalTravel(e,x.getAllClassMainTypes(),function(e,n){d(t.get(e),function(t){t.restoreData()})})}});u.mixin(w,n(62)),t.exports=w},function(t,e,n){function i(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function r(t,e,n){var i,r,a=[],o=[],s=t.timeline;if(t.baseOption&&(r=t.baseOption),(s||t.options)&&(r=r||{},a=(t.options||[]).slice()),t.media){r=r||{};var l=t.media;f(l,function(t){t&&t.option&&(t.query?o.push(t):i||(i=t))})}return r||(r=t),r.timeline||(r.timeline=s),f([r].concat(a).concat(h.map(o,function(t){return t.option})),function(t){f(e,function(e){e(t,n)})}),{baseOption:r,timelineOptions:a,mediaDefault:i,mediaList:o}}function a(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return h.each(t,function(t,e){var n=e.match(v);if(n&&n[1]&&n[2]){var a=n[1],s=n[2].toLowerCase();o(i[s],t,a)||(r=!1)}}),r}function o(t,e,n){return"min"===n?t>=e:"max"===n?t<=e:t===e}function s(t,e){return t.join(",")===e.join(",")}function l(t,e){e=e||{},f(e,function(e,n){if(null!=e){var i=t[n];if(c.hasClass(n)){e=u.normalizeToArray(e),i=u.normalizeToArray(i);var r=u.mappingToExists(i,e);t[n]=p(r,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[n]=g(i,e,!0)}})}var h=n(1),u=n(5),c=n(13),f=h.each,d=h.clone,p=h.map,g=h.merge,v=/^(min|max)?(.+)$/;i.prototype={constructor:i,setOption:function(t,e){t=d(t,!0);var n=this._optionBackup,i=r.call(this,t,e,!n);this._newBaseOption=i.baseOption,n?(l(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=p(e.timelineOptions,d),this._mediaList=p(e.mediaList,d),this._mediaDefault=d(e.mediaDefault),this._currentMediaIndices=[],d(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=d(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,o=[],l=[];if(!i.length&&!r)return l;for(var h=0,u=i.length;h<u;h++)a(i[h].query,e,n)&&o.push(h);return!o.length&&r&&(o=[-1]),o.length&&!s(o,this._currentMediaIndices)&&(l=p(o,function(t){return d(t===-1?r.option:i[t].option)})),this._currentMediaIndices=o,l}},t.exports=i},function(t,e){var n="";"undefined"!=typeof navigator&&(n=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],textStyle:{fontFamily:n.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1}},function(t,e,n){t.exports={getAreaStyle:n(31)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,n){var i=n(31)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]);t.exports={getItemStyle:function(t,e){var n=i.call(this,t,e),r=this.getBorderLineDash();return r&&(n.lineDash=r),n},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,n){var i=n(31)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=i.call(this,t),n=this.getLineDash(e.lineWidth);return n&&(e.lineDash=n),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),n=Math.max(t,2),i=4*t;return"solid"===e||null==e?null:"dashed"===e?[i,i]:[n,n]}}},function(t,e,n){var i=n(16),r=n(3);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){return r.getFont({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(t){return i.getBoundingRect(t,this.getFont(),this.getShallow("align"),this.getShallow("baseline"))},truncateText:function(t,e,n,r){return i.truncateText(t,e,this.getFont(),n,r)}}},function(t,e,n){function i(t,e){e=e.split(",");for(var n=t,i=0;i<e.length&&(n=n&&n[e[i]],null!=n);i++);return n}function r(t,e,n,i){e=e.split(",");for(var r,a=t,o=0;o<e.length-1;o++)r=e[o],null==a[r]&&(a[r]={}),a=a[r];(i||null==a[e[o]])&&(a[e[o]]=n)}function a(t){c(l,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}var o=n(1),s=n(146),l=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],h=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],u=["bar","boxplot","candlestick","chord","effectScatter","funnel","gauge","lines","graph","heatmap","line","map","parallel","pie","radar","sankey","scatter","treemap"],c=o.each;t.exports=function(t){c(t.series,function(t){if(o.isObject(t)){var e=t.type;if(s(t),"pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var n=i(t,"pointer.color");null!=n&&r(t,"itemStyle.normal.color",n)}for(var l=0;l<u.length;l++)if(u[l]===t.type){a(t);break}}}),t.dataRange&&(t.visualMap=t.dataRange),c(h,function(e){var n=t[e];n&&(o.isArray(n)||(n=[n]),c(n,function(t){a(t)}))})}},function(t,e,n){function i(t){var e=t&&t.itemStyle;e&&r.each(a,function(n){var i=e.normal,a=e.emphasis;i&&i[n]&&(t[n]=t[n]||{},t[n].normal?r.merge(t[n].normal,i[n]):t[n].normal=i[n],i[n]=null),a&&a[n]&&(t[n]=t[n]||{},t[n].emphasis?r.merge(t[n].emphasis,a[n]):t[n].emphasis=a[n],a[n]=null)})}var r=n(1),a=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];t.exports=function(t){if(t){i(t),i(t.markPoint),i(t.markLine);var e=t.data;if(e){for(var n=0;n<e.length;n++)i(e[n]);var a=t.markPoint;if(a&&a.data)for(var o=a.data,n=0;n<o.length;n++)i(o[n]);var s=t.markLine;if(s&&s.data)for(var l=s.data,n=0;n<l.length;n++)r.isArray(l[n])?(i(l[n][0]),i(l[n][1])):i(l[n])}}}},function(t,e){var n={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-(1/0),n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return e},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return e},nearest:function(t){return t[0]}},i=function(t,e){return Math.round(t.length/2)};t.exports=function(t,e,r){e.eachSeriesByType(t,function(t){var e=t.getData(),r=t.get("sampling"),a=t.coordinateSystem;if("cartesian2d"===a.type&&r){var o=a.getBaseAxis(),s=a.getOtherAxis(o),l=o.getExtent(),h=l[1]-l[0],u=Math.round(e.count()/h);if(u>1){var c;"string"==typeof r?c=n[r]:"function"==typeof r&&(c=r),c&&(e=e.downSample(s.dim,1/u,c,i),t.setData(e))}}},this)}},function(t,e,n){function i(t,e){return c(t,u(e))}var r=n(1),a=n(34),o=n(4),s=n(43),l=a.prototype,h=s.prototype,u=o.getPrecisionSafe,c=o.round,f=Math.floor,d=Math.ceil,p=Math.pow,g=Math.log,v=a.extend({type:"log",base:10,$constructor:function(){a.apply(this,arguments),this._originalScale=new s},getTicks:function(){var t=this._originalScale,e=this._extent,n=t.getExtent();return r.map(h.getTicks.call(this),function(r){var a=o.round(p(this.base,r));return a=r===e[0]&&t.__fixMin?i(a,n[0]):a,a=r===e[1]&&t.__fixMax?i(a,n[1]):a},this)},getLabel:h.getLabel,scale:function(t){return t=l.scale.call(this,t),p(this.base,t)},setExtent:function(t,e){var n=this.base;t=g(t)/g(n),e=g(e)/g(n),h.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=l.getExtent.call(this);e[0]=p(t,e[0]),e[1]=p(t,e[1]);var n=this._originalScale,r=n.getExtent();return n.__fixMin&&(e[0]=i(e[0],r[0])),n.__fixMax&&(e[1]=i(e[1],r[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=g(t[0])/g(e),t[1]=g(t[1])/g(e),l.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=o.quantity(n),r=t/n*i;for(r<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var a=[o.round(d(e[0]/i)*i),o.round(f(e[1]/i)*i)];this._interval=i,this._niceExtent=a}},niceExtent:function(t){h.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});r.each(["contain","normalize"],function(t){v.prototype[t]=function(e){return e=g(e)/g(this.base),l[t].call(this,e)}}),v.create=function(){return new v},t.exports=v},function(t,e,n){var i=n(1),r=n(34),a=r.prototype,o=r.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?i.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),a.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return a.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(a.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!1))},niceTicks:i.noop,niceExtent:i.noop});o.create=function(){return new o},t.exports=o},function(t,e,n){var i=n(1),r=n(4),a=n(7),o=n(64),s=n(43),l=s.prototype,h=Math.ceil,u=Math.floor,c=1e3,f=60*c,d=60*f,p=24*d,g=function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][2]<e?n=r+1:i=r}return n},v=s.extend({type:"time",getLabel:function(t){var e=this._stepLvl,n=new Date(t);return a.formatTime(e[0],n,this.getSetting("useUTC"))},niceExtent:function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=p,e[1]+=p),e[1]===-(1/0)&&e[0]===1/0){var n=new Date;e[1]=new Date(n.getFullYear(),n.getMonth(),n.getDate()),e[0]=e[1]-p}this.niceTicks(t.splitNumber);var i=this._interval;t.fixMin||(e[0]=r.round(u(e[0]/i)*i)),t.fixMax||(e[1]=r.round(h(e[1]/i)*i))},niceTicks:function(t){var e=this.getSetting("useUTC")?0:60*r.getTimezoneOffset()*1e3;t=t||10;var n=this._extent,i=n[1]-n[0],a=i/t,s=m.length,l=g(m,a,0,s),c=m[Math.min(l,s-1)],f=c[2];if("year"===c[0]){var d=i/f,p=r.nice(d/t,!0);f*=p}var v=[Math.round(h((n[0]-e)/f)*f+e),Math.round(u((n[1]-e)/f)*f+e)];o.fixExtent(v,n),this._stepLvl=c,this._interval=f,this._niceExtent=v},parse:function(t){return+r.parseDate(t)}});i.each(["contain","normalize"],function(t){v.prototype[t]=function(e){return l[t].call(this,this.parse(e))}});var m=[["hh:mm:ss",1,c],["hh:mm:ss",5,5*c],["hh:mm:ss",10,10*c],["hh:mm:ss",15,15*c],["hh:mm:ss",30,30*c],["hh:mm\nMM-dd",1,f],["hh:mm\nMM-dd",5,5*f],["hh:mm\nMM-dd",10,10*f],["hh:mm\nMM-dd",15,15*f],["hh:mm\nMM-dd",30,30*f],["hh:mm\nMM-dd",1,d],["hh:mm\nMM-dd",2,2*d],["hh:mm\nMM-dd",6,6*d],["hh:mm\nMM-dd",12,12*d],["MM-dd\nyyyy",1,p],["week",7,7*p],["month",1,31*p],["quarter",3,380*p/4],["half-year",6,380*p/2],["year",1,380*p]];v.create=function(t){return new v({useUTC:t.ecModel.get("useUTC")})},t.exports=v},function(t,e,n){var i=n(39);t.exports=function(t){function e(e){var n=(e.visualColorAccessPath||"itemStyle.normal.color").split("."),r=e.getData(),a=e.get(n)||e.getColorFromPalette(e.get("name"));r.setVisual("color",a),t.isSeriesFiltered(e)||("function"!=typeof a||a instanceof i||r.each(function(t){r.setItemVisual(t,"color",a(e.getDataParams(t)))}),r.each(function(t){var e=r.getItemModel(t),i=e.get(n,!0);null!=i&&r.setItemVisual(t,"color",i)}))}t.eachRawSeries(e)}},function(t,e,n){"use strict";function i(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch}}function r(){}function a(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i,r=t;r;){if(r.clipPath&&!r.clipPath.contain(e,n))return!1;r.silent&&(i=!0),r=r.parent}return!i||h}return!1}var o=n(1),s=n(179),l=n(23),h="silent";r.prototype.dispose=function(){};var u=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],c=function(t,e,n,i){l.call(this),this.storage=t,this.painter=e,this.painterRoot=i,n=n||new r,this.proxy=n,n.handler=this,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,s.call(this),o.each(u,function(t){n.on&&n.on(t,this[t],this)},this)};c.prototype={constructor:c,mousemove:function(t){var e=t.zrX,n=t.zrY,i=this._hovered,r=this._hovered=this.findHover(e,n),a=r.target,o=i.target,s=this.proxy;s.setCursor&&s.setCursor(a?a.cursor:"default"),o&&a!==o&&o.__zr&&this.dispatchToElement(i,"mouseout",t),this.dispatchToElement(r,"mousemove",t),a&&a!==o&&this.dispatchToElement(r,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,n=t.toElement||t.relatedTarget;do n=n&&n.parentNode;while(n&&9!=n.nodeType&&!(e=n===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var n=this[t];n&&n.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,n){t=t||{};for(var r="on"+e,a=i(e,t,n),o=t.target;o&&(o[r]&&(a.cancelBubble=o[r].call(o,a)),o.trigger(e,a),o=o.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,a),t.trigger&&t.trigger(e,a)}))},findHover:function(t,e,n){for(var i=this.storage.getDisplayList(),r={},o=i.length-1;o>=0;o--){var s;if(i[o]!==n&&!i[o].ignore&&(s=a(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),s!==h)){r.target=i[o];break}}return r}},o.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){c.prototype[t]=function(e){var n=this.findHover(e.zrX,e.zrY),i=n.target;if("mousedown"===t)this._downel=i,this._upel=i;else if("mosueup"===t)this._upel=i;else if("click"===t&&this._downel!==this._upel)return;this.dispatchToElement(n,t,e)}}),o.mixin(c,l),o.mixin(c,s),t.exports=c},function(t,e,n){function i(){return!1}function r(t,e,n,i){var r=document.createElement(e),a=n.getWidth(),o=n.getHeight(),s=r.style;return s.position="absolute",s.left=0,s.top=0,s.width=a+"px",s.height=o+"px",r.width=a*i,r.height=o*i,r.setAttribute("data-zr-dom-id",t),r}var a=n(1),o=n(35),s=n(73),l=n(72),h=function(t,e,n){var s;n=n||o.devicePixelRatio,"string"==typeof t?s=r(t,"canvas",e,n):a.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=i,l["-webkit-user-select"]="none",l["user-select"]="none",l["-webkit-touch-callout"]="none",l["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",l.padding=0,l.margin=0,l["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=n};h.prototype={constructor:h,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=r("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var n=this.dpr,i=this.dom,r=i.style,a=this.domBack;r.width=t+"px",r.height=e+"px",i.width=t*n,i.height=e*n,a&&(a.width=t*n,a.height=e*n,1!=n&&this.ctxBack.scale(n,n))},clear:function(t){var e=this.dom,n=this.ctx,i=e.width,r=e.height,a=this.clearColor,o=this.motionBlur&&!t,h=this.lastFrameAlpha,u=this.dpr;if(o&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,i/u,r/u)),n.clearRect(0,0,i,r),a){var c;a.colorStops?(c=a.__canvasGradient||s.getGradient(n,a,{x:0,y:0,width:i,height:r}),a.__canvasGradient=c):a.image&&(c=l.prototype.getCanvasPattern.call(a,n)),n.save(),n.fillStyle=c||a,n.fillRect(0,0,i,r),n.restore()}if(o){var f=this.domBack;n.save(),n.globalAlpha=h,n.drawImage(f,0,0,i,r),n.restore()}}},t.exports=h},function(t,e,n){"use strict";function i(t){return parseInt(t,10)}function r(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function a(t){t.__unusedCount++}function o(t){1==t.__unusedCount&&t.clear()}function s(t,e,n){return x.copy(t.getBoundingRect()),t.transform&&x.applyTransform(t.transform),_.width=e,_.height=n,!x.intersect(_)}function l(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0}function h(t,e){for(var n=0;n<t.length;n++){var i=t[n];i.setTransform(e),e.beginPath(),i.buildPath(e,i.shape),e.clip(),i.restoreTransform(e)}}function u(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}var c=n(35),f=n(1),d=n(52),p=n(11),g=n(51),v=n(153),m=n(68),y=5,x=new p(0,0,0,0),_=new p(0,0,0,0),b=function(t,e,n){var i=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=f.extend({},n||{}),this.dpr=n.devicePixelRatio||c.devicePixelRatio,this._singleCanvas=i,this.root=t;var r=t.style;r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]=r["user-select"]=r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var a=this._zlevelList=[],o=this._layers={};if(this._layerConfig={},i){null!=n.width&&(t.width=n.width),null!=n.height&&(t.height=n.height);var s=t.width,l=t.height;this._width=s,this._height=l;var h=new v(t,this,1);h.initContext(),o[0]=h,a.push(0),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var d=this._domRoot=u(this._width,this._height);t.appendChild(d)}this._progressiveLayers=[],this._hoverlayer,this._hoverElements=[]};b.prototype={constructor:b,isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},refresh:function(t){var e=this.storage.getDisplayList(!0),n=this._zlevelList;this._paintList(e,t);for(var i=0;i<n.length;i++){var r=n[i],a=this._layers[r];!a.__builtin__&&a.refresh&&a.refresh()}return this.refreshHover(),this._progressiveLayers.length&&this._startProgessive(),this},addHover:function(t,e){if(!t.__hoverMir){var n=new t.constructor({style:t.style,shape:t.shape});n.__from=t,t.__hoverMir=n,n.setStyle(e),this._hoverElements.push(n)}},removeHover:function(t){var e=t.__hoverMir,n=this._hoverElements,i=f.indexOf(n,e);i>=0&&n.splice(i,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,n=0;n<e.length;n++){var i=e[n].__from;i&&(i.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){g(t,this.storage.displayableSortFunc),n||(n=this._hoverlayer=this.getLayer(1e5));var i={};n.ctx.save();for(var r=0;r<e;){var a=t[r],o=a.__from;o&&o.__zr?(r++,o.invisible||(a.transform=o.transform,a.invTransform=o.invTransform,a.__clipPaths=o.__clipPaths,this._doPaintEl(a,n,!0,i))):(t.splice(r,1),o.__hoverMir=null,e--)}n.ctx.restore()}},_startProgessive:function(){function t(){n===e._progressiveToken&&e.storage&&(e._doPaintList(e.storage.getDisplayList()),e._furtherProgressive?(e._progress++,m(t)):e._progressiveToken=-1)}var e=this;if(e._furtherProgressive){var n=e._progressiveToken=+new Date;e._progress++,m(t)}},_clearProgressive:function(){this._progressiveToken=-1,this._progress=0,f.each(this._progressiveLayers,function(t){t.__dirty&&t.clear()})},_paintList:function(t,e){null==e&&(e=!1),this._updateLayerStatus(t),this._clearProgressive(),this.eachBuiltinLayer(a),this._doPaintList(t,e),this.eachBuiltinLayer(o)},_doPaintList:function(t,e){function n(t){var e=a.dpr||1;a.save(),a.globalAlpha=1,a.shadowBlur=0,i.__dirty=!0,a.setTransform(1,0,0,1,0,0),a.drawImage(t.dom,0,0,u*e,c*e),a.restore()}for(var i,r,a,o,s,l,h=0,u=this._width,c=this._height,p=this._progress,g=0,v=t.length;g<v;g++){var m=t[g],x=this._singleCanvas?0:m.zlevel,_=m.__frame;if(_<0&&s&&(n(s),s=null),r!==x&&(a&&a.restore(),o={},r=x,i=this.getLayer(r),i.__builtin__||d("ZLevel "+r+" has been used by unkown layer "+i.id),a=i.ctx,a.save(),i.__unusedCount=0,(i.__dirty||e)&&i.clear()),i.__dirty||e){if(_>=0){if(!s){if(s=this._progressiveLayers[Math.min(h++,y-1)],s.ctx.save(),s.renderScope={},s&&s.__progress>s.__maxProgress){g=s.__nextIdxNotProg-1;continue}l=s.__progress,s.__dirty||(p=l),s.__progress=p+1}_===p&&this._doPaintEl(m,s,!0,s.renderScope)}else this._doPaintEl(m,i,e,o);m.__dirty=!1}}s&&n(s),a&&a.restore(),this._furtherProgressive=!1,f.each(this._progressiveLayers,function(t){t.__maxProgress>=t.__progress&&(this._furtherProgressive=!0)},this)},_doPaintEl:function(t,e,n,i){var r=e.ctx,a=t.transform;if((e.__dirty||n)&&!t.invisible&&0!==t.style.opacity&&(!a||a[0]||a[3])&&(!t.culling||!s(t,this._width,this._height))){var o=t.__clipPaths;(i.prevClipLayer!==e||l(o,i.prevElClipPaths))&&(i.prevElClipPaths&&(i.prevClipLayer.ctx.restore(),i.prevClipLayer=i.prevElClipPaths=null,i.prevEl=null),o&&(r.save(),h(o,r),i.prevClipLayer=e,i.prevElClipPaths=o)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,i.prevEl||null),i.prevEl=t,t.afterBrush&&t.afterBrush(r)}},getLayer:function(t){if(this._singleCanvas)return this._layers[0];
+var e=this._layers[t];return e||(e=new v("zr_"+t,this,this.dpr),e.__builtin__=!0,this._layerConfig[t]&&f.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var n=this._layers,i=this._zlevelList,a=i.length,o=null,s=-1,l=this._domRoot;if(n[t])return void d("ZLevel "+t+" has been used already");if(!r(e))return void d("Layer of zlevel "+t+" is not valid");if(a>0&&t>i[0]){for(s=0;s<a-1&&!(i[s]<t&&i[s+1]>t);s++);o=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(o){var h=o.dom;h.nextSibling?l.insertBefore(e.dom,h.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom)},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i<r.length;i++)n=r[i],t.call(e,this._layers[n],n)},eachBuiltinLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],n=this._layers[i],n.__builtin__&&t.call(e,n,i)},eachOtherLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],n=this._layers[i],n.__builtin__||t.call(e,n,i)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){var e=this._layers,n=this._progressiveLayers,i={},r={};this.eachBuiltinLayer(function(t,e){i[e]=t.elCount,t.elCount=0,t.__dirty=!1}),f.each(n,function(t,e){r[e]=t.elCount,t.elCount=0,t.__dirty=!1});for(var a,o,s=0,l=0,h=0,u=t.length;h<u;h++){var c=t[h],d=this._singleCanvas?0:c.zlevel,p=e[d],g=c.progressive;if(p&&(p.elCount++,p.__dirty=p.__dirty||c.__dirty),g>=0){o!==g&&(o=g,l++);var m=c.__frame=l-1;if(!a){var x=Math.min(s,y-1);a=n[x],a||(a=n[x]=new v("progressive",this,this.dpr),a.initContext()),a.__maxProgress=0}a.__dirty=a.__dirty||c.__dirty,a.elCount++,a.__maxProgress=Math.max(a.__maxProgress,m),a.__maxProgress>=a.__progress&&(p.__dirty=!0)}else c.__frame=-1,a&&(a.__nextIdxNotProg=h,s++,a=null)}a&&(s++,a.__nextIdxNotProg=h),this.eachBuiltinLayer(function(t,e){i[e]!==t.elCount&&(t.__dirty=!0)}),n.length=Math.min(s,y),f.each(n,function(t,e){r[e]!==t.elCount&&(c.__dirty=!0),t.__dirty&&(t.__progress=0)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?f.merge(n[t],e,!0):n[t]=e;var i=this._layers[t];i&&f.merge(i,n[t],!0)}},delLayer:function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(f.indexOf(n,t),1))},resize:function(t,e){var n=this._domRoot;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!=t||e!=this._height){n.style.width=t+"px",n.style.height=e+"px";for(var r in this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(t,e);f.each(this._progressiveLayers,function(n){n.resize(t,e)}),this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){function e(t,e){var i=o._zlevelList;null==t&&(t=-(1/0));for(var r,a=0;a<i.length;a++){var s=i[a],l=o._layers[s];if(!l.__builtin__&&s>t&&s<e){r=l;break}}r&&r.renderToCanvas&&(n.ctx.save(),r.renderToCanvas(n.ctx),n.ctx.restore())}if(t=t||{},this._singleCanvas)return this._layers[0].dom;var n=new v("image",this,t.pixelRatio||this.dpr);n.initContext(),n.clearColor=t.backgroundColor,n.clear();for(var i,r=this.storage.getDisplayList(!0),a={},o=this,s=0;s<r.length;s++){var l=r[s];l.zlevel!==i&&(e(i,l.zlevel),i=l.zlevel),this._doPaintEl(l,n,!0,a)}return e(i,1/0),n.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],r=["clientWidth","clientHeight"][t],a=["paddingLeft","paddingTop"][t],o=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var s=this.root,l=document.defaultView.getComputedStyle(s);return(s[r]||i(l[n])||i(s.style[n]))-(i(l[a])||0)-(i(l[o])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var i=document.createElement("canvas"),r=i.getContext("2d"),a=t.getBoundingRect(),o=t.style,s=o.shadowBlur,l=o.shadowOffsetX,h=o.shadowOffsetY,u=o.hasStroke()?o.lineWidth:0,c=Math.max(u/2,-l+s),f=Math.max(u/2,l+s),d=Math.max(u/2,-h+s),p=Math.max(u/2,h+s),g=a.width+c+f,v=a.height+d+p;i.width=g*e,i.height=v*e,r.scale(e,e),r.clearRect(0,0,g,v),r.dpr=e;var m={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[c-a.x,d-a.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(r);var y=n(53),x=new y({style:{x:0,y:0,image:i}});return null!=m.position&&(x.position=t.position=m.position),null!=m.rotation&&(x.rotation=t.rotation=m.rotation),null!=m.scale&&(x.scale=t.scale=m.scale),x}},t.exports=b},function(t,e,n){"use strict";function i(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var r=n(1),a=n(9),o=n(36),s=n(51),l=function(){this._roots=[],this._displayList=[],this._displayListLen=0};l.prototype={constructor:l,traverse:function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,r=0,o=e.length;r<o;r++)this._updateAndAddDisplayable(e[r],null,t);n.length=this._displayListLen,a.canvasSupported&&s(n,i)},_updateAndAddDisplayable:function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var i=t.clipPath;if(i){e=e?e.slice():[];for(var r=i,a=t;r;)r.parent=a,r.updateTransform(),e.push(r),a=r,r=r.clipPath}if(t.isGroup){for(var o=t._children,s=0;s<o.length;s++){var l=o[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,n)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof o&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var n=this._roots[e];n instanceof o&&n.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var e=0,i=t.length;e<i;e++)this.delRoot(t[e]);else{var a=r.indexOf(this._roots,t);a>=0&&(this.delFromStorage(t),this._roots.splice(a,1),t instanceof o&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t.__storage=this,t.dirty(!1),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:i},t.exports=l},function(t,e,n){"use strict";var i=n(1),r=n(21).Dispatcher,a=n(68),o=n(67),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,r.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),n=0;n<e.length;n++)this.addClip(e[n])},removeClip:function(t){var e=i.indexOf(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;n<e.length;n++)this.removeClip(e[n]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,n=this._clips,i=n.length,r=[],a=[],o=0;o<i;o++){var s=n[o],l=s.step(t,e);l&&(r.push(l),a.push(s))}for(var o=0;o<i;)n[o]._needsRemove?(n[o]=n[i-1],n.pop(),i--):o++;i=r.length;for(var o=0;o<i;o++)a[o].fire(r[o]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(a(t),!e._paused&&e._update())}var e=this;this._running=!0,a(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var n=new o(t,e.loop,e.getter,e.setter);return this.addAnimator(n),n}},i.mixin(s,r),t.exports=s},function(t,e,n){function i(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}var r=n(158);i.prototype={constructor:i,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)return void(this._pausedTime+=e);var n=(t-this._startTime-this._pausedTime)/this._life;if(!(n<0)){n=Math.min(n,1);var i=this.easing,a="string"==typeof i?r[i]:i,o="function"==typeof a?a(n):n;return this.fire("frame",o),1==n?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}},t.exports=i},function(t,e){var n={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),-(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)))},elasticOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?-.5*(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)):n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-n.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*n.bounceIn(2*t):.5*n.bounceOut(2*t-1)+.5}};t.exports=n},function(t,e,n){var i=n(69).normalizeRadian,r=2*Math.PI;t.exports={containStroke:function(t,e,n,a,o,s,l,h,u){if(0===l)return!1;var c=l;h-=t,u-=e;var f=Math.sqrt(h*h+u*u);if(f-c>n||f+c<n)return!1;if(Math.abs(a-o)%r<1e-4)return!0;if(s){var d=a;a=i(o),o=i(d)}else a=i(a),o=i(o);a>o&&(o+=r);var p=Math.atan2(u,h);return p<0&&(p+=r),p>=a&&p<=o||p+r>=a&&p+r<=o}}},function(t,e,n){var i=n(20);t.exports={containStroke:function(t,e,n,r,a,o,s,l,h,u,c){if(0===h)return!1;var f=h;if(c>e+f&&c>r+f&&c>o+f&&c>l+f||c<e-f&&c<r-f&&c<o-f&&c<l-f||u>t+f&&u>n+f&&u>a+f&&u>s+f||u<t-f&&u<n-f&&u<a-f&&u<s-f)return!1;var d=i.cubicProjectPoint(t,e,n,r,a,o,s,l,u,c,null);return d<=f/2}}},function(t,e,n){"use strict";function i(t,e){return Math.abs(t-e)<x}function r(){var t=b[0];b[0]=b[1],b[1]=t}function a(t,e,n,i,a,o,s,l,h,u){if(u>e&&u>i&&u>o&&u>l||u<e&&u<i&&u<o&&u<l)return 0;var c=g.cubicRootAt(e,i,o,l,u,_);if(0===c)return 0;for(var f,d,p=0,v=-1,m=0;m<c;m++){var y=_[m],x=0===y||1===y?.5:1,w=g.cubicAt(t,n,a,s,y);w<h||(v<0&&(v=g.cubicExtrema(e,i,o,l,b),b[1]<b[0]&&v>1&&r(),f=g.cubicAt(e,i,o,l,b[0]),v>1&&(d=g.cubicAt(e,i,o,l,b[1]))),p+=2==v?y<b[0]?f<e?x:-x:y<b[1]?d<f?x:-x:l<d?x:-x:y<b[0]?f<e?x:-x:l<f?x:-x)}return p}function o(t,e,n,i,r,a,o,s){if(s>e&&s>i&&s>a||s<e&&s<i&&s<a)return 0;var l=g.quadraticRootAt(e,i,a,s,_);if(0===l)return 0;var h=g.quadraticExtremum(e,i,a);if(h>=0&&h<=1){for(var u=0,c=g.quadraticAt(e,i,a,h),f=0;f<l;f++){var d=0===_[f]||1===_[f]?.5:1,p=g.quadraticAt(t,n,r,_[f]);p<o||(u+=_[f]<h?c<e?d:-d:a<c?d:-d)}return u}var d=0===_[0]||1===_[0]?.5:1,p=g.quadraticAt(t,n,r,_[0]);return p<o?0:a<e?d:-d}function s(t,e,n,i,r,a,o,s){if(s-=e,s>n||s<-n)return 0;var l=Math.sqrt(n*n-s*s);_[0]=-l,_[1]=l;var h=Math.abs(i-r);if(h<1e-4)return 0;if(h%y<1e-4){i=0,r=y;var u=a?1:-1;return o>=_[0]+t&&o<=_[1]+t?u:0}if(a){var l=i;i=p(r),r=p(l)}else i=p(i),r=p(r);i>r&&(r+=y);for(var c=0,f=0;f<2;f++){var d=_[f];if(d+t>o){var g=Math.atan2(s,d),u=a?1:-1;g<0&&(g=y+g),(g>=i&&g<=r||g+y>=i&&g+y<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(u=-u),c+=u)}}return c}function l(t,e,n,r,l){for(var u=0,p=0,g=0,y=0,x=0,_=0;_<t.length;){var b=t[_++];switch(b===h.M&&_>1&&(n||(u+=v(p,g,y,x,r,l))),1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case h.M:y=t[_++],x=t[_++],p=y,g=x;break;case h.L:if(n){if(m(p,g,t[_],t[_+1],e,r,l))return!0}else u+=v(p,g,t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.C:if(n){if(c.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else u+=a(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.Q:if(n){if(f.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else u+=o(p,g,t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.A:var w=t[_++],M=t[_++],T=t[_++],S=t[_++],A=t[_++],I=t[_++],C=(t[_++],1-t[_++]),P=Math.cos(A)*T+w,L=Math.sin(A)*S+M;_>1?u+=v(p,g,P,L,r,l):(y=P,x=L);var k=(r-w)*S/T+w;if(n){if(d.containStroke(w,M,S,A,A+I,C,e,k,l))return!0}else u+=s(w,M,S,A,A+I,C,k,l);p=Math.cos(A+I)*T+w,g=Math.sin(A+I)*S+M;break;case h.R:y=p=t[_++],x=g=t[_++];var D=t[_++],O=t[_++],P=y+D,L=x+O;if(n){if(m(y,x,P,x,e,r,l)||m(P,x,P,L,e,r,l)||m(P,L,y,L,e,r,l)||m(y,L,y,x,e,r,l))return!0}else u+=v(P,x,P,L,r,l),u+=v(y,L,y,x,r,l);break;case h.Z:if(n){if(m(p,g,y,x,e,r,l))return!0}else u+=v(p,g,y,x,r,l);p=y,g=x}}return n||i(g,x)||(u+=v(p,g,y,x,r,l)||0),0!==u}var h=n(27).CMD,u=n(97),c=n(160),f=n(98),d=n(159),p=n(69).normalizeRadian,g=n(20),v=n(99),m=u.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,n){return l(t,0,!1,e,n)},containStroke:function(t,e,n,i){return l(t,e,!0,n,i)}}},function(t,e,n){"use strict";function i(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}function r(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var a=n(21),o=function(){this._track=[]};o.prototype={constructor:o,recognize:function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,s=i.length;o<s;o++){var l=i[o],h=a.clientToLocal(n,l,{});r.points.push([h.zrX,h.zrY]),r.touches.push(l)}this._track.push(r)}},_recognize:function(t){for(var e in s)if(s.hasOwnProperty(e)){var n=s[e](this._track,t);if(n)return n}}};var s={pinch:function(t,e){var n=t.length;if(n){var a=(t[n-1]||{}).points,o=(t[n-2]||{}).points||a;if(o&&o.length>1&&a&&a.length>1){var s=i(a)/i(o);!isFinite(s)&&(s=1),e.pinchScale=s;var l=r(a);return e.pinchX=l[0],e.pinchY=l[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=o},function(t,e,n){function i(t){return"mousewheel"===t&&f.browser.firefox?"DOMMouseScroll":t}function r(t,e,n){var i=t._gestureMgr;"start"===n&&i.clear();var r=i.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===n&&i.clear(),r){var a=r.type;e.gestureEvent=a,t.handler.dispatchToElement({target:r.target},a,r.event)}}function a(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function o(t){var e=t.pointerType;return"pen"===e||"touch"===e}function s(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}u.each(x,function(e){t._handlers[e]=u.bind(w[e],t)}),u.each(b,function(e){t._handlers[e]=u.bind(w[e],t)}),u.each(y,function(n){t._handlers[n]=e(w[n],t)})}function l(t){function e(e,n){u.each(e,function(e){p(t,i(e),n._handlers[e])},n)}c.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new d,this._handlers={},s(this),f.pointerEventsSupported?e(b,this):(f.touchEventsSupported&&e(x,this),e(y,this))}var h=n(21),u=n(1),c=n(23),f=n(9),d=n(162),p=h.addEventListener,g=h.removeEventListener,v=h.normalizeEvent,m=300,y=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],x=["touchstart","touchend","touchmove"],_={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},b=u.map(y,function(t){var e=t.replace("mouse","pointer");return _[e]?e:t}),w={mousemove:function(t){t=v(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){t=v(this.dom,t);var e=t.toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){t=v(this.dom,t),t.zrByTouch=!0,this._lastTouchMoment=new Date,r(this,t,"start"),w.mousemove.call(this,t),w.mousedown.call(this,t),a(this)},touchmove:function(t){t=v(this.dom,t),t.zrByTouch=!0,r(this,t,"change"),w.mousemove.call(this,t),a(this)},touchend:function(t){t=v(this.dom,t),t.zrByTouch=!0,r(this,t,"end"),w.mouseup.call(this,t),+new Date-this._lastTouchMoment<m&&w.click.call(this,t),a(this)},pointerdown:function(t){w.mousedown.call(this,t)},pointermove:function(t){o(t)||w.mousemove.call(this,t)},pointerup:function(t){w.mouseup.call(this,t)},pointerout:function(t){o(t)||w.mouseout.call(this,t)}};u.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){w[t]=function(e){e=v(this.dom,e),this.trigger(t,e)}});var M=l.prototype;M.dispose=function(){for(var t=y.concat(x),e=0;e<t.length;e++){var n=t[e];g(this.dom,i(n),this._handlers[n])}},M.setCursor=function(t){this.dom.style.cursor=t||"default"},u.mixin(l,c),t.exports=l},function(t,e,n){var i=n(8);t.exports=i.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,n=0;n<e.length;n++)t=t||e[n].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},afterBrush:function(){for(var t=this.shape.paths,e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),i.prototype.getBoundingRect.call(this)}})},function(t,e,n){"use strict";var i=n(1),r=n(39),a=function(t,e,n,i,a){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,this.type="radial",this.global=a||!1,r.call(this,i)};a.prototype={constructor:a},i.inherits(a,r),t.exports=a},function(t,e){t.exports={buildPath:function(t,e){var n,i,r,a,o=e.x,s=e.y,l=e.width,h=e.height,u=e.r;l<0&&(o+=l,l=-l),h<0&&(s+=h,h=-h),"number"==typeof u?n=i=r=a=u:u instanceof Array?1===u.length?n=i=r=a=u[0]:2===u.length?(n=r=u[0],i=a=u[1]):3===u.length?(n=u[0],i=a=u[1],r=u[2]):(n=u[0],i=u[1],r=u[2],a=u[3]):n=i=r=a=0;var c;n+i>l&&(c=n+i,n*=l/c,i*=l/c),r+a>l&&(c=r+a,r*=l/c,a*=l/c),i+r>h&&(c=i+r,i*=h/c,r*=h/c),n+a>h&&(c=n+a,n*=h/c,a*=h/c),t.moveTo(o+n,s),t.lineTo(o+l-i,s),0!==i&&t.quadraticCurveTo(o+l,s,o+l,s+i),t.lineTo(o+l,s+h-r),0!==r&&t.quadraticCurveTo(o+l,s+h,o+l-r,s+h),t.lineTo(o+a,s+h),0!==a&&t.quadraticCurveTo(o,s+h,o,s+h-a),t.lineTo(o,s+n),0!==n&&t.quadraticCurveTo(o,s,o+n,s)}}},function(t,e,n){var i=n(6),r=i.min,a=i.max,o=i.scale,s=i.distance,l=i.add;t.exports=function(t,e,n,h){var u,c,f,d,p=[],g=[],v=[],m=[];if(h){f=[1/0,1/0],d=[-(1/0),-(1/0)];for(var y=0,x=t.length;y<x;y++)r(f,f,t[y]),a(d,d,t[y]);r(f,f,h[0]),a(d,d,h[1])}for(var y=0,x=t.length;y<x;y++){var _=t[y];if(n)u=t[y?y-1:x-1],c=t[(y+1)%x];else{if(0===y||y===x-1){p.push(i.clone(t[y]));continue}u=t[y-1],c=t[y+1]}i.sub(g,c,u),o(g,g,e);var b=s(_,u),w=s(_,c),M=b+w;0!==M&&(b/=M,w/=M),o(v,g,-b),o(m,g,w);var T=l([],_,v),S=l([],_,m);h&&(a(T,T,f),r(T,T,d),a(S,S,f),r(S,S,d)),p.push(T),p.push(S)}return n&&p.push(p.shift()),p}},function(t,e,n){function i(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}var r=n(6);t.exports=function(t,e){for(var n=t.length,a=[],o=0,s=1;s<n;s++)o+=r.distance(t[s-1],t[s]);var l=o/2;l=l<n?n:l;for(var s=0;s<l;s++){var h,u,c,f=s/(l-1)*(e?n:n-1),d=Math.floor(f),p=f-d,g=t[d%n];e?(h=t[(d-1+n)%n],u=t[(d+1)%n],c=t[(d+2)%n]):(h=t[0===d?d:d-1],u=t[d>n-2?n-1:d+1],c=t[d>n-3?n-1:d+2]);var v=p*p,m=p*v;a.push([i(h[0],g[0],u[0],c[0],p,v,m),i(h[1],g[1],u[1],c[1],p,v,m)])}return a}},function(t,e,n){t.exports=n(8).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),a=e.startAngle,o=e.endAngle,s=e.clockwise,l=Math.cos(a),h=Math.sin(a);t.moveTo(l*r+n,h*r+i),t.arc(n,i,r,a,o,!s)}})},function(t,e,n){"use strict";function i(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?c:h)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?c:h)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?u:l)(t.x1,t.cpx1,t.x2,e),(n?u:l)(t.y1,t.cpy1,t.y2,e)]}var r=n(20),a=n(6),o=r.quadraticSubdivide,s=r.cubicSubdivide,l=r.quadraticAt,h=r.cubicAt,u=r.quadraticDerivativeAt,c=r.cubicDerivativeAt,f=[];t.exports=n(8).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,l=e.cpx1,h=e.cpy1,u=e.cpx2,c=e.cpy2,d=e.percent;0!==d&&(t.moveTo(n,i),null==u||null==c?(d<1&&(o(n,l,r,d,f),l=f[1],r=f[2],o(i,h,a,d,f),h=f[1],a=f[2]),t.quadraticCurveTo(l,h,r,a)):(d<1&&(s(n,l,u,r,d,f),l=f[1],u=f[2],r=f[3],s(i,h,c,a,d,f),h=f[1],c=f[2],a=f[3]),t.bezierCurveTo(l,h,u,c,r,a)))},pointAt:function(t){return i(this.shape,t,!1)},tangentAt:function(t){var e=i(this.shape,t,!0);return a.normalize(e,e)}})},function(t,e,n){"use strict";t.exports=n(8).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,n){t.exports=n(8).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,o=e.percent;0!==o&&(t.moveTo(n,i),o<1&&(r=n*(1-o)+r*o,a=i*(1-o)+a*o),t.lineTo(r,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,n){var i=n(74);t.exports=n(8).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){i.buildPath(t,e,!0)}})},function(t,e,n){var i=n(74);t.exports=n(8).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){i.buildPath(t,e,!1)}})},function(t,e,n){var i=n(166);t.exports=n(8).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,r=e.y,a=e.width,o=e.height;e.r?i.buildPath(t,e):t.rect(n,r,a,o),t.closePath()}})},function(t,e,n){t.exports=n(8).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)}})},function(t,e,n){var i=n(9),r=n(8),a=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]];t.exports=r.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:i.browser.ie&&i.browser.version>=11?function(){var t,e=this.__clipPaths,n=this.style;if(e)for(var i=0;i<e.length;i++){var o=e[i]&&e[i].shape;if(o&&o.startAngle===o.endAngle){for(var s=0;s<a.length;s++)a[s][2]=n[a[s][0]],n[a[s][0]]=a[s][1];t=!0;break}}if(r.prototype.brush.apply(this,arguments),t)for(var s=0;s<a.length;s++)n[a[s][0]]=a[s][2]}:r.prototype.brush,buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),a=Math.max(e.r,0),o=e.startAngle,s=e.endAngle,l=e.clockwise,h=Math.cos(o),u=Math.sin(o);t.moveTo(h*r+n,u*r+i),t.lineTo(h*a+n,u*a+i),t.arc(n,i,a,o,s,!l),t.lineTo(Math.cos(s)*r+n,Math.sin(s)*r+i),0!==r&&t.arc(n,i,r,s,o,l),t.closePath()}})},function(t,e,n){"use strict";var i=n(67),r=n(1),a=r.isString,o=r.isFunction,s=r.isObject,l=n(52),h=function(){this.animators=[]};h.prototype={constructor:h,animate:function(t,e){var n,a=!1,o=this,s=this.__zr;if(t){var h=t.split("."),u=o;a="shape"===h[0];for(var c=0,f=h.length;c<f;c++)u&&(u=u[h[c]]);u&&(n=u)}else n=o;if(!n)return void l('Property "'+t+'" is not existed in element '+o.id);var d=o.animators,p=new i(n,e);return p.during(function(t){o.dirty(a)}).done(function(){d.splice(r.indexOf(d,p),1)}),d.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,n=e.length,i=0;i<n;i++)e[i].stop(t);return e.length=0,this},animateTo:function(t,e,n,i,r){function s(){h--,h||r&&r()}a(n)?(r=i,i=n,n=0):o(i)?(r=i,i="linear",n=0):o(n)?(r=n,n=0):o(e)?(r=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,n,i,r);var l=this.animators.slice(),h=l.length;h||r&&r();for(var u=0;u<l.length;u++)l[u].done(s).start(i)},_animateToShallow:function(t,e,n,i,a){var o={},l=0;for(var h in n)if(n.hasOwnProperty(h))if(null!=e[h])s(n[h])&&!r.isArrayLike(n[h])?this._animateToShallow(t?t+"."+h:h,e[h],n[h],i,a):(o[h]=n[h],l++);else if(null!=n[h])if(t){var u={};u[t]={},u[t][h]=n[h],this.attr(u)}else this.attr(h,n[h]);return l>0&&this.animate(t,!1).when(null==i?500:i,o).delay(a||0),this}},t.exports=h},function(t,e){function n(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function i(t,e){return{target:t,topTarget:e&&e.topTarget}}n.prototype={constructor:n,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(i(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,r=t.offsetY,a=n-this._x,o=r-this._y;this._x=n,this._y=r,e.drift(a,o,t),this.dispatchToElement(i(e,t),"drag",t.event);var s=this.findHover(n,r,e).target,l=this._dropTarget;this._dropTarget=s,e!==s&&(l&&s!==l&&this.dispatchToElement(i(l,t),"dragleave",t.event),s&&s!==l&&this.dispatchToElement(i(s,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(i(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(i(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=n},function(t,e,n){function i(t,e,n,i,r,a,o,s,l,h,p){var m=l*(d/180),y=f(m)*(t-n)/2+c(m)*(e-i)/2,x=-1*c(m)*(t-n)/2+f(m)*(e-i)/2,_=y*y/(o*o)+x*x/(s*s);_>1&&(o*=u(_),s*=u(_));var b=(r===a?-1:1)*u((o*o*(s*s)-o*o*(x*x)-s*s*(y*y))/(o*o*(x*x)+s*s*(y*y)))||0,w=b*o*x/s,M=b*-s*y/o,T=(t+n)/2+f(m)*w-c(m)*M,S=(e+i)/2+c(m)*w+f(m)*M,A=v([1,0],[(y-w)/o,(x-M)/s]),I=[(y-w)/o,(x-M)/s],C=[(-1*y-w)/o,(-1*x-M)/s],P=v(I,C);g(I,C)<=-1&&(P=d),g(I,C)>=1&&(P=0),0===a&&P>0&&(P-=2*d),1===a&&P<0&&(P+=2*d),p.addData(h,T,S,o,s,A,P,m,a)}function r(t){if(!t)return[];var e,n=t.replace(/-/g," -").replace(/  /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e<h.length;e++)n=n.replace(new RegExp(h[e],"g"),"|"+h[e]);var r,a=n.split("|"),o=0,l=0,u=new s,c=s.CMD;for(e=1;e<a.length;e++){var f,d=a[e],p=d.charAt(0),g=0,v=d.slice(1).replace(/e,-/g,"e-").split(",");v.length>0&&""===v[0]&&v.shift();for(var m=0;m<v.length;m++)v[m]=parseFloat(v[m]);for(;g<v.length&&!isNaN(v[g])&&!isNaN(v[0]);){var y,x,_,b,w,M,T,S=o,A=l;switch(p){case"l":o+=v[g++],l+=v[g++],f=c.L,u.addData(f,o,l);break;case"L":o=v[g++],l=v[g++],f=c.L,u.addData(f,o,l);break;case"m":o+=v[g++],l+=v[g++],f=c.M,u.addData(f,o,l),p="l";break;case"M":o=v[g++],l=v[g++],f=c.M,u.addData(f,o,l),p="L";break;case"h":o+=v[g++],f=c.L,u.addData(f,o,l);break;case"H":o=v[g++],f=c.L,u.addData(f,o,l);break;case"v":l+=v[g++],f=c.L,u.addData(f,o,l);break;case"V":l=v[g++],f=c.L,u.addData(f,o,l);break;case"C":f=c.C,u.addData(f,v[g++],v[g++],v[g++],v[g++],v[g++],v[g++]),o=v[g-2],l=v[g-1];break;case"c":f=c.C,u.addData(f,v[g++]+o,v[g++]+l,v[g++]+o,v[g++]+l,v[g++]+o,v[g++]+l),o+=v[g-2],l+=v[g-1];break;case"S":y=o,x=l;var I=u.len(),C=u.data;r===c.C&&(y+=o-C[I-4],x+=l-C[I-3]),f=c.C,S=v[g++],A=v[g++],o=v[g++],l=v[g++],u.addData(f,y,x,S,A,o,l);break;case"s":y=o,x=l;var I=u.len(),C=u.data;r===c.C&&(y+=o-C[I-4],x+=l-C[I-3]),f=c.C,S=o+v[g++],A=l+v[g++],o+=v[g++],l+=v[g++],u.addData(f,y,x,S,A,o,l);break;case"Q":S=v[g++],A=v[g++],o=v[g++],l=v[g++],f=c.Q,u.addData(f,S,A,o,l);break;case"q":S=v[g++]+o,A=v[g++]+l,o+=v[g++],l+=v[g++],f=c.Q,u.addData(f,S,A,o,l);break;case"T":y=o,x=l;var I=u.len(),C=u.data;r===c.Q&&(y+=o-C[I-4],x+=l-C[I-3]),o=v[g++],l=v[g++],f=c.Q,u.addData(f,y,x,o,l);break;case"t":y=o,x=l;var I=u.len(),C=u.data;r===c.Q&&(y+=o-C[I-4],x+=l-C[I-3]),o+=v[g++],l+=v[g++],f=c.Q,u.addData(f,y,x,o,l);break;case"A":_=v[g++],b=v[g++],w=v[g++],M=v[g++],T=v[g++],S=o,A=l,o=v[g++],l=v[g++],f=c.A,i(S,A,o,l,M,T,_,b,w,f,u);break;case"a":_=v[g++],b=v[g++],w=v[g++],M=v[g++],T=v[g++],S=o,A=l,o+=v[g++],l+=v[g++],f=c.A,i(S,A,o,l,M,T,_,b,w,f,u)}}"z"!==p&&"Z"!==p||(f=c.Z,u.addData(f)),r=f}return u.toStatic(),u}function a(t,e){var n=r(t);return e=e||{},e.buildPath=function(t){if(t.setData){t.setData(n.data);var e=t.getContext();e&&t.rebuildPath(e)}else{var e=t;n.rebuildPath(e)}},e.applyTransform=function(t){l(n,t),this.dirty(!0)},e}var o=n(8),s=n(27),l=n(181),h=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],u=Math.sqrt,c=Math.sin,f=Math.cos,d=Math.PI,p=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},g=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(p(t)*p(e))},v=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(g(t,e))};t.exports={createFromString:function(t,e){return new o(a(t,e))},extendFromString:function(t,e){return o.extend(a(t,e))},mergePath:function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var a=t[r];a.path||a.createPathProxy(),a.__dirtyPath&&a.buildPath(a.path,a.shape,!0),n.push(a.path)}var s=new o(e);return s.createPathProxy(),s.buildPath=function(t){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,n){function i(t,e){var n,i,a,u,c,f,d=t.data,p=r.M,g=r.C,v=r.L,m=r.R,y=r.A,x=r.Q;for(a=0,u=0;a<d.length;){switch(n=d[a++],u=a,i=0,n){case p:i=1;break;case v:i=1;break;case g:i=3;break;case x:i=2;break;case y:var _=e[4],b=e[5],w=l(e[0]*e[0]+e[1]*e[1]),M=l(e[2]*e[2]+e[3]*e[3]),T=h(-e[1]/M,e[0]/w);d[a]*=w,d[a++]+=_,d[a]*=M,d[a++]+=b,d[a++]*=w,d[a++]*=M,d[a++]+=T,d[a++]+=T,a+=2,u=a;break;case m:f[0]=d[a++],f[1]=d[a++],o(f,f,e),d[u++]=f[0],d[u++]=f[1],f[0]+=d[a++],f[1]+=d[a++],o(f,f,e),d[u++]=f[0],d[u++]=f[1]}for(c=0;c<i;c++){var f=s[c];f[0]=d[a++],f[1]=d[a++],o(f,f,e),d[u++]=f[0],d[u++]=f[1]}}}var r=n(27).CMD,a=n(6),o=a.applyTransform,s=[[],[],[]],l=Math.sqrt,h=Math.atan2;t.exports=i}])});
\ No newline at end of file
