You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@griffin.apache.org by gu...@apache.org on 2017/03/03 12:16:22 UTC

[16/51] [partial] incubator-griffin git commit: Init move

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/a8ba6ba9/griffin-ui/bower_components/echarts/dist/echarts.js
----------------------------------------------------------------------
diff --git a/griffin-ui/bower_components/echarts/dist/echarts.js b/griffin-ui/bower_components/echarts/dist/echarts.js
new file mode 100644
index 0000000..894d2b5
--- /dev/null
+++ b/griffin-ui/bower_components/echarts/dist/echarts.js
@@ -0,0 +1,63245 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else if(typeof exports === 'object')
+		exports["echarts"] = factory();
+	else
+		root["echarts"] = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+
+
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Export echarts as CommonJS module
+	 */
+	module.exports = __webpack_require__(1);
+
+	// Import all charts and components
+	__webpack_require__(99);
+	__webpack_require__(133);
+	__webpack_require__(138);
+	__webpack_require__(147);
+	__webpack_require__(151);
+
+	__webpack_require__(161);
+	__webpack_require__(182);
+	__webpack_require__(194);
+	__webpack_require__(215);
+	__webpack_require__(219);
+	__webpack_require__(223);
+	__webpack_require__(238);
+	__webpack_require__(244);
+	__webpack_require__(251);
+	__webpack_require__(257);
+	__webpack_require__(261);
+	__webpack_require__(269);
+
+	__webpack_require__(112);
+	__webpack_require__(273);
+	__webpack_require__(279);
+	__webpack_require__(283);
+	__webpack_require__(294);
+	__webpack_require__(224);
+	__webpack_require__(297);
+	__webpack_require__(303);
+
+	__webpack_require__(315);
+
+	__webpack_require__(316);
+	__webpack_require__(329);
+
+	__webpack_require__(344);
+	__webpack_require__(350);
+	__webpack_require__(353);
+
+	__webpack_require__(356);
+	__webpack_require__(365);
+
+	__webpack_require__(378);
+
+
+/***/ },
+/* 1 */
+/***/ function(module, exports, __webpack_require__) {
+
+	// Enable DEV mode when using source code without build. which has no __DEV__ variable
+	// In build process 'typeof __DEV__' will be replace with 'boolean'
+	// So this code will be removed or disabled anyway after built.
+	if (false) {
+	    // In browser
+	    if (typeof window !== 'undefined') {
+	        window.__DEV__ = true;
+	    }
+	    // In node
+	    else if (typeof global !== 'undefined') {
+	        global.__DEV__ = true;
+	    }
+	}
+
+	/*!
+	 * ECharts, a javascript interactive chart library.
+	 *
+	 * Copyright (c) 2015, Baidu Inc.
+	 * All rights reserved.
+	 *
+	 * LICENSE
+	 * https://github.com/ecomfe/echarts/blob/master/LICENSE.txt
+	 */
+
+	/**
+	 * @module echarts
+	 */
+
+
+	    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 ComponentModel = __webpack_require__(19);
+	    var SeriesModel = __webpack_require__(28);
+
+	    var ComponentView = __webpack_require__(29);
+	    var ChartView = __webpack_require__(42);
+	    var graphic = __webpack_require__(43);
+
+	    var zrender = __webpack_require__(81);
+	    var zrUtil = __webpack_require__(4);
+	    var colorTool = __webpack_require__(39);
+	    var Eventful = __webpack_require__(33);
+	    var timsort = __webpack_require__(85);
+
+	    var each = zrUtil.each;
+
+	    var PRIORITY_PROCESSOR_FILTER = 1000;
+	    var PRIORITY_PROCESSOR_STATISTIC = 5000;
+
+
+	    var PRIORITY_VISUAL_LAYOUT = 1000;
+	    var PRIORITY_VISUAL_GLOBAL = 2000;
+	    var PRIORITY_VISUAL_CHART = 3000;
+	    var PRIORITY_VISUAL_COMPONENT = 4000;
+	    var PRIORITY_VISUAL_BRUSH = 5000;
+
+	    // Main process have three entries: `setOption`, `dispatchAction` and `resize`,
+	    // where they must not be invoked nestedly, except the only case: invoke
+	    // dispatchAction with updateMethod "none" in main process.
+	    // This flag is used to carry out this rule.
+	    // All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]).
+	    var IN_MAIN_PROCESS = '__flag_in_main_process';
+	    var HAS_GRADIENT_OR_PATTERN_BG = '_hasGradientOrPatternBg';
+
+	    function createRegisterEventWithLowercaseName(method) {
+	        return function (eventName, handler, context) {
+	            // Event name is all lowercase
+	            eventName = eventName && eventName.toLowerCase();
+	            Eventful.prototype[method].call(this, eventName, handler, context);
+	        };
+	    }
+	    /**
+	     * @module echarts~MessageCenter
+	     */
+	    function MessageCenter() {
+	        Eventful.call(this);
+	    }
+	    MessageCenter.prototype.on = createRegisterEventWithLowercaseName('on');
+	    MessageCenter.prototype.off = createRegisterEventWithLowercaseName('off');
+	    MessageCenter.prototype.one = createRegisterEventWithLowercaseName('one');
+	    zrUtil.mixin(MessageCenter, Eventful);
+	    /**
+	     * @module echarts~ECharts
+	     */
+	    function ECharts (dom, theme, opts) {
+	        opts = opts || {};
+
+	        // Get theme by name
+	        if (typeof theme === 'string') {
+	            theme = themeStorage[theme];
+	        }
+
+	        /**
+	         * @type {string}
+	         */
+	        this.id;
+	        /**
+	         * Group id
+	         * @type {string}
+	         */
+	        this.group;
+	        /**
+	         * @type {HTMLDomElement}
+	         * @private
+	         */
+	        this._dom = dom;
+	        /**
+	         * @type {module:zrender/ZRender}
+	         * @private
+	         */
+	        this._zr = zrender.init(dom, {
+	            renderer: opts.renderer || 'canvas',
+	            devicePixelRatio: opts.devicePixelRatio
+	        });
+
+	        /**
+	         * @type {Object}
+	         * @private
+	         */
+	        this._theme = zrUtil.clone(theme);
+
+	        /**
+	         * @type {Array.<module:echarts/view/Chart>}
+	         * @private
+	         */
+	        this._chartsViews = [];
+
+	        /**
+	         * @type {Object.<string, module:echarts/view/Chart>}
+	         * @private
+	         */
+	        this._chartsMap = {};
+
+	        /**
+	         * @type {Array.<module:echarts/view/Component>}
+	         * @private
+	         */
+	        this._componentsViews = [];
+
+	        /**
+	         * @type {Object.<string, module:echarts/view/Component>}
+	         * @private
+	         */
+	        this._componentsMap = {};
+
+	        /**
+	         * @type {module:echarts/ExtensionAPI}
+	         * @private
+	         */
+	        this._api = new ExtensionAPI(this);
+
+	        /**
+	         * @type {module:echarts/CoordinateSystem}
+	         * @private
+	         */
+	        this._coordSysMgr = new CoordinateSystemManager();
+
+	        Eventful.call(this);
+
+	        /**
+	         * @type {module:echarts~MessageCenter}
+	         * @private
+	         */
+	        this._messageCenter = new MessageCenter();
+
+	        // Init mouse events
+	        this._initEvents();
+
+	        // In case some people write `window.onresize = chart.resize`
+	        this.resize = zrUtil.bind(this.resize, this);
+
+	        // Can't dispatch action during rendering procedure
+	        this._pendingActions = [];
+	        // Sort on demand
+	        function prioritySortFunc(a, b) {
+	            return a.prio - b.prio;
+	        }
+	        timsort(visualFuncs, prioritySortFunc);
+	        timsort(dataProcessorFuncs, prioritySortFunc);
+	    }
+
+	    var echartsProto = ECharts.prototype;
+
+	    /**
+	     * @return {HTMLDomElement}
+	     */
+	    echartsProto.getDom = function () {
+	        return this._dom;
+	    };
+
+	    /**
+	     * @return {module:zrender~ZRender}
+	     */
+	    echartsProto.getZr = function () {
+	        return this._zr;
+	    };
+
+	    /**
+	     * @param {Object} option
+	     * @param {boolean} notMerge
+	     * @param {boolean} [notRefreshImmediately=false] Useful when setOption frequently.
+	     */
+	    echartsProto.setOption = function (option, notMerge, notRefreshImmediately) {
+	        if (true) {
+	            zrUtil.assert(!this[IN_MAIN_PROCESS], '`setOption` should not be called during main process.');
+	        }
+
+	        this[IN_MAIN_PROCESS] = true;
+
+	        if (!this._model || notMerge) {
+	            var optionManager = new OptionManager(this._api);
+	            var theme = this._theme;
+	            var ecModel = this._model = new GlobalModel(null, null, theme, optionManager);
+	            ecModel.init(null, null, theme, optionManager);
+	        }
+
+	        this._model.setOption(option, optionPreprocessorFuncs);
+
+	        updateMethods.prepareAndUpdate.call(this);
+
+	        this[IN_MAIN_PROCESS] = false;
+
+	        this._flushPendingActions();
+
+	        !notRefreshImmediately && this._zr.refreshImmediately();
+	    };
+
+	    /**
+	     * @DEPRECATED
+	     */
+	    echartsProto.setTheme = function () {
+	        console.log('ECharts#setTheme() is DEPRECATED in ECharts 3.0');
+	    };
+
+	    /**
+	     * @return {module:echarts/model/Global}
+	     */
+	    echartsProto.getModel = function () {
+	        return this._model;
+	    };
+
+	    /**
+	     * @return {Object}
+	     */
+	    echartsProto.getOption = function () {
+	        return this._model.getOption();
+	    };
+
+	    /**
+	     * @return {number}
+	     */
+	    echartsProto.getWidth = function () {
+	        return this._zr.getWidth();
+	    };
+
+	    /**
+	     * @return {number}
+	     */
+	    echartsProto.getHeight = function () {
+	        return this._zr.getHeight();
+	    };
+
+	    /**
+	     * Get canvas which has all thing rendered
+	     * @param {Object} opts
+	     * @param {string} [opts.backgroundColor]
+	     */
+	    echartsProto.getRenderedCanvas = function (opts) {
+	        if (!env.canvasSupported) {
+	            return;
+	        }
+	        opts = opts || {};
+	        opts.pixelRatio = opts.pixelRatio || 1;
+	        opts.backgroundColor = opts.backgroundColor
+	            || this._model.get('backgroundColor');
+	        var zr = this._zr;
+	        var list = zr.storage.getDisplayList();
+	        // Stop animations
+	        zrUtil.each(list, function (el) {
+	            el.stopAnimation(true);
+	        });
+	        return zr.painter.getRenderedCanvas(opts);
+	    };
+	    /**
+	     * @return {string}
+	     * @param {Object} opts
+	     * @param {string} [opts.type='png']
+	     * @param {string} [opts.pixelRatio=1]
+	     * @param {string} [opts.backgroundColor]
+	     */
+	    echartsProto.getDataURL = function (opts) {
+	        opts = opts || {};
+	        var excludeComponents = opts.excludeComponents;
+	        var ecModel = this._model;
+	        var excludesComponentViews = [];
+	        var self = this;
+
+	        each(excludeComponents, function (componentType) {
+	            ecModel.eachComponent({
+	                mainType: componentType
+	            }, function (component) {
+	                var view = self._componentsMap[component.__viewId];
+	                if (!view.group.ignore) {
+	                    excludesComponentViews.push(view);
+	                    view.group.ignore = true;
+	                }
+	            });
+	        });
+
+	        var url = this.getRenderedCanvas(opts).toDataURL(
+	            'image/' + (opts && opts.type || 'png')
+	        );
+
+	        each(excludesComponentViews, function (view) {
+	            view.group.ignore = false;
+	        });
+	        return url;
+	    };
+
+
+	    /**
+	     * @return {string}
+	     * @param {Object} opts
+	     * @param {string} [opts.type='png']
+	     * @param {string} [opts.pixelRatio=1]
+	     * @param {string} [opts.backgroundColor]
+	     */
+	    echartsProto.getConnectedDataURL = function (opts) {
+	        if (!env.canvasSupported) {
+	            return;
+	        }
+	        var groupId = this.group;
+	        var mathMin = Math.min;
+	        var mathMax = Math.max;
+	        var MAX_NUMBER = Infinity;
+	        if (connectedGroups[groupId]) {
+	            var left = MAX_NUMBER;
+	            var top = MAX_NUMBER;
+	            var right = -MAX_NUMBER;
+	            var bottom = -MAX_NUMBER;
+	            var canvasList = [];
+	            var dpr = (opts && opts.pixelRatio) || 1;
+	            for (var id in instances) {
+	                var chart = instances[id];
+	                if (chart.group === groupId) {
+	                    var canvas = chart.getRenderedCanvas(
+	                        zrUtil.clone(opts)
+	                    );
+	                    var boundingRect = chart.getDom().getBoundingClientRect();
+	                    left = mathMin(boundingRect.left, left);
+	                    top = mathMin(boundingRect.top, top);
+	                    right = mathMax(boundingRect.right, right);
+	                    bottom = mathMax(boundingRect.bottom, bottom);
+	                    canvasList.push({
+	                        dom: canvas,
+	                        left: boundingRect.left,
+	                        top: boundingRect.top
+	                    });
+	                }
+	            }
+
+	            left *= dpr;
+	            top *= dpr;
+	            right *= dpr;
+	            bottom *= dpr;
+	            var width = right - left;
+	            var height = bottom - top;
+	            var targetCanvas = zrUtil.createCanvas();
+	            targetCanvas.width = width;
+	            targetCanvas.height = height;
+	            var zr = zrender.init(targetCanvas);
+
+	            each(canvasList, function (item) {
+	                var img = new graphic.Image({
+	                    style: {
+	                        x: item.left * dpr - left,
+	                        y: item.top * dpr - top,
+	                        image: item.dom
+	                    }
+	                });
+	                zr.add(img);
+	            });
+	            zr.refreshImmediately();
+
+	            return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png'));
+	        }
+	        else {
+	            return this.getDataURL(opts);
+	        }
+	    };
+
+	    var updateMethods = {
+
+
+	        /**
+	         * @param {Object} payload
+	         * @private
+	         */
+	        update: function (payload) {
+	            // console.time && console.time('update');
+
+	            var ecModel = this._model;
+	            var api = this._api;
+	            var coordSysMgr = this._coordSysMgr;
+	            var zr = this._zr;
+	            // update before setOption
+	            if (!ecModel) {
+	                return;
+	            }
+
+	            // Fixme First time update ?
+	            ecModel.restoreData();
+
+	            // TODO
+	            // Save total ecModel here for undo/redo (after restoring data and before processing data).
+	            // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call.
+
+	            // Create new coordinate system each update
+	            // In LineView may save the old coordinate system and use it to get the orignal point
+	            coordSysMgr.create(this._model, this._api);
+
+	            processData.call(this, ecModel, api);
+
+	            stackSeriesData.call(this, ecModel);
+
+	            coordSysMgr.update(ecModel, api);
+
+	            doVisualEncoding.call(this, ecModel, payload);
+
+	            doRender.call(this, ecModel, payload);
+
+	            // Set background
+	            var backgroundColor = ecModel.get('backgroundColor') || 'transparent';
+
+	            var painter = zr.painter;
+	            // TODO all use clearColor ?
+	            if (painter.isSingleCanvas && painter.isSingleCanvas()) {
+	                zr.configLayer(0, {
+	                    clearColor: backgroundColor
+	                });
+	            }
+	            else {
+	                // In IE8
+	                if (!env.canvasSupported) {
+	                    var colorArr = colorTool.parse(backgroundColor);
+	                    backgroundColor = colorTool.stringify(colorArr, 'rgb');
+	                    if (colorArr[3] === 0) {
+	                        backgroundColor = 'transparent';
+	                    }
+	                }
+	                if (backgroundColor.colorStops || backgroundColor.image) {
+	                    // Gradient background
+	                    // FIXME Fixed layer\uff1f
+	                    zr.configLayer(0, {
+	                        clearColor: backgroundColor
+	                    });
+	                    this[HAS_GRADIENT_OR_PATTERN_BG] = true;
+
+	                    this._dom.style.background = 'transparent';
+	                }
+	                else {
+	                    if (this[HAS_GRADIENT_OR_PATTERN_BG]) {
+	                        zr.configLayer(0, {
+	                            clearColor: null
+	                        });
+	                    }
+	                    this[HAS_GRADIENT_OR_PATTERN_BG] = false;
+
+	                    this._dom.style.background = backgroundColor;
+	                }
+	            }
+
+	            // console.time && console.timeEnd('update');
+	        },
+
+	        // PENDING
+	        /**
+	         * @param {Object} payload
+	         * @private
+	         */
+	        updateView: function (payload) {
+	            var ecModel = this._model;
+
+	            // update before setOption
+	            if (!ecModel) {
+	                return;
+	            }
+
+	            ecModel.eachSeries(function (seriesModel) {
+	                seriesModel.getData().clearAllVisual();
+	            });
+
+	            doVisualEncoding.call(this, ecModel, payload);
+
+	            invokeUpdateMethod.call(this, 'updateView', ecModel, payload);
+	        },
+
+	        /**
+	         * @param {Object} payload
+	         * @private
+	         */
+	        updateVisual: function (payload) {
+	            var ecModel = this._model;
+
+	            // update before setOption
+	            if (!ecModel) {
+	                return;
+	            }
+
+	            ecModel.eachSeries(function (seriesModel) {
+	                seriesModel.getData().clearAllVisual();
+	            });
+
+	            doVisualEncoding.call(this, ecModel, payload);
+
+	            invokeUpdateMethod.call(this, 'updateVisual', ecModel, payload);
+	        },
+
+	        /**
+	         * @param {Object} payload
+	         * @private
+	         */
+	        updateLayout: function (payload) {
+	            var ecModel = this._model;
+
+	            // update before setOption
+	            if (!ecModel) {
+	                return;
+	            }
+
+	            doLayout.call(this, ecModel, payload);
+
+	            invokeUpdateMethod.call(this, 'updateLayout', ecModel, payload);
+	        },
+
+	        /**
+	         * @param {Object} payload
+	         * @private
+	         */
+	        highlight: function (payload) {
+	            toggleHighlight.call(this, 'highlight', payload);
+	        },
+
+	        /**
+	         * @param {Object} payload
+	         * @private
+	         */
+	        downplay: function (payload) {
+	            toggleHighlight.call(this, 'downplay', payload);
+	        },
+
+	        /**
+	         * @param {Object} payload
+	         * @private
+	         */
+	        prepareAndUpdate: function (payload) {
+	            var ecModel = this._model;
+
+	            prepareView.call(this, 'component', ecModel);
+
+	            prepareView.call(this, 'chart', ecModel);
+
+	            updateMethods.update.call(this, payload);
+	        }
+	    };
+
+	    /**
+	     * @param {Object} payload
+	     * @private
+	     */
+	    function toggleHighlight(method, payload) {
+	        var ecModel = this._model;
+
+	        // dispatchAction before setOption
+	        if (!ecModel) {
+	            return;
+	        }
+
+	        ecModel.eachComponent(
+	            {mainType: 'series', query: payload},
+	            function (seriesModel, index) {
+	                var chartView = this._chartsMap[seriesModel.__viewId];
+	                if (chartView && chartView.__alive) {
+	                    chartView[method](
+	                        seriesModel, ecModel, this._api, payload
+	                    );
+	                }
+	            },
+	            this
+	        );
+	    }
+
+	    /**
+	     * Resize the chart
+	     */
+	    echartsProto.resize = function () {
+	        if (true) {
+	            zrUtil.assert(!this[IN_MAIN_PROCESS], '`resize` should not be called during main process.');
+	        }
+
+	        this[IN_MAIN_PROCESS] = true;
+
+	        this._zr.resize();
+
+	        var optionChanged = this._model && this._model.resetOption('media');
+	        updateMethods[optionChanged ? 'prepareAndUpdate' : 'update'].call(this);
+
+	        // Resize loading effect
+	        this._loadingFX && this._loadingFX.resize();
+
+	        this[IN_MAIN_PROCESS] = false;
+
+	        this._flushPendingActions();
+	    };
+
+	    var defaultLoadingEffect = __webpack_require__(93);
+	    /**
+	     * Show loading effect
+	     * @param  {string} [name='default']
+	     * @param  {Object} [cfg]
+	     */
+	    echartsProto.showLoading = function (name, cfg) {
+	        if (zrUtil.isObject(name)) {
+	            cfg = name;
+	            name = 'default';
+	        }
+	        this.hideLoading();
+	        var el = defaultLoadingEffect(this._api, cfg);
+	        var zr = this._zr;
+	        this._loadingFX = el;
+
+	        zr.add(el);
+	    };
+
+	    /**
+	     * Hide loading effect
+	     */
+	    echartsProto.hideLoading = function () {
+	        this._loadingFX && this._zr.remove(this._loadingFX);
+	        this._loadingFX = null;
+	    };
+
+	    /**
+	     * @param {Object} eventObj
+	     * @return {Object}
+	     */
+	    echartsProto.makeActionFromEvent = function (eventObj) {
+	        var payload = zrUtil.extend({}, eventObj);
+	        payload.type = eventActionMap[eventObj.type];
+	        return payload;
+	    };
+
+	    /**
+	     * @pubilc
+	     * @param {Object} payload
+	     * @param {string} [payload.type] Action type
+	     * @param {boolean} [silent=false] Whether trigger event.
+	     */
+	    echartsProto.dispatchAction = function (payload, silent) {
+	        var actionWrap = actions[payload.type];
+	        if (!actionWrap) {
+	            return;
+	        }
+
+	        var actionInfo = actionWrap.actionInfo;
+	        var updateMethod = actionInfo.update || 'update';
+
+	        // if (__DEV__) {
+	        //     zrUtil.assert(
+	        //         !this[IN_MAIN_PROCESS],
+	        //         '`dispatchAction` should not be called during main process.'
+	        //         + 'unless updateMathod is "none".'
+	        //     );
+	        // }
+
+	        // May dispatchAction in rendering procedure
+	        if (this[IN_MAIN_PROCESS]) {
+	            this._pendingActions.push(payload);
+	            return;
+	        }
+
+	        this[IN_MAIN_PROCESS] = true;
+
+	        var payloads = [payload];
+	        var batched = false;
+	        // Batch action
+	        if (payload.batch) {
+	            batched = true;
+	            payloads = zrUtil.map(payload.batch, function (item) {
+	                item = zrUtil.defaults(zrUtil.extend({}, item), payload);
+	                item.batch = null;
+	                return item;
+	            });
+	        }
+
+	        var eventObjBatch = [];
+	        var eventObj;
+	        var isHighlightOrDownplay = payload.type === 'highlight' || payload.type === 'downplay';
+	        for (var i = 0; i < payloads.length; i++) {
+	            var batchItem = payloads[i];
+	            // Action can specify the event by return it.
+	            eventObj = actionWrap.action(batchItem, this._model);
+	            // Emit event outside
+	            eventObj = eventObj || zrUtil.extend({}, batchItem);
+	            // Convert type to eventType
+	            eventObj.type = actionInfo.event || eventObj.type;
+	            eventObjBatch.push(eventObj);
+
+	            // Highlight and downplay are special.
+	            isHighlightOrDownplay && updateMethods[updateMethod].call(this, batchItem);
+	        }
+
+	        (updateMethod !== 'none' && !isHighlightOrDownplay)
+	            && updateMethods[updateMethod].call(this, payload);
+
+	        // Follow the rule of action batch
+	        if (batched) {
+	            eventObj = {
+	                type: actionInfo.event || payload.type,
+	                batch: eventObjBatch
+	            };
+	        }
+	        else {
+	            eventObj = eventObjBatch[0];
+	        }
+
+	        this[IN_MAIN_PROCESS] = false;
+
+	        !silent && this._messageCenter.trigger(eventObj.type, eventObj);
+
+	        this._flushPendingActions();
+
+	    };
+
+	    echartsProto._flushPendingActions = function () {
+	        var pendingActions = this._pendingActions;
+	        while (pendingActions.length) {
+	            var payload = pendingActions.shift();
+	            this.dispatchAction(payload);
+	        }
+	    };
+
+	    /**
+	     * Register event
+	     * @method
+	     */
+	    echartsProto.on = createRegisterEventWithLowercaseName('on');
+	    echartsProto.off = createRegisterEventWithLowercaseName('off');
+	    echartsProto.one = createRegisterEventWithLowercaseName('one');
+
+	    /**
+	     * @param {string} methodName
+	     * @private
+	     */
+	    function invokeUpdateMethod(methodName, ecModel, payload) {
+	        var api = this._api;
+
+	        // Update all components
+	        each(this._componentsViews, function (component) {
+	            var componentModel = component.__model;
+	            component[methodName](componentModel, ecModel, api, payload);
+
+	            updateZ(componentModel, component);
+	        }, this);
+
+	        // Upate all charts
+	        ecModel.eachSeries(function (seriesModel, idx) {
+	            var chart = this._chartsMap[seriesModel.__viewId];
+	            chart[methodName](seriesModel, ecModel, api, payload);
+
+	            updateZ(seriesModel, chart);
+
+	            updateProgressiveAndBlend(seriesModel, chart);
+	        }, this);
+
+	        // If use hover layer
+	        updateHoverLayerStatus(this._zr, ecModel);
+	    }
+
+	    /**
+	     * Prepare view instances of charts and components
+	     * @param  {module:echarts/model/Global} ecModel
+	     * @private
+	     */
+	    function prepareView(type, ecModel) {
+	        var isComponent = type === 'component';
+	        var viewList = isComponent ? this._componentsViews : this._chartsViews;
+	        var viewMap = isComponent ? this._componentsMap : this._chartsMap;
+	        var zr = this._zr;
+
+	        for (var i = 0; i < viewList.length; i++) {
+	            viewList[i].__alive = false;
+	        }
+
+	        ecModel[isComponent ? 'eachComponent' : 'eachSeries'](function (componentType, model) {
+	            if (isComponent) {
+	                if (componentType === 'series') {
+	                    return;
+	                }
+	            }
+	            else {
+	                model = componentType;
+	            }
+
+	            // Consider: id same and type changed.
+	            var viewId = model.id + '_' + model.type;
+	            var view = viewMap[viewId];
+	            if (!view) {
+	                var classType = ComponentModel.parseClassType(model.type);
+	                var Clazz = isComponent
+	                    ? ComponentView.getClass(classType.main, classType.sub)
+	                    : ChartView.getClass(classType.sub);
+	                if (Clazz) {
+	                    view = new Clazz();
+	                    view.init(ecModel, this._api);
+	                    viewMap[viewId] = view;
+	                    viewList.push(view);
+	                    zr.add(view.group);
+	                }
+	                else {
+	                    // Error
+	                    return;
+	                }
+	            }
+
+	            model.__viewId = viewId;
+	            view.__alive = true;
+	            view.__id = viewId;
+	            view.__model = model;
+	        }, this);
+
+	        for (var i = 0; i < viewList.length;) {
+	            var view = viewList[i];
+	            if (!view.__alive) {
+	                zr.remove(view.group);
+	                view.dispose(ecModel, this._api);
+	                viewList.splice(i, 1);
+	                delete viewMap[view.__id];
+	            }
+	            else {
+	                i++;
+	            }
+	        }
+	    }
+
+	    /**
+	     * Processor data in each series
+	     *
+	     * @param {module:echarts/model/Global} ecModel
+	     * @private
+	     */
+	    function processData(ecModel, api) {
+	        each(dataProcessorFuncs, function (process) {
+	            process.func(ecModel, api);
+	        });
+	    }
+
+	    /**
+	     * @private
+	     */
+	    function stackSeriesData(ecModel) {
+	        var stackedDataMap = {};
+	        ecModel.eachSeries(function (series) {
+	            var stack = series.get('stack');
+	            var data = series.getData();
+	            if (stack && data.type === 'list') {
+	                var previousStack = stackedDataMap[stack];
+	                if (previousStack) {
+	                    data.stackedOn = previousStack;
+	                }
+	                stackedDataMap[stack] = data;
+	            }
+	        });
+	    }
+
+	    /**
+	     * Layout before each chart render there series, special visual encoding stage
+	     *
+	     * @param {module:echarts/model/Global} ecModel
+	     * @private
+	     */
+	    function doLayout(ecModel, payload) {
+	        var api = this._api;
+	        each(visualFuncs, function (visual) {
+	            if (visual.isLayout) {
+	                visual.func(ecModel, api, payload);
+	            }
+	        });
+	    }
+
+	    /**
+	     * Encode visual infomation from data after data processing
+	     *
+	     * @param {module:echarts/model/Global} ecModel
+	     * @private
+	     */
+	    function doVisualEncoding(ecModel, payload) {
+	        var api = this._api;
+	        ecModel.clearColorPalette();
+	        ecModel.eachSeries(function (seriesModel) {
+	            seriesModel.clearColorPalette();
+	        });
+	        each(visualFuncs, function (visual) {
+	            visual.func(ecModel, api, payload);
+	        });
+	    }
+
+	    /**
+	     * Render each chart and component
+	     * @private
+	     */
+	    function doRender(ecModel, payload) {
+	        var api = this._api;
+	        // Render all components
+	        each(this._componentsViews, function (componentView) {
+	            var componentModel = componentView.__model;
+	            componentView.render(componentModel, ecModel, api, payload);
+
+	            updateZ(componentModel, componentView);
+	        }, this);
+
+	        each(this._chartsViews, function (chart) {
+	            chart.__alive = false;
+	        }, this);
+
+	        // Render all charts
+	        ecModel.eachSeries(function (seriesModel, idx) {
+	            var chartView = this._chartsMap[seriesModel.__viewId];
+	            chartView.__alive = true;
+	            chartView.render(seriesModel, ecModel, api, payload);
+
+	            chartView.group.silent = !!seriesModel.get('silent');
+
+	            updateZ(seriesModel, chartView);
+
+	            updateProgressiveAndBlend(seriesModel, chartView);
+
+	        }, this);
+
+	        // If use hover layer
+	        updateHoverLayerStatus(this._zr, ecModel);
+
+	        // Remove groups of unrendered charts
+	        each(this._chartsViews, function (chart) {
+	            if (!chart.__alive) {
+	                chart.remove(ecModel, api);
+	            }
+	        }, this);
+	    }
+
+	    var MOUSE_EVENT_NAMES = [
+	        'click', 'dblclick', 'mouseover', 'mouseout', 'mousedown', 'mouseup', 'globalout'
+	    ];
+	    /**
+	     * @private
+	     */
+	    echartsProto._initEvents = function () {
+	        each(MOUSE_EVENT_NAMES, function (eveName) {
+	            this._zr.on(eveName, function (e) {
+	                var ecModel = this.getModel();
+	                var el = e.target;
+	                if (el && el.dataIndex != null) {
+	                    var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex);
+	                    var params = dataModel && dataModel.getDataParams(el.dataIndex, el.dataType) || {};
+	                    params.event = e;
+	                    params.type = eveName;
+	                    this.trigger(eveName, params);
+	                }
+	                // If element has custom eventData of components
+	                else if (el && el.eventData) {
+	                    this.trigger(eveName, el.eventData);
+	                }
+	            }, this);
+	        }, this);
+
+	        each(eventActionMap, function (actionType, eventType) {
+	            this._messageCenter.on(eventType, function (event) {
+	                this.trigger(eventType, event);
+	            }, this);
+	        }, this);
+	    };
+
+	    /**
+	     * @return {boolean}
+	     */
+	    echartsProto.isDisposed = function () {
+	        return this._disposed;
+	    };
+
+	    /**
+	     * Clear
+	     */
+	    echartsProto.clear = function () {
+	        this.setOption({}, true);
+	    };
+	    /**
+	     * Dispose instance
+	     */
+	    echartsProto.dispose = function () {
+	        if (this._disposed) {
+	            if (true) {
+	                console.warn('Instance ' + this.id + ' has been disposed');
+	            }
+	            return;
+	        }
+	        this._disposed = true;
+
+	        var api = this._api;
+	        var ecModel = this._model;
+
+	        each(this._componentsViews, function (component) {
+	            component.dispose(ecModel, api);
+	        });
+	        each(this._chartsViews, function (chart) {
+	            chart.dispose(ecModel, api);
+	        });
+
+	        // Dispose after all views disposed
+	        this._zr.dispose();
+
+	        delete instances[this.id];
+	    };
+
+	    zrUtil.mixin(ECharts, Eventful);
+
+	    function updateHoverLayerStatus(zr, ecModel) {
+	        var storage = zr.storage;
+	        var elCount = 0;
+	        storage.traverse(function (el) {
+	            if (!el.isGroup) {
+	                elCount++;
+	            }
+	        });
+	        if (elCount > ecModel.get('hoverLayerThreshold') && !env.node) {
+	            storage.traverse(function (el) {
+	                if (!el.isGroup) {
+	                    el.useHoverLayer = true;
+	                }
+	            });
+	        }
+	    }
+	    /**
+	     * Update chart progressive and blend.
+	     * @param {module:echarts/model/Series|module:echarts/model/Component} model
+	     * @param {module:echarts/view/Component|module:echarts/view/Chart} view
+	     */
+	    function updateProgressiveAndBlend(seriesModel, chartView) {
+	        // Progressive configuration
+	        var elCount = 0;
+	        chartView.group.traverse(function (el) {
+	            if (el.type !== 'group' && !el.ignore) {
+	                elCount++;
+	            }
+	        });
+	        var frameDrawNum = +seriesModel.get('progressive');
+	        var needProgressive = elCount > seriesModel.get('progressiveThreshold') && frameDrawNum && !env.node;
+	        if (needProgressive) {
+	            chartView.group.traverse(function (el) {
+	                // FIXME marker and other components
+	                if (!el.isGroup) {
+	                    el.progressive = needProgressive ?
+	                        Math.floor(elCount++ / frameDrawNum) : -1;
+	                    if (needProgressive) {
+	                        el.stopAnimation(true);
+	                    }
+	                }
+	            });
+	        }
+
+	        // Blend configration
+	        var blendMode = seriesModel.get('blendMode') || null;
+	        if (true) {
+	            if (!env.canvasSupported && blendMode && blendMode !== 'source-over') {
+	                console.warn('Only canvas support blendMode');
+	            }
+	        }
+	        chartView.group.traverse(function (el) {
+	            // FIXME marker and other components
+	            if (!el.isGroup) {
+	                el.setStyle('blend', blendMode);
+	            }
+	        });
+	    }
+	    /**
+	     * @param {module:echarts/model/Series|module:echarts/model/Component} model
+	     * @param {module:echarts/view/Component|module:echarts/view/Chart} view
+	     */
+	    function updateZ(model, view) {
+	        var z = model.get('z');
+	        var zlevel = model.get('zlevel');
+	        // Set z and zlevel
+	        view.group.traverse(function (el) {
+	            if (el.type !== 'group') {
+	                z != null && (el.z = z);
+	                zlevel != null && (el.zlevel = zlevel);
+	            }
+	        });
+	    }
+	    /**
+	     * @type {Array.<Function>}
+	     * @inner
+	     */
+	    var actions = [];
+
+	    /**
+	     * Map eventType to actionType
+	     * @type {Object}
+	     */
+	    var eventActionMap = {};
+
+	    /**
+	     * Data processor functions of each stage
+	     * @type {Array.<Object.<string, Function>>}
+	     * @inner
+	     */
+	    var dataProcessorFuncs = [];
+
+	    /**
+	     * @type {Array.<Function>}
+	     * @inner
+	     */
+	    var optionPreprocessorFuncs = [];
+
+	    /**
+	     * Visual encoding functions of each stage
+	     * @type {Array.<Object.<string, Function>>}
+	     * @inner
+	     */
+	    var visualFuncs = [];
+	    /**
+	     * Theme storage
+	     * @type {Object.<key, Object>}
+	     */
+	    var themeStorage = {};
+
+
+	    var instances = {};
+	    var connectedGroups = {};
+
+	    var idBase = new Date() - 0;
+	    var groupIdBase = new Date() - 0;
+	    var DOM_ATTRIBUTE_KEY = '_echarts_instance_';
+	    /**
+	     * @alias module:echarts
+	     */
+	    var echarts = {
+	        /**
+	         * @type {number}
+	         */
+	        version: '3.2.2',
+	        dependencies: {
+	            zrender: '3.1.2'
+	        }
+	    };
+
+	    function enableConnect(chart) {
+
+	        var STATUS_PENDING = 0;
+	        var STATUS_UPDATING = 1;
+	        var STATUS_UPDATED = 2;
+	        var STATUS_KEY = '__connectUpdateStatus';
+	        function updateConnectedChartsStatus(charts, status) {
+	            for (var i = 0; i < charts.length; i++) {
+	                var otherChart = charts[i];
+	                otherChart[STATUS_KEY] = status;
+	            }
+	        }
+	        zrUtil.each(eventActionMap, function (actionType, eventType) {
+	            chart._messageCenter.on(eventType, function (event) {
+	                if (connectedGroups[chart.group] && chart[STATUS_KEY] !== STATUS_PENDING) {
+	                    var action = chart.makeActionFromEvent(event);
+	                    var otherCharts = [];
+	                    for (var id in instances) {
+	                        var otherChart = instances[id];
+	                        if (otherChart !== chart && otherChart.group === chart.group) {
+	                            otherCharts.push(otherChart);
+	                        }
+	                    }
+	                    updateConnectedChartsStatus(otherCharts, STATUS_PENDING);
+	                    each(otherCharts, function (otherChart) {
+	                        if (otherChart[STATUS_KEY] !== STATUS_UPDATING) {
+	                            otherChart.dispatchAction(action);
+	                        }
+	                    });
+	                    updateConnectedChartsStatus(otherCharts, STATUS_UPDATED);
+	                }
+	            });
+	        });
+
+	    }
+	    /**
+	     * @param {HTMLDomElement} dom
+	     * @param {Object} [theme]
+	     * @param {Object} opts
+	     */
+	    echarts.init = function (dom, theme, opts) {
+	        if (true) {
+	            // Check version
+	            if ((zrender.version.replace('.', '') - 0) < (echarts.dependencies.zrender.replace('.', '') - 0)) {
+	                throw new Error(
+	                    'ZRender ' + zrender.version
+	                    + ' is too old for ECharts ' + echarts.version
+	                    + '. Current version need ZRender '
+	                    + echarts.dependencies.zrender + '+'
+	                );
+	            }
+	            if (!dom) {
+	                throw new Error('Initialize failed: invalid dom.');
+	            }
+	            if (zrUtil.isDom(dom) && dom.nodeName.toUpperCase() !== 'CANVAS' && (!dom.clientWidth || !dom.clientHeight)) {
+	                console.warn('Can\'t get dom width or height');
+	            }
+	        }
+
+	        var chart = new ECharts(dom, theme, opts);
+	        chart.id = 'ec_' + idBase++;
+	        instances[chart.id] = chart;
+
+	        dom.setAttribute &&
+	            dom.setAttribute(DOM_ATTRIBUTE_KEY, chart.id);
+
+	        enableConnect(chart);
+
+	        return chart;
+	    };
+
+	    /**
+	     * @return {string|Array.<module:echarts~ECharts>} groupId
+	     */
+	    echarts.connect = function (groupId) {
+	        // Is array of charts
+	        if (zrUtil.isArray(groupId)) {
+	            var charts = groupId;
+	            groupId = null;
+	            // If any chart has group
+	            zrUtil.each(charts, function (chart) {
+	                if (chart.group != null) {
+	                    groupId = chart.group;
+	                }
+	            });
+	            groupId = groupId || ('g_' + groupIdBase++);
+	            zrUtil.each(charts, function (chart) {
+	                chart.group = groupId;
+	            });
+	        }
+	        connectedGroups[groupId] = true;
+	        return groupId;
+	    };
+
+	    /**
+	     * @return {string} groupId
+	     */
+	    echarts.disConnect = function (groupId) {
+	        connectedGroups[groupId] = false;
+	    };
+
+	    /**
+	     * Dispose a chart instance
+	     * @param  {module:echarts~ECharts|HTMLDomElement|string} chart
+	     */
+	    echarts.dispose = function (chart) {
+	        if (zrUtil.isDom(chart)) {
+	            chart = echarts.getInstanceByDom(chart);
+	        }
+	        else if (typeof chart === 'string') {
+	            chart = instances[chart];
+	        }
+	        if ((chart instanceof ECharts) && !chart.isDisposed()) {
+	            chart.dispose();
+	        }
+	    };
+
+	    /**
+	     * @param  {HTMLDomElement} dom
+	     * @return {echarts~ECharts}
+	     */
+	    echarts.getInstanceByDom = function (dom) {
+	        var key = dom.getAttribute(DOM_ATTRIBUTE_KEY);
+	        return instances[key];
+	    };
+	    /**
+	     * @param {string} key
+	     * @return {echarts~ECharts}
+	     */
+	    echarts.getInstanceById = function (key) {
+	        return instances[key];
+	    };
+
+	    /**
+	     * Register theme
+	     */
+	    echarts.registerTheme = function (name, theme) {
+	        themeStorage[name] = theme;
+	    };
+
+	    /**
+	     * Register option preprocessor
+	     * @param {Function} preprocessorFunc
+	     */
+	    echarts.registerPreprocessor = function (preprocessorFunc) {
+	        optionPreprocessorFuncs.push(preprocessorFunc);
+	    };
+
+	    /**
+	     * @param {number} [priority=1000]
+	     * @param {Function} processorFunc
+	     */
+	    echarts.registerProcessor = function (priority, processorFunc) {
+	        if (typeof priority === 'function') {
+	            processorFunc = priority;
+	            priority = PRIORITY_PROCESSOR_FILTER;
+	        }
+	        if (true) {
+	            if (isNaN(priority)) {
+	                throw new Error('Unkown processor priority');
+	            }
+	        }
+	        dataProcessorFuncs.push({
+	            prio: priority,
+	            func: processorFunc
+	        });
+	    };
+
+	    /**
+	     * Usage:
+	     * registerAction('someAction', 'someEvent', function () { ... });
+	     * registerAction('someAction', function () { ... });
+	     * registerAction(
+	     *     {type: 'someAction', event: 'someEvent', update: 'updateView'},
+	     *     function () { ... }
+	     * );
+	     *
+	     * @param {(string|Object)} actionInfo
+	     * @param {string} actionInfo.type
+	     * @param {string} [actionInfo.event]
+	     * @param {string} [actionInfo.update]
+	     * @param {string} [eventName]
+	     * @param {Function} action
+	     */
+	    echarts.registerAction = function (actionInfo, eventName, action) {
+	        if (typeof eventName === 'function') {
+	            action = eventName;
+	            eventName = '';
+	        }
+	        var actionType = zrUtil.isObject(actionInfo)
+	            ? actionInfo.type
+	            : ([actionInfo, actionInfo = {
+	                event: eventName
+	            }][0]);
+
+	        // Event name is all lowercase
+	        actionInfo.event = (actionInfo.event || actionType).toLowerCase();
+	        eventName = actionInfo.event;
+
+	        if (!actions[actionType]) {
+	            actions[actionType] = {action: action, actionInfo: actionInfo};
+	        }
+	        eventActionMap[eventName] = actionType;
+	    };
+
+	    /**
+	     * @param {string} type
+	     * @param {*} CoordinateSystem
+	     */
+	    echarts.registerCoordinateSystem = function (type, CoordinateSystem) {
+	        CoordinateSystemManager.register(type, CoordinateSystem);
+	    };
+
+	    /**
+	     * Layout is a special stage of visual encoding
+	     * Most visual encoding like color are common for different chart
+	     * But each chart has it's own layout algorithm
+	     *
+	     * @param {string} [priority=1000]
+	     * @param {Function} layoutFunc
+	     */
+	    echarts.registerLayout = function (priority, layoutFunc) {
+	        if (typeof priority === 'function') {
+	            layoutFunc = priority;
+	            priority = PRIORITY_VISUAL_LAYOUT;
+	        }
+	        if (true) {
+	            if (isNaN(priority)) {
+	                throw new Error('Unkown layout priority');
+	            }
+	        }
+	        visualFuncs.push({
+	            prio: priority,
+	            func: layoutFunc,
+	            isLayout: true
+	        });
+	    };
+
+	    /**
+	     * @param {string} [priority=3000]
+	     * @param {Function} visualFunc
+	     */
+	    echarts.registerVisual = function (priority, visualFunc) {
+	        if (typeof priority === 'function') {
+	            visualFunc = priority;
+	            priority = PRIORITY_VISUAL_CHART;
+	        }
+	        if (true) {
+	            if (isNaN(priority)) {
+	                throw new Error('Unkown visual priority');
+	            }
+	        }
+	        visualFuncs.push({
+	            prio: priority,
+	            func: visualFunc
+	        });
+	    };
+
+	    var parseClassType = ComponentModel.parseClassType;
+	    /**
+	     * @param {Object} opts
+	     * @param {string} [superClass]
+	     */
+	    echarts.extendComponentModel = function (opts, superClass) {
+	        var Clazz = ComponentModel;
+	        if (superClass) {
+	            var classType = parseClassType(superClass);
+	            Clazz = ComponentModel.getClass(classType.main, classType.sub, true);
+	        }
+	        return Clazz.extend(opts);
+	    };
+
+	    /**
+	     * @param {Object} opts
+	     * @param {string} [superClass]
+	     */
+	    echarts.extendComponentView = function (opts, superClass) {
+	        var Clazz = ComponentView;
+	        if (superClass) {
+	            var classType = parseClassType(superClass);
+	            Clazz = ComponentView.getClass(classType.main, classType.sub, true);
+	        }
+	        return Clazz.extend(opts);
+	    };
+
+	    /**
+	     * @param {Object} opts
+	     * @param {string} [superClass]
+	     */
+	    echarts.extendSeriesModel = function (opts, superClass) {
+	        var Clazz = SeriesModel;
+	        if (superClass) {
+	            superClass = 'series.' + superClass.replace('series.', '');
+	            var classType = parseClassType(superClass);
+	            Clazz = SeriesModel.getClass(classType.main, classType.sub, true);
+	        }
+	        return Clazz.extend(opts);
+	    };
+
+	    /**
+	     * @param {Object} opts
+	     * @param {string} [superClass]
+	     */
+	    echarts.extendChartView = function (opts, superClass) {
+	        var Clazz = ChartView;
+	        if (superClass) {
+	            superClass.replace('series.', '');
+	            var classType = parseClassType(superClass);
+	            Clazz = ChartView.getClass(classType.main, true);
+	        }
+	        return ChartView.extend(opts);
+	    };
+
+	    /**
+	     * ZRender need a canvas context to do measureText.
+	     * But in node environment canvas may be created by node-canvas.
+	     * So we need to specify how to create a canvas instead of using document.createElement('canvas')
+	     *
+	     * Be careful of using it in the browser.
+	     *
+	     * @param {Function} creator
+	     * @example
+	     *     var Canvas = require('canvas');
+	     *     var echarts = require('echarts');
+	     *     echarts.setCanvasCreator(function () {
+	     *         // Small size is enough.
+	     *         return new Canvas(32, 32);
+	     *     });
+	     */
+	    echarts.setCanvasCreator = function (creator) {
+	        zrUtil.createCanvas = creator;
+	    };
+
+	    echarts.registerVisual(PRIORITY_VISUAL_GLOBAL, __webpack_require__(94));
+	    echarts.registerPreprocessor(__webpack_require__(95));
+
+	    // Default action
+	    echarts.registerAction({
+	        type: 'highlight',
+	        event: 'highlight',
+	        update: 'highlight'
+	    }, zrUtil.noop);
+	    echarts.registerAction({
+	        type: 'downplay',
+	        event: 'downplay',
+	        update: 'downplay'
+	    }, zrUtil.noop);
+
+
+	    // --------
+	    // Exports
+	    // --------
+	    //
+	    echarts.List = __webpack_require__(97);
+	    echarts.Model = __webpack_require__(12);
+
+	    echarts.graphic = __webpack_require__(43);
+	    echarts.number = __webpack_require__(7);
+	    echarts.format = __webpack_require__(6);
+	    echarts.matrix = __webpack_require__(11);
+	    echarts.vector = __webpack_require__(10);
+	    echarts.color = __webpack_require__(39);
+
+	    echarts.util = {};
+	    each([
+	            'map', 'each', 'filter', 'indexOf', 'inherits',
+	            'reduce', 'filter', 'bind', 'curry', 'isArray',
+	            'isString', 'isObject', 'isFunction', 'extend', 'defaults'
+	        ],
+	        function (name) {
+	            echarts.util[name] = zrUtil[name];
+	        }
+	    );
+
+	    // PRIORITY
+	    echarts.PRIORITY = {
+	        PROCESSOR: {
+	            FILTER: PRIORITY_PROCESSOR_FILTER,
+	            STATISTIC: PRIORITY_PROCESSOR_STATISTIC
+	        },
+	        VISUAL: {
+	            LAYOUT: PRIORITY_VISUAL_LAYOUT,
+	            GLOBAL: PRIORITY_VISUAL_GLOBAL,
+	            CHART: PRIORITY_VISUAL_CHART,
+	            COMPONENT: PRIORITY_VISUAL_COMPONENT,
+	            BRUSH: PRIORITY_VISUAL_BRUSH
+	        }
+	    };
+
+	    module.exports = echarts;
+
+
+/***/ },
+/* 2 */
+/***/ function(module, exports) {
+
+	/**
+	 * echarts\u8bbe\u5907\u73af\u5883\u8bc6\u522b
+	 *
+	 * @desc echarts\u57fa\u4e8eCanvas\uff0c\u7eafJavascript\u56fe\u8868\u5e93\uff0c\u63d0\u4f9b\u76f4\u89c2\uff0c\u751f\u52a8\uff0c\u53ef\u4ea4\u4e92\uff0c\u53ef\u4e2a\u6027\u5316\u5b9a\u5236\u7684\u6570\u636e\u7edf\u8ba1\u56fe\u8868\u3002
+	 * @author firede[firede@firede.us]
+	 * @desc thanks zepto.
+	 */
+
+	    var env = {};
+	    if (typeof navigator === 'undefined') {
+	        // In node
+	        env = {
+	            browser: {},
+	            os: {},
+	            node: true,
+	            // Assume canvas is supported
+	            canvasSupported: true
+	        };
+	    }
+	    else {
+	        env = detect(navigator.userAgent);
+	    }
+
+	    module.exports = env;
+
+	    // Zepto.js
+	    // (c) 2010-2013 Thomas Fuchs
+	    // Zepto.js may be freely distributed under the MIT license.
+
+	    function detect(ua) {
+	        var os = {};
+	        var browser = {};
+	        // var webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/);
+	        // var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/);
+	        // var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
+	        // var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
+	        // var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/);
+	        // var webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/);
+	        // var touchpad = webos && ua.match(/TouchPad/);
+	        // var kindle = ua.match(/Kindle\/([\d.]+)/);
+	        // var silk = ua.match(/Silk\/([\d._]+)/);
+	        // var blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/);
+	        // var bb10 = ua.match(/(BB10).*Version\/([\d.]+)/);
+	        // var rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/);
+	        // var playbook = ua.match(/PlayBook/);
+	        // var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/);
+	        var firefox = ua.match(/Firefox\/([\d.]+)/);
+	        // var safari = webkit && ua.match(/Mobile\//) && !chrome;
+	        // var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome;
+	        var ie = ua.match(/MSIE\s([\d.]+)/)
+	            // IE 11 Trident/7.0; rv:11.0
+	            || ua.match(/Trident\/.+?rv:(([\d.]+))/);
+	        var edge = ua.match(/Edge\/([\d.]+)/); // IE 12 and 12+
+
+	        // Todo: clean this up with a better OS/browser seperation:
+	        // - discern (more) between multiple browsers on android
+	        // - decide if kindle fire in silk mode is android or not
+	        // - Firefox on Android doesn't specify the Android version
+	        // - possibly devide in os, device and browser hashes
+
+	        // if (browser.webkit = !!webkit) browser.version = webkit[1];
+
+	        // if (android) os.android = true, os.version = android[2];
+	        // if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.');
+	        // if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.');
+	        // if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
+	        // if (webos) os.webos = true, os.version = webos[2];
+	        // if (touchpad) os.touchpad = true;
+	        // if (blackberry) os.blackberry = true, os.version = blackberry[2];
+	        // if (bb10) os.bb10 = true, os.version = bb10[2];
+	        // if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2];
+	        // if (playbook) browser.playbook = true;
+	        // if (kindle) os.kindle = true, os.version = kindle[1];
+	        // if (silk) browser.silk = true, browser.version = silk[1];
+	        // if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true;
+	        // if (chrome) browser.chrome = true, browser.version = chrome[1];
+	        if (firefox) browser.firefox = true, browser.version = firefox[1];
+	        // if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true;
+	        // if (webview) browser.webview = true;
+	        if (ie) {
+	            browser.ie = true; browser.version = ie[1];
+	        }
+	        if (ie) {
+	            browser.ie = true;
+	            browser.version = ie[1];
+	        }
+	        if (edge) {
+	            browser.edge = true;
+	            browser.version = edge[1];
+	        }
+
+	        // os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) ||
+	        //     (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/)));
+	        // os.phone  = !!(!os.tablet && !os.ipod && (android || iphone || webos ||
+	        //     (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) ||
+	        //     (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/))));
+
+	        return {
+	            browser: browser,
+	            os: os,
+	            node: false,
+	            // \u539f\u751fcanvas\u652f\u6301\uff0c\u6539\u6781\u7aef\u70b9\u4e86
+	            // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9)
+	            canvasSupported : document.createElement('canvas').getContext ? true : false,
+	            // @see <http://stackoverflow.com/questions/4817029/whats-the-best-way-to-detect-a-touch-screen-device-using-javascript>
+	            // works on most browsers
+	            // IE10/11 does not support touch event, and MS Edge supports them but not by
+	            // default, so we dont check navigator.maxTouchPoints for them here.
+	            touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge,
+	            // <http://caniuse.com/#search=pointer%20event>.
+	            pointerEventsSupported: 'onpointerdown' in window
+	                // Firefox supports pointer but not by default,
+	                // only MS browsers are reliable on pointer events currently.
+	                && (browser.edge || (browser.ie && browser.version >= 10))
+	        };
+	    }
+
+
+/***/ },
+/* 3 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * ECharts global model
+	 *
+	 * @module {echarts/model/Global}
+	 *
+	 */
+
+
+
+	    var zrUtil = __webpack_require__(4);
+	    var modelUtil = __webpack_require__(5);
+	    var Model = __webpack_require__(12);
+	    var each = zrUtil.each;
+	    var filter = zrUtil.filter;
+	    var map = zrUtil.map;
+	    var isArray = zrUtil.isArray;
+	    var indexOf = zrUtil.indexOf;
+	    var isObject = zrUtil.isObject;
+
+	    var ComponentModel = __webpack_require__(19);
+
+	    var globalDefault = __webpack_require__(23);
+
+	    var OPTION_INNER_KEY = '\0_ec_inner';
+
+	    /**
+	     * @alias module:echarts/model/Global
+	     *
+	     * @param {Object} option
+	     * @param {module:echarts/model/Model} parentModel
+	     * @param {Object} theme
+	     */
+	    var GlobalModel = Model.extend({
+
+	        constructor: GlobalModel,
+
+	        init: function (option, parentModel, theme, optionManager) {
+	            theme = theme || {};
+
+	            this.option = null; // Mark as not initialized.
+
+	            /**
+	             * @type {module:echarts/model/Model}
+	             * @private
+	             */
+	            this._theme = new Model(theme);
+
+	            /**
+	             * @type {module:echarts/model/OptionManager}
+	             */
+	            this._optionManager = optionManager;
+	        },
+
+	        setOption: function (option, optionPreprocessorFuncs) {
+	            zrUtil.assert(
+	                !(OPTION_INNER_KEY in option),
+	                'please use chart.getOption()'
+	            );
+
+	            this._optionManager.setOption(option, optionPreprocessorFuncs);
+
+	            this.resetOption();
+	        },
+
+	        /**
+	         * @param {string} type null/undefined: reset all.
+	         *                      'recreate': force recreate all.
+	         *                      'timeline': only reset timeline option
+	         *                      'media': only reset media query option
+	         * @return {boolean} Whether option changed.
+	         */
+	        resetOption: function (type) {
+	            var optionChanged = false;
+	            var optionManager = this._optionManager;
+
+	            if (!type || type === 'recreate') {
+	                var baseOption = optionManager.mountOption(type === 'recreate');
+
+	                if (!this.option || type === 'recreate') {
+	                    initBase.call(this, baseOption);
+	                }
+	                else {
+	                    this.restoreData();
+	                    this.mergeOption(baseOption);
+	                }
+	                optionChanged = true;
+	            }
+
+	            if (type === 'timeline' || type === 'media') {
+	                this.restoreData();
+	            }
+
+	            if (!type || type === 'recreate' || type === 'timeline') {
+	                var timelineOption = optionManager.getTimelineOption(this);
+	                timelineOption && (this.mergeOption(timelineOption), optionChanged = true);
+	            }
+
+	            if (!type || type === 'recreate' || type === 'media') {
+	                var mediaOptions = optionManager.getMediaOption(this, this._api);
+	                if (mediaOptions.length) {
+	                    each(mediaOptions, function (mediaOption) {
+	                        this.mergeOption(mediaOption, optionChanged = true);
+	                    }, this);
+	                }
+	            }
+
+	            return optionChanged;
+	        },
+
+	        /**
+	         * @protected
+	         */
+	        mergeOption: function (newOption) {
+	            var option = this.option;
+	            var componentsMap = this._componentsMap;
+	            var newCptTypes = [];
+
+	            // \u5982\u679c\u4e0d\u5b58\u5728\u5bf9\u5e94\u7684 component model \u5219\u76f4\u63a5 merge
+	            each(newOption, function (componentOption, mainType) {
+	                if (componentOption == null) {
+	                    return;
+	                }
+
+	                if (!ComponentModel.hasClass(mainType)) {
+	                    option[mainType] = option[mainType] == null
+	                        ? zrUtil.clone(componentOption)
+	                        : zrUtil.merge(option[mainType], componentOption, true);
+	                }
+	                else {
+	                    newCptTypes.push(mainType);
+	                }
+	            });
+
+	            // FIXME OPTION \u540c\u6b65\u662f\u5426\u8981\u6539\u56de\u539f\u6765\u7684
+	            ComponentModel.topologicalTravel(
+	                newCptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this
+	            );
+
+	            function visitComponent(mainType, dependencies) {
+	                var newCptOptionList = modelUtil.normalizeToArray(newOption[mainType]);
+
+	                var mapResult = modelUtil.mappingToExists(
+	                    componentsMap[mainType], newCptOptionList
+	                );
+
+	                makeKeyInfo(mainType, mapResult);
+
+	                var dependentModels = getComponentsByTypes(
+	                    componentsMap, dependencies
+	                );
+
+	                option[mainType] = [];
+	                componentsMap[mainType] = [];
+
+	                each(mapResult, function (resultItem, index) {
+	                    var componentModel = resultItem.exist;
+	                    var newCptOption = resultItem.option;
+
+	                    zrUtil.assert(
+	                        isObject(newCptOption) || componentModel,
+	                        'Empty component definition'
+	                    );
+
+	                    // Consider where is no new option and should be merged using {},
+	                    // see removeEdgeAndAdd in topologicalTravel and
+	                    // ComponentModel.getAllClassMainTypes.
+	                    if (!newCptOption) {
+	                        componentModel.mergeOption({}, this);
+	                        componentModel.optionUpdated({}, false);
+	                    }
+	                    else {
+	                        var ComponentModelClass = ComponentModel.getClass(
+	                            mainType, resultItem.keyInfo.subType, true
+	                        );
+
+	                        if (componentModel && componentModel instanceof ComponentModelClass) {
+	                            componentModel.mergeOption(newCptOption, this);
+	                            componentModel.optionUpdated(newCptOption, false);
+	                        }
+	                        else {
+	                            // PENDING Global as parent ?
+	                            var extraOpt = zrUtil.extend(
+	                                {
+	                                    dependentModels: dependentModels,
+	                                    componentIndex: index
+	                                },
+	                                resultItem.keyInfo
+	                            );
+	                            componentModel = new ComponentModelClass(
+	                                newCptOption, this, this, extraOpt
+	                            );
+	                            componentModel.init(newCptOption, this, this, extraOpt);
+	                            // Call optionUpdated after init.
+	                            // newCptOption has been used as componentModel.option
+	                            // and may be merged with theme and default, so pass null
+	                            // to avoid confusion.
+	                            componentModel.optionUpdated(null, true);
+	                        }
+	                    }
+
+	                    componentsMap[mainType][index] = componentModel;
+	                    option[mainType][index] = componentModel.option;
+	                }, this);
+
+	                // Backup series for filtering.
+	                if (mainType === 'series') {
+	                    this._seriesIndices = createSeriesIndices(componentsMap.series);
+	                }
+	            }
+	        },
+
+	        /**
+	         * Get option for output (cloned option and inner info removed)
+	         * @public
+	         * @return {Object}
+	         */
+	        getOption: function () {
+	            var option = zrUtil.clone(this.option);
+
+	            each(option, function (opts, mainType) {
+	                if (ComponentModel.hasClass(mainType)) {
+	                    var opts = modelUtil.normalizeToArray(opts);
+	                    for (var i = opts.length - 1; i >= 0; i--) {
+	                        // Remove options with inner id.
+	                        if (modelUtil.isIdInner(opts[i])) {
+	                            opts.splice(i, 1);
+	                        }
+	                    }
+	                    option[mainType] = opts;
+	                }
+	            });
+
+	            delete option[OPTION_INNER_KEY];
+
+	            return option;
+	        },
+
+	        /**
+	         * @return {module:echarts/model/Model}
+	         */
+	        getTheme: function () {
+	            return this._theme;
+	        },
+
+	        /**
+	         * @param {string} mainType
+	         * @param {number} [idx=0]
+	         * @return {module:echarts/model/Component}
+	         */
+	        getComponent: function (mainType, idx) {
+	            var list = this._componentsMap[mainType];
+	            if (list) {
+	                return list[idx || 0];
+	            }
+	        },
+
+	        /**
+	         * @param {Object} condition
+	         * @param {string} condition.mainType
+	         * @param {string} [condition.subType] If ignore, only query by mainType
+	         * @param {number} [condition.index] Either input index or id or name.
+	         * @param {string} [condition.id] Either input index or id or name.
+	         * @param {string} [condition.name] Either input index or id or name.
+	         * @return {Array.<module:echarts/model/Component>}
+	         */
+	        queryComponents: function (condition) {
+	            var mainType = condition.mainType;
+	            if (!mainType) {
+	                return [];
+	            }
+
+	            var index = condition.index;
+	            var id = condition.id;
+	            var name = condition.name;
+
+	            var cpts = this._componentsMap[mainType];
+
+	            if (!cpts || !cpts.length) {
+	                return [];
+	            }
+
+	            var result;
+
+	            if (index != null) {
+	                if (!isArray(index)) {
+	                    index = [index];
+	                }
+	                result = filter(map(index, function (idx) {
+	                    return cpts[idx];
+	                }), function (val) {
+	                    return !!val;
+	                });
+	            }
+	            else if (id != null) {
+	                var isIdArray = isArray(id);
+	                result = filter(cpts, function (cpt) {
+	                    return (isIdArray && indexOf(id, cpt.id) >= 0)
+	                        || (!isIdArray && cpt.id === id);
+	                });
+	            }
+	            else if (name != null) {
+	                var isNameArray = isArray(name);
+	                result = filter(cpts, function (cpt) {
+	                    return (isNameArray && indexOf(name, cpt.name) >= 0)
+	                        || (!isNameArray && cpt.name === name);
+	                });
+	            }
+
+	            return filterBySubType(result, condition);
+	        },
+
+	        /**
+	         * The interface is different from queryComponents,
+	         * which is convenient for inner usage.
+	         *
+	         * @usage
+	         * var result = findComponents(
+	         *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}
+	         * );
+	         * var result = findComponents(
+	         *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}
+	         * );
+	         * var result = findComponents(
+	         *     {mainType: 'series'},
+	         *     function (model, index) {...}
+	         * );
+	         * // result like [component0, componnet1, ...]
+	         *
+	         * @param {Object} condition
+	         * @param {string} condition.mainType Mandatory.
+	         * @param {string} [condition.subType] Optional.
+	         * @param {Object} [condition.query] like {xxxIndex, xxxId, xxxName},
+	         *        where xxx is mainType.
+	         *        If query attribute is null/undefined or has no index/id/name,
+	         *        do not filtering by query conditions, which is convenient for
+	         *        no-payload situations or when target of action is global.
+	         * @param {Function} [condition.filter] parameter: component, return boolean.
+	         * @return {Array.<module:echarts/model/Component>}
+	         */
+	        findComponents: function (condition) {
+	            var query = condition.query;
+	            var mainType = condition.mainType;
+
+	            var queryCond = getQueryCond(query);
+	            var result = queryCond
+	                ? this.queryComponents(queryCond)
+	                : this._componentsMap[mainType];
+
+	            return doFilter(filterBySubType(result, condition));
+
+	            function getQueryCond(q) {
+	                var indexAttr = mainType + 'Index';
+	                var idAttr = mainType + 'Id';
+	                var nameAttr = mainType + 'Name';
+	                return q && (
+	                        q.hasOwnProperty(indexAttr)
+	                        || q.hasOwnProperty(idAttr)
+	                        || q.hasOwnProperty(nameAttr)
+	                    )
+	                    ? {
+	                        mainType: mainType,
+	                        // subType will be filtered finally.
+	                        index: q[indexAttr],
+	                        id: q[idAttr],
+	                        name: q[nameAttr]
+	                    }
+	                    : null;
+	            }
+
+	            function doFilter(res) {
+	                return condition.filter
+	                     ? filter(res, condition.filter)
+	                     : res;
+	            }
+	        },
+
+	        /**
+	         * @usage
+	         * eachComponent('legend', function (legendModel, index) {
+	         *     ...
+	         * });
+	         * eachComponent(function (componentType, model, index) {
+	         *     // componentType does not include subType
+	         *     // (componentType is 'xxx' but not 'xxx.aa')
+	         * });
+	         * eachComponent(
+	         *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}},
+	         *     function (model, index) {...}
+	         * );
+	         * eachComponent(
+	         *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}},
+	         *     function (model, index) {...}
+	         * );
+	         *
+	         * @param {string|Object=} mainType When mainType is object, the definition
+	         *                                  is the same as the method 'findComponents'.
+	         * @param {Function} cb
+	         * @param {*} context
+	         */
+	        eachComponent: function (mainType, cb, context) {
+	            var componentsMap = this._componentsMap;
+
+	            if (typeof mainType === 'function') {
+	                context = cb;
+	                cb = mainType;
+	                each(componentsMap, function (components, componentType) {
+	                    each(components, function (component, index) {
+	                        cb.call(context, componentType, component, index);
+	                    });
+	                });
+	            }
+	            else if (zrUtil.isString(mainType)) {
+	                each(componentsMap[mainType], cb, context);
+	            }
+	            else if (isObject(mainType)) {
+	                var queryResult = this.findComponents(mainType);
+	                each(queryResult, cb, context);
+	            }
+	        },
+
+	        /**
+	         * @param {string} name
+	         * @return {Array.<module:echarts/model/Series>}
+	         */
+	        getSeriesByName: function (name) {
+	            var series = this._componentsMap.series;
+	            return filter(series, function (oneSeries) {
+	                return oneSeries.name === name;
+	            });
+	        },
+
+	        /**
+	         * @param {number} seriesIndex
+	         * @return {module:echarts/model/Series}
+	         */
+	        getSeriesByIndex: function (seriesIndex) {
+	            return this._componentsMap.series[seriesIndex];
+	        },
+
+	        /**
+	         * @param {string} subType
+	         * @return {Array.<module:echarts/model/Series>}
+	         */
+	        getSeriesByType: function (subType) {
+	            var series = this._componentsMap.series;
+	            return filter(series, function (oneSeries) {
+	                return oneSeries.subType === subType;
+	            });
+	        },
+
+	        /**
+	         * @return {Array.<module:echarts/model/Series>}
+	         */
+	        getSeries: function () {
+	            return this._componentsMap.series.slice();
+	        },
+
+	        /**
+	         * After filtering, series may be different
+	         * frome raw series.
+	         *
+	         * @param {Function} cb
+	         * @param {*} context
+	         */
+	        eachSeries: function (cb, context) {
+	            assertSeriesInitialized(this);
+	            each(this._seriesIndices, function (rawSeriesIndex) {
+	                var series = this._componentsMap.series[rawSeriesIndex];
+	                cb.call(context, series, rawSeriesIndex);
+	            }, this);
+	        },
+
+	        /**
+	         * Iterate raw series before filtered.
+	         *
+	         * @param {Function} cb
+	         * @param {*} context
+	         */
+	        eachRawSeries: function (cb, context) {
+	            each(this._componentsMap.series, cb, context);
+	        },
+
+	        /**
+	         * After filtering, series may be different.
+	         * frome raw series.
+	         *
+	         * @parma {string} subType
+	         * @param {Function} cb
+	         * @param {*} context
+	         */
+	        eachSeriesByType: function (subType, cb, context) {
+	            assertSeriesInitialized(this);
+	            each(this._seriesIndices, function (rawSeriesIndex) {
+	                var series = this._componentsMap.series[rawSeriesIndex];
+	                if (series.subType === subType) {
+	                    cb.call(context, series, rawSeriesIndex);
+	                }
+	            }, this);
+	        },
+
+	        /**
+	         * Iterate raw series before filtered of given type.
+	         *
+	         * @parma {string} subType
+	         * @param {Function} cb
+	         * @param {*} context
+	         */
+	        eachRawSeriesByType: function (subType, cb, context) {
+	            return each(this.getSeriesByType(subType), cb, context);
+	        },
+
+	        /**
+	         * @param {module:echarts/model/Series} seriesModel
+	         */
+	        isSeriesFiltered: function (seriesModel) {
+	            assertSeriesInitialized(this);
+	            return zrUtil.indexOf(this._seriesIndices, seriesModel.componentIndex) < 0;
+	        },
+
+	        /**
+	         * @param {Function} cb
+	         * @param {*} context
+	         */
+	        filterSeries: function (cb, context) {
+	            assertSeriesInitialized(this);
+	            var filteredSeries = filter(
+	                this._componentsMap.series, cb, context
+	            );
+	            this._seriesIndices = createSeriesIndices(filteredSeries);
+	        },
+
+	        restoreData: function () {
+	            var componentsMap = this._componentsMap;
+
+	            this._seriesIndices = createSeriesIndices(componentsMap.series);
+
+	            var componentTypes = [];
+	            each(componentsMap, function (components, componentType) {
+	                componentTypes.push(componentType);
+	            });
+
+	            ComponentModel.topologicalTravel(
+	                componentTypes,
+	                ComponentModel.getAllClassMainTypes(),
+	                function (componentType, dependencies) {
+	                    each(componentsMap[componentType], function (component) {
+	                        component.restoreData();
+	                    });
+	                }
+	            );
+	        }
+
+	    });
+
+	    /**
+	     * @inner
+	     */
+	    function mergeTheme(option, theme) {
+	        for (var name in theme) {
+	            // \u5982\u679c\u6709 component model \u5219\u628a\u5177\u4f53\u7684 merge \u903b\u8f91\u4ea4\u7ed9\u8be5 model \u5904\u7406
+	            if (!ComponentModel.hasClass(name)) {
+	                if (typeof theme[name] === 'object') {
+	                    option[name] = !option[name]
+	                        ? zrUtil.clone(theme[name])
+	                        : zrUtil.merge(option[name], theme[name], false);
+	                }
+	                else {
+	                    if (option[name] == null) {
+	                        option[name] = theme[name];
+	                    }
+	                }
+	            }
+	        }
+	    }
+
+	    function initBase(baseOption) {
+	        baseOption = baseOption;
+
+	        // Using OPTION_INNER_KEY to mark that this option can not be used outside,
+	        // i.e. `chart.setOption(chart.getModel().option);` is forbiden.
+	        this.option = {};
+	        this.option[OPTION_INNER_KEY] = 1;
+
+	        /**
+	         * @type {Object.<string, Array.<module:echarts/model/Model>>}
+	         * @private
+	         */
+	        this._componentsMap = {};
+
+	        /**
+	         * Mapping between filtered series list and raw series list.
+	         * key: filtered series indices, value: raw series indices.
+	         * @type {Array.<nubmer>}
+	         * @private
+	         */
+	        this._seriesIndices = null;
+
+	        mergeTheme(baseOption, this._theme.option);
+
+	        // TODO Needs clone when merging to the unexisted property
+	        zrUtil.merge(baseOption, globalDefault, false);
+
+	        this.mergeOption(baseOption);
+	    }
+
+	    /**
+	     * @inner
+	     * @param {Array.<string>|string} types model types
+	     * @return {Object} key: {string} type, value: {Array.<Object>} models
+	     */
+	    function getComponentsByTypes(componentsMap, types) {
+	        if (!zrUtil.isArray(types)) {
+	            types = types ? [types] : [];
+	        }
+
+	        var ret = {};
+	        each(types, function (type) {
+	            ret[type] = (componentsMap[type] || []).slice();
+	        });
+
+	        return ret;
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function makeKeyInfo(mainType, mapResult) {
+	        // We use this id to hash component models and view instances
+	        // in echarts. id can be specified by user, or auto generated.
+
+	        // The id generation rule ensures new view instance are able
+	        // to mapped to old instance when setOption are called in
+	        // no-merge mode. So we generate model id by name and plus
+	        // type in view id.
+
+	        // name can be duplicated among components, which is convenient
+	        // to specify multi components (like series) by one name.
+
+	        // Ensure that each id is distinct.
+	        var idMap = {};
+
+	        each(mapResult, function (item, index) {
+	            var existCpt = item.exist;
+	            existCpt && (idMap[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,
+	                'id duplicates: ' + (opt && opt.id)
+	            );
+
+	            opt && opt.id != null && (idMap[opt.id] = item);
+
+	            // Complete subType
+	            if (isObject(opt)) {
+	                var subType = determineSubType(mainType, opt, item.exist);
+	                item.keyInfo = {mainType: mainType, subType: subType};
+	            }
+	        });
+
+	        // Make name and id.
+	        each(mapResult, function (item, index) {
+	            var existCpt = item.exist;
+	            var opt = item.option;
+	            var keyInfo = item.keyInfo;
+
+	            if (!isObject(opt)) {
+	                return;
+	            }
+
+	            // name can be overwitten. Consider case: axis.name = '20km'.
+	            // But id generated by name will not be changed, which affect
+	            // only in that case: setOption with 'not merge mode' and view
+	            // instance will be recreated, which can be accepted.
+	            keyInfo.name = opt.name != null
+	                ? opt.name + ''
+	                : existCpt
+	                ? existCpt.name
+	                : '\0-';
+
+	            if (existCpt) {
+	                keyInfo.id = existCpt.id;
+	            }
+	            else if (opt.id != null) {
+	                keyInfo.id = opt.id + '';
+	            }
+	            else {
+	                // Consider this situatoin:
+	                //  optionA: [{name: 'a'}, {name: 'a'}, {..}]
+	                //  optionB [{..}, {name: 'a'}, {name: 'a'}]
+	                // Series with the same name between optionA and optionB
+	                // should be mapped.
+	                var idNum = 0;
+	                do {
+	                    keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++;
+	                }
+	                while (idMap[keyInfo.id]);
+	            }
+
+	            idMap[keyInfo.id] = item;
+	        });
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function determineSubType(mainType, newCptOption, existComponent) {
+	        var subType = newCptOption.type
+	            ? newCptOption.type
+	            : existComponent
+	            ? existComponent.subType
+	            // Use determineSubType only when there is no existComponent.
+	            : ComponentModel.determineSubType(mainType, newCptOption);
+
+	        // tooltip, markline, markpoint may always has no subType
+	        return subType;
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function createSeriesIndices(seriesModels) {
+	        return map(seriesModels, function (series) {
+	            return series.componentIndex;
+	        }) || [];
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function filterBySubType(components, condition) {
+	        // Using hasOwnProperty for restrict. Consider
+	        // subType is undefined in user payload.
+	        return condition.hasOwnProperty('subType')
+	            ? filter(components, function (cpt) {
+	                return cpt.subType === condition.subType;
+	            })
+	            : components;
+	    }
+
+	    /**
+	     * @inner
+	     */
+	    function assertSeriesInitialized(ecModel) {
+	        // Components that use _seriesIndices should depends on series component,
+	        // which make sure that their initialization is after series.
+	        if (true) {
+	            if (!ecModel._seriesIndices) {
+	                throw new Error('Series has not been initialized yet.');
+	            }
+	        }
+	    }
+
+	    zrUtil.mixin(GlobalModel, __webpack_require__(24));
+
+	    module.exports = GlobalModel;
+
+
+/***/ },
+/* 4 */
+/***/ function(module, exports) {
+
+	/**
+	 * @module zrender/core/util
+	 */
+
+
+	    // \u7528\u4e8e\u5904\u7406merge\u65f6\u65e0\u6cd5\u904d\u5386Date\u7b49\u5bf9\u8c61\u7684\u95ee\u9898
+	    var BUILTIN_OBJECT = {
+	        '[object Function]': 1,
+	        '[object RegExp]': 1,
+	        '[object Date]': 1,
+	        '[object Error]': 1,
+	        '[object CanvasGradient]': 1,
+	        '[object CanvasPattern]': 1,
+	        // In node-canvas Image can be Canvas.Image
+	        '[object Image]': 1
+	    };
+
+	    var objToString = Object.prototype.toString;
+
+	    var arrayProto = Array.prototype;
+	    var nativeForEach = arrayProto.forEach;
+	    var nativeFilter = arrayProto.filter;
+	    var nativeSlice = arrayProto.slice;
+	    var nativeMap = arrayProto.map;
+	    var nativeReduce = arrayProto.reduce;
+
+	    /**
+	     * @param {*} source
+	     * @return {*} \u62f7\u8d1d\u540e\u7684\u65b0\u5bf9\u8c61
+	     */
+	    function clone(source) {
+	        if (typeof source == 'object' && source !== null) {
+	            var result = source;
+	            if (source instanceof Array) {
+	                result = [];
+	                for (var i = 0, len = source.length; i < len; i++) {
+	                    result[i] = clone(source[i]);
+	                }
+	            }
+	            else if (
+	                !isBuildInObject(source)
+	                // \u662f\u5426\u4e3a dom \u5bf9\u8c61
+	                && !isDom(source)
+	            ) {
+	                result = {};
+	                for (var key in source) {
+	                    if (source.hasOwnProperty(key)) {
+	                        result[key] = clone(source[key]);
+	                    }
+	                }
+	            }
+
+	            return result;
+	        }
+
+	        return source;
+	    }
+
+	    /**
+	     * @memberOf module:zrender/core/util
+	     * @param {*} target
+	     * @param {*} source
+	     * @param {boolean} [overwrite=false]
+	     */
+	    function merge(target, source, overwrite) {
+	        // We should escapse that source is string
+	        // and enter for ... in ...
+	        if (!isObject(source) || !isObject(target)) {
+	            return overwrite ? clone(source) : target;
+	        }
+
+	        for (var key in source) {
+	            if (source.hasOwnProperty(key)) {
+	                var targetProp = target[key];
+	                var sourceProp = source[key];
+
+	                if (isObject(sourceProp)
+	                    && isObject(targetProp)
+	                    && !isArray(sourceProp)
+	                    && !isArray(targetProp)
+	                    && !isDom(sourceProp)
+	                    && !isDom(targetProp)
+	                    && !isBuildInObject(sourceProp)
+	                    && !isBuildInObject(targetProp)
+	                ) {
+	                    // \u5982\u679c\u9700\u8981\u9012\u5f52\u8986\u76d6\uff0c\u5c31\u9012\u5f52\u8c03\u7528merge
+	                    merge(targetProp, sourceProp, overwrite);
+	                }
+	                else if (overwrite || !(key in target)) {
+	                    // \u5426\u5219\u53ea\u5904\u7406overwrite\u4e3atrue\uff0c\u6216\u8005\u5728\u76ee\u6807\u5bf9\u8c61\u4e2d\u6ca1\u6709\u6b64\u5c5e\u6027\u7684\u60c5\u51b5
+	                    // NOTE\uff0c\u5728 target[key] \u4e0d\u5b58\u5728\u7684\u65f6\u5019\u4e5f\u662f\u76f4\u63a5\u8986\u76d6
+	                    target[key] = clone(source[key], true);
+	                }
+	            }
+	        }
+
+	        return target;
+	    }
+
+	    /**
+	     * @param {Array} targetAndSources The first item is target, and the rests are source.
+	     * @param {boolean} [overwrite=false]
+	     * @return {*} target
+	     */
+	    function mergeAll(targetAndSources, overwrite) {
+	        var result = targetAndSources[0];
+	        for (var i = 1, len = targetAndSources.length; i < len; i++) {
+	            result = merge(result, targetAndSources[i], overwrite);
+	        }
+	        return result;
+	    }
+
+	    /**
+	     * @param {*} target
+	     * @param {*} source
+	     * @memberOf module:zrender/core/util
+	     */
+	    function extend(target, source) {
+	        for (var key in source) {
+	            if (source.hasOwnProperty(key)) {
+	                target[key] = source[key];
+	            }
+	        }
+	        return target;
+	    }
+
+	    /**
+	     * @param {*} target
+	     * @param {*} source
+	     * @param {boolen} [overlay=false]
+	     * @memberOf module:zrender/core/util
+	     *

<TRUNCATED>