\n\t * ```\n\t */\n\texports.default = {\n\t bind: function bind(el, binding, vnode) {\n\t var id = nodeList.push(el) - 1;\n\t var documentHandler = function documentHandler(e) {\n\t if (!vnode.context || el.contains(e.target) || vnode.context.popperElm && vnode.context.popperElm.contains(e.target)) return;\n\t\n\t if (binding.expression) {\n\t el[ctx].methodName && vnode.context[el[ctx].methodName] && vnode.context[el[ctx].methodName]();\n\t } else {\n\t el[ctx].bindingFn && el[ctx].bindingFn();\n\t }\n\t };\n\t el[ctx] = {\n\t id: id,\n\t documentHandler: documentHandler,\n\t methodName: binding.expression,\n\t bindingFn: binding.value\n\t };\n\t },\n\t update: function update(el, binding) {\n\t el[ctx].methodName = binding.expression;\n\t el[ctx].bindingFn = binding.value;\n\t },\n\t unbind: function unbind(el) {\n\t var len = nodeList.length;\n\t\n\t for (var i = 0; i < len; i++) {\n\t if (nodeList[i][ctx].id === el[ctx].id) {\n\t nodeList.splice(i, 1);\n\t break;\n\t }\n\t }\n\t }\n\t};\n\n/***/ },\n/* 246 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t/**\n\t* Modified from https://github.com/sdecima/javascript-detect-element-resize\n\t*\n\t* version: 0.5.3\n\t**/\n\t\n\t/* istanbul ignore next */\n\tvar requestFrame = function () {\n\t var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function (fn) {\n\t return window.setTimeout(fn, 20);\n\t };\n\t return function (fn) {\n\t return raf(fn);\n\t };\n\t}();\n\t\n\t/* istanbul ignore next */\n\tvar cancelFrame = function () {\n\t var cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.clearTimeout;\n\t return function (id) {\n\t return cancel(id);\n\t };\n\t}();\n\t\n\t/* istanbul ignore next */\n\tvar resetTrigger = function resetTrigger(element) {\n\t var trigger = element.__resizeTrigger__;\n\t var expand = trigger.firstElementChild;\n\t var contract = trigger.lastElementChild;\n\t var expandChild = expand.firstElementChild;\n\t\n\t contract.scrollLeft = contract.scrollWidth;\n\t contract.scrollTop = contract.scrollHeight;\n\t expandChild.style.width = expand.offsetWidth + 1 + 'px';\n\t expandChild.style.height = expand.offsetHeight + 1 + 'px';\n\t expand.scrollLeft = expand.scrollWidth;\n\t expand.scrollTop = expand.scrollHeight;\n\t};\n\t\n\t/* istanbul ignore next */\n\tvar checkTriggers = function checkTriggers(element) {\n\t return element.offsetWidth !== element.__resizeLast__.width || element.offsetHeight !== element.__resizeLast__.height;\n\t};\n\t\n\t/* istanbul ignore next */\n\tvar scrollListener = function scrollListener(event) {\n\t var _this = this;\n\t\n\t resetTrigger(this);\n\t if (this.__resizeRAF__) cancelFrame(this.__resizeRAF__);\n\t this.__resizeRAF__ = requestFrame(function () {\n\t if (checkTriggers(_this)) {\n\t _this.__resizeLast__.width = _this.offsetWidth;\n\t _this.__resizeLast__.height = _this.offsetHeight;\n\t _this.__resizeListeners__.forEach(function (fn) {\n\t fn.call(_this, event);\n\t });\n\t }\n\t });\n\t};\n\t\n\t/* Detect CSS Animations support to detect element display/re-attach */\n\tvar attachEvent = document.attachEvent;\n\tvar DOM_PREFIXES = 'Webkit Moz O ms'.split(' ');\n\tvar START_EVENTS = 'webkitAnimationStart animationstart oAnimationStart MSAnimationStart'.split(' ');\n\tvar RESIZE_ANIMATION_NAME = 'resizeanim';\n\tvar animation = false;\n\tvar keyFramePrefix = '';\n\tvar animationStartEvent = 'animationstart';\n\t\n\t/* istanbul ignore next */\n\tif (!attachEvent) {\n\t var testElement = document.createElement('fakeelement');\n\t if (testElement.style.animationName !== undefined) {\n\t animation = true;\n\t }\n\t\n\t if (animation === false) {\n\t var prefix = '';\n\t for (var i = 0; i < DOM_PREFIXES.length; i++) {\n\t if (testElement.style[DOM_PREFIXES[i] + 'AnimationName'] !== undefined) {\n\t prefix = DOM_PREFIXES[i];\n\t keyFramePrefix = '-' + prefix.toLowerCase() + '-';\n\t animationStartEvent = START_EVENTS[i];\n\t animation = true;\n\t break;\n\t }\n\t }\n\t }\n\t}\n\t\n\tvar stylesCreated = false;\n\t/* istanbul ignore next */\n\tvar createStyles = function createStyles() {\n\t if (!stylesCreated) {\n\t var animationKeyframes = '@' + keyFramePrefix + 'keyframes ' + RESIZE_ANIMATION_NAME + ' { from { opacity: 0; } to { opacity: 0; } } ';\n\t var animationStyle = keyFramePrefix + 'animation: 1ms ' + RESIZE_ANIMATION_NAME + ';';\n\t\n\t // opacity: 0 works around a chrome bug https://code.google.com/p/chromium/issues/detail?id=286360\n\t var css = animationKeyframes + '\\n .resize-triggers { ' + animationStyle + ' visibility: hidden; opacity: 0; }\\n .resize-triggers, .resize-triggers > div, .contract-trigger:before { content: \" \"; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; }\\n .resize-triggers > div { background: #eee; overflow: auto; }\\n .contract-trigger:before { width: 200%; height: 200%; }';\n\t\n\t var head = document.head || document.getElementsByTagName('head')[0];\n\t var style = document.createElement('style');\n\t\n\t style.type = 'text/css';\n\t if (style.styleSheet) {\n\t style.styleSheet.cssText = css;\n\t } else {\n\t style.appendChild(document.createTextNode(css));\n\t }\n\t\n\t head.appendChild(style);\n\t stylesCreated = true;\n\t }\n\t};\n\t\n\t/* istanbul ignore next */\n\tvar addResizeListener = exports.addResizeListener = function addResizeListener(element, fn) {\n\t if (attachEvent) {\n\t element.attachEvent('onresize', fn);\n\t } else {\n\t if (!element.__resizeTrigger__) {\n\t if (getComputedStyle(element).position === 'static') {\n\t element.style.position = 'relative';\n\t }\n\t createStyles();\n\t element.__resizeLast__ = {};\n\t element.__resizeListeners__ = [];\n\t\n\t var resizeTrigger = element.__resizeTrigger__ = document.createElement('div');\n\t resizeTrigger.className = 'resize-triggers';\n\t resizeTrigger.innerHTML = '
';\n\t element.appendChild(resizeTrigger);\n\t\n\t resetTrigger(element);\n\t element.addEventListener('scroll', scrollListener, true);\n\t\n\t /* Listen for a css animation to detect element display/re-attach */\n\t if (animationStartEvent) {\n\t resizeTrigger.addEventListener(animationStartEvent, function (event) {\n\t if (event.animationName === RESIZE_ANIMATION_NAME) {\n\t resetTrigger(element);\n\t }\n\t });\n\t }\n\t }\n\t element.__resizeListeners__.push(fn);\n\t }\n\t};\n\t\n\t/* istanbul ignore next */\n\tvar removeResizeListener = exports.removeResizeListener = function removeResizeListener(element, fn) {\n\t if (attachEvent) {\n\t element.detachEvent('onresize', fn);\n\t } else {\n\t element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);\n\t if (!element.__resizeListeners__.length) {\n\t element.removeEventListener('scroll', scrollListener);\n\t element.__resizeTrigger__ = !element.removeChild(element.__resizeTrigger__);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 247 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n\t * @license MIT */\n\t\n\t;(function(root, factory) {\n\t\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else if (typeof exports === 'object') {\n\t module.exports = factory();\n\t } else {\n\t root.NProgress = factory();\n\t }\n\t\n\t})(this, function() {\n\t var NProgress = {};\n\t\n\t NProgress.version = '0.2.0';\n\t\n\t var Settings = NProgress.settings = {\n\t minimum: 0.08,\n\t easing: 'ease',\n\t positionUsing: '',\n\t speed: 200,\n\t trickle: true,\n\t trickleRate: 0.02,\n\t trickleSpeed: 800,\n\t showSpinner: true,\n\t barSelector: '[role=\"bar\"]',\n\t spinnerSelector: '[role=\"spinner\"]',\n\t parent: 'body',\n\t template: '
'\n\t };\n\t\n\t /**\n\t * Updates configuration.\n\t *\n\t * NProgress.configure({\n\t * minimum: 0.1\n\t * });\n\t */\n\t NProgress.configure = function(options) {\n\t var key, value;\n\t for (key in options) {\n\t value = options[key];\n\t if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;\n\t }\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Last number.\n\t */\n\t\n\t NProgress.status = null;\n\t\n\t /**\n\t * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n\t *\n\t * NProgress.set(0.4);\n\t * NProgress.set(1.0);\n\t */\n\t\n\t NProgress.set = function(n) {\n\t var started = NProgress.isStarted();\n\t\n\t n = clamp(n, Settings.minimum, 1);\n\t NProgress.status = (n === 1 ? null : n);\n\t\n\t var progress = NProgress.render(!started),\n\t bar = progress.querySelector(Settings.barSelector),\n\t speed = Settings.speed,\n\t ease = Settings.easing;\n\t\n\t progress.offsetWidth; /* Repaint */\n\t\n\t queue(function(next) {\n\t // Set positionUsing if it hasn't already been set\n\t if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();\n\t\n\t // Add transition\n\t css(bar, barPositionCSS(n, speed, ease));\n\t\n\t if (n === 1) {\n\t // Fade out\n\t css(progress, { \n\t transition: 'none', \n\t opacity: 1 \n\t });\n\t progress.offsetWidth; /* Repaint */\n\t\n\t setTimeout(function() {\n\t css(progress, { \n\t transition: 'all ' + speed + 'ms linear', \n\t opacity: 0 \n\t });\n\t setTimeout(function() {\n\t NProgress.remove();\n\t next();\n\t }, speed);\n\t }, speed);\n\t } else {\n\t setTimeout(next, speed);\n\t }\n\t });\n\t\n\t return this;\n\t };\n\t\n\t NProgress.isStarted = function() {\n\t return typeof NProgress.status === 'number';\n\t };\n\t\n\t /**\n\t * Shows the progress bar.\n\t * This is the same as setting the status to 0%, except that it doesn't go backwards.\n\t *\n\t * NProgress.start();\n\t *\n\t */\n\t NProgress.start = function() {\n\t if (!NProgress.status) NProgress.set(0);\n\t\n\t var work = function() {\n\t setTimeout(function() {\n\t if (!NProgress.status) return;\n\t NProgress.trickle();\n\t work();\n\t }, Settings.trickleSpeed);\n\t };\n\t\n\t if (Settings.trickle) work();\n\t\n\t return this;\n\t };\n\t\n\t /**\n\t * Hides the progress bar.\n\t * This is the *sort of* the same as setting the status to 100%, with the\n\t * difference being `done()` makes some placebo effect of some realistic motion.\n\t *\n\t * NProgress.done();\n\t *\n\t * If `true` is passed, it will show the progress bar even if its hidden.\n\t *\n\t * NProgress.done(true);\n\t */\n\t\n\t NProgress.done = function(force) {\n\t if (!force && !NProgress.status) return this;\n\t\n\t return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);\n\t };\n\t\n\t /**\n\t * Increments by a random amount.\n\t */\n\t\n\t NProgress.inc = function(amount) {\n\t var n = NProgress.status;\n\t\n\t if (!n) {\n\t return NProgress.start();\n\t } else {\n\t if (typeof amount !== 'number') {\n\t amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);\n\t }\n\t\n\t n = clamp(n + amount, 0, 0.994);\n\t return NProgress.set(n);\n\t }\n\t };\n\t\n\t NProgress.trickle = function() {\n\t return NProgress.inc(Math.random() * Settings.trickleRate);\n\t };\n\t\n\t /**\n\t * Waits for all supplied jQuery promises and\n\t * increases the progress as the promises resolve.\n\t *\n\t * @param $promise jQUery Promise\n\t */\n\t (function() {\n\t var initial = 0, current = 0;\n\t\n\t NProgress.promise = function($promise) {\n\t if (!$promise || $promise.state() === \"resolved\") {\n\t return this;\n\t }\n\t\n\t if (current === 0) {\n\t NProgress.start();\n\t }\n\t\n\t initial++;\n\t current++;\n\t\n\t $promise.always(function() {\n\t current--;\n\t if (current === 0) {\n\t initial = 0;\n\t NProgress.done();\n\t } else {\n\t NProgress.set((initial - current) / initial);\n\t }\n\t });\n\t\n\t return this;\n\t };\n\t\n\t })();\n\t\n\t /**\n\t * (Internal) renders the progress bar markup based on the `template`\n\t * setting.\n\t */\n\t\n\t NProgress.render = function(fromStart) {\n\t if (NProgress.isRendered()) return document.getElementById('nprogress');\n\t\n\t addClass(document.documentElement, 'nprogress-busy');\n\t \n\t var progress = document.createElement('div');\n\t progress.id = 'nprogress';\n\t progress.innerHTML = Settings.template;\n\t\n\t var bar = progress.querySelector(Settings.barSelector),\n\t perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0),\n\t parent = document.querySelector(Settings.parent),\n\t spinner;\n\t \n\t css(bar, {\n\t transition: 'all 0 linear',\n\t transform: 'translate3d(' + perc + '%,0,0)'\n\t });\n\t\n\t if (!Settings.showSpinner) {\n\t spinner = progress.querySelector(Settings.spinnerSelector);\n\t spinner && removeElement(spinner);\n\t }\n\t\n\t if (parent != document.body) {\n\t addClass(parent, 'nprogress-custom-parent');\n\t }\n\t\n\t parent.appendChild(progress);\n\t return progress;\n\t };\n\t\n\t /**\n\t * Removes the element. Opposite of render().\n\t */\n\t\n\t NProgress.remove = function() {\n\t removeClass(document.documentElement, 'nprogress-busy');\n\t removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');\n\t var progress = document.getElementById('nprogress');\n\t progress && removeElement(progress);\n\t };\n\t\n\t /**\n\t * Checks if the progress bar is rendered.\n\t */\n\t\n\t NProgress.isRendered = function() {\n\t return !!document.getElementById('nprogress');\n\t };\n\t\n\t /**\n\t * Determine which positioning CSS rule to use.\n\t */\n\t\n\t NProgress.getPositioningCSS = function() {\n\t // Sniff on document.body.style\n\t var bodyStyle = document.body.style;\n\t\n\t // Sniff prefixes\n\t var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :\n\t ('MozTransform' in bodyStyle) ? 'Moz' :\n\t ('msTransform' in bodyStyle) ? 'ms' :\n\t ('OTransform' in bodyStyle) ? 'O' : '';\n\t\n\t if (vendorPrefix + 'Perspective' in bodyStyle) {\n\t // Modern browsers with 3D support, e.g. Webkit, IE10\n\t return 'translate3d';\n\t } else if (vendorPrefix + 'Transform' in bodyStyle) {\n\t // Browsers without 3D support, e.g. IE9\n\t return 'translate';\n\t } else {\n\t // Browsers without translate() support, e.g. IE7-8\n\t return 'margin';\n\t }\n\t };\n\t\n\t /**\n\t * Helpers\n\t */\n\t\n\t function clamp(n, min, max) {\n\t if (n < min) return min;\n\t if (n > max) return max;\n\t return n;\n\t }\n\t\n\t /**\n\t * (Internal) converts a percentage (`0..1`) to a bar translateX\n\t * percentage (`-100%..0%`).\n\t */\n\t\n\t function toBarPerc(n) {\n\t return (-1 + n) * 100;\n\t }\n\t\n\t\n\t /**\n\t * (Internal) returns the correct CSS for changing the bar's\n\t * position given an n percentage, and speed and ease from Settings\n\t */\n\t\n\t function barPositionCSS(n, speed, ease) {\n\t var barCSS;\n\t\n\t if (Settings.positionUsing === 'translate3d') {\n\t barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };\n\t } else if (Settings.positionUsing === 'translate') {\n\t barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };\n\t } else {\n\t barCSS = { 'margin-left': toBarPerc(n)+'%' };\n\t }\n\t\n\t barCSS.transition = 'all '+speed+'ms '+ease;\n\t\n\t return barCSS;\n\t }\n\t\n\t /**\n\t * (Internal) Queues a function to be executed.\n\t */\n\t\n\t var queue = (function() {\n\t var pending = [];\n\t \n\t function next() {\n\t var fn = pending.shift();\n\t if (fn) {\n\t fn(next);\n\t }\n\t }\n\t\n\t return function(fn) {\n\t pending.push(fn);\n\t if (pending.length == 1) next();\n\t };\n\t })();\n\t\n\t /**\n\t * (Internal) Applies css properties to an element, similar to the jQuery \n\t * css method.\n\t *\n\t * While this helper does assist with vendor prefixed property names, it \n\t * does not perform any manipulation of values prior to setting styles.\n\t */\n\t\n\t var css = (function() {\n\t var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],\n\t cssProps = {};\n\t\n\t function camelCase(string) {\n\t return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function(match, letter) {\n\t return letter.toUpperCase();\n\t });\n\t }\n\t\n\t function getVendorProp(name) {\n\t var style = document.body.style;\n\t if (name in style) return name;\n\t\n\t var i = cssPrefixes.length,\n\t capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t vendorName;\n\t while (i--) {\n\t vendorName = cssPrefixes[i] + capName;\n\t if (vendorName in style) return vendorName;\n\t }\n\t\n\t return name;\n\t }\n\t\n\t function getStyleProp(name) {\n\t name = camelCase(name);\n\t return cssProps[name] || (cssProps[name] = getVendorProp(name));\n\t }\n\t\n\t function applyCss(element, prop, value) {\n\t prop = getStyleProp(prop);\n\t element.style[prop] = value;\n\t }\n\t\n\t return function(element, properties) {\n\t var args = arguments,\n\t prop, \n\t value;\n\t\n\t if (args.length == 2) {\n\t for (prop in properties) {\n\t value = properties[prop];\n\t if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);\n\t }\n\t } else {\n\t applyCss(element, args[1], args[2]);\n\t }\n\t }\n\t })();\n\t\n\t /**\n\t * (Internal) Determines if an element or space separated list of class names contains a class name.\n\t */\n\t\n\t function hasClass(element, name) {\n\t var list = typeof element == 'string' ? element : classList(element);\n\t return list.indexOf(' ' + name + ' ') >= 0;\n\t }\n\t\n\t /**\n\t * (Internal) Adds a class to an element.\n\t */\n\t\n\t function addClass(element, name) {\n\t var oldList = classList(element),\n\t newList = oldList + name;\n\t\n\t if (hasClass(oldList, name)) return; \n\t\n\t // Trim the opening space.\n\t element.className = newList.substring(1);\n\t }\n\t\n\t /**\n\t * (Internal) Removes a class from an element.\n\t */\n\t\n\t function removeClass(element, name) {\n\t var oldList = classList(element),\n\t newList;\n\t\n\t if (!hasClass(element, name)) return;\n\t\n\t // Replace the class name.\n\t newList = oldList.replace(' ' + name + ' ', ' ');\n\t\n\t // Trim the opening and closing spaces.\n\t element.className = newList.substring(1, newList.length - 1);\n\t }\n\t\n\t /**\n\t * (Internal) Gets a space separated list of the class names on the element. \n\t * The list is wrapped with a single space on each end to facilitate finding \n\t * matches within the list.\n\t */\n\t\n\t function classList(element) {\n\t return (' ' + (element.className || '') + ' ').replace(/\\s+/gi, ' ');\n\t }\n\t\n\t /**\n\t * (Internal) Removes an element from the DOM.\n\t */\n\t\n\t function removeElement(element) {\n\t element && element.parentNode && element.parentNode.removeChild(element);\n\t }\n\t\n\t return NProgress;\n\t});\n\t\n\n\n/***/ },\n/* 248 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\tvar process = module.exports = {};\n\t\n\t// cached from whatever global is present so that test runners that stub it\n\t// don't break things. But we need to wrap it in a try catch in case it is\n\t// wrapped in strict mode code which doesn't define any globals. It's inside a\n\t// function because try/catches deoptimize in certain engines.\n\t\n\tvar cachedSetTimeout;\n\tvar cachedClearTimeout;\n\t\n\tfunction defaultSetTimout() {\n\t throw new Error('setTimeout has not been defined');\n\t}\n\tfunction defaultClearTimeout () {\n\t throw new Error('clearTimeout has not been defined');\n\t}\n\t(function () {\n\t try {\n\t if (typeof setTimeout === 'function') {\n\t cachedSetTimeout = setTimeout;\n\t } else {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t } catch (e) {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t try {\n\t if (typeof clearTimeout === 'function') {\n\t cachedClearTimeout = clearTimeout;\n\t } else {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t } catch (e) {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t} ())\n\tfunction runTimeout(fun) {\n\t if (cachedSetTimeout === setTimeout) {\n\t //normal enviroments in sane situations\n\t return setTimeout(fun, 0);\n\t }\n\t // if setTimeout wasn't available but was latter defined\n\t if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n\t cachedSetTimeout = setTimeout;\n\t return setTimeout(fun, 0);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedSetTimeout(fun, 0);\n\t } catch(e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedSetTimeout.call(null, fun, 0);\n\t } catch(e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n\t return cachedSetTimeout.call(this, fun, 0);\n\t }\n\t }\n\t\n\t\n\t}\n\tfunction runClearTimeout(marker) {\n\t if (cachedClearTimeout === clearTimeout) {\n\t //normal enviroments in sane situations\n\t return clearTimeout(marker);\n\t }\n\t // if clearTimeout wasn't available but was latter defined\n\t if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n\t cachedClearTimeout = clearTimeout;\n\t return clearTimeout(marker);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedClearTimeout(marker);\n\t } catch (e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedClearTimeout.call(null, marker);\n\t } catch (e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n\t // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n\t return cachedClearTimeout.call(this, marker);\n\t }\n\t }\n\t\n\t\n\t\n\t}\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t if (!draining || !currentQueue) {\n\t return;\n\t }\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = runTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t runClearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t runTimeout(drainQueue);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 249 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* eslint-disable no-undefined */\n\t\n\tvar throttle = __webpack_require__(250);\n\t\n\t/**\n\t * Debounce execution of a function. Debouncing, unlike throttling,\n\t * guarantees that a function is only executed a single time, either at the\n\t * very beginning of a series of calls, or at the very end.\n\t *\n\t * @param {Number} delay A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n\t * @param {Boolean} atBegin Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\n\t * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\n\t * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\n\t * @param {Function} callback A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n\t * to `callback` when the debounced-function is executed.\n\t *\n\t * @return {Function} A new, debounced function.\n\t */\n\tmodule.exports = function ( delay, atBegin, callback ) {\n\t\treturn callback === undefined ? throttle(delay, atBegin, false) : throttle(delay, callback, atBegin !== false);\n\t};\n\n\n/***/ },\n/* 250 */\n/***/ function(module, exports) {\n\n\t/* eslint-disable no-undefined,no-param-reassign,no-shadow */\n\t\n\t/**\n\t * Throttle execution of a function. Especially useful for rate limiting\n\t * execution of handlers on events like resize and scroll.\n\t *\n\t * @param {Number} delay A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n\t * @param {Boolean} noTrailing Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds while the\n\t * throttled-function is being called. If noTrailing is false or unspecified, callback will be executed one final time\n\t * after the last throttled-function call. (After the throttled-function has not been called for `delay` milliseconds,\n\t * the internal counter is reset)\n\t * @param {Function} callback A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n\t * to `callback` when the throttled-function is executed.\n\t * @param {Boolean} debounceMode If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is false (at end),\n\t * schedule `callback` to execute after `delay` ms.\n\t *\n\t * @return {Function} A new, throttled, function.\n\t */\n\tmodule.exports = function ( delay, noTrailing, callback, debounceMode ) {\n\t\n\t\t// After wrapper has stopped being called, this timeout ensures that\n\t\t// `callback` is executed at the proper times in `throttle` and `end`\n\t\t// debounce modes.\n\t\tvar timeoutID;\n\t\n\t\t// Keep track of the last time `callback` was executed.\n\t\tvar lastExec = 0;\n\t\n\t\t// `noTrailing` defaults to falsy.\n\t\tif ( typeof noTrailing !== 'boolean' ) {\n\t\t\tdebounceMode = callback;\n\t\t\tcallback = noTrailing;\n\t\t\tnoTrailing = undefined;\n\t\t}\n\t\n\t\t// The `wrapper` function encapsulates all of the throttling / debouncing\n\t\t// functionality and when executed will limit the rate at which `callback`\n\t\t// is executed.\n\t\tfunction wrapper () {\n\t\n\t\t\tvar self = this;\n\t\t\tvar elapsed = Number(new Date()) - lastExec;\n\t\t\tvar args = arguments;\n\t\n\t\t\t// Execute `callback` and update the `lastExec` timestamp.\n\t\t\tfunction exec () {\n\t\t\t\tlastExec = Number(new Date());\n\t\t\t\tcallback.apply(self, args);\n\t\t\t}\n\t\n\t\t\t// If `debounceMode` is true (at begin) this is used to clear the flag\n\t\t\t// to allow future `callback` executions.\n\t\t\tfunction clear () {\n\t\t\t\ttimeoutID = undefined;\n\t\t\t}\n\t\n\t\t\tif ( debounceMode && !timeoutID ) {\n\t\t\t\t// Since `wrapper` is being called for the first time and\n\t\t\t\t// `debounceMode` is true (at begin), execute `callback`.\n\t\t\t\texec();\n\t\t\t}\n\t\n\t\t\t// Clear any existing timeout.\n\t\t\tif ( timeoutID ) {\n\t\t\t\tclearTimeout(timeoutID);\n\t\t\t}\n\t\n\t\t\tif ( debounceMode === undefined && elapsed > delay ) {\n\t\t\t\t// In throttle mode, if `delay` time has been exceeded, execute\n\t\t\t\t// `callback`.\n\t\t\t\texec();\n\t\n\t\t\t} else if ( noTrailing !== true ) {\n\t\t\t\t// In trailing throttle mode, since `delay` time has not been\n\t\t\t\t// exceeded, schedule `callback` to execute `delay` ms after most\n\t\t\t\t// recent execution.\n\t\t\t\t//\n\t\t\t\t// If `debounceMode` is true (at begin), schedule `clear` to execute\n\t\t\t\t// after `delay` ms.\n\t\t\t\t//\n\t\t\t\t// If `debounceMode` is false (at end), schedule `callback` to\n\t\t\t\t// execute after `delay` ms.\n\t\t\t\ttimeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === undefined ? delay - elapsed : delay);\n\t\t\t}\n\t\n\t\t}\n\t\n\t\t// Return the wrapper function.\n\t\treturn wrapper;\n\t\n\t};\n\n\n/***/ },\n/* 251 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t!function(e,t){ true?module.exports=t(__webpack_require__(91)):\"function\"==typeof define&&define.amd?define(\"VuePopup\",[\"vue\"],t):\"object\"==typeof exports?exports.VuePopup=t(require(\"vue\")):e.VuePopup=t(e.vue)}(this,function(e){return function(e){function t(n){if(o[n])return o[n].exports;var i=o[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var o={};return t.m=e,t.c=o,t.i=function(e){return e},t.d=function(e,t,o){Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var o=e&&e.__esModule?function(){return e[\"default\"]}:function(){return e};return t.d(o,\"a\",o),o},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"/lib/\",t(t.s=6)}([function(e,t,o){\"use strict\";function n(e){return e&&e.__esModule?e:{\"default\":e}}t.__esModule=!0,t.PopupManager=void 0;var i=o(5),l=n(i),s=o(3),d=o(2),a=n(d);o(4);var r=1,u=[],c=function(e){if(u.indexOf(e)===-1){var t=function(e){var t=e.__vue__;if(!t){var o=e.previousSibling;o.__vue__&&(t=o.__vue__)}return t};l[\"default\"].transition(e,{afterEnter:function(e){var o=t(e);o&&o.doAfterOpen&&o.doAfterOpen()},afterLeave:function(e){var o=t(e);o&&o.doAfterClose&&o.doAfterClose()}})}},f=void 0,p=function(){if(void 0!==f)return f;var e=document.createElement(\"div\");e.style.visibility=\"hidden\",e.style.width=\"100px\",e.style.position=\"absolute\",e.style.top=\"-9999px\",document.body.appendChild(e);var t=e.offsetWidth;e.style.overflow=\"scroll\";var o=document.createElement(\"div\");o.style.width=\"100%\",e.appendChild(o);var n=o.offsetWidth;return e.parentNode.removeChild(e),t-n},h=function m(e){return 3===e.nodeType&&(e=e.nextElementSibling||e.nextSibling,m(e)),e};t[\"default\"]={props:{value:{type:Boolean,\"default\":!1},transition:{type:String,\"default\":\"\"},openDelay:{},closeDelay:{},zIndex:{},modal:{type:Boolean,\"default\":!1},modalFade:{type:Boolean,\"default\":!0},modalClass:{},lockScroll:{type:Boolean,\"default\":!0},closeOnPressEscape:{type:Boolean,\"default\":!1},closeOnClickModal:{type:Boolean,\"default\":!1}},created:function(){this.transition&&c(this.transition)},beforeMount:function(){this._popupId=\"popup-\"+r++,a[\"default\"].register(this._popupId,this)},beforeDestroy:function(){a[\"default\"].deregister(this._popupId),a[\"default\"].closeModal(this._popupId),this.modal&&null!==this.bodyOverflow&&\"hidden\"!==this.bodyOverflow&&(document.body.style.overflow=this.bodyOverflow,document.body.style.paddingRight=this.bodyPaddingRight),this.bodyOverflow=null,this.bodyPaddingRight=null},data:function(){return{opened:!1,bodyOverflow:null,bodyPaddingRight:null,rendered:!1}},watch:{value:function(e){var t=this;if(e){if(this._opening)return;this.rendered?this.open():(this.rendered=!0,l[\"default\"].nextTick(function(){t.open()}))}else this.close()}},methods:{open:function(e){var t=this;this.rendered||(this.rendered=!0,this.$emit(\"input\",!0));var o=(0,s.merge)({},this,e);this._closeTimer&&(clearTimeout(this._closeTimer),this._closeTimer=null),clearTimeout(this._openTimer);var n=Number(o.openDelay);n>0?this._openTimer=setTimeout(function(){t._openTimer=null,t.doOpen(o)},n):this.doOpen(o)},doOpen:function(e){if((!this.willOpen||this.willOpen())&&!this.opened){this._opening=!0,this.visible=!0,this.$emit(\"input\",!0);var t=h(this.$el),o=e.modal,n=e.zIndex;if(n&&(a[\"default\"].zIndex=n),o&&(this._closing&&(a[\"default\"].closeModal(this._popupId),this._closing=!1),a[\"default\"].openModal(this._popupId,a[\"default\"].nextZIndex(),t,e.modalClass,e.modalFade),e.lockScroll)){this.bodyOverflow||(this.bodyPaddingRight=document.body.style.paddingRight,this.bodyOverflow=document.body.style.overflow),f=p();var i=document.documentElement.clientHeight
0&&i&&(document.body.style.paddingRight=f+\"px\"),document.body.style.overflow=\"hidden\"}\"static\"===getComputedStyle(t).position&&(t.style.position=\"absolute\"),o?t.style.zIndex=a[\"default\"].nextZIndex():n&&(t.style.zIndex=n),this.opened=!0,this.onOpen&&this.onOpen(),this.transition||this.doAfterOpen()}},doAfterOpen:function(){this._opening=!1},close:function(){var e=this;if(!this.willClose||this.willClose()){null!==this._openTimer&&(clearTimeout(this._openTimer),this._openTimer=null),clearTimeout(this._closeTimer);var t=Number(this.closeDelay);t>0?this._closeTimer=setTimeout(function(){e._closeTimer=null,e.doClose()},t):this.doClose()}},doClose:function(){var e=this;this.visible=!1,this.$emit(\"input\",!1),this._closing=!0,this.onClose&&this.onClose(),this.lockScroll&&setTimeout(function(){e.modal&&\"hidden\"!==e.bodyOverflow&&(document.body.style.overflow=e.bodyOverflow,document.body.style.paddingRight=e.bodyPaddingRight),e.bodyOverflow=null,e.bodyPaddingRight=null},200),this.opened=!1,this.transition||this.doAfterClose()},doAfterClose:function(){a[\"default\"].closeModal(this._popupId),this._closing=!1}}},t.PopupManager=a[\"default\"]},function(e,t){var o=function(e){return(e||\"\").replace(/^[\\s\\uFEFF]+|[\\s\\uFEFF]+$/g,\"\")},n=function(e,t){if(!e||!t)return!1;if(t.indexOf(\" \")!=-1)throw new Error(\"className should not contain space.\");return e.classList?e.classList.contains(t):(\" \"+e.className+\" \").indexOf(\" \"+t+\" \")>-1},i=function(e,t){if(e){for(var o=e.className,i=(t||\"\").split(\" \"),l=0,s=i.length;l0){var i=t[t.length-1];if(i.id===e){if(i.modalClass){var s=i.modalClass.trim().split(/\\s+/);s.forEach(function(e){return(0,n.removeClass)(o,e)})}t.pop(),t.length>0&&(o.style.zIndex=t[t.length-1].zIndex)}else for(var a=t.length-1;a>=0;a--)if(t[a].id===e){t.splice(a,1);break}}0===t.length&&(this.modalFade&&(0,n.addClass)(o,\"v-modal-leave\"),setTimeout(function(){0===t.length&&(o.parentNode&&o.parentNode.removeChild(o),o.style.display=\"none\",d.modalDom=void 0),(0,n.removeClass)(o,\"v-modal-leave\")},200))}};window.addEventListener(\"keydown\",function(e){if(27===e.keyCode&&d.modalStack.length>0){var t=d.modalStack[d.modalStack.length-1];if(!t)return;var o=d.getInstance(t.id);o.closeOnPressEscape&&o.close()}}),t[\"default\"]=d},function(e,t){\"use strict\";function o(e){for(var t=1,o=arguments.length;t -1;\n\t }\n\t};\n\t\n\tvar addClass = function (el, cls) {\n\t if (!el) return;\n\t var curClass = el.className;\n\t var classes = (cls || '').split(' ');\n\t\n\t for (var i = 0, j = classes.length; i < j; i++) {\n\t var clsName = classes[i];\n\t if (!clsName) continue;\n\t\n\t if (el.classList) {\n\t el.classList.add(clsName);\n\t } else {\n\t if (!hasClass(el, clsName)) {\n\t curClass += ' ' + clsName;\n\t }\n\t }\n\t }\n\t if (!el.classList) {\n\t el.className = curClass;\n\t }\n\t};\n\t\n\tvar removeClass = function (el, cls) {\n\t if (!el || !cls) return;\n\t var classes = cls.split(' ');\n\t var curClass = ' ' + el.className + ' ';\n\t\n\t for (var i = 0, j = classes.length; i < j; i++) {\n\t var clsName = classes[i];\n\t if (!clsName) continue;\n\t\n\t if (el.classList) {\n\t el.classList.remove(clsName);\n\t } else {\n\t if (hasClass(el, clsName)) {\n\t curClass = curClass.replace(' ' + clsName + ' ', ' ');\n\t }\n\t }\n\t }\n\t if (!el.classList) {\n\t el.className = trim(curClass);\n\t }\n\t};\n\t\n\tmodule.exports = {\n\t hasClass: hasClass,\n\t addClass: addClass,\n\t removeClass: removeClass\n\t};\n\n/***/ },\n/* 253 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t/**\n\t * @module zrender/Element\n\t */\n\t\n\t\n\t var guid = __webpack_require__(261);\n\t var Eventful = __webpack_require__(70);\n\t var Transformable = __webpack_require__(268);\n\t var Animatable = __webpack_require__(816);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t /**\n\t * @alias module:zrender/Element\n\t * @constructor\n\t * @extends {module:zrender/mixin/Animatable}\n\t * @extends {module:zrender/mixin/Transformable}\n\t * @extends {module:zrender/mixin/Eventful}\n\t */\n\t var Element = function (opts) {\n\t\n\t Transformable.call(this, opts);\n\t Eventful.call(this, opts);\n\t Animatable.call(this, opts);\n\t\n\t /**\n\t * 画布元素ID\n\t * @type {string}\n\t */\n\t this.id = opts.id || guid();\n\t };\n\t\n\t Element.prototype = {\n\t\n\t /**\n\t * 元素类型\n\t * Element type\n\t * @type {string}\n\t */\n\t type: 'element',\n\t\n\t /**\n\t * 元素名字\n\t * Element name\n\t * @type {string}\n\t */\n\t name: '',\n\t\n\t /**\n\t * ZRender 实例对象,会在 element 添加到 zrender 实例中后自动赋值\n\t * ZRender instance will be assigned when element is associated with zrender\n\t * @name module:/zrender/Element#__zr\n\t * @type {module:zrender/ZRender}\n\t */\n\t __zr: null,\n\t\n\t /**\n\t * 图形是否忽略,为true时忽略图形的绘制以及事件触发\n\t * If ignore drawing and events of the element object\n\t * @name module:/zrender/Element#ignore\n\t * @type {boolean}\n\t * @default false\n\t */\n\t ignore: false,\n\t\n\t /**\n\t * 用于裁剪的路径(shape),所有 Group 内的路径在绘制时都会被这个路径裁剪\n\t * 该路径会继承被裁减对象的变换\n\t * @type {module:zrender/graphic/Path}\n\t * @see http://www.w3.org/TR/2dcontext/#clipping-region\n\t * @readOnly\n\t */\n\t clipPath: null,\n\t\n\t /**\n\t * Drift element\n\t * @param {number} dx dx on the global space\n\t * @param {number} dy dy on the global space\n\t */\n\t drift: function (dx, dy) {\n\t switch (this.draggable) {\n\t case 'horizontal':\n\t dy = 0;\n\t break;\n\t case 'vertical':\n\t dx = 0;\n\t break;\n\t }\n\t\n\t var m = this.transform;\n\t if (!m) {\n\t m = this.transform = [1, 0, 0, 1, 0, 0];\n\t }\n\t m[4] += dx;\n\t m[5] += dy;\n\t\n\t this.decomposeTransform();\n\t this.dirty(false);\n\t },\n\t\n\t /**\n\t * Hook before update\n\t */\n\t beforeUpdate: function () {},\n\t /**\n\t * Hook after update\n\t */\n\t afterUpdate: function () {},\n\t /**\n\t * Update each frame\n\t */\n\t update: function () {\n\t this.updateTransform();\n\t },\n\t\n\t /**\n\t * @param {Function} cb\n\t * @param {} context\n\t */\n\t traverse: function (cb, context) {},\n\t\n\t /**\n\t * @protected\n\t */\n\t attrKV: function (key, value) {\n\t if (key === 'position' || key === 'scale' || key === 'origin') {\n\t // Copy the array\n\t if (value) {\n\t var target = this[key];\n\t if (!target) {\n\t target = this[key] = [];\n\t }\n\t target[0] = value[0];\n\t target[1] = value[1];\n\t }\n\t }\n\t else {\n\t this[key] = value;\n\t }\n\t },\n\t\n\t /**\n\t * Hide the element\n\t */\n\t hide: function () {\n\t this.ignore = true;\n\t this.__zr && this.__zr.refresh();\n\t },\n\t\n\t /**\n\t * Show the element\n\t */\n\t show: function () {\n\t this.ignore = false;\n\t this.__zr && this.__zr.refresh();\n\t },\n\t\n\t /**\n\t * @param {string|Object} key\n\t * @param {*} value\n\t */\n\t attr: function (key, value) {\n\t if (typeof key === 'string') {\n\t this.attrKV(key, value);\n\t }\n\t else if (zrUtil.isObject(key)) {\n\t for (var name in key) {\n\t if (key.hasOwnProperty(name)) {\n\t this.attrKV(name, key[name]);\n\t }\n\t }\n\t }\n\t\n\t this.dirty(false);\n\t\n\t return this;\n\t },\n\t\n\t /**\n\t * @param {module:zrender/graphic/Path} clipPath\n\t */\n\t setClipPath: function (clipPath) {\n\t var zr = this.__zr;\n\t if (zr) {\n\t clipPath.addSelfToZr(zr);\n\t }\n\t\n\t // Remove previous clip path\n\t if (this.clipPath && this.clipPath !== clipPath) {\n\t this.removeClipPath();\n\t }\n\t\n\t this.clipPath = clipPath;\n\t clipPath.__zr = zr;\n\t clipPath.__clipTarget = this;\n\t\n\t this.dirty(false);\n\t },\n\t\n\t /**\n\t */\n\t removeClipPath: function () {\n\t var clipPath = this.clipPath;\n\t if (clipPath) {\n\t if (clipPath.__zr) {\n\t clipPath.removeSelfFromZr(clipPath.__zr);\n\t }\n\t\n\t clipPath.__zr = null;\n\t clipPath.__clipTarget = null;\n\t this.clipPath = null;\n\t\n\t this.dirty(false);\n\t }\n\t },\n\t\n\t /**\n\t * Add self from zrender instance.\n\t * Not recursively because it will be invoked when element added to storage.\n\t * @param {module:zrender/ZRender} zr\n\t */\n\t addSelfToZr: function (zr) {\n\t this.__zr = zr;\n\t // 添加动画\n\t var animators = this.animators;\n\t if (animators) {\n\t for (var i = 0; i < animators.length; i++) {\n\t zr.animation.addAnimator(animators[i]);\n\t }\n\t }\n\t\n\t if (this.clipPath) {\n\t this.clipPath.addSelfToZr(zr);\n\t }\n\t },\n\t\n\t /**\n\t * Remove self from zrender instance.\n\t * Not recursively because it will be invoked when element added to storage.\n\t * @param {module:zrender/ZRender} zr\n\t */\n\t removeSelfFromZr: function (zr) {\n\t this.__zr = null;\n\t // 移除动画\n\t var animators = this.animators;\n\t if (animators) {\n\t for (var i = 0; i < animators.length; i++) {\n\t zr.animation.removeAnimator(animators[i]);\n\t }\n\t }\n\t\n\t if (this.clipPath) {\n\t this.clipPath.removeSelfFromZr(zr);\n\t }\n\t }\n\t };\n\t\n\t zrUtil.mixin(Element, Animatable);\n\t zrUtil.mixin(Element, Transformable);\n\t zrUtil.mixin(Element, Eventful);\n\t\n\t module.exports = Element;\n\n\n/***/ },\n/* 254 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @module echarts/animation/Animator\n\t */\n\t\n\t\n\t var Clip = __webpack_require__(794);\n\t var color = __webpack_require__(51);\n\t var util = __webpack_require__(1);\n\t var isArrayLike = util.isArrayLike;\n\t\n\t var arraySlice = Array.prototype.slice;\n\t\n\t function defaultGetter(target, key) {\n\t return target[key];\n\t }\n\t\n\t function defaultSetter(target, key, value) {\n\t target[key] = value;\n\t }\n\t\n\t /**\n\t * @param {number} p0\n\t * @param {number} p1\n\t * @param {number} percent\n\t * @return {number}\n\t */\n\t function interpolateNumber(p0, p1, percent) {\n\t return (p1 - p0) * percent + p0;\n\t }\n\t\n\t /**\n\t * @param {string} p0\n\t * @param {string} p1\n\t * @param {number} percent\n\t * @return {string}\n\t */\n\t function interpolateString(p0, p1, percent) {\n\t return percent > 0.5 ? p1 : p0;\n\t }\n\t\n\t /**\n\t * @param {Array} p0\n\t * @param {Array} p1\n\t * @param {number} percent\n\t * @param {Array} out\n\t * @param {number} arrDim\n\t */\n\t function interpolateArray(p0, p1, percent, out, arrDim) {\n\t var len = p0.length;\n\t if (arrDim == 1) {\n\t for (var i = 0; i < len; i++) {\n\t out[i] = interpolateNumber(p0[i], p1[i], percent);\n\t }\n\t }\n\t else {\n\t var len2 = p0[0].length;\n\t for (var i = 0; i < len; i++) {\n\t for (var j = 0; j < len2; j++) {\n\t out[i][j] = interpolateNumber(\n\t p0[i][j], p1[i][j], percent\n\t );\n\t }\n\t }\n\t }\n\t }\n\t\n\t // arr0 is source array, arr1 is target array.\n\t // Do some preprocess to avoid error happened when interpolating from arr0 to arr1\n\t function fillArr(arr0, arr1, arrDim) {\n\t var arr0Len = arr0.length;\n\t var arr1Len = arr1.length;\n\t if (arr0Len !== arr1Len) {\n\t // FIXME Not work for TypedArray\n\t var isPreviousLarger = arr0Len > arr1Len;\n\t if (isPreviousLarger) {\n\t // Cut the previous\n\t arr0.length = arr1Len;\n\t }\n\t else {\n\t // Fill the previous\n\t for (var i = arr0Len; i < arr1Len; i++) {\n\t arr0.push(\n\t arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i])\n\t );\n\t }\n\t }\n\t }\n\t // Handling NaN value\n\t var len2 = arr0[0] && arr0[0].length;\n\t for (var i = 0; i < arr0.length; i++) {\n\t if (arrDim === 1) {\n\t if (isNaN(arr0[i])) {\n\t arr0[i] = arr1[i];\n\t }\n\t }\n\t else {\n\t for (var j = 0; j < len2; j++) {\n\t if (isNaN(arr0[i][j])) {\n\t arr0[i][j] = arr1[i][j];\n\t }\n\t }\n\t }\n\t }\n\t }\n\t\n\t /**\n\t * @param {Array} arr0\n\t * @param {Array} arr1\n\t * @param {number} arrDim\n\t * @return {boolean}\n\t */\n\t function isArraySame(arr0, arr1, arrDim) {\n\t if (arr0 === arr1) {\n\t return true;\n\t }\n\t var len = arr0.length;\n\t if (len !== arr1.length) {\n\t return false;\n\t }\n\t if (arrDim === 1) {\n\t for (var i = 0; i < len; i++) {\n\t if (arr0[i] !== arr1[i]) {\n\t return false;\n\t }\n\t }\n\t }\n\t else {\n\t var len2 = arr0[0].length;\n\t for (var i = 0; i < len; i++) {\n\t for (var j = 0; j < len2; j++) {\n\t if (arr0[i][j] !== arr1[i][j]) {\n\t return false;\n\t }\n\t }\n\t }\n\t }\n\t return true;\n\t }\n\t\n\t /**\n\t * Catmull Rom interpolate array\n\t * @param {Array} p0\n\t * @param {Array} p1\n\t * @param {Array} p2\n\t * @param {Array} p3\n\t * @param {number} t\n\t * @param {number} t2\n\t * @param {number} t3\n\t * @param {Array} out\n\t * @param {number} arrDim\n\t */\n\t function catmullRomInterpolateArray(\n\t p0, p1, p2, p3, t, t2, t3, out, arrDim\n\t ) {\n\t var len = p0.length;\n\t if (arrDim == 1) {\n\t for (var i = 0; i < len; i++) {\n\t out[i] = catmullRomInterpolate(\n\t p0[i], p1[i], p2[i], p3[i], t, t2, t3\n\t );\n\t }\n\t }\n\t else {\n\t var len2 = p0[0].length;\n\t for (var i = 0; i < len; i++) {\n\t for (var j = 0; j < len2; j++) {\n\t out[i][j] = catmullRomInterpolate(\n\t p0[i][j], p1[i][j], p2[i][j], p3[i][j],\n\t t, t2, t3\n\t );\n\t }\n\t }\n\t }\n\t }\n\t\n\t /**\n\t * Catmull Rom interpolate number\n\t * @param {number} p0\n\t * @param {number} p1\n\t * @param {number} p2\n\t * @param {number} p3\n\t * @param {number} t\n\t * @param {number} t2\n\t * @param {number} t3\n\t * @return {number}\n\t */\n\t function catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) {\n\t var v0 = (p2 - p0) * 0.5;\n\t var v1 = (p3 - p1) * 0.5;\n\t return (2 * (p1 - p2) + v0 + v1) * t3\n\t + (-3 * (p1 - p2) - 2 * v0 - v1) * t2\n\t + v0 * t + p1;\n\t }\n\t\n\t function cloneValue(value) {\n\t if (isArrayLike(value)) {\n\t var len = value.length;\n\t if (isArrayLike(value[0])) {\n\t var ret = [];\n\t for (var i = 0; i < len; i++) {\n\t ret.push(arraySlice.call(value[i]));\n\t }\n\t return ret;\n\t }\n\t\n\t return arraySlice.call(value);\n\t }\n\t\n\t return value;\n\t }\n\t\n\t function rgba2String(rgba) {\n\t rgba[0] = Math.floor(rgba[0]);\n\t rgba[1] = Math.floor(rgba[1]);\n\t rgba[2] = Math.floor(rgba[2]);\n\t\n\t return 'rgba(' + rgba.join(',') + ')';\n\t }\n\t\n\t function createTrackClip (animator, easing, oneTrackDone, keyframes, propName) {\n\t var getter = animator._getter;\n\t var setter = animator._setter;\n\t var useSpline = easing === 'spline';\n\t\n\t var trackLen = keyframes.length;\n\t if (!trackLen) {\n\t return;\n\t }\n\t // Guess data type\n\t var firstVal = keyframes[0].value;\n\t var isValueArray = isArrayLike(firstVal);\n\t var isValueColor = false;\n\t var isValueString = false;\n\t\n\t // For vertices morphing\n\t var arrDim = (\n\t isValueArray\n\t && isArrayLike(firstVal[0])\n\t )\n\t ? 2 : 1;\n\t var trackMaxTime;\n\t // Sort keyframe as ascending\n\t keyframes.sort(function(a, b) {\n\t return a.time - b.time;\n\t });\n\t\n\t trackMaxTime = keyframes[trackLen - 1].time;\n\t // Percents of each keyframe\n\t var kfPercents = [];\n\t // Value of each keyframe\n\t var kfValues = [];\n\t var prevValue = keyframes[0].value;\n\t var isAllValueEqual = true;\n\t for (var i = 0; i < trackLen; i++) {\n\t kfPercents.push(keyframes[i].time / trackMaxTime);\n\t // Assume value is a color when it is a string\n\t var value = keyframes[i].value;\n\t\n\t // Check if value is equal, deep check if value is array\n\t if (!((isValueArray && isArraySame(value, prevValue, arrDim))\n\t || (!isValueArray && value === prevValue))) {\n\t isAllValueEqual = false;\n\t }\n\t prevValue = value;\n\t\n\t // Try converting a string to a color array\n\t if (typeof value == 'string') {\n\t var colorArray = color.parse(value);\n\t if (colorArray) {\n\t value = colorArray;\n\t isValueColor = true;\n\t }\n\t else {\n\t isValueString = true;\n\t }\n\t }\n\t kfValues.push(value);\n\t }\n\t if (isAllValueEqual) {\n\t return;\n\t }\n\t\n\t var lastValue = kfValues[trackLen - 1];\n\t // Polyfill array and NaN value\n\t for (var i = 0; i < trackLen - 1; i++) {\n\t if (isValueArray) {\n\t fillArr(kfValues[i], lastValue, arrDim);\n\t }\n\t else {\n\t if (isNaN(kfValues[i]) && !isNaN(lastValue) && !isValueString && !isValueColor) {\n\t kfValues[i] = lastValue;\n\t }\n\t }\n\t }\n\t isValueArray && fillArr(getter(animator._target, propName), lastValue, arrDim);\n\t\n\t // Cache the key of last frame to speed up when\n\t // animation playback is sequency\n\t var lastFrame = 0;\n\t var lastFramePercent = 0;\n\t var start;\n\t var w;\n\t var p0;\n\t var p1;\n\t var p2;\n\t var p3;\n\t\n\t if (isValueColor) {\n\t var rgba = [0, 0, 0, 0];\n\t }\n\t\n\t var onframe = function (target, percent) {\n\t // Find the range keyframes\n\t // kf1-----kf2---------current--------kf3\n\t // find kf2 and kf3 and do interpolation\n\t var frame;\n\t // In the easing function like elasticOut, percent may less than 0\n\t if (percent < 0) {\n\t frame = 0;\n\t }\n\t else if (percent < lastFramePercent) {\n\t // Start from next key\n\t // PENDING start from lastFrame ?\n\t start = Math.min(lastFrame + 1, trackLen - 1);\n\t for (frame = start; frame >= 0; frame--) {\n\t if (kfPercents[frame] <= percent) {\n\t break;\n\t }\n\t }\n\t // PENDING really need to do this ?\n\t frame = Math.min(frame, trackLen - 2);\n\t }\n\t else {\n\t for (frame = lastFrame; frame < trackLen; frame++) {\n\t if (kfPercents[frame] > percent) {\n\t break;\n\t }\n\t }\n\t frame = Math.min(frame - 1, trackLen - 2);\n\t }\n\t lastFrame = frame;\n\t lastFramePercent = percent;\n\t\n\t var range = (kfPercents[frame + 1] - kfPercents[frame]);\n\t if (range === 0) {\n\t return;\n\t }\n\t else {\n\t w = (percent - kfPercents[frame]) / range;\n\t }\n\t if (useSpline) {\n\t p1 = kfValues[frame];\n\t p0 = kfValues[frame === 0 ? frame : frame - 1];\n\t p2 = kfValues[frame > trackLen - 2 ? trackLen - 1 : frame + 1];\n\t p3 = kfValues[frame > trackLen - 3 ? trackLen - 1 : frame + 2];\n\t if (isValueArray) {\n\t catmullRomInterpolateArray(\n\t p0, p1, p2, p3, w, w * w, w * w * w,\n\t getter(target, propName),\n\t arrDim\n\t );\n\t }\n\t else {\n\t var value;\n\t if (isValueColor) {\n\t value = catmullRomInterpolateArray(\n\t p0, p1, p2, p3, w, w * w, w * w * w,\n\t rgba, 1\n\t );\n\t value = rgba2String(rgba);\n\t }\n\t else if (isValueString) {\n\t // String is step(0.5)\n\t return interpolateString(p1, p2, w);\n\t }\n\t else {\n\t value = catmullRomInterpolate(\n\t p0, p1, p2, p3, w, w * w, w * w * w\n\t );\n\t }\n\t setter(\n\t target,\n\t propName,\n\t value\n\t );\n\t }\n\t }\n\t else {\n\t if (isValueArray) {\n\t interpolateArray(\n\t kfValues[frame], kfValues[frame + 1], w,\n\t getter(target, propName),\n\t arrDim\n\t );\n\t }\n\t else {\n\t var value;\n\t if (isValueColor) {\n\t interpolateArray(\n\t kfValues[frame], kfValues[frame + 1], w,\n\t rgba, 1\n\t );\n\t value = rgba2String(rgba);\n\t }\n\t else if (isValueString) {\n\t // String is step(0.5)\n\t return interpolateString(kfValues[frame], kfValues[frame + 1], w);\n\t }\n\t else {\n\t value = interpolateNumber(kfValues[frame], kfValues[frame + 1], w);\n\t }\n\t setter(\n\t target,\n\t propName,\n\t value\n\t );\n\t }\n\t }\n\t };\n\t\n\t var clip = new Clip({\n\t target: animator._target,\n\t life: trackMaxTime,\n\t loop: animator._loop,\n\t delay: animator._delay,\n\t onframe: onframe,\n\t ondestroy: oneTrackDone\n\t });\n\t\n\t if (easing && easing !== 'spline') {\n\t clip.easing = easing;\n\t }\n\t\n\t return clip;\n\t }\n\t\n\t /**\n\t * @alias module:zrender/animation/Animator\n\t * @constructor\n\t * @param {Object} target\n\t * @param {boolean} loop\n\t * @param {Function} getter\n\t * @param {Function} setter\n\t */\n\t var Animator = function(target, loop, getter, setter) {\n\t this._tracks = {};\n\t this._target = target;\n\t\n\t this._loop = loop || false;\n\t\n\t this._getter = getter || defaultGetter;\n\t this._setter = setter || defaultSetter;\n\t\n\t this._clipCount = 0;\n\t\n\t this._delay = 0;\n\t\n\t this._doneList = [];\n\t\n\t this._onframeList = [];\n\t\n\t this._clipList = [];\n\t };\n\t\n\t Animator.prototype = {\n\t /**\n\t * 设置动画关键帧\n\t * @param {number} time 关键帧时间,单位是ms\n\t * @param {Object} props 关键帧的属性值,key-value表示\n\t * @return {module:zrender/animation/Animator}\n\t */\n\t when: function(time /* ms */, props) {\n\t var tracks = this._tracks;\n\t for (var propName in props) {\n\t if (!props.hasOwnProperty(propName)) {\n\t continue;\n\t }\n\t\n\t if (!tracks[propName]) {\n\t tracks[propName] = [];\n\t // Invalid value\n\t var value = this._getter(this._target, propName);\n\t if (value == null) {\n\t // zrLog('Invalid property ' + propName);\n\t continue;\n\t }\n\t // If time is 0\n\t // Then props is given initialize value\n\t // Else\n\t // Initialize value from current prop value\n\t if (time !== 0) {\n\t tracks[propName].push({\n\t time: 0,\n\t value: cloneValue(value)\n\t });\n\t }\n\t }\n\t tracks[propName].push({\n\t time: time,\n\t value: props[propName]\n\t });\n\t }\n\t return this;\n\t },\n\t /**\n\t * 添加动画每一帧的回调函数\n\t * @param {Function} callback\n\t * @return {module:zrender/animation/Animator}\n\t */\n\t during: function (callback) {\n\t this._onframeList.push(callback);\n\t return this;\n\t },\n\t\n\t _doneCallback: function () {\n\t // Clear all tracks\n\t this._tracks = {};\n\t // Clear all clips\n\t this._clipList.length = 0;\n\t\n\t var doneList = this._doneList;\n\t var len = doneList.length;\n\t for (var i = 0; i < len; i++) {\n\t doneList[i].call(this);\n\t }\n\t },\n\t /**\n\t * 开始执行动画\n\t * @param {string|Function} easing\n\t * 动画缓动函数,详见{@link module:zrender/animation/easing}\n\t * @return {module:zrender/animation/Animator}\n\t */\n\t start: function (easing) {\n\t\n\t var self = this;\n\t var clipCount = 0;\n\t\n\t var oneTrackDone = function() {\n\t clipCount--;\n\t if (!clipCount) {\n\t self._doneCallback();\n\t }\n\t };\n\t\n\t var lastClip;\n\t for (var propName in this._tracks) {\n\t if (!this._tracks.hasOwnProperty(propName)) {\n\t continue;\n\t }\n\t var clip = createTrackClip(\n\t this, easing, oneTrackDone,\n\t this._tracks[propName], propName\n\t );\n\t if (clip) {\n\t this._clipList.push(clip);\n\t clipCount++;\n\t\n\t // If start after added to animation\n\t if (this.animation) {\n\t this.animation.addClip(clip);\n\t }\n\t\n\t lastClip = clip;\n\t }\n\t }\n\t\n\t // Add during callback on the last clip\n\t if (lastClip) {\n\t var oldOnFrame = lastClip.onframe;\n\t lastClip.onframe = function (target, percent) {\n\t oldOnFrame(target, percent);\n\t\n\t for (var i = 0; i < self._onframeList.length; i++) {\n\t self._onframeList[i](target, percent);\n\t }\n\t };\n\t }\n\t\n\t if (!clipCount) {\n\t this._doneCallback();\n\t }\n\t return this;\n\t },\n\t /**\n\t * 停止动画\n\t * @param {boolean} forwardToLast If move to last frame before stop\n\t */\n\t stop: function (forwardToLast) {\n\t var clipList = this._clipList;\n\t var animation = this.animation;\n\t for (var i = 0; i < clipList.length; i++) {\n\t var clip = clipList[i];\n\t if (forwardToLast) {\n\t // Move to last frame before stop\n\t clip.onframe(this._target, 1);\n\t }\n\t animation && animation.removeClip(clip);\n\t }\n\t clipList.length = 0;\n\t },\n\t /**\n\t * 设置动画延迟开始的时间\n\t * @param {number} time 单位ms\n\t * @return {module:zrender/animation/Animator}\n\t */\n\t delay: function (time) {\n\t this._delay = time;\n\t return this;\n\t },\n\t /**\n\t * 添加动画结束的回调\n\t * @param {Function} cb\n\t * @return {module:zrender/animation/Animator}\n\t */\n\t done: function(cb) {\n\t if (cb) {\n\t this._doneList.push(cb);\n\t }\n\t return this;\n\t },\n\t\n\t /**\n\t * @return {Array.}\n\t */\n\t getClips: function () {\n\t return this._clipList;\n\t }\n\t };\n\t\n\t module.exports = Animator;\n\n\n/***/ },\n/* 255 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t module.exports = (typeof window !== 'undefined' &&\n\t (window.requestAnimationFrame\n\t || window.msRequestAnimationFrame\n\t || window.mozRequestAnimationFrame\n\t || window.webkitRequestAnimationFrame))\n\t || function (func) {\n\t setTimeout(func, 16);\n\t };\n\t\n\n\n/***/ },\n/* 256 */\n/***/ function(module, exports) {\n\n\t\n\t module.exports = {\n\t /**\n\t * 线段包含判断\n\t * @param {number} x0\n\t * @param {number} y0\n\t * @param {number} x1\n\t * @param {number} y1\n\t * @param {number} lineWidth\n\t * @param {number} x\n\t * @param {number} y\n\t * @return {boolean}\n\t */\n\t containStroke: function (x0, y0, x1, y1, lineWidth, x, y) {\n\t if (lineWidth === 0) {\n\t return false;\n\t }\n\t var _l = lineWidth;\n\t var _a = 0;\n\t var _b = x0;\n\t // Quick reject\n\t if (\n\t (y > y0 + _l && y > y1 + _l)\n\t || (y < y0 - _l && y < y1 - _l)\n\t || (x > x0 + _l && x > x1 + _l)\n\t || (x < x0 - _l && x < x1 - _l)\n\t ) {\n\t return false;\n\t }\n\t\n\t if (x0 !== x1) {\n\t _a = (y0 - y1) / (x0 - x1);\n\t _b = (x0 * y1 - x1 * y0) / (x0 - x1) ;\n\t }\n\t else {\n\t return Math.abs(x - x0) <= _l / 2;\n\t }\n\t var tmp = _a * x - y + _b;\n\t var _s = tmp * tmp / (_a * _a + 1);\n\t return _s <= _l / 2 * _l / 2;\n\t }\n\t };\n\n\n/***/ },\n/* 257 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var windingLine = __webpack_require__(260);\n\t\n\t var EPSILON = 1e-8;\n\t\n\t function isAroundEqual(a, b) {\n\t return Math.abs(a - b) < EPSILON;\n\t }\n\t\n\t function contain(points, x, y) {\n\t var w = 0;\n\t var p = points[0];\n\t\n\t if (!p) {\n\t return false;\n\t }\n\t\n\t for (var i = 1; i < points.length; i++) {\n\t var p2 = points[i];\n\t w += windingLine(p[0], p[1], p2[0], p2[1], x, y);\n\t p = p2;\n\t }\n\t\n\t // Close polygon\n\t var p0 = points[0];\n\t if (!isAroundEqual(p[0], p0[0]) || !isAroundEqual(p[1], p0[1])) {\n\t w += windingLine(p[0], p[1], p0[0], p0[1], x, y);\n\t }\n\t\n\t return w !== 0;\n\t }\n\t\n\t\n\t module.exports = {\n\t contain: contain\n\t };\n\n\n/***/ },\n/* 258 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var curve = __webpack_require__(58);\n\t\n\t module.exports = {\n\t /**\n\t * 二次贝塞尔曲线描边包含判断\n\t * @param {number} x0\n\t * @param {number} y0\n\t * @param {number} x1\n\t * @param {number} y1\n\t * @param {number} x2\n\t * @param {number} y2\n\t * @param {number} lineWidth\n\t * @param {number} x\n\t * @param {number} y\n\t * @return {boolean}\n\t */\n\t containStroke: function (x0, y0, x1, y1, x2, y2, lineWidth, x, y) {\n\t if (lineWidth === 0) {\n\t return false;\n\t }\n\t var _l = lineWidth;\n\t // Quick reject\n\t if (\n\t (y > y0 + _l && y > y1 + _l && y > y2 + _l)\n\t || (y < y0 - _l && y < y1 - _l && y < y2 - _l)\n\t || (x > x0 + _l && x > x1 + _l && x > x2 + _l)\n\t || (x < x0 - _l && x < x1 - _l && x < x2 - _l)\n\t ) {\n\t return false;\n\t }\n\t var d = curve.quadraticProjectPoint(\n\t x0, y0, x1, y1, x2, y2,\n\t x, y, null\n\t );\n\t return d <= _l / 2;\n\t }\n\t };\n\n\n/***/ },\n/* 259 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t var PI2 = Math.PI * 2;\n\t module.exports = {\n\t normalizeRadian: function(angle) {\n\t angle %= PI2;\n\t if (angle < 0) {\n\t angle += PI2;\n\t }\n\t return angle;\n\t }\n\t };\n\n\n/***/ },\n/* 260 */\n/***/ function(module, exports) {\n\n\t\n\t module.exports = function windingLine(x0, y0, x1, y1, x, y) {\n\t if ((y > y0 && y > y1) || (y < y0 && y < y1)) {\n\t return 0;\n\t }\n\t // Ignore horizontal line\n\t if (y1 === y0) {\n\t return 0;\n\t }\n\t var dir = y1 < y0 ? 1 : -1;\n\t var t = (y - y0) / (y1 - y0);\n\t\n\t // Avoid winding error when intersection point is the connect point of two line of polygon\n\t if (t === 1 || t === 0) {\n\t dir = y1 < y0 ? 0.5 : -0.5;\n\t }\n\t\n\t var x_ = t * (x1 - x0) + x0;\n\t\n\t return x_ > x ? dir : 0;\n\t };\n\n\n/***/ },\n/* 261 */\n/***/ function(module, exports) {\n\n\t/**\n\t * zrender: 生成唯一id\n\t *\n\t * @author errorrik (errorrik@gmail.com)\n\t */\n\t\n\t\n\t var idStart = 0x0907;\n\t\n\t module.exports = function () {\n\t return idStart++;\n\t };\n\t\n\n\n/***/ },\n/* 262 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var Gradient = __webpack_require__(117);\n\t\n\t /**\n\t * x, y, x2, y2 are all percent from 0 to 1\n\t * @param {number} [x=0]\n\t * @param {number} [y=0]\n\t * @param {number} [x2=1]\n\t * @param {number} [y2=0]\n\t * @param {Array.} colorStops\n\t * @param {boolean} [globalCoord=false]\n\t */\n\t var LinearGradient = function (x, y, x2, y2, colorStops, globalCoord) {\n\t this.x = x == null ? 0 : x;\n\t\n\t this.y = y == null ? 0 : y;\n\t\n\t this.x2 = x2 == null ? 1 : x2;\n\t\n\t this.y2 = y2 == null ? 0 : y2;\n\t\n\t // Can be cloned\n\t this.type = 'linear';\n\t\n\t // If use global coord\n\t this.global = globalCoord || false;\n\t\n\t Gradient.call(this, colorStops);\n\t };\n\t\n\t LinearGradient.prototype = {\n\t\n\t constructor: LinearGradient\n\t };\n\t\n\t zrUtil.inherits(LinearGradient, Gradient);\n\t\n\t module.exports = LinearGradient;\n\n\n/***/ },\n/* 263 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t var Pattern = function (image, repeat) {\n\t this.image = image;\n\t this.repeat = repeat;\n\t\n\t // Can be cloned\n\t this.type = 'pattern';\n\t };\n\t\n\t Pattern.prototype.getCanvasPattern = function (ctx) {\n\t\n\t return this._canvasPattern\n\t || (this._canvasPattern = ctx.createPattern(this.image, this.repeat));\n\t };\n\t\n\t module.exports = Pattern;\n\n\n/***/ },\n/* 264 */\n/***/ function(module, exports) {\n\n\t/**\n\t * @module zrender/graphic/Style\n\t */\n\t\n\t\n\t var STYLE_COMMON_PROPS = [\n\t ['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'],\n\t ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]\n\t ];\n\t\n\t // var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);\n\t // var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);\n\t\n\t var Style = function (opts) {\n\t this.extendFrom(opts);\n\t };\n\t\n\t function createLinearGradient(ctx, obj, rect) {\n\t // var size =\n\t var x = obj.x;\n\t var x2 = obj.x2;\n\t var y = obj.y;\n\t var y2 = obj.y2;\n\t\n\t if (!obj.global) {\n\t x = x * rect.width + rect.x;\n\t x2 = x2 * rect.width + rect.x;\n\t y = y * rect.height + rect.y;\n\t y2 = y2 * rect.height + rect.y;\n\t }\n\t\n\t var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);\n\t\n\t return canvasGradient;\n\t }\n\t\n\t function createRadialGradient(ctx, obj, rect) {\n\t var width = rect.width;\n\t var height = rect.height;\n\t var min = Math.min(width, height);\n\t\n\t var x = obj.x;\n\t var y = obj.y;\n\t var r = obj.r;\n\t if (!obj.global) {\n\t x = x * width + rect.x;\n\t y = y * height + rect.y;\n\t r = r * min;\n\t }\n\t\n\t var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);\n\t\n\t return canvasGradient;\n\t }\n\t\n\t\n\t Style.prototype = {\n\t\n\t constructor: Style,\n\t\n\t /**\n\t * @type {string}\n\t */\n\t fill: '#000000',\n\t\n\t /**\n\t * @type {string}\n\t */\n\t stroke: null,\n\t\n\t /**\n\t * @type {number}\n\t */\n\t opacity: 1,\n\t\n\t /**\n\t * @type {Array.}\n\t */\n\t lineDash: null,\n\t\n\t /**\n\t * @type {number}\n\t */\n\t lineDashOffset: 0,\n\t\n\t /**\n\t * @type {number}\n\t */\n\t shadowBlur: 0,\n\t\n\t /**\n\t * @type {number}\n\t */\n\t shadowOffsetX: 0,\n\t\n\t /**\n\t * @type {number}\n\t */\n\t shadowOffsetY: 0,\n\t\n\t /**\n\t * @type {number}\n\t */\n\t lineWidth: 1,\n\t\n\t /**\n\t * If stroke ignore scale\n\t * @type {Boolean}\n\t */\n\t strokeNoScale: false,\n\t\n\t // Bounding rect text configuration\n\t // Not affected by element transform\n\t /**\n\t * @type {string}\n\t */\n\t text: null,\n\t\n\t /**\n\t * @type {string}\n\t */\n\t textFill: '#000',\n\t\n\t /**\n\t * @type {string}\n\t */\n\t textStroke: null,\n\t\n\t /**\n\t * 'inside', 'left', 'right', 'top', 'bottom'\n\t * [x, y]\n\t * @type {string|Array.}\n\t * @default 'inside'\n\t */\n\t textPosition: 'inside',\n\t\n\t /**\n\t * @type {string}\n\t */\n\t textBaseline: null,\n\t\n\t /**\n\t * @type {string}\n\t */\n\t textAlign: null,\n\t\n\t /**\n\t * @type {string}\n\t */\n\t textVerticalAlign: null,\n\t\n\t /**\n\t * Only useful in Path and Image element\n\t * @type {number}\n\t */\n\t textDistance: 5,\n\t\n\t /**\n\t * Only useful in Path and Image element\n\t * @type {number}\n\t */\n\t textShadowBlur: 0,\n\t\n\t /**\n\t * Only useful in Path and Image element\n\t * @type {number}\n\t */\n\t textShadowOffsetX: 0,\n\t\n\t /**\n\t * Only useful in Path and Image element\n\t * @type {number}\n\t */\n\t textShadowOffsetY: 0,\n\t\n\t /**\n\t * If transform text\n\t * Only useful in Path and Image element\n\t * @type {boolean}\n\t */\n\t textTransform: false,\n\t\n\t /**\n\t * Text rotate around position of Path or Image\n\t * Only useful in Path and Image element and textTransform is false.\n\t */\n\t textRotation: 0,\n\t\n\t /**\n\t * @type {string}\n\t * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n\t */\n\t blend: null,\n\t\n\t /**\n\t * @param {CanvasRenderingContext2D} ctx\n\t */\n\t bind: function (ctx, el, prevEl) {\n\t var style = this;\n\t var prevStyle = prevEl && prevEl.style;\n\t var firstDraw = !prevStyle;\n\t\n\t for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {\n\t var prop = STYLE_COMMON_PROPS[i];\n\t var styleName = prop[0];\n\t\n\t if (firstDraw || style[styleName] !== prevStyle[styleName]) {\n\t // FIXME Invalid property value will cause style leak from previous element.\n\t ctx[styleName] = style[styleName] || prop[1];\n\t }\n\t }\n\t\n\t if ((firstDraw || style.fill !== prevStyle.fill)) {\n\t ctx.fillStyle = style.fill;\n\t }\n\t if ((firstDraw || style.stroke !== prevStyle.stroke)) {\n\t ctx.strokeStyle = style.stroke;\n\t }\n\t if ((firstDraw || style.opacity !== prevStyle.opacity)) {\n\t ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;\n\t }\n\t\n\t if ((firstDraw || style.blend !== prevStyle.blend)) {\n\t ctx.globalCompositeOperation = style.blend || 'source-over';\n\t }\n\t if (this.hasStroke()) {\n\t var lineWidth = style.lineWidth;\n\t ctx.lineWidth = lineWidth / (\n\t (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1\n\t );\n\t }\n\t },\n\t\n\t hasFill: function () {\n\t var fill = this.fill;\n\t return fill != null && fill !== 'none';\n\t },\n\t\n\t hasStroke: function () {\n\t var stroke = this.stroke;\n\t return stroke != null && stroke !== 'none' && this.lineWidth > 0;\n\t },\n\t\n\t /**\n\t * Extend from other style\n\t * @param {zrender/graphic/Style} otherStyle\n\t * @param {boolean} overwrite\n\t */\n\t extendFrom: function (otherStyle, overwrite) {\n\t if (otherStyle) {\n\t var target = this;\n\t for (var name in otherStyle) {\n\t if (otherStyle.hasOwnProperty(name)\n\t && (overwrite || ! target.hasOwnProperty(name))\n\t ) {\n\t target[name] = otherStyle[name];\n\t }\n\t }\n\t }\n\t },\n\t\n\t /**\n\t * Batch setting style with a given object\n\t * @param {Object|string} obj\n\t * @param {*} [obj]\n\t */\n\t set: function (obj, value) {\n\t if (typeof obj === 'string') {\n\t this[obj] = value;\n\t }\n\t else {\n\t this.extendFrom(obj, true);\n\t }\n\t },\n\t\n\t /**\n\t * Clone\n\t * @return {zrender/graphic/Style} [description]\n\t */\n\t clone: function () {\n\t var newStyle = new this.constructor();\n\t newStyle.extendFrom(this, true);\n\t return newStyle;\n\t },\n\t\n\t getGradient: function (ctx, obj, rect) {\n\t var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;\n\t var canvasGradient = method(ctx, obj, rect);\n\t var colorStops = obj.colorStops;\n\t for (var i = 0; i < colorStops.length; i++) {\n\t canvasGradient.addColorStop(\n\t colorStops[i].offset, colorStops[i].color\n\t );\n\t }\n\t return canvasGradient;\n\t }\n\t };\n\t\n\t var styleProto = Style.prototype;\n\t for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {\n\t var prop = STYLE_COMMON_PROPS[i];\n\t if (!(prop[0] in styleProto)) {\n\t styleProto[prop[0]] = prop[1];\n\t }\n\t }\n\t\n\t // Provide for others\n\t Style.getGradient = styleProto.getGradient;\n\t\n\t module.exports = Style;\n\n\n/***/ },\n/* 265 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Text element\n\t * @module zrender/graphic/Text\n\t *\n\t * TODO Wrapping\n\t *\n\t * Text not support gradient\n\t */\n\t\n\t\n\t\n\t var Displayable = __webpack_require__(116);\n\t var zrUtil = __webpack_require__(1);\n\t var textContain = __webpack_require__(57);\n\t\n\t /**\n\t * @alias zrender/graphic/Text\n\t * @extends module:zrender/graphic/Displayable\n\t * @constructor\n\t * @param {Object} opts\n\t */\n\t var Text = function (opts) {\n\t Displayable.call(this, opts);\n\t };\n\t\n\t Text.prototype = {\n\t\n\t constructor: Text,\n\t\n\t type: 'text',\n\t\n\t brush: function (ctx, prevEl) {\n\t var style = this.style;\n\t var x = style.x || 0;\n\t var y = style.y || 0;\n\t // Convert to string\n\t var text = style.text;\n\t\n\t // Convert to string\n\t text != null && (text += '');\n\t\n\t // Always bind style\n\t style.bind(ctx, this, prevEl);\n\t\n\t if (text) {\n\t\n\t this.setTransform(ctx);\n\t\n\t var textBaseline;\n\t var textAlign = style.textAlign;\n\t var font = style.textFont || style.font;\n\t if (style.textVerticalAlign) {\n\t var rect = textContain.getBoundingRect(\n\t text, font, style.textAlign, 'top'\n\t );\n\t // Ignore textBaseline\n\t textBaseline = 'middle';\n\t switch (style.textVerticalAlign) {\n\t case 'middle':\n\t y -= rect.height / 2 - rect.lineHeight / 2;\n\t break;\n\t case 'bottom':\n\t y -= rect.height - rect.lineHeight / 2;\n\t break;\n\t default:\n\t y += rect.lineHeight / 2;\n\t }\n\t }\n\t else {\n\t textBaseline = style.textBaseline;\n\t }\n\t\n\t // TODO Invalid font\n\t ctx.font = font || '12px sans-serif';\n\t ctx.textAlign = textAlign || 'left';\n\t // Use canvas default left textAlign. Giving invalid value will cause state not change\n\t if (ctx.textAlign !== textAlign) {\n\t ctx.textAlign = 'left';\n\t }\n\t ctx.textBaseline = textBaseline || 'alphabetic';\n\t // Use canvas default alphabetic baseline\n\t if (ctx.textBaseline !== textBaseline) {\n\t ctx.textBaseline = 'alphabetic';\n\t }\n\t\n\t var lineHeight = textContain.measureText('国', ctx.font).width;\n\t\n\t var textLines = text.split('\\n');\n\t for (var i = 0; i < textLines.length; i++) {\n\t style.hasFill() && ctx.fillText(textLines[i], x, y);\n\t style.hasStroke() && ctx.strokeText(textLines[i], x, y);\n\t y += lineHeight;\n\t }\n\t\n\t this.restoreTransform(ctx);\n\t }\n\t },\n\t\n\t getBoundingRect: function () {\n\t if (!this._rect) {\n\t var style = this.style;\n\t var textVerticalAlign = style.textVerticalAlign;\n\t var rect = textContain.getBoundingRect(\n\t style.text + '', style.textFont || style.font, style.textAlign,\n\t textVerticalAlign ? 'top' : style.textBaseline\n\t );\n\t switch (textVerticalAlign) {\n\t case 'middle':\n\t rect.y -= rect.height / 2;\n\t break;\n\t case 'bottom':\n\t rect.y -= rect.height;\n\t break;\n\t }\n\t rect.x += style.x || 0;\n\t rect.y += style.y || 0;\n\t this._rect = rect;\n\t }\n\t return this._rect;\n\t }\n\t };\n\t\n\t zrUtil.inherits(Text, Displayable);\n\t\n\t module.exports = Text;\n\n\n/***/ },\n/* 266 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var smoothSpline = __webpack_require__(806);\n\t var smoothBezier = __webpack_require__(805);\n\t\n\t module.exports = {\n\t buildPath: function (ctx, shape, closePath) {\n\t var points = shape.points;\n\t var smooth = shape.smooth;\n\t if (points && points.length >= 2) {\n\t if (smooth && smooth !== 'spline') {\n\t var controlPoints = smoothBezier(\n\t points, smooth, closePath, shape.smoothConstraint\n\t );\n\t\n\t ctx.moveTo(points[0][0], points[0][1]);\n\t var len = points.length;\n\t for (var i = 0; i < (closePath ? len : len - 1); i++) {\n\t var cp1 = controlPoints[i * 2];\n\t var cp2 = controlPoints[i * 2 + 1];\n\t var p = points[(i + 1) % len];\n\t ctx.bezierCurveTo(\n\t cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]\n\t );\n\t }\n\t }\n\t else {\n\t if (smooth === 'spline') {\n\t points = smoothSpline(points, closePath);\n\t }\n\t\n\t ctx.moveTo(points[0][0], points[0][1]);\n\t for (var i = 1, l = points.length; i < l; i++) {\n\t ctx.lineTo(points[i][0], points[i][1]);\n\t }\n\t }\n\t\n\t closePath && ctx.closePath();\n\t }\n\t }\n\t };\n\n\n/***/ },\n/* 267 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Mixin for drawing text in a element bounding rect\n\t * @module zrender/mixin/RectText\n\t */\n\t\n\t\n\t\n\t var textContain = __webpack_require__(57);\n\t var BoundingRect = __webpack_require__(17);\n\t\n\t var tmpRect = new BoundingRect();\n\t\n\t var RectText = function () {};\n\t\n\t function parsePercent(value, maxValue) {\n\t if (typeof value === 'string') {\n\t if (value.lastIndexOf('%') >= 0) {\n\t return parseFloat(value) / 100 * maxValue;\n\t }\n\t return parseFloat(value);\n\t }\n\t return value;\n\t }\n\t\n\t RectText.prototype = {\n\t\n\t constructor: RectText,\n\t\n\t /**\n\t * Draw text in a rect with specified position.\n\t * @param {CanvasRenderingContext} ctx\n\t * @param {Object} rect Displayable rect\n\t * @return {Object} textRect Alternative precalculated text bounding rect\n\t */\n\t drawRectText: function (ctx, rect, textRect) {\n\t var style = this.style;\n\t var text = style.text;\n\t // Convert to string\n\t text != null && (text += '');\n\t if (!text) {\n\t return;\n\t }\n\t\n\t // FIXME\n\t ctx.save();\n\t\n\t var x;\n\t var y;\n\t var textPosition = style.textPosition;\n\t var distance = style.textDistance;\n\t var align = style.textAlign;\n\t var font = style.textFont || style.font;\n\t var baseline = style.textBaseline;\n\t var verticalAlign = style.textVerticalAlign;\n\t\n\t textRect = textRect || textContain.getBoundingRect(text, font, align, baseline);\n\t\n\t // Transform rect to view space\n\t var transform = this.transform;\n\t if (!style.textTransform) {\n\t if (transform) {\n\t tmpRect.copy(rect);\n\t tmpRect.applyTransform(transform);\n\t rect = tmpRect;\n\t }\n\t }\n\t else {\n\t this.setTransform(ctx);\n\t }\n\t\n\t // Text position represented by coord\n\t if (textPosition instanceof Array) {\n\t // Percent\n\t x = rect.x + parsePercent(textPosition[0], rect.width);\n\t y = rect.y + parsePercent(textPosition[1], rect.height);\n\t align = align || 'left';\n\t baseline = baseline || 'top';\n\t\n\t if (verticalAlign) {\n\t switch (verticalAlign) {\n\t case 'middle':\n\t y -= textRect.height / 2 - textRect.lineHeight / 2;\n\t break;\n\t case 'bottom':\n\t y -= textRect.height - textRect.lineHeight / 2;\n\t break;\n\t default:\n\t y += textRect.lineHeight / 2;\n\t }\n\t // Force bseline to be middle\n\t baseline = 'middle';\n\t }\n\t }\n\t else {\n\t var res = textContain.adjustTextPositionOnRect(\n\t textPosition, rect, textRect, distance\n\t );\n\t x = res.x;\n\t y = res.y;\n\t // Default align and baseline when has textPosition\n\t align = align || res.textAlign;\n\t baseline = baseline || res.textBaseline;\n\t }\n\t\n\t // Use canvas default left textAlign. Giving invalid value will cause state not change\n\t ctx.textAlign = align || 'left';\n\t // Use canvas default alphabetic baseline\n\t ctx.textBaseline = baseline || 'alphabetic';\n\t\n\t var textFill = style.textFill;\n\t var textStroke = style.textStroke;\n\t textFill && (ctx.fillStyle = textFill);\n\t textStroke && (ctx.strokeStyle = textStroke);\n\t\n\t // TODO Invalid font\n\t ctx.font = font || '12px sans-serif';\n\t\n\t // Text shadow\n\t // Always set shadowBlur and shadowOffset to avoid leak from displayable\n\t ctx.shadowBlur = style.textShadowBlur;\n\t ctx.shadowColor = style.textShadowColor || 'transparent';\n\t ctx.shadowOffsetX = style.textShadowOffsetX;\n\t ctx.shadowOffsetY = style.textShadowOffsetY;\n\t\n\t var textLines = text.split('\\n');\n\t\n\t if (style.textRotation) {\n\t transform && ctx.translate(transform[4], transform[5]);\n\t ctx.rotate(style.textRotation);\n\t transform && ctx.translate(-transform[4], -transform[5]);\n\t }\n\t\n\t for (var i = 0; i < textLines.length; i++) {\n\t textFill && ctx.fillText(textLines[i], x, y);\n\t textStroke && ctx.strokeText(textLines[i], x, y);\n\t y += textRect.lineHeight;\n\t }\n\t\n\t ctx.restore();\n\t }\n\t };\n\t\n\t module.exports = RectText;\n\n\n/***/ },\n/* 268 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t/**\n\t * 提供变换扩展\n\t * @module zrender/mixin/Transformable\n\t * @author pissang (https://www.github.com/pissang)\n\t */\n\t\n\t\n\t var matrix = __webpack_require__(50);\n\t var vector = __webpack_require__(10);\n\t var mIdentity = matrix.identity;\n\t\n\t var EPSILON = 5e-5;\n\t\n\t function isNotAroundZero(val) {\n\t return val > EPSILON || val < -EPSILON;\n\t }\n\t\n\t /**\n\t * @alias module:zrender/mixin/Transformable\n\t * @constructor\n\t */\n\t var Transformable = function (opts) {\n\t opts = opts || {};\n\t // If there are no given position, rotation, scale\n\t if (!opts.position) {\n\t /**\n\t * 平移\n\t * @type {Array.}\n\t * @default [0, 0]\n\t */\n\t this.position = [0, 0];\n\t }\n\t if (opts.rotation == null) {\n\t /**\n\t * 旋转\n\t * @type {Array.}\n\t * @default 0\n\t */\n\t this.rotation = 0;\n\t }\n\t if (!opts.scale) {\n\t /**\n\t * 缩放\n\t * @type {Array.}\n\t * @default [1, 1]\n\t */\n\t this.scale = [1, 1];\n\t }\n\t /**\n\t * 旋转和缩放的原点\n\t * @type {Array.}\n\t * @default null\n\t */\n\t this.origin = this.origin || null;\n\t };\n\t\n\t var transformableProto = Transformable.prototype;\n\t transformableProto.transform = null;\n\t\n\t /**\n\t * 判断是否需要有坐标变换\n\t * 如果有坐标变换, 则从position, rotation, scale以及父节点的transform计算出自身的transform矩阵\n\t */\n\t transformableProto.needLocalTransform = function () {\n\t return isNotAroundZero(this.rotation)\n\t || isNotAroundZero(this.position[0])\n\t || isNotAroundZero(this.position[1])\n\t || isNotAroundZero(this.scale[0] - 1)\n\t || isNotAroundZero(this.scale[1] - 1);\n\t };\n\t\n\t transformableProto.updateTransform = function () {\n\t var parent = this.parent;\n\t var parentHasTransform = parent && parent.transform;\n\t var needLocalTransform = this.needLocalTransform();\n\t\n\t var m = this.transform;\n\t if (!(needLocalTransform || parentHasTransform)) {\n\t m && mIdentity(m);\n\t return;\n\t }\n\t\n\t m = m || matrix.create();\n\t\n\t if (needLocalTransform) {\n\t this.getLocalTransform(m);\n\t }\n\t else {\n\t mIdentity(m);\n\t }\n\t\n\t // 应用父节点变换\n\t if (parentHasTransform) {\n\t if (needLocalTransform) {\n\t matrix.mul(m, parent.transform, m);\n\t }\n\t else {\n\t matrix.copy(m, parent.transform);\n\t }\n\t }\n\t // 保存这个变换矩阵\n\t this.transform = m;\n\t\n\t this.invTransform = this.invTransform || matrix.create();\n\t matrix.invert(this.invTransform, m);\n\t };\n\t\n\t transformableProto.getLocalTransform = function (m) {\n\t m = m || [];\n\t mIdentity(m);\n\t\n\t var origin = this.origin;\n\t\n\t var scale = this.scale;\n\t var rotation = this.rotation;\n\t var position = this.position;\n\t if (origin) {\n\t // Translate to origin\n\t m[4] -= origin[0];\n\t m[5] -= origin[1];\n\t }\n\t matrix.scale(m, m, scale);\n\t if (rotation) {\n\t matrix.rotate(m, m, rotation);\n\t }\n\t if (origin) {\n\t // Translate back from origin\n\t m[4] += origin[0];\n\t m[5] += origin[1];\n\t }\n\t\n\t m[4] += position[0];\n\t m[5] += position[1];\n\t\n\t return m;\n\t };\n\t /**\n\t * 将自己的transform应用到context上\n\t * @param {Context2D} ctx\n\t */\n\t transformableProto.setTransform = function (ctx) {\n\t var m = this.transform;\n\t var dpr = ctx.dpr || 1;\n\t if (m) {\n\t ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]);\n\t }\n\t else {\n\t ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\t }\n\t };\n\t\n\t transformableProto.restoreTransform = function (ctx) {\n\t var m = this.transform;\n\t var dpr = ctx.dpr || 1;\n\t ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\t }\n\t\n\t var tmpTransform = [];\n\t\n\t /**\n\t * 分解`transform`矩阵到`position`, `rotation`, `scale`\n\t */\n\t transformableProto.decomposeTransform = function () {\n\t if (!this.transform) {\n\t return;\n\t }\n\t var parent = this.parent;\n\t var m = this.transform;\n\t if (parent && parent.transform) {\n\t // Get local transform and decompose them to position, scale, rotation\n\t matrix.mul(tmpTransform, parent.invTransform, m);\n\t m = tmpTransform;\n\t }\n\t var sx = m[0] * m[0] + m[1] * m[1];\n\t var sy = m[2] * m[2] + m[3] * m[3];\n\t var position = this.position;\n\t var scale = this.scale;\n\t if (isNotAroundZero(sx - 1)) {\n\t sx = Math.sqrt(sx);\n\t }\n\t if (isNotAroundZero(sy - 1)) {\n\t sy = Math.sqrt(sy);\n\t }\n\t if (m[0] < 0) {\n\t sx = -sx;\n\t }\n\t if (m[3] < 0) {\n\t sy = -sy;\n\t }\n\t position[0] = m[4];\n\t position[1] = m[5];\n\t scale[0] = sx;\n\t scale[1] = sy;\n\t this.rotation = Math.atan2(-m[1] / sy, m[0] / sx);\n\t };\n\t\n\t /**\n\t * Get global scale\n\t * @return {Array.}\n\t */\n\t transformableProto.getGlobalScale = function () {\n\t var m = this.transform;\n\t if (!m) {\n\t return [1, 1];\n\t }\n\t var sx = Math.sqrt(m[0] * m[0] + m[1] * m[1]);\n\t var sy = Math.sqrt(m[2] * m[2] + m[3] * m[3]);\n\t if (m[0] < 0) {\n\t sx = -sx;\n\t }\n\t if (m[3] < 0) {\n\t sy = -sy;\n\t }\n\t return [sx, sy];\n\t };\n\t /**\n\t * 变换坐标位置到 shape 的局部坐标空间\n\t * @method\n\t * @param {number} x\n\t * @param {number} y\n\t * @return {Array.}\n\t */\n\t transformableProto.transformCoordToLocal = function (x, y) {\n\t var v2 = [x, y];\n\t var invTransform = this.invTransform;\n\t if (invTransform) {\n\t vector.applyTransform(v2, v2, invTransform);\n\t }\n\t return v2;\n\t };\n\t\n\t /**\n\t * 变换局部坐标位置到全局坐标空间\n\t * @method\n\t * @param {number} x\n\t * @param {number} y\n\t * @return {Array.}\n\t */\n\t transformableProto.transformCoordToGlobal = function (x, y) {\n\t var v2 = [x, y];\n\t var transform = this.transform;\n\t if (transform) {\n\t vector.applyTransform(v2, v2, transform);\n\t }\n\t return v2;\n\t };\n\t\n\t module.exports = Transformable;\n\t\n\n\n/***/ },\n/* 269 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\tif (!__webpack_require__(28).canvasSupported) {\n\t var urn = 'urn:schemas-microsoft-com:vml';\n\t\n\t var createNode;\n\t var win = window;\n\t var doc = win.document;\n\t\n\t var vmlInited = false;\n\t\n\t try {\n\t !doc.namespaces.zrvml && doc.namespaces.add('zrvml', urn);\n\t createNode = function (tagName) {\n\t return doc.createElement('');\n\t };\n\t }\n\t catch (e) {\n\t createNode = function (tagName) {\n\t return doc.createElement('<' + tagName + ' xmlns=\"' + urn + '\" class=\"zrvml\">');\n\t };\n\t }\n\t\n\t // From raphael\n\t var initVML = function () {\n\t if (vmlInited) {\n\t return;\n\t }\n\t vmlInited = true;\n\t\n\t var styleSheets = doc.styleSheets;\n\t if (styleSheets.length < 31) {\n\t doc.createStyleSheet().addRule('.zrvml', 'behavior:url(#default#VML)');\n\t }\n\t else {\n\t // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx\n\t styleSheets[0].addRule('.zrvml', 'behavior:url(#default#VML)');\n\t }\n\t };\n\t\n\t // Not useing return to avoid error when converting to CommonJS module\n\t module.exports = {\n\t doc: doc,\n\t initVML: initVML,\n\t createNode: createNode\n\t };\n\t}\n\n\n/***/ },\n/* 270 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*!\n\t * ZRender, a high performance 2d drawing library.\n\t *\n\t * Copyright (c) 2013, Baidu Inc.\n\t * All rights reserved.\n\t *\n\t * LICENSE\n\t * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt\n\t */\n\t// Global defines\n\t\n\t var guid = __webpack_require__(261);\n\t var env = __webpack_require__(28);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var Handler = __webpack_require__(789);\n\t var Storage = __webpack_require__(792);\n\t var Animation = __webpack_require__(793);\n\t var HandlerProxy = __webpack_require__(801);\n\t\n\t var useVML = !env.canvasSupported;\n\t\n\t var painterCtors = {\n\t canvas: __webpack_require__(791)\n\t };\n\t\n\t var instances = {}; // ZRender实例map索引\n\t\n\t var zrender = {};\n\t\n\t /**\n\t * @type {string}\n\t */\n\t zrender.version = '3.2.2';\n\t\n\t /**\n\t * Initializing a zrender instance\n\t * @param {HTMLElement} dom\n\t * @param {Object} opts\n\t * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg'\n\t * @param {number} [opts.devicePixelRatio]\n\t * @param {number|string} [opts.width] Can be 'auto' (the same as null/undefined)\n\t * @param {number|string} [opts.height] Can be 'auto' (the same as null/undefined)\n\t * @return {module:zrender/ZRender}\n\t */\n\t zrender.init = function(dom, opts) {\n\t var zr = new ZRender(guid(), dom, opts);\n\t instances[zr.id] = zr;\n\t return zr;\n\t };\n\t\n\t /**\n\t * Dispose zrender instance\n\t * @param {module:zrender/ZRender} zr\n\t */\n\t zrender.dispose = function (zr) {\n\t if (zr) {\n\t zr.dispose();\n\t }\n\t else {\n\t for (var key in instances) {\n\t if (instances.hasOwnProperty(key)) {\n\t instances[key].dispose();\n\t }\n\t }\n\t instances = {};\n\t }\n\t\n\t return zrender;\n\t };\n\t\n\t /**\n\t * Get zrender instance by id\n\t * @param {string} id zrender instance id\n\t * @return {module:zrender/ZRender}\n\t */\n\t zrender.getInstance = function (id) {\n\t return instances[id];\n\t };\n\t\n\t zrender.registerPainter = function (name, Ctor) {\n\t painterCtors[name] = Ctor;\n\t };\n\t\n\t function delInstance(id) {\n\t delete instances[id];\n\t }\n\t\n\t /**\n\t * @module zrender/ZRender\n\t */\n\t /**\n\t * @constructor\n\t * @alias module:zrender/ZRender\n\t * @param {string} id\n\t * @param {HTMLDomElement} dom\n\t * @param {Object} opts\n\t * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg'\n\t * @param {number} [opts.devicePixelRatio]\n\t * @param {number} [opts.width] Can be 'auto' (the same as null/undefined)\n\t * @param {number} [opts.height] Can be 'auto' (the same as null/undefined)\n\t */\n\t var ZRender = function(id, dom, opts) {\n\t\n\t opts = opts || {};\n\t\n\t /**\n\t * @type {HTMLDomElement}\n\t */\n\t this.dom = dom;\n\t\n\t /**\n\t * @type {string}\n\t */\n\t this.id = id;\n\t\n\t var self = this;\n\t var storage = new Storage();\n\t\n\t var rendererType = opts.renderer;\n\t if (useVML) {\n\t if (!painterCtors.vml) {\n\t throw new Error('You need to require \\'zrender/vml/vml\\' to support IE8');\n\t }\n\t rendererType = 'vml';\n\t }\n\t else if (!rendererType || !painterCtors[rendererType]) {\n\t rendererType = 'canvas';\n\t }\n\t var painter = new painterCtors[rendererType](dom, storage, opts);\n\t\n\t this.storage = storage;\n\t this.painter = painter;\n\t\n\t var handerProxy = !env.node ? new HandlerProxy(painter.getViewportRoot()) : null;\n\t this.handler = new Handler(storage, painter, handerProxy, painter.root);\n\t\n\t /**\n\t * @type {module:zrender/animation/Animation}\n\t */\n\t this.animation = new Animation({\n\t stage: {\n\t update: zrUtil.bind(this.flush, this)\n\t }\n\t });\n\t this.animation.start();\n\t\n\t /**\n\t * @type {boolean}\n\t * @private\n\t */\n\t this._needsRefresh;\n\t\n\t // 修改 storage.delFromMap, 每次删除元素之前删除动画\n\t // FIXME 有点ugly\n\t var oldDelFromMap = storage.delFromMap;\n\t var oldAddToMap = storage.addToMap;\n\t\n\t storage.delFromMap = function (elId) {\n\t var el = storage.get(elId);\n\t\n\t oldDelFromMap.call(storage, elId);\n\t\n\t el && el.removeSelfFromZr(self);\n\t };\n\t\n\t storage.addToMap = function (el) {\n\t oldAddToMap.call(storage, el);\n\t\n\t el.addSelfToZr(self);\n\t };\n\t };\n\t\n\t ZRender.prototype = {\n\t\n\t constructor: ZRender,\n\t /**\n\t * 获取实例唯一标识\n\t * @return {string}\n\t */\n\t getId: function () {\n\t return this.id;\n\t },\n\t\n\t /**\n\t * 添加元素\n\t * @param {module:zrender/Element} el\n\t */\n\t add: function (el) {\n\t this.storage.addRoot(el);\n\t this._needsRefresh = true;\n\t },\n\t\n\t /**\n\t * 删除元素\n\t * @param {module:zrender/Element} el\n\t */\n\t remove: function (el) {\n\t this.storage.delRoot(el);\n\t this._needsRefresh = true;\n\t },\n\t\n\t /**\n\t * Change configuration of layer\n\t * @param {string} zLevel\n\t * @param {Object} config\n\t * @param {string} [config.clearColor=0] Clear color\n\t * @param {string} [config.motionBlur=false] If enable motion blur\n\t * @param {number} [config.lastFrameAlpha=0.7] Motion blur factor. Larger value cause longer trailer\n\t */\n\t configLayer: function (zLevel, config) {\n\t this.painter.configLayer(zLevel, config);\n\t this._needsRefresh = true;\n\t },\n\t\n\t /**\n\t * Repaint the canvas immediately\n\t */\n\t refreshImmediately: function () {\n\t // Clear needsRefresh ahead to avoid something wrong happens in refresh\n\t // Or it will cause zrender refreshes again and again.\n\t this._needsRefresh = false;\n\t this.painter.refresh();\n\t /**\n\t * Avoid trigger zr.refresh in Element#beforeUpdate hook\n\t */\n\t this._needsRefresh = false;\n\t },\n\t\n\t /**\n\t * Mark and repaint the canvas in the next frame of browser\n\t */\n\t refresh: function() {\n\t this._needsRefresh = true;\n\t },\n\t\n\t /**\n\t * Perform all refresh\n\t */\n\t flush: function () {\n\t if (this._needsRefresh) {\n\t this.refreshImmediately();\n\t }\n\t if (this._needsRefreshHover) {\n\t this.refreshHoverImmediately();\n\t }\n\t },\n\t\n\t /**\n\t * Add element to hover layer\n\t * @param {module:zrender/Element} el\n\t * @param {Object} style\n\t */\n\t addHover: function (el, style) {\n\t if (this.painter.addHover) {\n\t this.painter.addHover(el, style);\n\t this.refreshHover();\n\t }\n\t },\n\t\n\t /**\n\t * Add element from hover layer\n\t * @param {module:zrender/Element} el\n\t */\n\t removeHover: function (el) {\n\t if (this.painter.removeHover) {\n\t this.painter.removeHover(el);\n\t this.refreshHover();\n\t }\n\t },\n\t\n\t /**\n\t * Clear all hover elements in hover layer\n\t * @param {module:zrender/Element} el\n\t */\n\t clearHover: function () {\n\t if (this.painter.clearHover) {\n\t this.painter.clearHover();\n\t this.refreshHover();\n\t }\n\t },\n\t\n\t /**\n\t * Refresh hover in next frame\n\t */\n\t refreshHover: function () {\n\t this._needsRefreshHover = true;\n\t },\n\t\n\t /**\n\t * Refresh hover immediately\n\t */\n\t refreshHoverImmediately: function () {\n\t this._needsRefreshHover = false;\n\t this.painter.refreshHover && this.painter.refreshHover();\n\t },\n\t\n\t /**\n\t * Resize the canvas.\n\t * Should be invoked when container size is changed\n\t * @param {Object} [opts]\n\t * @param {number|string} [opts.width] Can be 'auto' (the same as null/undefined)\n\t * @param {number|string} [opts.height] Can be 'auto' (the same as null/undefined)\n\t */\n\t resize: function(opts) {\n\t opts = opts || {};\n\t this.painter.resize(opts.width, opts.height);\n\t this.handler.resize();\n\t },\n\t\n\t /**\n\t * Stop and clear all animation immediately\n\t */\n\t clearAnimation: function () {\n\t this.animation.clear();\n\t },\n\t\n\t /**\n\t * Get container width\n\t */\n\t getWidth: function() {\n\t return this.painter.getWidth();\n\t },\n\t\n\t /**\n\t * Get container height\n\t */\n\t getHeight: function() {\n\t return this.painter.getHeight();\n\t },\n\t\n\t /**\n\t * Export the canvas as Base64 URL\n\t * @param {string} type\n\t * @param {string} [backgroundColor='#fff']\n\t * @return {string} Base64 URL\n\t */\n\t // toDataURL: function(type, backgroundColor) {\n\t // return this.painter.getRenderedCanvas({\n\t // backgroundColor: backgroundColor\n\t // }).toDataURL(type);\n\t // },\n\t\n\t /**\n\t * Converting a path to image.\n\t * It has much better performance of drawing image rather than drawing a vector path.\n\t * @param {module:zrender/graphic/Path} e\n\t * @param {number} width\n\t * @param {number} height\n\t */\n\t pathToImage: function(e, width, height) {\n\t var id = guid();\n\t return this.painter.pathToImage(id, e, width, height);\n\t },\n\t\n\t /**\n\t * Set default cursor\n\t * @param {string} [cursorStyle='default'] 例如 crosshair\n\t */\n\t setCursorStyle: function (cursorStyle) {\n\t this.handler.setCursorStyle(cursorStyle);\n\t },\n\t\n\t /**\n\t * Bind event\n\t *\n\t * @param {string} eventName Event name\n\t * @param {Function} eventHandler Handler function\n\t * @param {Object} [context] Context object\n\t */\n\t on: function(eventName, eventHandler, context) {\n\t this.handler.on(eventName, eventHandler, context);\n\t },\n\t\n\t /**\n\t * Unbind event\n\t * @param {string} eventName Event name\n\t * @param {Function} [eventHandler] Handler function\n\t */\n\t off: function(eventName, eventHandler) {\n\t this.handler.off(eventName, eventHandler);\n\t },\n\t\n\t /**\n\t * Trigger event manually\n\t *\n\t * @param {string} eventName Event name\n\t * @param {event=} event Event object\n\t */\n\t trigger: function (eventName, event) {\n\t this.handler.trigger(eventName, event);\n\t },\n\t\n\t\n\t /**\n\t * Clear all objects and the canvas.\n\t */\n\t clear: function () {\n\t this.storage.delRoot();\n\t this.painter.clear();\n\t },\n\t\n\t /**\n\t * Dispose self.\n\t */\n\t dispose: function () {\n\t this.animation.stop();\n\t\n\t this.clear();\n\t this.storage.dispose();\n\t this.painter.dispose();\n\t this.handler.dispose();\n\t\n\t this.animation =\n\t this.storage =\n\t this.painter =\n\t this.handler = null;\n\t\n\t delInstance(this.id);\n\t }\n\t };\n\t\n\t module.exports = zrender;\n\t\n\n\n/***/ },\n/* 271 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tvar _validator = __webpack_require__(283);\n\t\n\tvar _validator2 = _interopRequireDefault(_validator);\n\t\n\tvar _messages2 = __webpack_require__(272);\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Encapsulates a validation schema.\n\t *\n\t * @param descriptor An object declaring validation rules\n\t * for this schema.\n\t */\n\tfunction Schema(descriptor) {\n\t this.rules = null;\n\t this._messages = _messages2.messages;\n\t this.define(descriptor);\n\t}\n\t\n\tSchema.prototype = {\n\t messages: function messages(_messages) {\n\t if (_messages) {\n\t this._messages = (0, _util.deepMerge)((0, _messages2.newMessages)(), _messages);\n\t }\n\t return this._messages;\n\t },\n\t define: function define(rules) {\n\t if (!rules) {\n\t throw new Error('Cannot configure a schema with no rules');\n\t }\n\t if ((typeof rules === 'undefined' ? 'undefined' : _typeof(rules)) !== 'object' || Array.isArray(rules)) {\n\t throw new Error('Rules must be an object');\n\t }\n\t this.rules = {};\n\t var z = void 0;\n\t var item = void 0;\n\t for (z in rules) {\n\t if (rules.hasOwnProperty(z)) {\n\t item = rules[z];\n\t this.rules[z] = Array.isArray(item) ? item : [item];\n\t }\n\t }\n\t },\n\t validate: function validate(source_) {\n\t var _this = this;\n\t\n\t var o = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t var oc = arguments[2];\n\t\n\t var source = source_;\n\t var options = o;\n\t var callback = oc;\n\t if (typeof options === 'function') {\n\t callback = options;\n\t options = {};\n\t }\n\t if (!this.rules || Object.keys(this.rules).length === 0) {\n\t if (callback) {\n\t callback();\n\t }\n\t return;\n\t }\n\t function complete(results) {\n\t var i = void 0;\n\t var field = void 0;\n\t var errors = [];\n\t var fields = {};\n\t\n\t function add(e) {\n\t if (Array.isArray(e)) {\n\t errors = errors.concat.apply(errors, e);\n\t } else {\n\t errors.push(e);\n\t }\n\t }\n\t\n\t for (i = 0; i < results.length; i++) {\n\t add(results[i]);\n\t }\n\t if (!errors.length) {\n\t errors = null;\n\t fields = null;\n\t } else {\n\t for (i = 0; i < errors.length; i++) {\n\t field = errors[i].field;\n\t fields[field] = fields[field] || [];\n\t fields[field].push(errors[i]);\n\t }\n\t }\n\t callback(errors, fields);\n\t }\n\t\n\t if (options.messages) {\n\t var messages = this.messages();\n\t if (messages === _messages2.messages) {\n\t messages = (0, _messages2.newMessages)();\n\t }\n\t (0, _util.deepMerge)(messages, options.messages);\n\t options.messages = messages;\n\t } else {\n\t options.messages = this.messages();\n\t }\n\t\n\t options.error = _rule.error;\n\t var arr = void 0;\n\t var value = void 0;\n\t var series = {};\n\t var keys = options.keys || Object.keys(this.rules);\n\t keys.forEach(function (z) {\n\t arr = _this.rules[z];\n\t value = source[z];\n\t arr.forEach(function (r) {\n\t var rule = r;\n\t if (typeof rule.transform === 'function') {\n\t if (source === source_) {\n\t source = _extends({}, source);\n\t }\n\t value = source[z] = rule.transform(value);\n\t }\n\t if (typeof rule === 'function') {\n\t rule = {\n\t validator: rule\n\t };\n\t } else {\n\t rule = _extends({}, rule);\n\t }\n\t rule.validator = _this.getValidationMethod(rule);\n\t rule.field = z;\n\t rule.fullField = rule.fullField || z;\n\t rule.type = _this.getType(rule);\n\t if (!rule.validator) {\n\t return;\n\t }\n\t series[z] = series[z] || [];\n\t series[z].push({\n\t rule: rule,\n\t value: value,\n\t source: source,\n\t field: z\n\t });\n\t });\n\t });\n\t var errorFields = {};\n\t (0, _util.asyncMap)(series, options, function (data, doIt) {\n\t var rule = data.rule;\n\t var deep = (rule.type === 'object' || rule.type === 'array') && (_typeof(rule.fields) === 'object' || _typeof(rule.defaultField) === 'object');\n\t deep = deep && (rule.required || !rule.required && data.value);\n\t rule.field = data.field;\n\t function addFullfield(key, schema) {\n\t return _extends({}, schema, {\n\t fullField: rule.fullField + '.' + key\n\t });\n\t }\n\t\n\t function cb() {\n\t var e = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];\n\t\n\t var errors = e;\n\t if (!Array.isArray(errors)) {\n\t errors = [errors];\n\t }\n\t if (errors.length) {\n\t (0, _util.warning)('async-validator:', errors);\n\t }\n\t if (errors.length && rule.message) {\n\t errors = [].concat(rule.message);\n\t }\n\t\n\t errors = errors.map((0, _util.complementError)(rule));\n\t\n\t if ((options.first || options.fieldFirst) && errors.length) {\n\t errorFields[rule.field] = 1;\n\t return doIt(errors);\n\t }\n\t if (!deep) {\n\t doIt(errors);\n\t } else {\n\t // if rule is required but the target object\n\t // does not exist fail at the rule level and don't\n\t // go deeper\n\t if (rule.required && !data.value) {\n\t if (rule.message) {\n\t errors = [].concat(rule.message).map((0, _util.complementError)(rule));\n\t } else {\n\t errors = [options.error(rule, (0, _util.format)(options.messages.required, rule.field))];\n\t }\n\t return doIt(errors);\n\t }\n\t\n\t var fieldsSchema = {};\n\t if (rule.defaultField) {\n\t for (var k in data.value) {\n\t if (data.value.hasOwnProperty(k)) {\n\t fieldsSchema[k] = rule.defaultField;\n\t }\n\t }\n\t }\n\t fieldsSchema = _extends({}, fieldsSchema, data.rule.fields);\n\t for (var f in fieldsSchema) {\n\t if (fieldsSchema.hasOwnProperty(f)) {\n\t var fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]];\n\t fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f));\n\t }\n\t }\n\t var schema = new Schema(fieldsSchema);\n\t schema.messages(options.messages);\n\t if (data.rule.options) {\n\t data.rule.options.messages = options.messages;\n\t data.rule.options.error = options.error;\n\t }\n\t schema.validate(data.value, data.rule.options || options, function (errs) {\n\t doIt(errs && errs.length ? errors.concat(errs) : errs);\n\t });\n\t }\n\t }\n\t\n\t rule.validator(rule, data.value, cb, data.source, options);\n\t }, function (results) {\n\t complete(results);\n\t });\n\t },\n\t getType: function getType(rule) {\n\t if (rule.type === undefined && rule.pattern instanceof RegExp) {\n\t rule.type = 'pattern';\n\t }\n\t if (typeof rule.validator !== 'function' && rule.type && !_validator2[\"default\"].hasOwnProperty(rule.type)) {\n\t throw new Error((0, _util.format)('Unknown rule type %s', rule.type));\n\t }\n\t return rule.type || 'string';\n\t },\n\t getValidationMethod: function getValidationMethod(rule) {\n\t if (typeof rule.validator === 'function') {\n\t return rule.validator;\n\t }\n\t var keys = Object.keys(rule);\n\t if (keys.length === 1 && keys[0] === 'required') {\n\t return _validator2[\"default\"].required;\n\t }\n\t return _validator2[\"default\"][this.getType(rule)] || false;\n\t }\n\t};\n\t\n\tSchema.register = function register(type, validator) {\n\t if (typeof validator !== 'function') {\n\t throw new Error('Cannot register a validator by type, validator is not a function');\n\t }\n\t _validator2[\"default\"][type] = validator;\n\t};\n\t\n\tSchema.messages = _messages2.messages;\n\t\n\texports[\"default\"] = Schema;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 272 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.newMessages = newMessages;\n\tfunction newMessages() {\n\t return {\n\t \"default\": 'Validation error on field %s',\n\t required: '%s is required',\n\t \"enum\": '%s must be one of %s',\n\t whitespace: '%s cannot be empty',\n\t date: {\n\t format: '%s date %s is invalid for format %s',\n\t parse: '%s date could not be parsed, %s is invalid ',\n\t invalid: '%s date %s is invalid'\n\t },\n\t types: {\n\t string: '%s is not a %s',\n\t method: '%s is not a %s (function)',\n\t array: '%s is not an %s',\n\t object: '%s is not an %s',\n\t number: '%s is not a %s',\n\t date: '%s is not a %s',\n\t \"boolean\": '%s is not a %s',\n\t integer: '%s is not an %s',\n\t \"float\": '%s is not a %s',\n\t regexp: '%s is not a valid %s',\n\t email: '%s is not a valid %s',\n\t url: '%s is not a valid %s',\n\t hex: '%s is not a valid %s'\n\t },\n\t string: {\n\t len: '%s must be exactly %s characters',\n\t min: '%s must be at least %s characters',\n\t max: '%s cannot be longer than %s characters',\n\t range: '%s must be between %s and %s characters'\n\t },\n\t number: {\n\t len: '%s must equal %s',\n\t min: '%s cannot be less than %s',\n\t max: '%s cannot be greater than %s',\n\t range: '%s must be between %s and %s'\n\t },\n\t array: {\n\t len: '%s must be exactly %s in length',\n\t min: '%s cannot be less than %s in length',\n\t max: '%s cannot be greater than %s in length',\n\t range: '%s must be between %s and %s in length'\n\t },\n\t pattern: {\n\t mismatch: '%s value %s does not match pattern %s'\n\t },\n\t clone: function clone() {\n\t var cloned = JSON.parse(JSON.stringify(this));\n\t cloned.clone = this.clone;\n\t return cloned;\n\t }\n\t };\n\t}\n\t\n\tvar messages = exports.messages = newMessages();\n\n/***/ },\n/* 273 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tvar util = _interopRequireWildcard(_util);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj[\"default\"] = obj; return newObj; } }\n\t\n\tvar ENUM = 'enum';\n\t\n\t/**\n\t * Rule for validating a value exists in an enumerable list.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param source The source object being validated.\n\t * @param errors An array of errors that this rule may add\n\t * validation errors to.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction enumerable(rule, value, source, errors, options) {\n\t rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [];\n\t if (rule[ENUM].indexOf(value) === -1) {\n\t errors.push(util.format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', ')));\n\t }\n\t}\n\t\n\texports[\"default\"] = enumerable;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 274 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tvar util = _interopRequireWildcard(_util);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj[\"default\"] = obj; return newObj; } }\n\t\n\t/**\n\t * Rule for validating a regular expression pattern.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param source The source object being validated.\n\t * @param errors An array of errors that this rule may add\n\t * validation errors to.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction pattern(rule, value, source, errors, options) {\n\t if (rule.pattern instanceof RegExp) {\n\t if (!rule.pattern.test(value)) {\n\t errors.push(util.format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n\t }\n\t }\n\t}\n\t\n\texports[\"default\"] = pattern;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 275 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tvar util = _interopRequireWildcard(_util);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj[\"default\"] = obj; return newObj; } }\n\t\n\t/**\n\t * Rule for validating minimum and maximum allowed values.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param source The source object being validated.\n\t * @param errors An array of errors that this rule may add\n\t * validation errors to.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction range(rule, value, source, errors, options) {\n\t var len = typeof rule.len === 'number';\n\t var min = typeof rule.min === 'number';\n\t var max = typeof rule.max === 'number';\n\t var val = value;\n\t var key = null;\n\t var num = typeof value === 'number';\n\t var str = typeof value === 'string';\n\t var arr = Array.isArray(value);\n\t if (num) {\n\t key = 'number';\n\t } else if (str) {\n\t key = 'string';\n\t } else if (arr) {\n\t key = 'array';\n\t }\n\t // if the value is not of a supported type for range validation\n\t // the validation rule rule should use the\n\t // type property to also test for a particular type\n\t if (!key) {\n\t return false;\n\t }\n\t if (str || arr) {\n\t val = value.length;\n\t }\n\t if (len) {\n\t if (val !== rule.len) {\n\t errors.push(util.format(options.messages[key].len, rule.fullField, rule.len));\n\t }\n\t } else if (min && !max && val < rule.min) {\n\t errors.push(util.format(options.messages[key].min, rule.fullField, rule.min));\n\t } else if (max && !min && val > rule.max) {\n\t errors.push(util.format(options.messages[key].max, rule.fullField, rule.max));\n\t } else if (min && max && (val < rule.min || val > rule.max)) {\n\t errors.push(util.format(options.messages[key].range, rule.fullField, rule.min, rule.max));\n\t }\n\t}\n\t\n\texports[\"default\"] = range;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 276 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tvar util = _interopRequireWildcard(_util);\n\t\n\tvar _required = __webpack_require__(174);\n\t\n\tvar _required2 = _interopRequireDefault(_required);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj[\"default\"] = obj; return newObj; } }\n\t\n\t/* eslint max-len:0 */\n\t\n\tvar pattern = {\n\t email: /^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$/,\n\t url: new RegExp('^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?$', 'i'),\n\t hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i\n\t};\n\t\n\tvar types = {\n\t integer: function integer(value) {\n\t return types.number(value) && parseInt(value, 10) === value;\n\t },\n\t \"float\": function float(value) {\n\t return types.number(value) && !types.integer(value);\n\t },\n\t array: function array(value) {\n\t return Array.isArray(value);\n\t },\n\t regexp: function regexp(value) {\n\t if (value instanceof RegExp) {\n\t return true;\n\t }\n\t try {\n\t return !!new RegExp(value);\n\t } catch (e) {\n\t return false;\n\t }\n\t },\n\t date: function date(value) {\n\t return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear === 'function';\n\t },\n\t number: function number(value) {\n\t if (isNaN(value)) {\n\t return false;\n\t }\n\t return typeof value === 'number';\n\t },\n\t object: function object(value) {\n\t return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && !types.array(value);\n\t },\n\t method: function method(value) {\n\t return typeof value === 'function';\n\t },\n\t email: function email(value) {\n\t return typeof value === 'string' && !!value.match(pattern.email);\n\t },\n\t url: function url(value) {\n\t return typeof value === 'string' && !!value.match(pattern.url);\n\t },\n\t hex: function hex(value) {\n\t return typeof value === 'string' && !!value.match(pattern.hex);\n\t }\n\t};\n\t\n\t/**\n\t * Rule for validating the type of a value.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param source The source object being validated.\n\t * @param errors An array of errors that this rule may add\n\t * validation errors to.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction type(rule, value, source, errors, options) {\n\t if (rule.required && value === undefined) {\n\t (0, _required2[\"default\"])(rule, value, source, errors, options);\n\t return;\n\t }\n\t var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];\n\t var ruleType = rule.type;\n\t if (custom.indexOf(ruleType) > -1) {\n\t if (!types[ruleType](value)) {\n\t errors.push(util.format(options.messages.types[ruleType], rule.fullField, rule.type));\n\t }\n\t // straight typeof check\n\t } else if (ruleType && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== rule.type) {\n\t errors.push(util.format(options.messages.types[ruleType], rule.fullField, rule.type));\n\t }\n\t}\n\t\n\texports[\"default\"] = type;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 277 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tvar util = _interopRequireWildcard(_util);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj[\"default\"] = obj; return newObj; } }\n\t\n\t/**\n\t * Rule for validating whitespace.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param source The source object being validated.\n\t * @param errors An array of errors that this rule may add\n\t * validation errors to.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction whitespace(rule, value, source, errors, options) {\n\t if (/^\\s+$/.test(value) || value === '') {\n\t errors.push(util.format(options.messages.whitespace, rule.fullField));\n\t }\n\t}\n\t\n\texports[\"default\"] = whitespace;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 278 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Validates an array.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction array(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value, 'array') && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options, 'array');\n\t if (!(0, _util.isEmptyValue)(value, 'array')) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t _rule2[\"default\"].range(rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = array;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 279 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Validates a boolean.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction boolean(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value) && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (value !== undefined) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = boolean;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 280 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\tfunction date(rule, value, callback, source, options) {\n\t // console.log('integer rule called %j', rule);\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t // console.log('validate on %s value', value);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value) && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (!(0, _util.isEmptyValue)(value)) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t if (value) {\n\t _rule2[\"default\"].range(rule, value.getTime(), source, errors, options);\n\t }\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = date;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 281 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\tvar ENUM = 'enum';\n\t\n\t/**\n\t * Validates an enumerable list.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction enumerable(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value) && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (value) {\n\t _rule2[\"default\"][ENUM](rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = enumerable;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 282 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Validates a number is a floating point number.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction floatFn(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value) && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (value !== undefined) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t _rule2[\"default\"].range(rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = floatFn;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 283 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tmodule.exports = {\n\t string: __webpack_require__(291),\n\t method: __webpack_require__(285),\n\t number: __webpack_require__(286),\n\t \"boolean\": __webpack_require__(279),\n\t regexp: __webpack_require__(289),\n\t integer: __webpack_require__(284),\n\t \"float\": __webpack_require__(282),\n\t array: __webpack_require__(278),\n\t object: __webpack_require__(287),\n\t \"enum\": __webpack_require__(281),\n\t pattern: __webpack_require__(288),\n\t email: __webpack_require__(118),\n\t url: __webpack_require__(118),\n\t date: __webpack_require__(280),\n\t hex: __webpack_require__(118),\n\t required: __webpack_require__(290)\n\t};\n\n/***/ },\n/* 284 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Validates a number is an integer.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction integer(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value) && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (value !== undefined) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t _rule2[\"default\"].range(rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = integer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 285 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Validates a function.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction method(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value) && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (value !== undefined) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = method;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 286 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Validates a number.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction number(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value) && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (value !== undefined) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t _rule2[\"default\"].range(rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = number;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 287 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Validates an object.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction object(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value) && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (value !== undefined) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = object;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 288 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Validates a regular expression pattern.\n\t *\n\t * Performs validation when a rule only contains\n\t * a pattern property but is not declared as a string type.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction pattern(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value, 'string') && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (!(0, _util.isEmptyValue)(value, 'string')) {\n\t _rule2[\"default\"].pattern(rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = pattern;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 289 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Validates the regular expression type.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction regexp(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value) && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options);\n\t if (!(0, _util.isEmptyValue)(value)) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = regexp;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 290 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\tfunction required(rule, value, callback, source, options) {\n\t var errors = [];\n\t var type = Array.isArray(value) ? 'array' : typeof value === 'undefined' ? 'undefined' : _typeof(value);\n\t _rule2[\"default\"].required(rule, value, source, errors, options, type);\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = required;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 291 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _rule = __webpack_require__(25);\n\t\n\tvar _rule2 = _interopRequireDefault(_rule);\n\t\n\tvar _util = __webpack_require__(15);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\t\n\t/**\n\t * Performs validation for string types.\n\t *\n\t * @param rule The validation rule.\n\t * @param value The value of the field on the source object.\n\t * @param callback The callback function.\n\t * @param source The source object being validated.\n\t * @param options The validation options.\n\t * @param options.messages The validation messages.\n\t */\n\tfunction string(rule, value, callback, source, options) {\n\t var errors = [];\n\t var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\t if (validate) {\n\t if ((0, _util.isEmptyValue)(value, 'string') && !rule.required) {\n\t return callback();\n\t }\n\t _rule2[\"default\"].required(rule, value, source, errors, options, 'string');\n\t if (!(0, _util.isEmptyValue)(value, 'string')) {\n\t _rule2[\"default\"].type(rule, value, source, errors, options);\n\t _rule2[\"default\"].range(rule, value, source, errors, options);\n\t _rule2[\"default\"].pattern(rule, value, source, errors, options);\n\t if (rule.whitespace === true) {\n\t _rule2[\"default\"].whitespace(rule, value, source, errors, options);\n\t }\n\t }\n\t }\n\t callback(errors);\n\t}\n\t\n\texports[\"default\"] = string;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 292 */,\n/* 293 */,\n/* 294 */,\n/* 295 */,\n/* 296 */,\n/* 297 */,\n/* 298 */,\n/* 299 */,\n/* 300 */,\n/* 301 */,\n/* 302 */,\n/* 303 */,\n/* 304 */,\n/* 305 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {\"use strict\";\n\t\n\t__webpack_require__(515);\n\t\n\t__webpack_require__(763);\n\t\n\t__webpack_require__(308);\n\t\n\tif (global._babelPolyfill) {\n\t throw new Error(\"only one instance of babel-polyfill is allowed\");\n\t}\n\tglobal._babelPolyfill = true;\n\t\n\tvar DEFINE_PROPERTY = \"defineProperty\";\n\tfunction define(O, key, value) {\n\t O[key] || Object[DEFINE_PROPERTY](O, key, {\n\t writable: true,\n\t configurable: true,\n\t value: value\n\t });\n\t}\n\t\n\tdefine(String.prototype, \"padLeft\", \"\".padStart);\n\tdefine(String.prototype, \"padRight\", \"\".padEnd);\n\t\n\t\"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill\".split(\",\").forEach(function (key) {\n\t [][key] && define(Array, key, Function.call.bind([][key]));\n\t});\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 306 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(309), __esModule: true };\n\n/***/ },\n/* 307 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\t\n\tvar _assign = __webpack_require__(306);\n\t\n\tvar _assign2 = _interopRequireDefault(_assign);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = _assign2.default || function (target) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t var source = arguments[i];\n\t\n\t for (var key in source) {\n\t if (Object.prototype.hasOwnProperty.call(source, key)) {\n\t target[key] = source[key];\n\t }\n\t }\n\t }\n\t\n\t return target;\n\t};\n\n/***/ },\n/* 308 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(344);\n\tmodule.exports = __webpack_require__(43).RegExp.escape;\n\n/***/ },\n/* 309 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(335);\n\tmodule.exports = __webpack_require__(175).Object.assign;\n\n/***/ },\n/* 310 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(it){\n\t if(typeof it != 'function')throw TypeError(it + ' is not a function!');\n\t return it;\n\t};\n\n/***/ },\n/* 311 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isObject = __webpack_require__(122);\n\tmodule.exports = function(it){\n\t if(!isObject(it))throw TypeError(it + ' is not an object!');\n\t return it;\n\t};\n\n/***/ },\n/* 312 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// false -> Array#indexOf\n\t// true -> Array#includes\n\tvar toIObject = __webpack_require__(179)\n\t , toLength = __webpack_require__(331)\n\t , toIndex = __webpack_require__(330);\n\tmodule.exports = function(IS_INCLUDES){\n\t return function($this, el, fromIndex){\n\t var O = toIObject($this)\n\t , length = toLength(O.length)\n\t , index = toIndex(fromIndex, length)\n\t , value;\n\t // Array#includes uses SameValueZero equality algorithm\n\t if(IS_INCLUDES && el != el)while(length > index){\n\t value = O[index++];\n\t if(value != value)return true;\n\t // Array#toIndex ignores holes, Array#includes - not\n\t } else for(;length > index; index++)if(IS_INCLUDES || index in O){\n\t if(O[index] === el)return IS_INCLUDES || index || 0;\n\t } return !IS_INCLUDES && -1;\n\t };\n\t};\n\n/***/ },\n/* 313 */\n/***/ function(module, exports) {\n\n\tvar toString = {}.toString;\n\t\n\tmodule.exports = function(it){\n\t return toString.call(it).slice(8, -1);\n\t};\n\n/***/ },\n/* 314 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// optional / simple context binding\n\tvar aFunction = __webpack_require__(310);\n\tmodule.exports = function(fn, that, length){\n\t aFunction(fn);\n\t if(that === undefined)return fn;\n\t switch(length){\n\t case 1: return function(a){\n\t return fn.call(that, a);\n\t };\n\t case 2: return function(a, b){\n\t return fn.call(that, a, b);\n\t };\n\t case 3: return function(a, b, c){\n\t return fn.call(that, a, b, c);\n\t };\n\t }\n\t return function(/* ...args */){\n\t return fn.apply(that, arguments);\n\t };\n\t};\n\n/***/ },\n/* 315 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isObject = __webpack_require__(122)\n\t , document = __webpack_require__(121).document\n\t // in old IE typeof document.createElement is 'object'\n\t , is = isObject(document) && isObject(document.createElement);\n\tmodule.exports = function(it){\n\t return is ? document.createElement(it) : {};\n\t};\n\n/***/ },\n/* 316 */\n/***/ function(module, exports) {\n\n\t// IE 8- don't enum bug keys\n\tmodule.exports = (\n\t 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n\t).split(',');\n\n/***/ },\n/* 317 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(121)\n\t , core = __webpack_require__(175)\n\t , ctx = __webpack_require__(314)\n\t , hide = __webpack_require__(319)\n\t , PROTOTYPE = 'prototype';\n\t\n\tvar $export = function(type, name, source){\n\t var IS_FORCED = type & $export.F\n\t , IS_GLOBAL = type & $export.G\n\t , IS_STATIC = type & $export.S\n\t , IS_PROTO = type & $export.P\n\t , IS_BIND = type & $export.B\n\t , IS_WRAP = type & $export.W\n\t , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})\n\t , expProto = exports[PROTOTYPE]\n\t , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]\n\t , key, own, out;\n\t if(IS_GLOBAL)source = name;\n\t for(key in source){\n\t // contains in native\n\t own = !IS_FORCED && target && target[key] !== undefined;\n\t if(own && key in exports)continue;\n\t // export native or passed\n\t out = own ? target[key] : source[key];\n\t // prevent global pollution for namespaces\n\t exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n\t // bind timers to global for call from export context\n\t : IS_BIND && own ? ctx(out, global)\n\t // wrap global constructors for prevent change them in library\n\t : IS_WRAP && target[key] == out ? (function(C){\n\t var F = function(a, b, c){\n\t if(this instanceof C){\n\t switch(arguments.length){\n\t case 0: return new C;\n\t case 1: return new C(a);\n\t case 2: return new C(a, b);\n\t } return new C(a, b, c);\n\t } return C.apply(this, arguments);\n\t };\n\t F[PROTOTYPE] = C[PROTOTYPE];\n\t return F;\n\t // make static versions for prototype methods\n\t })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n\t // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n\t if(IS_PROTO){\n\t (exports.virtual || (exports.virtual = {}))[key] = out;\n\t // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n\t if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);\n\t }\n\t }\n\t};\n\t// type bitmap\n\t$export.F = 1; // forced\n\t$export.G = 2; // global\n\t$export.S = 4; // static\n\t$export.P = 8; // proto\n\t$export.B = 16; // bind\n\t$export.W = 32; // wrap\n\t$export.U = 64; // safe\n\t$export.R = 128; // real proto method for `library` \n\tmodule.exports = $export;\n\n/***/ },\n/* 318 */\n/***/ function(module, exports) {\n\n\tvar hasOwnProperty = {}.hasOwnProperty;\n\tmodule.exports = function(it, key){\n\t return hasOwnProperty.call(it, key);\n\t};\n\n/***/ },\n/* 319 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar dP = __webpack_require__(322)\n\t , createDesc = __webpack_require__(327);\n\tmodule.exports = __webpack_require__(119) ? function(object, key, value){\n\t return dP.f(object, key, createDesc(1, value));\n\t} : function(object, key, value){\n\t object[key] = value;\n\t return object;\n\t};\n\n/***/ },\n/* 320 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = !__webpack_require__(119) && !__webpack_require__(120)(function(){\n\t return Object.defineProperty(__webpack_require__(315)('div'), 'a', {get: function(){ return 7; }}).a != 7;\n\t});\n\n/***/ },\n/* 321 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// 19.1.2.1 Object.assign(target, source, ...)\n\tvar getKeys = __webpack_require__(325)\n\t , gOPS = __webpack_require__(323)\n\t , pIE = __webpack_require__(326)\n\t , toObject = __webpack_require__(332)\n\t , IObject = __webpack_require__(177)\n\t , $assign = Object.assign;\n\t\n\t// should work with symbols and should have deterministic property order (V8 bug)\n\tmodule.exports = !$assign || __webpack_require__(120)(function(){\n\t var A = {}\n\t , B = {}\n\t , S = Symbol()\n\t , K = 'abcdefghijklmnopqrst';\n\t A[S] = 7;\n\t K.split('').forEach(function(k){ B[k] = k; });\n\t return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n\t}) ? function assign(target, source){ // eslint-disable-line no-unused-vars\n\t var T = toObject(target)\n\t , aLen = arguments.length\n\t , index = 1\n\t , getSymbols = gOPS.f\n\t , isEnum = pIE.f;\n\t while(aLen > index){\n\t var S = IObject(arguments[index++])\n\t , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)\n\t , length = keys.length\n\t , j = 0\n\t , key;\n\t while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key];\n\t } return T;\n\t} : $assign;\n\n/***/ },\n/* 322 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar anObject = __webpack_require__(311)\n\t , IE8_DOM_DEFINE = __webpack_require__(320)\n\t , toPrimitive = __webpack_require__(333)\n\t , dP = Object.defineProperty;\n\t\n\texports.f = __webpack_require__(119) ? Object.defineProperty : function defineProperty(O, P, Attributes){\n\t anObject(O);\n\t P = toPrimitive(P, true);\n\t anObject(Attributes);\n\t if(IE8_DOM_DEFINE)try {\n\t return dP(O, P, Attributes);\n\t } catch(e){ /* empty */ }\n\t if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n\t if('value' in Attributes)O[P] = Attributes.value;\n\t return O;\n\t};\n\n/***/ },\n/* 323 */\n/***/ function(module, exports) {\n\n\texports.f = Object.getOwnPropertySymbols;\n\n/***/ },\n/* 324 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar has = __webpack_require__(318)\n\t , toIObject = __webpack_require__(179)\n\t , arrayIndexOf = __webpack_require__(312)(false)\n\t , IE_PROTO = __webpack_require__(328)('IE_PROTO');\n\t\n\tmodule.exports = function(object, names){\n\t var O = toIObject(object)\n\t , i = 0\n\t , result = []\n\t , key;\n\t for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);\n\t // Don't enum bug & hidden keys\n\t while(names.length > i)if(has(O, key = names[i++])){\n\t ~arrayIndexOf(result, key) || result.push(key);\n\t }\n\t return result;\n\t};\n\n/***/ },\n/* 325 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.14 / 15.2.3.14 Object.keys(O)\n\tvar $keys = __webpack_require__(324)\n\t , enumBugKeys = __webpack_require__(316);\n\t\n\tmodule.exports = Object.keys || function keys(O){\n\t return $keys(O, enumBugKeys);\n\t};\n\n/***/ },\n/* 326 */\n/***/ function(module, exports) {\n\n\texports.f = {}.propertyIsEnumerable;\n\n/***/ },\n/* 327 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(bitmap, value){\n\t return {\n\t enumerable : !(bitmap & 1),\n\t configurable: !(bitmap & 2),\n\t writable : !(bitmap & 4),\n\t value : value\n\t };\n\t};\n\n/***/ },\n/* 328 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar shared = __webpack_require__(329)('keys')\n\t , uid = __webpack_require__(334);\n\tmodule.exports = function(key){\n\t return shared[key] || (shared[key] = uid(key));\n\t};\n\n/***/ },\n/* 329 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(121)\n\t , SHARED = '__core-js_shared__'\n\t , store = global[SHARED] || (global[SHARED] = {});\n\tmodule.exports = function(key){\n\t return store[key] || (store[key] = {});\n\t};\n\n/***/ },\n/* 330 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar toInteger = __webpack_require__(178)\n\t , max = Math.max\n\t , min = Math.min;\n\tmodule.exports = function(index, length){\n\t index = toInteger(index);\n\t return index < 0 ? max(index + length, 0) : min(index, length);\n\t};\n\n/***/ },\n/* 331 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.1.15 ToLength\n\tvar toInteger = __webpack_require__(178)\n\t , min = Math.min;\n\tmodule.exports = function(it){\n\t return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n\t};\n\n/***/ },\n/* 332 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.1.13 ToObject(argument)\n\tvar defined = __webpack_require__(176);\n\tmodule.exports = function(it){\n\t return Object(defined(it));\n\t};\n\n/***/ },\n/* 333 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.1.1 ToPrimitive(input [, PreferredType])\n\tvar isObject = __webpack_require__(122);\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\tmodule.exports = function(it, S){\n\t if(!isObject(it))return it;\n\t var fn, val;\n\t if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n\t if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n\t if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n\t throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n/***/ },\n/* 334 */\n/***/ function(module, exports) {\n\n\tvar id = 0\n\t , px = Math.random();\n\tmodule.exports = function(key){\n\t return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n\t};\n\n/***/ },\n/* 335 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.3.1 Object.assign(target, source)\n\tvar $export = __webpack_require__(317);\n\t\n\t$export($export.S + $export.F, 'Object', {assign: __webpack_require__(321)});\n\n/***/ },\n/* 336 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isObject = __webpack_require__(9)\n\t , isArray = __webpack_require__(131)\n\t , SPECIES = __webpack_require__(11)('species');\n\t\n\tmodule.exports = function(original){\n\t var C;\n\t if(isArray(original)){\n\t C = original.constructor;\n\t // cross-realm fallback\n\t if(typeof C == 'function' && (C === Array || isArray(C.prototype)))C = undefined;\n\t if(isObject(C)){\n\t C = C[SPECIES];\n\t if(C === null)C = undefined;\n\t }\n\t } return C === undefined ? Array : C;\n\t};\n\n/***/ },\n/* 337 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\n\tvar speciesConstructor = __webpack_require__(336);\n\t\n\tmodule.exports = function(original, length){\n\t return new (speciesConstructor(original))(length);\n\t};\n\n/***/ },\n/* 338 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar anObject = __webpack_require__(6)\n\t , toPrimitive = __webpack_require__(41)\n\t , NUMBER = 'number';\n\t\n\tmodule.exports = function(hint){\n\t if(hint !== 'string' && hint !== NUMBER && hint !== 'default')throw TypeError('Incorrect hint');\n\t return toPrimitive(anObject(this), hint != NUMBER);\n\t};\n\n/***/ },\n/* 339 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// all enumerable object keys, includes symbols\n\tvar getKeys = __webpack_require__(63)\n\t , gOPS = __webpack_require__(101)\n\t , pIE = __webpack_require__(83);\n\tmodule.exports = function(it){\n\t var result = getKeys(it)\n\t , getSymbols = gOPS.f;\n\t if(getSymbols){\n\t var symbols = getSymbols(it)\n\t , isEnum = pIE.f\n\t , i = 0\n\t , key;\n\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\n\t } return result;\n\t};\n\n/***/ },\n/* 340 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar getKeys = __webpack_require__(63)\n\t , toIObject = __webpack_require__(33);\n\tmodule.exports = function(object, el){\n\t var O = toIObject(object)\n\t , keys = getKeys(O)\n\t , length = keys.length\n\t , index = 0\n\t , key;\n\t while(length > index)if(O[key = keys[index++]] === el)return key;\n\t};\n\n/***/ },\n/* 341 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar path = __webpack_require__(342)\n\t , invoke = __webpack_require__(97)\n\t , aFunction = __webpack_require__(29);\n\tmodule.exports = function(/* ...pargs */){\n\t var fn = aFunction(this)\n\t , length = arguments.length\n\t , pargs = Array(length)\n\t , i = 0\n\t , _ = path._\n\t , holder = false;\n\t while(length > i)if((pargs[i] = arguments[i++]) === _)holder = true;\n\t return function(/* ...args */){\n\t var that = this\n\t , aLen = arguments.length\n\t , j = 0, k = 0, args;\n\t if(!holder && !aLen)return invoke(fn, pargs, that);\n\t args = pargs.slice();\n\t if(holder)for(;length > j; j++)if(args[j] === _)args[j] = arguments[k++];\n\t while(aLen > k)args.push(arguments[k++]);\n\t return invoke(fn, args, that);\n\t };\n\t};\n\n/***/ },\n/* 342 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(7);\n\n/***/ },\n/* 343 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(regExp, replace){\n\t var replacer = replace === Object(replace) ? function(part){\n\t return replace[part];\n\t } : replace;\n\t return function(it){\n\t return String(it).replace(regExp, replacer);\n\t };\n\t};\n\n/***/ },\n/* 344 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/benjamingr/RexExp.escape\n\tvar $export = __webpack_require__(2)\n\t , $re = __webpack_require__(343)(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\n\t$export($export.S, 'RegExp', {escape: function escape(it){ return $re(it); }});\n\n\n/***/ },\n/* 345 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.P, 'Array', {copyWithin: __webpack_require__(181)});\n\t\n\t__webpack_require__(71)('copyWithin');\n\n/***/ },\n/* 346 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $every = __webpack_require__(39)(4);\n\t\n\t$export($export.P + $export.F * !__webpack_require__(38)([].every, true), 'Array', {\n\t // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n\t every: function every(callbackfn /* , thisArg */){\n\t return $every(this, callbackfn, arguments[1]);\n\t }\n\t});\n\n/***/ },\n/* 347 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.P, 'Array', {fill: __webpack_require__(123)});\n\t\n\t__webpack_require__(71)('fill');\n\n/***/ },\n/* 348 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $filter = __webpack_require__(39)(2);\n\t\n\t$export($export.P + $export.F * !__webpack_require__(38)([].filter, true), 'Array', {\n\t // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n\t filter: function filter(callbackfn /* , thisArg */){\n\t return $filter(this, callbackfn, arguments[1]);\n\t }\n\t});\n\n/***/ },\n/* 349 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\n\tvar $export = __webpack_require__(2)\n\t , $find = __webpack_require__(39)(6)\n\t , KEY = 'findIndex'\n\t , forced = true;\n\t// Shouldn't skip holes\n\tif(KEY in [])Array(1)[KEY](function(){ forced = false; });\n\t$export($export.P + $export.F * forced, 'Array', {\n\t findIndex: function findIndex(callbackfn/*, that = undefined */){\n\t return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\t__webpack_require__(71)(KEY);\n\n/***/ },\n/* 350 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\n\tvar $export = __webpack_require__(2)\n\t , $find = __webpack_require__(39)(5)\n\t , KEY = 'find'\n\t , forced = true;\n\t// Shouldn't skip holes\n\tif(KEY in [])Array(1)[KEY](function(){ forced = false; });\n\t$export($export.P + $export.F * forced, 'Array', {\n\t find: function find(callbackfn/*, that = undefined */){\n\t return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\t__webpack_require__(71)(KEY);\n\n/***/ },\n/* 351 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $forEach = __webpack_require__(39)(0)\n\t , STRICT = __webpack_require__(38)([].forEach, true);\n\t\n\t$export($export.P + $export.F * !STRICT, 'Array', {\n\t // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n\t forEach: function forEach(callbackfn /* , thisArg */){\n\t return $forEach(this, callbackfn, arguments[1]);\n\t }\n\t});\n\n/***/ },\n/* 352 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar ctx = __webpack_require__(44)\n\t , $export = __webpack_require__(2)\n\t , toObject = __webpack_require__(22)\n\t , call = __webpack_require__(190)\n\t , isArrayIter = __webpack_require__(130)\n\t , toLength = __webpack_require__(19)\n\t , createProperty = __webpack_require__(124)\n\t , getIterFn = __webpack_require__(147);\n\t\n\t$export($export.S + $export.F * !__webpack_require__(99)(function(iter){ Array.from(iter); }), 'Array', {\n\t // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n\t from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){\n\t var O = toObject(arrayLike)\n\t , C = typeof this == 'function' ? this : Array\n\t , aLen = arguments.length\n\t , mapfn = aLen > 1 ? arguments[1] : undefined\n\t , mapping = mapfn !== undefined\n\t , index = 0\n\t , iterFn = getIterFn(O)\n\t , length, result, step, iterator;\n\t if(mapping)mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n\t // if object isn't iterable or it's array with default iterator - use simple case\n\t if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){\n\t for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){\n\t createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n\t }\n\t } else {\n\t length = toLength(O.length);\n\t for(result = new C(length); length > index; index++){\n\t createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n\t }\n\t }\n\t result.length = index;\n\t return result;\n\t }\n\t});\n\n\n/***/ },\n/* 353 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $indexOf = __webpack_require__(93)(false)\n\t , $native = [].indexOf\n\t , NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;\n\t\n\t$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(38)($native)), 'Array', {\n\t // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n\t indexOf: function indexOf(searchElement /*, fromIndex = 0 */){\n\t return NEGATIVE_ZERO\n\t // convert -0 to +0\n\t ? $native.apply(this, arguments) || 0\n\t : $indexOf(this, searchElement, arguments[1]);\n\t }\n\t});\n\n/***/ },\n/* 354 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Array', {isArray: __webpack_require__(131)});\n\n/***/ },\n/* 355 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// 22.1.3.13 Array.prototype.join(separator)\n\tvar $export = __webpack_require__(2)\n\t , toIObject = __webpack_require__(33)\n\t , arrayJoin = [].join;\n\t\n\t// fallback for not array-like strings\n\t$export($export.P + $export.F * (__webpack_require__(82) != Object || !__webpack_require__(38)(arrayJoin)), 'Array', {\n\t join: function join(separator){\n\t return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);\n\t }\n\t});\n\n/***/ },\n/* 356 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , toIObject = __webpack_require__(33)\n\t , toInteger = __webpack_require__(54)\n\t , toLength = __webpack_require__(19)\n\t , $native = [].lastIndexOf\n\t , NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;\n\t\n\t$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(38)($native)), 'Array', {\n\t // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n\t lastIndexOf: function lastIndexOf(searchElement /*, fromIndex = @[*-1] */){\n\t // convert -0 to +0\n\t if(NEGATIVE_ZERO)return $native.apply(this, arguments) || 0;\n\t var O = toIObject(this)\n\t , length = toLength(O.length)\n\t , index = length - 1;\n\t if(arguments.length > 1)index = Math.min(index, toInteger(arguments[1]));\n\t if(index < 0)index = length + index;\n\t for(;index >= 0; index--)if(index in O)if(O[index] === searchElement)return index || 0;\n\t return -1;\n\t }\n\t});\n\n/***/ },\n/* 357 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $map = __webpack_require__(39)(1);\n\t\n\t$export($export.P + $export.F * !__webpack_require__(38)([].map, true), 'Array', {\n\t // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n\t map: function map(callbackfn /* , thisArg */){\n\t return $map(this, callbackfn, arguments[1]);\n\t }\n\t});\n\n/***/ },\n/* 358 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , createProperty = __webpack_require__(124);\n\t\n\t// WebKit Array.of isn't generic\n\t$export($export.S + $export.F * __webpack_require__(8)(function(){\n\t function F(){}\n\t return !(Array.of.call(F) instanceof F);\n\t}), 'Array', {\n\t // 22.1.2.3 Array.of( ...items)\n\t of: function of(/* ...args */){\n\t var index = 0\n\t , aLen = arguments.length\n\t , result = new (typeof this == 'function' ? this : Array)(aLen);\n\t while(aLen > index)createProperty(result, index, arguments[index++]);\n\t result.length = aLen;\n\t return result;\n\t }\n\t});\n\n/***/ },\n/* 359 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $reduce = __webpack_require__(183);\n\t\n\t$export($export.P + $export.F * !__webpack_require__(38)([].reduceRight, true), 'Array', {\n\t // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n\t reduceRight: function reduceRight(callbackfn /* , initialValue */){\n\t return $reduce(this, callbackfn, arguments.length, arguments[1], true);\n\t }\n\t});\n\n/***/ },\n/* 360 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $reduce = __webpack_require__(183);\n\t\n\t$export($export.P + $export.F * !__webpack_require__(38)([].reduce, true), 'Array', {\n\t // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n\t reduce: function reduce(callbackfn /* , initialValue */){\n\t return $reduce(this, callbackfn, arguments.length, arguments[1], false);\n\t }\n\t});\n\n/***/ },\n/* 361 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , html = __webpack_require__(128)\n\t , cof = __webpack_require__(36)\n\t , toIndex = __webpack_require__(66)\n\t , toLength = __webpack_require__(19)\n\t , arraySlice = [].slice;\n\t\n\t// fallback for not array-like ES3 strings and DOM objects\n\t$export($export.P + $export.F * __webpack_require__(8)(function(){\n\t if(html)arraySlice.call(html);\n\t}), 'Array', {\n\t slice: function slice(begin, end){\n\t var len = toLength(this.length)\n\t , klass = cof(this);\n\t end = end === undefined ? len : end;\n\t if(klass == 'Array')return arraySlice.call(this, begin, end);\n\t var start = toIndex(begin, len)\n\t , upTo = toIndex(end, len)\n\t , size = toLength(upTo - start)\n\t , cloned = Array(size)\n\t , i = 0;\n\t for(; i < size; i++)cloned[i] = klass == 'String'\n\t ? this.charAt(start + i)\n\t : this[start + i];\n\t return cloned;\n\t }\n\t});\n\n/***/ },\n/* 362 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $some = __webpack_require__(39)(3);\n\t\n\t$export($export.P + $export.F * !__webpack_require__(38)([].some, true), 'Array', {\n\t // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n\t some: function some(callbackfn /* , thisArg */){\n\t return $some(this, callbackfn, arguments[1]);\n\t }\n\t});\n\n/***/ },\n/* 363 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , aFunction = __webpack_require__(29)\n\t , toObject = __webpack_require__(22)\n\t , fails = __webpack_require__(8)\n\t , $sort = [].sort\n\t , test = [1, 2, 3];\n\t\n\t$export($export.P + $export.F * (fails(function(){\n\t // IE8-\n\t test.sort(undefined);\n\t}) || !fails(function(){\n\t // V8 bug\n\t test.sort(null);\n\t // Old WebKit\n\t}) || !__webpack_require__(38)($sort)), 'Array', {\n\t // 22.1.3.25 Array.prototype.sort(comparefn)\n\t sort: function sort(comparefn){\n\t return comparefn === undefined\n\t ? $sort.call(toObject(this))\n\t : $sort.call(toObject(this), aFunction(comparefn));\n\t }\n\t});\n\n/***/ },\n/* 364 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(65)('Array');\n\n/***/ },\n/* 365 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.3.3.1 / 15.9.4.4 Date.now()\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Date', {now: function(){ return new Date().getTime(); }});\n\n/***/ },\n/* 366 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\n\tvar $export = __webpack_require__(2)\n\t , fails = __webpack_require__(8)\n\t , getTime = Date.prototype.getTime;\n\t\n\tvar lz = function(num){\n\t return num > 9 ? num : '0' + num;\n\t};\n\t\n\t// PhantomJS / old WebKit has a broken implementations\n\t$export($export.P + $export.F * (fails(function(){\n\t return new Date(-5e13 - 1).toISOString() != '0385-07-25T07:06:39.999Z';\n\t}) || !fails(function(){\n\t new Date(NaN).toISOString();\n\t})), 'Date', {\n\t toISOString: function toISOString(){\n\t if(!isFinite(getTime.call(this)))throw RangeError('Invalid time value');\n\t var d = this\n\t , y = d.getUTCFullYear()\n\t , m = d.getUTCMilliseconds()\n\t , s = y < 0 ? '-' : y > 9999 ? '+' : '';\n\t return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +\n\t '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +\n\t 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +\n\t ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n\t }\n\t});\n\n/***/ },\n/* 367 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , toObject = __webpack_require__(22)\n\t , toPrimitive = __webpack_require__(41);\n\t\n\t$export($export.P + $export.F * __webpack_require__(8)(function(){\n\t return new Date(NaN).toJSON() !== null || Date.prototype.toJSON.call({toISOString: function(){ return 1; }}) !== 1;\n\t}), 'Date', {\n\t toJSON: function toJSON(key){\n\t var O = toObject(this)\n\t , pv = toPrimitive(O);\n\t return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n\t }\n\t});\n\n/***/ },\n/* 368 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar TO_PRIMITIVE = __webpack_require__(11)('toPrimitive')\n\t , proto = Date.prototype;\n\t\n\tif(!(TO_PRIMITIVE in proto))__webpack_require__(30)(proto, TO_PRIMITIVE, __webpack_require__(338));\n\n/***/ },\n/* 369 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar DateProto = Date.prototype\n\t , INVALID_DATE = 'Invalid Date'\n\t , TO_STRING = 'toString'\n\t , $toString = DateProto[TO_STRING]\n\t , getTime = DateProto.getTime;\n\tif(new Date(NaN) + '' != INVALID_DATE){\n\t __webpack_require__(31)(DateProto, TO_STRING, function toString(){\n\t var value = getTime.call(this);\n\t return value === value ? $toString.call(this) : INVALID_DATE;\n\t });\n\t}\n\n/***/ },\n/* 370 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.P, 'Function', {bind: __webpack_require__(184)});\n\n/***/ },\n/* 371 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar isObject = __webpack_require__(9)\n\t , getPrototypeOf = __webpack_require__(35)\n\t , HAS_INSTANCE = __webpack_require__(11)('hasInstance')\n\t , FunctionProto = Function.prototype;\n\t// 19.2.3.6 Function.prototype[@@hasInstance](V)\n\tif(!(HAS_INSTANCE in FunctionProto))__webpack_require__(13).f(FunctionProto, HAS_INSTANCE, {value: function(O){\n\t if(typeof this != 'function' || !isObject(O))return false;\n\t if(!isObject(this.prototype))return O instanceof this;\n\t // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n\t while(O = getPrototypeOf(O))if(this.prototype === O)return true;\n\t return false;\n\t}});\n\n/***/ },\n/* 372 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar dP = __webpack_require__(13).f\n\t , createDesc = __webpack_require__(53)\n\t , has = __webpack_require__(27)\n\t , FProto = Function.prototype\n\t , nameRE = /^\\s*function ([^ (]*)/\n\t , NAME = 'name';\n\t\n\tvar isExtensible = Object.isExtensible || function(){\n\t return true;\n\t};\n\t\n\t// 19.2.4.2 name\n\tNAME in FProto || __webpack_require__(12) && dP(FProto, NAME, {\n\t configurable: true,\n\t get: function(){\n\t try {\n\t var that = this\n\t , name = ('' + that).match(nameRE)[1];\n\t has(that, NAME) || !isExtensible(that) || dP(that, NAME, createDesc(5, name));\n\t return name;\n\t } catch(e){\n\t return '';\n\t }\n\t }\n\t});\n\n/***/ },\n/* 373 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.3 Math.acosh(x)\n\tvar $export = __webpack_require__(2)\n\t , log1p = __webpack_require__(192)\n\t , sqrt = Math.sqrt\n\t , $acosh = Math.acosh;\n\t\n\t$export($export.S + $export.F * !($acosh\n\t // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n\t && Math.floor($acosh(Number.MAX_VALUE)) == 710\n\t // Tor Browser bug: Math.acosh(Infinity) -> NaN \n\t && $acosh(Infinity) == Infinity\n\t), 'Math', {\n\t acosh: function acosh(x){\n\t return (x = +x) < 1 ? NaN : x > 94906265.62425156\n\t ? Math.log(x) + Math.LN2\n\t : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n\t }\n\t});\n\n/***/ },\n/* 374 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.5 Math.asinh(x)\n\tvar $export = __webpack_require__(2)\n\t , $asinh = Math.asinh;\n\t\n\tfunction asinh(x){\n\t return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n\t}\n\t\n\t// Tor Browser bug: Math.asinh(0) -> -0 \n\t$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', {asinh: asinh});\n\n/***/ },\n/* 375 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.7 Math.atanh(x)\n\tvar $export = __webpack_require__(2)\n\t , $atanh = Math.atanh;\n\t\n\t// Tor Browser bug: Math.atanh(-0) -> 0 \n\t$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n\t atanh: function atanh(x){\n\t return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n\t }\n\t});\n\n/***/ },\n/* 376 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.9 Math.cbrt(x)\n\tvar $export = __webpack_require__(2)\n\t , sign = __webpack_require__(135);\n\t\n\t$export($export.S, 'Math', {\n\t cbrt: function cbrt(x){\n\t return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n\t }\n\t});\n\n/***/ },\n/* 377 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.11 Math.clz32(x)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {\n\t clz32: function clz32(x){\n\t return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n\t }\n\t});\n\n/***/ },\n/* 378 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.12 Math.cosh(x)\n\tvar $export = __webpack_require__(2)\n\t , exp = Math.exp;\n\t\n\t$export($export.S, 'Math', {\n\t cosh: function cosh(x){\n\t return (exp(x = +x) + exp(-x)) / 2;\n\t }\n\t});\n\n/***/ },\n/* 379 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.14 Math.expm1(x)\n\tvar $export = __webpack_require__(2)\n\t , $expm1 = __webpack_require__(134);\n\t\n\t$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', {expm1: $expm1});\n\n/***/ },\n/* 380 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.16 Math.fround(x)\n\tvar $export = __webpack_require__(2)\n\t , sign = __webpack_require__(135)\n\t , pow = Math.pow\n\t , EPSILON = pow(2, -52)\n\t , EPSILON32 = pow(2, -23)\n\t , MAX32 = pow(2, 127) * (2 - EPSILON32)\n\t , MIN32 = pow(2, -126);\n\t\n\tvar roundTiesToEven = function(n){\n\t return n + 1 / EPSILON - 1 / EPSILON;\n\t};\n\t\n\t\n\t$export($export.S, 'Math', {\n\t fround: function fround(x){\n\t var $abs = Math.abs(x)\n\t , $sign = sign(x)\n\t , a, result;\n\t if($abs < MIN32)return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n\t a = (1 + EPSILON32 / EPSILON) * $abs;\n\t result = a - (a - $abs);\n\t if(result > MAX32 || result != result)return $sign * Infinity;\n\t return $sign * result;\n\t }\n\t});\n\n/***/ },\n/* 381 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\n\tvar $export = __webpack_require__(2)\n\t , abs = Math.abs;\n\t\n\t$export($export.S, 'Math', {\n\t hypot: function hypot(value1, value2){ // eslint-disable-line no-unused-vars\n\t var sum = 0\n\t , i = 0\n\t , aLen = arguments.length\n\t , larg = 0\n\t , arg, div;\n\t while(i < aLen){\n\t arg = abs(arguments[i++]);\n\t if(larg < arg){\n\t div = larg / arg;\n\t sum = sum * div * div + 1;\n\t larg = arg;\n\t } else if(arg > 0){\n\t div = arg / larg;\n\t sum += div * div;\n\t } else sum += arg;\n\t }\n\t return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n\t }\n\t});\n\n/***/ },\n/* 382 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.18 Math.imul(x, y)\n\tvar $export = __webpack_require__(2)\n\t , $imul = Math.imul;\n\t\n\t// some WebKit versions fails with big numbers, some has wrong arity\n\t$export($export.S + $export.F * __webpack_require__(8)(function(){\n\t return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n\t}), 'Math', {\n\t imul: function imul(x, y){\n\t var UINT16 = 0xffff\n\t , xn = +x\n\t , yn = +y\n\t , xl = UINT16 & xn\n\t , yl = UINT16 & yn;\n\t return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n\t }\n\t});\n\n/***/ },\n/* 383 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.21 Math.log10(x)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {\n\t log10: function log10(x){\n\t return Math.log(x) / Math.LN10;\n\t }\n\t});\n\n/***/ },\n/* 384 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.20 Math.log1p(x)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {log1p: __webpack_require__(192)});\n\n/***/ },\n/* 385 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.22 Math.log2(x)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {\n\t log2: function log2(x){\n\t return Math.log(x) / Math.LN2;\n\t }\n\t});\n\n/***/ },\n/* 386 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.28 Math.sign(x)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {sign: __webpack_require__(135)});\n\n/***/ },\n/* 387 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.30 Math.sinh(x)\n\tvar $export = __webpack_require__(2)\n\t , expm1 = __webpack_require__(134)\n\t , exp = Math.exp;\n\t\n\t// V8 near Chromium 38 has a problem with very small numbers\n\t$export($export.S + $export.F * __webpack_require__(8)(function(){\n\t return !Math.sinh(-2e-17) != -2e-17;\n\t}), 'Math', {\n\t sinh: function sinh(x){\n\t return Math.abs(x = +x) < 1\n\t ? (expm1(x) - expm1(-x)) / 2\n\t : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n\t }\n\t});\n\n/***/ },\n/* 388 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.33 Math.tanh(x)\n\tvar $export = __webpack_require__(2)\n\t , expm1 = __webpack_require__(134)\n\t , exp = Math.exp;\n\t\n\t$export($export.S, 'Math', {\n\t tanh: function tanh(x){\n\t var a = expm1(x = +x)\n\t , b = expm1(-x);\n\t return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n\t }\n\t});\n\n/***/ },\n/* 389 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.2.2.34 Math.trunc(x)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {\n\t trunc: function trunc(it){\n\t return (it > 0 ? Math.floor : Math.ceil)(it);\n\t }\n\t});\n\n/***/ },\n/* 390 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar global = __webpack_require__(7)\n\t , has = __webpack_require__(27)\n\t , cof = __webpack_require__(36)\n\t , inheritIfRequired = __webpack_require__(129)\n\t , toPrimitive = __webpack_require__(41)\n\t , fails = __webpack_require__(8)\n\t , gOPN = __webpack_require__(62).f\n\t , gOPD = __webpack_require__(34).f\n\t , dP = __webpack_require__(13).f\n\t , $trim = __webpack_require__(75).trim\n\t , NUMBER = 'Number'\n\t , $Number = global[NUMBER]\n\t , Base = $Number\n\t , proto = $Number.prototype\n\t // Opera ~12 has broken Object#toString\n\t , BROKEN_COF = cof(__webpack_require__(61)(proto)) == NUMBER\n\t , TRIM = 'trim' in String.prototype;\n\t\n\t// 7.1.3 ToNumber(argument)\n\tvar toNumber = function(argument){\n\t var it = toPrimitive(argument, false);\n\t if(typeof it == 'string' && it.length > 2){\n\t it = TRIM ? it.trim() : $trim(it, 3);\n\t var first = it.charCodeAt(0)\n\t , third, radix, maxCode;\n\t if(first === 43 || first === 45){\n\t third = it.charCodeAt(2);\n\t if(third === 88 || third === 120)return NaN; // Number('+0x1') should be NaN, old V8 fix\n\t } else if(first === 48){\n\t switch(it.charCodeAt(1)){\n\t case 66 : case 98 : radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n\t case 79 : case 111 : radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n\t default : return +it;\n\t }\n\t for(var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++){\n\t code = digits.charCodeAt(i);\n\t // parseInt parses a string to a first unavailable symbol\n\t // but ToNumber should return NaN if a string contains unavailable symbols\n\t if(code < 48 || code > maxCode)return NaN;\n\t } return parseInt(digits, radix);\n\t }\n\t } return +it;\n\t};\n\t\n\tif(!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')){\n\t $Number = function Number(value){\n\t var it = arguments.length < 1 ? 0 : value\n\t , that = this;\n\t return that instanceof $Number\n\t // check on 1..constructor(foo) case\n\t && (BROKEN_COF ? fails(function(){ proto.valueOf.call(that); }) : cof(that) != NUMBER)\n\t ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n\t };\n\t for(var keys = __webpack_require__(12) ? gOPN(Base) : (\n\t // ES3:\n\t 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n\t // ES6 (in case, if modules with ES6 Number statics required before):\n\t 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n\t 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n\t ).split(','), j = 0, key; keys.length > j; j++){\n\t if(has(Base, key = keys[j]) && !has($Number, key)){\n\t dP($Number, key, gOPD(Base, key));\n\t }\n\t }\n\t $Number.prototype = proto;\n\t proto.constructor = $Number;\n\t __webpack_require__(31)(global, NUMBER, $Number);\n\t}\n\n/***/ },\n/* 391 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.1 Number.EPSILON\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Number', {EPSILON: Math.pow(2, -52)});\n\n/***/ },\n/* 392 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.2 Number.isFinite(number)\n\tvar $export = __webpack_require__(2)\n\t , _isFinite = __webpack_require__(7).isFinite;\n\t\n\t$export($export.S, 'Number', {\n\t isFinite: function isFinite(it){\n\t return typeof it == 'number' && _isFinite(it);\n\t }\n\t});\n\n/***/ },\n/* 393 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.3 Number.isInteger(number)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Number', {isInteger: __webpack_require__(189)});\n\n/***/ },\n/* 394 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.4 Number.isNaN(number)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Number', {\n\t isNaN: function isNaN(number){\n\t return number != number;\n\t }\n\t});\n\n/***/ },\n/* 395 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.5 Number.isSafeInteger(number)\n\tvar $export = __webpack_require__(2)\n\t , isInteger = __webpack_require__(189)\n\t , abs = Math.abs;\n\t\n\t$export($export.S, 'Number', {\n\t isSafeInteger: function isSafeInteger(number){\n\t return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n\t }\n\t});\n\n/***/ },\n/* 396 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.6 Number.MAX_SAFE_INTEGER\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Number', {MAX_SAFE_INTEGER: 0x1fffffffffffff});\n\n/***/ },\n/* 397 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.10 Number.MIN_SAFE_INTEGER\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Number', {MIN_SAFE_INTEGER: -0x1fffffffffffff});\n\n/***/ },\n/* 398 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2)\n\t , $parseFloat = __webpack_require__(199);\n\t// 20.1.2.12 Number.parseFloat(string)\n\t$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', {parseFloat: $parseFloat});\n\n/***/ },\n/* 399 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2)\n\t , $parseInt = __webpack_require__(200);\n\t// 20.1.2.13 Number.parseInt(string, radix)\n\t$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', {parseInt: $parseInt});\n\n/***/ },\n/* 400 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , toInteger = __webpack_require__(54)\n\t , aNumberValue = __webpack_require__(180)\n\t , repeat = __webpack_require__(142)\n\t , $toFixed = 1..toFixed\n\t , floor = Math.floor\n\t , data = [0, 0, 0, 0, 0, 0]\n\t , ERROR = 'Number.toFixed: incorrect invocation!'\n\t , ZERO = '0';\n\t\n\tvar multiply = function(n, c){\n\t var i = -1\n\t , c2 = c;\n\t while(++i < 6){\n\t c2 += n * data[i];\n\t data[i] = c2 % 1e7;\n\t c2 = floor(c2 / 1e7);\n\t }\n\t};\n\tvar divide = function(n){\n\t var i = 6\n\t , c = 0;\n\t while(--i >= 0){\n\t c += data[i];\n\t data[i] = floor(c / n);\n\t c = (c % n) * 1e7;\n\t }\n\t};\n\tvar numToString = function(){\n\t var i = 6\n\t , s = '';\n\t while(--i >= 0){\n\t if(s !== '' || i === 0 || data[i] !== 0){\n\t var t = String(data[i]);\n\t s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n\t }\n\t } return s;\n\t};\n\tvar pow = function(x, n, acc){\n\t return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n\t};\n\tvar log = function(x){\n\t var n = 0\n\t , x2 = x;\n\t while(x2 >= 4096){\n\t n += 12;\n\t x2 /= 4096;\n\t }\n\t while(x2 >= 2){\n\t n += 1;\n\t x2 /= 2;\n\t } return n;\n\t};\n\t\n\t$export($export.P + $export.F * (!!$toFixed && (\n\t 0.00008.toFixed(3) !== '0.000' ||\n\t 0.9.toFixed(0) !== '1' ||\n\t 1.255.toFixed(2) !== '1.25' ||\n\t 1000000000000000128..toFixed(0) !== '1000000000000000128'\n\t) || !__webpack_require__(8)(function(){\n\t // V8 ~ Android 4.3-\n\t $toFixed.call({});\n\t})), 'Number', {\n\t toFixed: function toFixed(fractionDigits){\n\t var x = aNumberValue(this, ERROR)\n\t , f = toInteger(fractionDigits)\n\t , s = ''\n\t , m = ZERO\n\t , e, z, j, k;\n\t if(f < 0 || f > 20)throw RangeError(ERROR);\n\t if(x != x)return 'NaN';\n\t if(x <= -1e21 || x >= 1e21)return String(x);\n\t if(x < 0){\n\t s = '-';\n\t x = -x;\n\t }\n\t if(x > 1e-21){\n\t e = log(x * pow(2, 69, 1)) - 69;\n\t z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n\t z *= 0x10000000000000;\n\t e = 52 - e;\n\t if(e > 0){\n\t multiply(0, z);\n\t j = f;\n\t while(j >= 7){\n\t multiply(1e7, 0);\n\t j -= 7;\n\t }\n\t multiply(pow(10, j, 1), 0);\n\t j = e - 1;\n\t while(j >= 23){\n\t divide(1 << 23);\n\t j -= 23;\n\t }\n\t divide(1 << j);\n\t multiply(1, 1);\n\t divide(2);\n\t m = numToString();\n\t } else {\n\t multiply(0, z);\n\t multiply(1 << -e, 0);\n\t m = numToString() + repeat.call(ZERO, f);\n\t }\n\t }\n\t if(f > 0){\n\t k = m.length;\n\t m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n\t } else {\n\t m = s + m;\n\t } return m;\n\t }\n\t});\n\n/***/ },\n/* 401 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $fails = __webpack_require__(8)\n\t , aNumberValue = __webpack_require__(180)\n\t , $toPrecision = 1..toPrecision;\n\t\n\t$export($export.P + $export.F * ($fails(function(){\n\t // IE7-\n\t return $toPrecision.call(1, undefined) !== '1';\n\t}) || !$fails(function(){\n\t // V8 ~ Android 4.3-\n\t $toPrecision.call({});\n\t})), 'Number', {\n\t toPrecision: function toPrecision(precision){\n\t var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n\t return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision); \n\t }\n\t});\n\n/***/ },\n/* 402 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.3.1 Object.assign(target, source)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S + $export.F, 'Object', {assign: __webpack_require__(193)});\n\n/***/ },\n/* 403 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2)\n\t// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n\t$export($export.S, 'Object', {create: __webpack_require__(61)});\n\n/***/ },\n/* 404 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2);\n\t// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n\t$export($export.S + $export.F * !__webpack_require__(12), 'Object', {defineProperties: __webpack_require__(194)});\n\n/***/ },\n/* 405 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2);\n\t// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n\t$export($export.S + $export.F * !__webpack_require__(12), 'Object', {defineProperty: __webpack_require__(13).f});\n\n/***/ },\n/* 406 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.5 Object.freeze(O)\n\tvar isObject = __webpack_require__(9)\n\t , meta = __webpack_require__(52).onFreeze;\n\t\n\t__webpack_require__(40)('freeze', function($freeze){\n\t return function freeze(it){\n\t return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n\t };\n\t});\n\n/***/ },\n/* 407 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n\tvar toIObject = __webpack_require__(33)\n\t , $getOwnPropertyDescriptor = __webpack_require__(34).f;\n\t\n\t__webpack_require__(40)('getOwnPropertyDescriptor', function(){\n\t return function getOwnPropertyDescriptor(it, key){\n\t return $getOwnPropertyDescriptor(toIObject(it), key);\n\t };\n\t});\n\n/***/ },\n/* 408 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.7 Object.getOwnPropertyNames(O)\n\t__webpack_require__(40)('getOwnPropertyNames', function(){\n\t return __webpack_require__(195).f;\n\t});\n\n/***/ },\n/* 409 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.9 Object.getPrototypeOf(O)\n\tvar toObject = __webpack_require__(22)\n\t , $getPrototypeOf = __webpack_require__(35);\n\t\n\t__webpack_require__(40)('getPrototypeOf', function(){\n\t return function getPrototypeOf(it){\n\t return $getPrototypeOf(toObject(it));\n\t };\n\t});\n\n/***/ },\n/* 410 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.11 Object.isExtensible(O)\n\tvar isObject = __webpack_require__(9);\n\t\n\t__webpack_require__(40)('isExtensible', function($isExtensible){\n\t return function isExtensible(it){\n\t return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n\t };\n\t});\n\n/***/ },\n/* 411 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.12 Object.isFrozen(O)\n\tvar isObject = __webpack_require__(9);\n\t\n\t__webpack_require__(40)('isFrozen', function($isFrozen){\n\t return function isFrozen(it){\n\t return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n\t };\n\t});\n\n/***/ },\n/* 412 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.13 Object.isSealed(O)\n\tvar isObject = __webpack_require__(9);\n\t\n\t__webpack_require__(40)('isSealed', function($isSealed){\n\t return function isSealed(it){\n\t return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n\t };\n\t});\n\n/***/ },\n/* 413 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.3.10 Object.is(value1, value2)\n\tvar $export = __webpack_require__(2);\n\t$export($export.S, 'Object', {is: __webpack_require__(201)});\n\n/***/ },\n/* 414 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.14 Object.keys(O)\n\tvar toObject = __webpack_require__(22)\n\t , $keys = __webpack_require__(63);\n\t\n\t__webpack_require__(40)('keys', function(){\n\t return function keys(it){\n\t return $keys(toObject(it));\n\t };\n\t});\n\n/***/ },\n/* 415 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.15 Object.preventExtensions(O)\n\tvar isObject = __webpack_require__(9)\n\t , meta = __webpack_require__(52).onFreeze;\n\t\n\t__webpack_require__(40)('preventExtensions', function($preventExtensions){\n\t return function preventExtensions(it){\n\t return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n\t };\n\t});\n\n/***/ },\n/* 416 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.17 Object.seal(O)\n\tvar isObject = __webpack_require__(9)\n\t , meta = __webpack_require__(52).onFreeze;\n\t\n\t__webpack_require__(40)('seal', function($seal){\n\t return function seal(it){\n\t return $seal && isObject(it) ? $seal(meta(it)) : it;\n\t };\n\t});\n\n/***/ },\n/* 417 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.3.19 Object.setPrototypeOf(O, proto)\n\tvar $export = __webpack_require__(2);\n\t$export($export.S, 'Object', {setPrototypeOf: __webpack_require__(137).set});\n\n/***/ },\n/* 418 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// 19.1.3.6 Object.prototype.toString()\n\tvar classof = __webpack_require__(81)\n\t , test = {};\n\ttest[__webpack_require__(11)('toStringTag')] = 'z';\n\tif(test + '' != '[object z]'){\n\t __webpack_require__(31)(Object.prototype, 'toString', function toString(){\n\t return '[object ' + classof(this) + ']';\n\t }, true);\n\t}\n\n/***/ },\n/* 419 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2)\n\t , $parseFloat = __webpack_require__(199);\n\t// 18.2.4 parseFloat(string)\n\t$export($export.G + $export.F * (parseFloat != $parseFloat), {parseFloat: $parseFloat});\n\n/***/ },\n/* 420 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2)\n\t , $parseInt = __webpack_require__(200);\n\t// 18.2.5 parseInt(string, radix)\n\t$export($export.G + $export.F * (parseInt != $parseInt), {parseInt: $parseInt});\n\n/***/ },\n/* 421 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar LIBRARY = __webpack_require__(60)\n\t , global = __webpack_require__(7)\n\t , ctx = __webpack_require__(44)\n\t , classof = __webpack_require__(81)\n\t , $export = __webpack_require__(2)\n\t , isObject = __webpack_require__(9)\n\t , aFunction = __webpack_require__(29)\n\t , anInstance = __webpack_require__(59)\n\t , forOf = __webpack_require__(72)\n\t , speciesConstructor = __webpack_require__(139)\n\t , task = __webpack_require__(144).set\n\t , microtask = __webpack_require__(136)()\n\t , PROMISE = 'Promise'\n\t , TypeError = global.TypeError\n\t , process = global.process\n\t , $Promise = global[PROMISE]\n\t , process = global.process\n\t , isNode = classof(process) == 'process'\n\t , empty = function(){ /* empty */ }\n\t , Internal, GenericPromiseCapability, Wrapper;\n\t\n\tvar USE_NATIVE = !!function(){\n\t try {\n\t // correct subclassing with @@species support\n\t var promise = $Promise.resolve(1)\n\t , FakePromise = (promise.constructor = {})[__webpack_require__(11)('species')] = function(exec){ exec(empty, empty); };\n\t // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n\t return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n\t } catch(e){ /* empty */ }\n\t}();\n\t\n\t// helpers\n\tvar sameConstructor = function(a, b){\n\t // with library wrapper special case\n\t return a === b || a === $Promise && b === Wrapper;\n\t};\n\tvar isThenable = function(it){\n\t var then;\n\t return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n\t};\n\tvar newPromiseCapability = function(C){\n\t return sameConstructor($Promise, C)\n\t ? new PromiseCapability(C)\n\t : new GenericPromiseCapability(C);\n\t};\n\tvar PromiseCapability = GenericPromiseCapability = function(C){\n\t var resolve, reject;\n\t this.promise = new C(function($$resolve, $$reject){\n\t if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor');\n\t resolve = $$resolve;\n\t reject = $$reject;\n\t });\n\t this.resolve = aFunction(resolve);\n\t this.reject = aFunction(reject);\n\t};\n\tvar perform = function(exec){\n\t try {\n\t exec();\n\t } catch(e){\n\t return {error: e};\n\t }\n\t};\n\tvar notify = function(promise, isReject){\n\t if(promise._n)return;\n\t promise._n = true;\n\t var chain = promise._c;\n\t microtask(function(){\n\t var value = promise._v\n\t , ok = promise._s == 1\n\t , i = 0;\n\t var run = function(reaction){\n\t var handler = ok ? reaction.ok : reaction.fail\n\t , resolve = reaction.resolve\n\t , reject = reaction.reject\n\t , domain = reaction.domain\n\t , result, then;\n\t try {\n\t if(handler){\n\t if(!ok){\n\t if(promise._h == 2)onHandleUnhandled(promise);\n\t promise._h = 1;\n\t }\n\t if(handler === true)result = value;\n\t else {\n\t if(domain)domain.enter();\n\t result = handler(value);\n\t if(domain)domain.exit();\n\t }\n\t if(result === reaction.promise){\n\t reject(TypeError('Promise-chain cycle'));\n\t } else if(then = isThenable(result)){\n\t then.call(result, resolve, reject);\n\t } else resolve(result);\n\t } else reject(value);\n\t } catch(e){\n\t reject(e);\n\t }\n\t };\n\t while(chain.length > i)run(chain[i++]); // variable length - can't use forEach\n\t promise._c = [];\n\t promise._n = false;\n\t if(isReject && !promise._h)onUnhandled(promise);\n\t });\n\t};\n\tvar onUnhandled = function(promise){\n\t task.call(global, function(){\n\t var value = promise._v\n\t , abrupt, handler, console;\n\t if(isUnhandled(promise)){\n\t abrupt = perform(function(){\n\t if(isNode){\n\t process.emit('unhandledRejection', value, promise);\n\t } else if(handler = global.onunhandledrejection){\n\t handler({promise: promise, reason: value});\n\t } else if((console = global.console) && console.error){\n\t console.error('Unhandled promise rejection', value);\n\t }\n\t });\n\t // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n\t promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n\t } promise._a = undefined;\n\t if(abrupt)throw abrupt.error;\n\t });\n\t};\n\tvar isUnhandled = function(promise){\n\t if(promise._h == 1)return false;\n\t var chain = promise._a || promise._c\n\t , i = 0\n\t , reaction;\n\t while(chain.length > i){\n\t reaction = chain[i++];\n\t if(reaction.fail || !isUnhandled(reaction.promise))return false;\n\t } return true;\n\t};\n\tvar onHandleUnhandled = function(promise){\n\t task.call(global, function(){\n\t var handler;\n\t if(isNode){\n\t process.emit('rejectionHandled', promise);\n\t } else if(handler = global.onrejectionhandled){\n\t handler({promise: promise, reason: promise._v});\n\t }\n\t });\n\t};\n\tvar $reject = function(value){\n\t var promise = this;\n\t if(promise._d)return;\n\t promise._d = true;\n\t promise = promise._w || promise; // unwrap\n\t promise._v = value;\n\t promise._s = 2;\n\t if(!promise._a)promise._a = promise._c.slice();\n\t notify(promise, true);\n\t};\n\tvar $resolve = function(value){\n\t var promise = this\n\t , then;\n\t if(promise._d)return;\n\t promise._d = true;\n\t promise = promise._w || promise; // unwrap\n\t try {\n\t if(promise === value)throw TypeError(\"Promise can't be resolved itself\");\n\t if(then = isThenable(value)){\n\t microtask(function(){\n\t var wrapper = {_w: promise, _d: false}; // wrap\n\t try {\n\t then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n\t } catch(e){\n\t $reject.call(wrapper, e);\n\t }\n\t });\n\t } else {\n\t promise._v = value;\n\t promise._s = 1;\n\t notify(promise, false);\n\t }\n\t } catch(e){\n\t $reject.call({_w: promise, _d: false}, e); // wrap\n\t }\n\t};\n\t\n\t// constructor polyfill\n\tif(!USE_NATIVE){\n\t // 25.4.3.1 Promise(executor)\n\t $Promise = function Promise(executor){\n\t anInstance(this, $Promise, PROMISE, '_h');\n\t aFunction(executor);\n\t Internal.call(this);\n\t try {\n\t executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n\t } catch(err){\n\t $reject.call(this, err);\n\t }\n\t };\n\t Internal = function Promise(executor){\n\t this._c = []; // <- awaiting reactions\n\t this._a = undefined; // <- checked in isUnhandled reactions\n\t this._s = 0; // <- state\n\t this._d = false; // <- done\n\t this._v = undefined; // <- value\n\t this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n\t this._n = false; // <- notify\n\t };\n\t Internal.prototype = __webpack_require__(64)($Promise.prototype, {\n\t // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n\t then: function then(onFulfilled, onRejected){\n\t var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n\t reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n\t reaction.fail = typeof onRejected == 'function' && onRejected;\n\t reaction.domain = isNode ? process.domain : undefined;\n\t this._c.push(reaction);\n\t if(this._a)this._a.push(reaction);\n\t if(this._s)notify(this, false);\n\t return reaction.promise;\n\t },\n\t // 25.4.5.1 Promise.prototype.catch(onRejected)\n\t 'catch': function(onRejected){\n\t return this.then(undefined, onRejected);\n\t }\n\t });\n\t PromiseCapability = function(){\n\t var promise = new Internal;\n\t this.promise = promise;\n\t this.resolve = ctx($resolve, promise, 1);\n\t this.reject = ctx($reject, promise, 1);\n\t };\n\t}\n\t\n\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: $Promise});\n\t__webpack_require__(74)($Promise, PROMISE);\n\t__webpack_require__(65)(PROMISE);\n\tWrapper = __webpack_require__(43)[PROMISE];\n\t\n\t// statics\n\t$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n\t // 25.4.4.5 Promise.reject(r)\n\t reject: function reject(r){\n\t var capability = newPromiseCapability(this)\n\t , $$reject = capability.reject;\n\t $$reject(r);\n\t return capability.promise;\n\t }\n\t});\n\t$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n\t // 25.4.4.6 Promise.resolve(x)\n\t resolve: function resolve(x){\n\t // instanceof instead of internal slot check because we should fix it without replacement native Promise core\n\t if(x instanceof $Promise && sameConstructor(x.constructor, this))return x;\n\t var capability = newPromiseCapability(this)\n\t , $$resolve = capability.resolve;\n\t $$resolve(x);\n\t return capability.promise;\n\t }\n\t});\n\t$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(99)(function(iter){\n\t $Promise.all(iter)['catch'](empty);\n\t})), PROMISE, {\n\t // 25.4.4.1 Promise.all(iterable)\n\t all: function all(iterable){\n\t var C = this\n\t , capability = newPromiseCapability(C)\n\t , resolve = capability.resolve\n\t , reject = capability.reject;\n\t var abrupt = perform(function(){\n\t var values = []\n\t , index = 0\n\t , remaining = 1;\n\t forOf(iterable, false, function(promise){\n\t var $index = index++\n\t , alreadyCalled = false;\n\t values.push(undefined);\n\t remaining++;\n\t C.resolve(promise).then(function(value){\n\t if(alreadyCalled)return;\n\t alreadyCalled = true;\n\t values[$index] = value;\n\t --remaining || resolve(values);\n\t }, reject);\n\t });\n\t --remaining || resolve(values);\n\t });\n\t if(abrupt)reject(abrupt.error);\n\t return capability.promise;\n\t },\n\t // 25.4.4.4 Promise.race(iterable)\n\t race: function race(iterable){\n\t var C = this\n\t , capability = newPromiseCapability(C)\n\t , reject = capability.reject;\n\t var abrupt = perform(function(){\n\t forOf(iterable, false, function(promise){\n\t C.resolve(promise).then(capability.resolve, reject);\n\t });\n\t });\n\t if(abrupt)reject(abrupt.error);\n\t return capability.promise;\n\t }\n\t});\n\n/***/ },\n/* 422 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\n\tvar $export = __webpack_require__(2)\n\t , aFunction = __webpack_require__(29)\n\t , anObject = __webpack_require__(6)\n\t , rApply = (__webpack_require__(7).Reflect || {}).apply\n\t , fApply = Function.apply;\n\t// MS Edge argumentsList argument is optional\n\t$export($export.S + $export.F * !__webpack_require__(8)(function(){\n\t rApply(function(){});\n\t}), 'Reflect', {\n\t apply: function apply(target, thisArgument, argumentsList){\n\t var T = aFunction(target)\n\t , L = anObject(argumentsList);\n\t return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n\t }\n\t});\n\n/***/ },\n/* 423 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\n\tvar $export = __webpack_require__(2)\n\t , create = __webpack_require__(61)\n\t , aFunction = __webpack_require__(29)\n\t , anObject = __webpack_require__(6)\n\t , isObject = __webpack_require__(9)\n\t , fails = __webpack_require__(8)\n\t , bind = __webpack_require__(184)\n\t , rConstruct = (__webpack_require__(7).Reflect || {}).construct;\n\t\n\t// MS Edge supports only 2 arguments and argumentsList argument is optional\n\t// FF Nightly sets third argument as `new.target`, but does not create `this` from it\n\tvar NEW_TARGET_BUG = fails(function(){\n\t function F(){}\n\t return !(rConstruct(function(){}, [], F) instanceof F);\n\t});\n\tvar ARGS_BUG = !fails(function(){\n\t rConstruct(function(){});\n\t});\n\t\n\t$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n\t construct: function construct(Target, args /*, newTarget*/){\n\t aFunction(Target);\n\t anObject(args);\n\t var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n\t if(ARGS_BUG && !NEW_TARGET_BUG)return rConstruct(Target, args, newTarget);\n\t if(Target == newTarget){\n\t // w/o altered newTarget, optimization for 0-4 arguments\n\t switch(args.length){\n\t case 0: return new Target;\n\t case 1: return new Target(args[0]);\n\t case 2: return new Target(args[0], args[1]);\n\t case 3: return new Target(args[0], args[1], args[2]);\n\t case 4: return new Target(args[0], args[1], args[2], args[3]);\n\t }\n\t // w/o altered newTarget, lot of arguments case\n\t var $args = [null];\n\t $args.push.apply($args, args);\n\t return new (bind.apply(Target, $args));\n\t }\n\t // with altered newTarget, not support built-in constructors\n\t var proto = newTarget.prototype\n\t , instance = create(isObject(proto) ? proto : Object.prototype)\n\t , result = Function.apply.call(Target, instance, args);\n\t return isObject(result) ? result : instance;\n\t }\n\t});\n\n/***/ },\n/* 424 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\n\tvar dP = __webpack_require__(13)\n\t , $export = __webpack_require__(2)\n\t , anObject = __webpack_require__(6)\n\t , toPrimitive = __webpack_require__(41);\n\t\n\t// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n\t$export($export.S + $export.F * __webpack_require__(8)(function(){\n\t Reflect.defineProperty(dP.f({}, 1, {value: 1}), 1, {value: 2});\n\t}), 'Reflect', {\n\t defineProperty: function defineProperty(target, propertyKey, attributes){\n\t anObject(target);\n\t propertyKey = toPrimitive(propertyKey, true);\n\t anObject(attributes);\n\t try {\n\t dP.f(target, propertyKey, attributes);\n\t return true;\n\t } catch(e){\n\t return false;\n\t }\n\t }\n\t});\n\n/***/ },\n/* 425 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.4 Reflect.deleteProperty(target, propertyKey)\n\tvar $export = __webpack_require__(2)\n\t , gOPD = __webpack_require__(34).f\n\t , anObject = __webpack_require__(6);\n\t\n\t$export($export.S, 'Reflect', {\n\t deleteProperty: function deleteProperty(target, propertyKey){\n\t var desc = gOPD(anObject(target), propertyKey);\n\t return desc && !desc.configurable ? false : delete target[propertyKey];\n\t }\n\t});\n\n/***/ },\n/* 426 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// 26.1.5 Reflect.enumerate(target)\n\tvar $export = __webpack_require__(2)\n\t , anObject = __webpack_require__(6);\n\tvar Enumerate = function(iterated){\n\t this._t = anObject(iterated); // target\n\t this._i = 0; // next index\n\t var keys = this._k = [] // keys\n\t , key;\n\t for(key in iterated)keys.push(key);\n\t};\n\t__webpack_require__(132)(Enumerate, 'Object', function(){\n\t var that = this\n\t , keys = that._k\n\t , key;\n\t do {\n\t if(that._i >= keys.length)return {value: undefined, done: true};\n\t } while(!((key = keys[that._i++]) in that._t));\n\t return {value: key, done: false};\n\t});\n\t\n\t$export($export.S, 'Reflect', {\n\t enumerate: function enumerate(target){\n\t return new Enumerate(target);\n\t }\n\t});\n\n/***/ },\n/* 427 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\n\tvar gOPD = __webpack_require__(34)\n\t , $export = __webpack_require__(2)\n\t , anObject = __webpack_require__(6);\n\t\n\t$export($export.S, 'Reflect', {\n\t getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey){\n\t return gOPD.f(anObject(target), propertyKey);\n\t }\n\t});\n\n/***/ },\n/* 428 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.8 Reflect.getPrototypeOf(target)\n\tvar $export = __webpack_require__(2)\n\t , getProto = __webpack_require__(35)\n\t , anObject = __webpack_require__(6);\n\t\n\t$export($export.S, 'Reflect', {\n\t getPrototypeOf: function getPrototypeOf(target){\n\t return getProto(anObject(target));\n\t }\n\t});\n\n/***/ },\n/* 429 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.6 Reflect.get(target, propertyKey [, receiver])\n\tvar gOPD = __webpack_require__(34)\n\t , getPrototypeOf = __webpack_require__(35)\n\t , has = __webpack_require__(27)\n\t , $export = __webpack_require__(2)\n\t , isObject = __webpack_require__(9)\n\t , anObject = __webpack_require__(6);\n\t\n\tfunction get(target, propertyKey/*, receiver*/){\n\t var receiver = arguments.length < 3 ? target : arguments[2]\n\t , desc, proto;\n\t if(anObject(target) === receiver)return target[propertyKey];\n\t if(desc = gOPD.f(target, propertyKey))return has(desc, 'value')\n\t ? desc.value\n\t : desc.get !== undefined\n\t ? desc.get.call(receiver)\n\t : undefined;\n\t if(isObject(proto = getPrototypeOf(target)))return get(proto, propertyKey, receiver);\n\t}\n\t\n\t$export($export.S, 'Reflect', {get: get});\n\n/***/ },\n/* 430 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.9 Reflect.has(target, propertyKey)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Reflect', {\n\t has: function has(target, propertyKey){\n\t return propertyKey in target;\n\t }\n\t});\n\n/***/ },\n/* 431 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.10 Reflect.isExtensible(target)\n\tvar $export = __webpack_require__(2)\n\t , anObject = __webpack_require__(6)\n\t , $isExtensible = Object.isExtensible;\n\t\n\t$export($export.S, 'Reflect', {\n\t isExtensible: function isExtensible(target){\n\t anObject(target);\n\t return $isExtensible ? $isExtensible(target) : true;\n\t }\n\t});\n\n/***/ },\n/* 432 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.11 Reflect.ownKeys(target)\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Reflect', {ownKeys: __webpack_require__(198)});\n\n/***/ },\n/* 433 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.12 Reflect.preventExtensions(target)\n\tvar $export = __webpack_require__(2)\n\t , anObject = __webpack_require__(6)\n\t , $preventExtensions = Object.preventExtensions;\n\t\n\t$export($export.S, 'Reflect', {\n\t preventExtensions: function preventExtensions(target){\n\t anObject(target);\n\t try {\n\t if($preventExtensions)$preventExtensions(target);\n\t return true;\n\t } catch(e){\n\t return false;\n\t }\n\t }\n\t});\n\n/***/ },\n/* 434 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.14 Reflect.setPrototypeOf(target, proto)\n\tvar $export = __webpack_require__(2)\n\t , setProto = __webpack_require__(137);\n\t\n\tif(setProto)$export($export.S, 'Reflect', {\n\t setPrototypeOf: function setPrototypeOf(target, proto){\n\t setProto.check(target, proto);\n\t try {\n\t setProto.set(target, proto);\n\t return true;\n\t } catch(e){\n\t return false;\n\t }\n\t }\n\t});\n\n/***/ },\n/* 435 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\n\tvar dP = __webpack_require__(13)\n\t , gOPD = __webpack_require__(34)\n\t , getPrototypeOf = __webpack_require__(35)\n\t , has = __webpack_require__(27)\n\t , $export = __webpack_require__(2)\n\t , createDesc = __webpack_require__(53)\n\t , anObject = __webpack_require__(6)\n\t , isObject = __webpack_require__(9);\n\t\n\tfunction set(target, propertyKey, V/*, receiver*/){\n\t var receiver = arguments.length < 4 ? target : arguments[3]\n\t , ownDesc = gOPD.f(anObject(target), propertyKey)\n\t , existingDescriptor, proto;\n\t if(!ownDesc){\n\t if(isObject(proto = getPrototypeOf(target))){\n\t return set(proto, propertyKey, V, receiver);\n\t }\n\t ownDesc = createDesc(0);\n\t }\n\t if(has(ownDesc, 'value')){\n\t if(ownDesc.writable === false || !isObject(receiver))return false;\n\t existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);\n\t existingDescriptor.value = V;\n\t dP.f(receiver, propertyKey, existingDescriptor);\n\t return true;\n\t }\n\t return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n\t}\n\t\n\t$export($export.S, 'Reflect', {set: set});\n\n/***/ },\n/* 436 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(7)\n\t , inheritIfRequired = __webpack_require__(129)\n\t , dP = __webpack_require__(13).f\n\t , gOPN = __webpack_require__(62).f\n\t , isRegExp = __webpack_require__(98)\n\t , $flags = __webpack_require__(96)\n\t , $RegExp = global.RegExp\n\t , Base = $RegExp\n\t , proto = $RegExp.prototype\n\t , re1 = /a/g\n\t , re2 = /a/g\n\t // \"new\" creates a new object, old webkit buggy here\n\t , CORRECT_NEW = new $RegExp(re1) !== re1;\n\t\n\tif(__webpack_require__(12) && (!CORRECT_NEW || __webpack_require__(8)(function(){\n\t re2[__webpack_require__(11)('match')] = false;\n\t // RegExp constructor can alter flags and IsRegExp works correct with @@match\n\t return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n\t}))){\n\t $RegExp = function RegExp(p, f){\n\t var tiRE = this instanceof $RegExp\n\t , piRE = isRegExp(p)\n\t , fiU = f === undefined;\n\t return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n\t : inheritIfRequired(CORRECT_NEW\n\t ? new Base(piRE && !fiU ? p.source : p, f)\n\t : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n\t , tiRE ? this : proto, $RegExp);\n\t };\n\t var proxy = function(key){\n\t key in $RegExp || dP($RegExp, key, {\n\t configurable: true,\n\t get: function(){ return Base[key]; },\n\t set: function(it){ Base[key] = it; }\n\t });\n\t };\n\t for(var keys = gOPN(Base), i = 0; keys.length > i; )proxy(keys[i++]);\n\t proto.constructor = $RegExp;\n\t $RegExp.prototype = proto;\n\t __webpack_require__(31)(global, 'RegExp', $RegExp);\n\t}\n\t\n\t__webpack_require__(65)('RegExp');\n\n/***/ },\n/* 437 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// @@match logic\n\t__webpack_require__(95)('match', 1, function(defined, MATCH, $match){\n\t // 21.1.3.11 String.prototype.match(regexp)\n\t return [function match(regexp){\n\t 'use strict';\n\t var O = defined(this)\n\t , fn = regexp == undefined ? undefined : regexp[MATCH];\n\t return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n\t }, $match];\n\t});\n\n/***/ },\n/* 438 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// @@replace logic\n\t__webpack_require__(95)('replace', 2, function(defined, REPLACE, $replace){\n\t // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n\t return [function replace(searchValue, replaceValue){\n\t 'use strict';\n\t var O = defined(this)\n\t , fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n\t return fn !== undefined\n\t ? fn.call(searchValue, O, replaceValue)\n\t : $replace.call(String(O), searchValue, replaceValue);\n\t }, $replace];\n\t});\n\n/***/ },\n/* 439 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// @@search logic\n\t__webpack_require__(95)('search', 1, function(defined, SEARCH, $search){\n\t // 21.1.3.15 String.prototype.search(regexp)\n\t return [function search(regexp){\n\t 'use strict';\n\t var O = defined(this)\n\t , fn = regexp == undefined ? undefined : regexp[SEARCH];\n\t return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n\t }, $search];\n\t});\n\n/***/ },\n/* 440 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// @@split logic\n\t__webpack_require__(95)('split', 2, function(defined, SPLIT, $split){\n\t 'use strict';\n\t var isRegExp = __webpack_require__(98)\n\t , _split = $split\n\t , $push = [].push\n\t , $SPLIT = 'split'\n\t , LENGTH = 'length'\n\t , LAST_INDEX = 'lastIndex';\n\t if(\n\t 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n\t 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n\t 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n\t '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n\t '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n\t ''[$SPLIT](/.?/)[LENGTH]\n\t ){\n\t var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n\t // based on es5-shim implementation, need to rework it\n\t $split = function(separator, limit){\n\t var string = String(this);\n\t if(separator === undefined && limit === 0)return [];\n\t // If `separator` is not a regex, use native split\n\t if(!isRegExp(separator))return _split.call(string, separator, limit);\n\t var output = [];\n\t var flags = (separator.ignoreCase ? 'i' : '') +\n\t (separator.multiline ? 'm' : '') +\n\t (separator.unicode ? 'u' : '') +\n\t (separator.sticky ? 'y' : '');\n\t var lastLastIndex = 0;\n\t var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n\t // Make `global` and avoid `lastIndex` issues by working with a copy\n\t var separatorCopy = new RegExp(separator.source, flags + 'g');\n\t var separator2, match, lastIndex, lastLength, i;\n\t // Doesn't need flags gy, but they don't hurt\n\t if(!NPCG)separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n\t while(match = separatorCopy.exec(string)){\n\t // `separatorCopy.lastIndex` is not reliable cross-browser\n\t lastIndex = match.index + match[0][LENGTH];\n\t if(lastIndex > lastLastIndex){\n\t output.push(string.slice(lastLastIndex, match.index));\n\t // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n\t if(!NPCG && match[LENGTH] > 1)match[0].replace(separator2, function(){\n\t for(i = 1; i < arguments[LENGTH] - 2; i++)if(arguments[i] === undefined)match[i] = undefined;\n\t });\n\t if(match[LENGTH] > 1 && match.index < string[LENGTH])$push.apply(output, match.slice(1));\n\t lastLength = match[0][LENGTH];\n\t lastLastIndex = lastIndex;\n\t if(output[LENGTH] >= splitLimit)break;\n\t }\n\t if(separatorCopy[LAST_INDEX] === match.index)separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n\t }\n\t if(lastLastIndex === string[LENGTH]){\n\t if(lastLength || !separatorCopy.test(''))output.push('');\n\t } else output.push(string.slice(lastLastIndex));\n\t return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n\t };\n\t // Chakra, V8\n\t } else if('0'[$SPLIT](undefined, 0)[LENGTH]){\n\t $split = function(separator, limit){\n\t return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n\t };\n\t }\n\t // 21.1.3.17 String.prototype.split(separator, limit)\n\t return [function split(separator, limit){\n\t var O = defined(this)\n\t , fn = separator == undefined ? undefined : separator[SPLIT];\n\t return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n\t }, $split];\n\t});\n\n/***/ },\n/* 441 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t__webpack_require__(205);\n\tvar anObject = __webpack_require__(6)\n\t , $flags = __webpack_require__(96)\n\t , DESCRIPTORS = __webpack_require__(12)\n\t , TO_STRING = 'toString'\n\t , $toString = /./[TO_STRING];\n\t\n\tvar define = function(fn){\n\t __webpack_require__(31)(RegExp.prototype, TO_STRING, fn, true);\n\t};\n\t\n\t// 21.2.5.14 RegExp.prototype.toString()\n\tif(__webpack_require__(8)(function(){ return $toString.call({source: 'a', flags: 'b'}) != '/a/b'; })){\n\t define(function toString(){\n\t var R = anObject(this);\n\t return '/'.concat(R.source, '/',\n\t 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n\t });\n\t// FF44- RegExp#toString has a wrong name\n\t} else if($toString.name != TO_STRING){\n\t define(function toString(){\n\t return $toString.call(this);\n\t });\n\t}\n\n/***/ },\n/* 442 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.2 String.prototype.anchor(name)\n\t__webpack_require__(32)('anchor', function(createHTML){\n\t return function anchor(name){\n\t return createHTML(this, 'a', 'name', name);\n\t }\n\t});\n\n/***/ },\n/* 443 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.3 String.prototype.big()\n\t__webpack_require__(32)('big', function(createHTML){\n\t return function big(){\n\t return createHTML(this, 'big', '', '');\n\t }\n\t});\n\n/***/ },\n/* 444 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.4 String.prototype.blink()\n\t__webpack_require__(32)('blink', function(createHTML){\n\t return function blink(){\n\t return createHTML(this, 'blink', '', '');\n\t }\n\t});\n\n/***/ },\n/* 445 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.5 String.prototype.bold()\n\t__webpack_require__(32)('bold', function(createHTML){\n\t return function bold(){\n\t return createHTML(this, 'b', '', '');\n\t }\n\t});\n\n/***/ },\n/* 446 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $at = __webpack_require__(140)(false);\n\t$export($export.P, 'String', {\n\t // 21.1.3.3 String.prototype.codePointAt(pos)\n\t codePointAt: function codePointAt(pos){\n\t return $at(this, pos);\n\t }\n\t});\n\n/***/ },\n/* 447 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , toLength = __webpack_require__(19)\n\t , context = __webpack_require__(141)\n\t , ENDS_WITH = 'endsWith'\n\t , $endsWith = ''[ENDS_WITH];\n\t\n\t$export($export.P + $export.F * __webpack_require__(127)(ENDS_WITH), 'String', {\n\t endsWith: function endsWith(searchString /*, endPosition = @length */){\n\t var that = context(this, searchString, ENDS_WITH)\n\t , endPosition = arguments.length > 1 ? arguments[1] : undefined\n\t , len = toLength(that.length)\n\t , end = endPosition === undefined ? len : Math.min(toLength(endPosition), len)\n\t , search = String(searchString);\n\t return $endsWith\n\t ? $endsWith.call(that, search, end)\n\t : that.slice(end - search.length, end) === search;\n\t }\n\t});\n\n/***/ },\n/* 448 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.6 String.prototype.fixed()\n\t__webpack_require__(32)('fixed', function(createHTML){\n\t return function fixed(){\n\t return createHTML(this, 'tt', '', '');\n\t }\n\t});\n\n/***/ },\n/* 449 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.7 String.prototype.fontcolor(color)\n\t__webpack_require__(32)('fontcolor', function(createHTML){\n\t return function fontcolor(color){\n\t return createHTML(this, 'font', 'color', color);\n\t }\n\t});\n\n/***/ },\n/* 450 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.8 String.prototype.fontsize(size)\n\t__webpack_require__(32)('fontsize', function(createHTML){\n\t return function fontsize(size){\n\t return createHTML(this, 'font', 'size', size);\n\t }\n\t});\n\n/***/ },\n/* 451 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2)\n\t , toIndex = __webpack_require__(66)\n\t , fromCharCode = String.fromCharCode\n\t , $fromCodePoint = String.fromCodePoint;\n\t\n\t// length should be 1, old FF problem\n\t$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n\t // 21.1.2.2 String.fromCodePoint(...codePoints)\n\t fromCodePoint: function fromCodePoint(x){ // eslint-disable-line no-unused-vars\n\t var res = []\n\t , aLen = arguments.length\n\t , i = 0\n\t , code;\n\t while(aLen > i){\n\t code = +arguments[i++];\n\t if(toIndex(code, 0x10ffff) !== code)throw RangeError(code + ' is not a valid code point');\n\t res.push(code < 0x10000\n\t ? fromCharCode(code)\n\t : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n\t );\n\t } return res.join('');\n\t }\n\t});\n\n/***/ },\n/* 452 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , context = __webpack_require__(141)\n\t , INCLUDES = 'includes';\n\t\n\t$export($export.P + $export.F * __webpack_require__(127)(INCLUDES), 'String', {\n\t includes: function includes(searchString /*, position = 0 */){\n\t return !!~context(this, searchString, INCLUDES)\n\t .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n/***/ },\n/* 453 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.9 String.prototype.italics()\n\t__webpack_require__(32)('italics', function(createHTML){\n\t return function italics(){\n\t return createHTML(this, 'i', '', '');\n\t }\n\t});\n\n/***/ },\n/* 454 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $at = __webpack_require__(140)(true);\n\t\n\t// 21.1.3.27 String.prototype[@@iterator]()\n\t__webpack_require__(133)(String, 'String', function(iterated){\n\t this._t = String(iterated); // target\n\t this._i = 0; // next index\n\t// 21.1.5.2.1 %StringIteratorPrototype%.next()\n\t}, function(){\n\t var O = this._t\n\t , index = this._i\n\t , point;\n\t if(index >= O.length)return {value: undefined, done: true};\n\t point = $at(O, index);\n\t this._i += point.length;\n\t return {value: point, done: false};\n\t});\n\n/***/ },\n/* 455 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.10 String.prototype.link(url)\n\t__webpack_require__(32)('link', function(createHTML){\n\t return function link(url){\n\t return createHTML(this, 'a', 'href', url);\n\t }\n\t});\n\n/***/ },\n/* 456 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2)\n\t , toIObject = __webpack_require__(33)\n\t , toLength = __webpack_require__(19);\n\t\n\t$export($export.S, 'String', {\n\t // 21.1.2.4 String.raw(callSite, ...substitutions)\n\t raw: function raw(callSite){\n\t var tpl = toIObject(callSite.raw)\n\t , len = toLength(tpl.length)\n\t , aLen = arguments.length\n\t , res = []\n\t , i = 0;\n\t while(len > i){\n\t res.push(String(tpl[i++]));\n\t if(i < aLen)res.push(String(arguments[i]));\n\t } return res.join('');\n\t }\n\t});\n\n/***/ },\n/* 457 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.P, 'String', {\n\t // 21.1.3.13 String.prototype.repeat(count)\n\t repeat: __webpack_require__(142)\n\t});\n\n/***/ },\n/* 458 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.11 String.prototype.small()\n\t__webpack_require__(32)('small', function(createHTML){\n\t return function small(){\n\t return createHTML(this, 'small', '', '');\n\t }\n\t});\n\n/***/ },\n/* 459 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , toLength = __webpack_require__(19)\n\t , context = __webpack_require__(141)\n\t , STARTS_WITH = 'startsWith'\n\t , $startsWith = ''[STARTS_WITH];\n\t\n\t$export($export.P + $export.F * __webpack_require__(127)(STARTS_WITH), 'String', {\n\t startsWith: function startsWith(searchString /*, position = 0 */){\n\t var that = context(this, searchString, STARTS_WITH)\n\t , index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length))\n\t , search = String(searchString);\n\t return $startsWith\n\t ? $startsWith.call(that, search, index)\n\t : that.slice(index, index + search.length) === search;\n\t }\n\t});\n\n/***/ },\n/* 460 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.12 String.prototype.strike()\n\t__webpack_require__(32)('strike', function(createHTML){\n\t return function strike(){\n\t return createHTML(this, 'strike', '', '');\n\t }\n\t});\n\n/***/ },\n/* 461 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.13 String.prototype.sub()\n\t__webpack_require__(32)('sub', function(createHTML){\n\t return function sub(){\n\t return createHTML(this, 'sub', '', '');\n\t }\n\t});\n\n/***/ },\n/* 462 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// B.2.3.14 String.prototype.sup()\n\t__webpack_require__(32)('sup', function(createHTML){\n\t return function sup(){\n\t return createHTML(this, 'sup', '', '');\n\t }\n\t});\n\n/***/ },\n/* 463 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// 21.1.3.25 String.prototype.trim()\n\t__webpack_require__(75)('trim', function($trim){\n\t return function trim(){\n\t return $trim(this, 3);\n\t };\n\t});\n\n/***/ },\n/* 464 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// ECMAScript 6 symbols shim\n\tvar global = __webpack_require__(7)\n\t , has = __webpack_require__(27)\n\t , DESCRIPTORS = __webpack_require__(12)\n\t , $export = __webpack_require__(2)\n\t , redefine = __webpack_require__(31)\n\t , META = __webpack_require__(52).KEY\n\t , $fails = __webpack_require__(8)\n\t , shared = __webpack_require__(102)\n\t , setToStringTag = __webpack_require__(74)\n\t , uid = __webpack_require__(67)\n\t , wks = __webpack_require__(11)\n\t , wksExt = __webpack_require__(203)\n\t , wksDefine = __webpack_require__(146)\n\t , keyOf = __webpack_require__(340)\n\t , enumKeys = __webpack_require__(339)\n\t , isArray = __webpack_require__(131)\n\t , anObject = __webpack_require__(6)\n\t , toIObject = __webpack_require__(33)\n\t , toPrimitive = __webpack_require__(41)\n\t , createDesc = __webpack_require__(53)\n\t , _create = __webpack_require__(61)\n\t , gOPNExt = __webpack_require__(195)\n\t , $GOPD = __webpack_require__(34)\n\t , $DP = __webpack_require__(13)\n\t , $keys = __webpack_require__(63)\n\t , gOPD = $GOPD.f\n\t , dP = $DP.f\n\t , gOPN = gOPNExt.f\n\t , $Symbol = global.Symbol\n\t , $JSON = global.JSON\n\t , _stringify = $JSON && $JSON.stringify\n\t , PROTOTYPE = 'prototype'\n\t , HIDDEN = wks('_hidden')\n\t , TO_PRIMITIVE = wks('toPrimitive')\n\t , isEnum = {}.propertyIsEnumerable\n\t , SymbolRegistry = shared('symbol-registry')\n\t , AllSymbols = shared('symbols')\n\t , OPSymbols = shared('op-symbols')\n\t , ObjectProto = Object[PROTOTYPE]\n\t , USE_NATIVE = typeof $Symbol == 'function'\n\t , QObject = global.QObject;\n\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\tvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\t\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDesc = DESCRIPTORS && $fails(function(){\n\t return _create(dP({}, 'a', {\n\t get: function(){ return dP(this, 'a', {value: 7}).a; }\n\t })).a != 7;\n\t}) ? function(it, key, D){\n\t var protoDesc = gOPD(ObjectProto, key);\n\t if(protoDesc)delete ObjectProto[key];\n\t dP(it, key, D);\n\t if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\n\t} : dP;\n\t\n\tvar wrap = function(tag){\n\t var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n\t sym._k = tag;\n\t return sym;\n\t};\n\t\n\tvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\n\t return typeof it == 'symbol';\n\t} : function(it){\n\t return it instanceof $Symbol;\n\t};\n\t\n\tvar $defineProperty = function defineProperty(it, key, D){\n\t if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\n\t anObject(it);\n\t key = toPrimitive(key, true);\n\t anObject(D);\n\t if(has(AllSymbols, key)){\n\t if(!D.enumerable){\n\t if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\n\t it[HIDDEN][key] = true;\n\t } else {\n\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\n\t D = _create(D, {enumerable: createDesc(0, false)});\n\t } return setSymbolDesc(it, key, D);\n\t } return dP(it, key, D);\n\t};\n\tvar $defineProperties = function defineProperties(it, P){\n\t anObject(it);\n\t var keys = enumKeys(P = toIObject(P))\n\t , i = 0\n\t , l = keys.length\n\t , key;\n\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\n\t return it;\n\t};\n\tvar $create = function create(it, P){\n\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n\t};\n\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\n\t var E = isEnum.call(this, key = toPrimitive(key, true));\n\t if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\n\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n\t};\n\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\n\t it = toIObject(it);\n\t key = toPrimitive(key, true);\n\t if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\n\t var D = gOPD(it, key);\n\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\n\t return D;\n\t};\n\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\n\t var names = gOPN(toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i){\n\t if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\n\t } return result;\n\t};\n\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\n\t var IS_OP = it === ObjectProto\n\t , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i){\n\t if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\n\t } return result;\n\t};\n\t\n\t// 19.4.1.1 Symbol([description])\n\tif(!USE_NATIVE){\n\t $Symbol = function Symbol(){\n\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\n\t var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n\t var $set = function(value){\n\t if(this === ObjectProto)$set.call(OPSymbols, value);\n\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\n\t setSymbolDesc(this, tag, createDesc(1, value));\n\t };\n\t if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\n\t return wrap(tag);\n\t };\n\t redefine($Symbol[PROTOTYPE], 'toString', function toString(){\n\t return this._k;\n\t });\n\t\n\t $GOPD.f = $getOwnPropertyDescriptor;\n\t $DP.f = $defineProperty;\n\t __webpack_require__(62).f = gOPNExt.f = $getOwnPropertyNames;\n\t __webpack_require__(83).f = $propertyIsEnumerable;\n\t __webpack_require__(101).f = $getOwnPropertySymbols;\n\t\n\t if(DESCRIPTORS && !__webpack_require__(60)){\n\t redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n\t }\n\t\n\t wksExt.f = function(name){\n\t return wrap(wks(name));\n\t }\n\t}\n\t\n\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\n\t\n\tfor(var symbols = (\n\t // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n\t).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\n\t\n\tfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\n\t\n\t$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n\t // 19.4.2.1 Symbol.for(key)\n\t 'for': function(key){\n\t return has(SymbolRegistry, key += '')\n\t ? SymbolRegistry[key]\n\t : SymbolRegistry[key] = $Symbol(key);\n\t },\n\t // 19.4.2.5 Symbol.keyFor(sym)\n\t keyFor: function keyFor(key){\n\t if(isSymbol(key))return keyOf(SymbolRegistry, key);\n\t throw TypeError(key + ' is not a symbol!');\n\t },\n\t useSetter: function(){ setter = true; },\n\t useSimple: function(){ setter = false; }\n\t});\n\t\n\t$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n\t // 19.1.2.2 Object.create(O [, Properties])\n\t create: $create,\n\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n\t defineProperty: $defineProperty,\n\t // 19.1.2.3 Object.defineProperties(O, Properties)\n\t defineProperties: $defineProperties,\n\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n\t // 19.1.2.7 Object.getOwnPropertyNames(O)\n\t getOwnPropertyNames: $getOwnPropertyNames,\n\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\n\t getOwnPropertySymbols: $getOwnPropertySymbols\n\t});\n\t\n\t// 24.3.2 JSON.stringify(value [, replacer [, space]])\n\t$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\n\t var S = $Symbol();\n\t // MS Edge converts symbol values to JSON as {}\n\t // WebKit converts symbol values to JSON as null\n\t // V8 throws on boxed symbols\n\t return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\n\t})), 'JSON', {\n\t stringify: function stringify(it){\n\t if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\n\t var args = [it]\n\t , i = 1\n\t , replacer, $replacer;\n\t while(arguments.length > i)args.push(arguments[i++]);\n\t replacer = args[1];\n\t if(typeof replacer == 'function')$replacer = replacer;\n\t if($replacer || !isArray(replacer))replacer = function(key, value){\n\t if($replacer)value = $replacer.call(this, key, value);\n\t if(!isSymbol(value))return value;\n\t };\n\t args[1] = replacer;\n\t return _stringify.apply($JSON, args);\n\t }\n\t});\n\t\n\t// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n\t$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(30)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\n\tsetToStringTag($Symbol, 'Symbol');\n\t// 20.2.1.9 Math[@@toStringTag]\n\tsetToStringTag(Math, 'Math', true);\n\t// 24.3.3 JSON[@@toStringTag]\n\tsetToStringTag(global.JSON, 'JSON', true);\n\n/***/ },\n/* 465 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , $typed = __webpack_require__(103)\n\t , buffer = __webpack_require__(145)\n\t , anObject = __webpack_require__(6)\n\t , toIndex = __webpack_require__(66)\n\t , toLength = __webpack_require__(19)\n\t , isObject = __webpack_require__(9)\n\t , ArrayBuffer = __webpack_require__(7).ArrayBuffer\n\t , speciesConstructor = __webpack_require__(139)\n\t , $ArrayBuffer = buffer.ArrayBuffer\n\t , $DataView = buffer.DataView\n\t , $isView = $typed.ABV && ArrayBuffer.isView\n\t , $slice = $ArrayBuffer.prototype.slice\n\t , VIEW = $typed.VIEW\n\t , ARRAY_BUFFER = 'ArrayBuffer';\n\t\n\t$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), {ArrayBuffer: $ArrayBuffer});\n\t\n\t$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n\t // 24.1.3.1 ArrayBuffer.isView(arg)\n\t isView: function isView(it){\n\t return $isView && $isView(it) || isObject(it) && VIEW in it;\n\t }\n\t});\n\t\n\t$export($export.P + $export.U + $export.F * __webpack_require__(8)(function(){\n\t return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n\t}), ARRAY_BUFFER, {\n\t // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n\t slice: function slice(start, end){\n\t if($slice !== undefined && end === undefined)return $slice.call(anObject(this), start); // FF fix\n\t var len = anObject(this).byteLength\n\t , first = toIndex(start, len)\n\t , final = toIndex(end === undefined ? len : end, len)\n\t , result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first))\n\t , viewS = new $DataView(this)\n\t , viewT = new $DataView(result)\n\t , index = 0;\n\t while(first < final){\n\t viewT.setUint8(index++, viewS.getUint8(first++));\n\t } return result;\n\t }\n\t});\n\t\n\t__webpack_require__(65)(ARRAY_BUFFER);\n\n/***/ },\n/* 466 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2);\n\t$export($export.G + $export.W + $export.F * !__webpack_require__(103).ABV, {\n\t DataView: __webpack_require__(145).DataView\n\t});\n\n/***/ },\n/* 467 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(46)('Float32', 4, function(init){\n\t return function Float32Array(data, byteOffset, length){\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n/***/ },\n/* 468 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(46)('Float64', 8, function(init){\n\t return function Float64Array(data, byteOffset, length){\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n/***/ },\n/* 469 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(46)('Int16', 2, function(init){\n\t return function Int16Array(data, byteOffset, length){\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n/***/ },\n/* 470 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(46)('Int32', 4, function(init){\n\t return function Int32Array(data, byteOffset, length){\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n/***/ },\n/* 471 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(46)('Int8', 1, function(init){\n\t return function Int8Array(data, byteOffset, length){\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n/***/ },\n/* 472 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(46)('Uint16', 2, function(init){\n\t return function Uint16Array(data, byteOffset, length){\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n/***/ },\n/* 473 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(46)('Uint32', 4, function(init){\n\t return function Uint32Array(data, byteOffset, length){\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n/***/ },\n/* 474 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(46)('Uint8', 1, function(init){\n\t return function Uint8Array(data, byteOffset, length){\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n/***/ },\n/* 475 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(46)('Uint8', 1, function(init){\n\t return function Uint8ClampedArray(data, byteOffset, length){\n\t return init(this, data, byteOffset, length);\n\t };\n\t}, true);\n\n/***/ },\n/* 476 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar weak = __webpack_require__(187);\n\t\n\t// 23.4 WeakSet Objects\n\t__webpack_require__(94)('WeakSet', function(get){\n\t return function WeakSet(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n\t}, {\n\t // 23.4.3.1 WeakSet.prototype.add(value)\n\t add: function add(value){\n\t return weak.def(this, value, true);\n\t }\n\t}, weak, false, true);\n\n/***/ },\n/* 477 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// https://github.com/tc39/Array.prototype.includes\n\tvar $export = __webpack_require__(2)\n\t , $includes = __webpack_require__(93)(true);\n\t\n\t$export($export.P, 'Array', {\n\t includes: function includes(el /*, fromIndex = 0 */){\n\t return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\t\n\t__webpack_require__(71)('includes');\n\n/***/ },\n/* 478 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask\n\tvar $export = __webpack_require__(2)\n\t , microtask = __webpack_require__(136)()\n\t , process = __webpack_require__(7).process\n\t , isNode = __webpack_require__(36)(process) == 'process';\n\t\n\t$export($export.G, {\n\t asap: function asap(fn){\n\t var domain = isNode && process.domain;\n\t microtask(domain ? domain.bind(fn) : fn);\n\t }\n\t});\n\n/***/ },\n/* 479 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/ljharb/proposal-is-error\n\tvar $export = __webpack_require__(2)\n\t , cof = __webpack_require__(36);\n\t\n\t$export($export.S, 'Error', {\n\t isError: function isError(it){\n\t return cof(it) === 'Error';\n\t }\n\t});\n\n/***/ },\n/* 480 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/DavidBruant/Map-Set.prototype.toJSON\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.P + $export.R, 'Map', {toJSON: __webpack_require__(186)('Map')});\n\n/***/ },\n/* 481 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {\n\t iaddh: function iaddh(x0, x1, y0, y1){\n\t var $x0 = x0 >>> 0\n\t , $x1 = x1 >>> 0\n\t , $y0 = y0 >>> 0;\n\t return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;\n\t }\n\t});\n\n/***/ },\n/* 482 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {\n\t imulh: function imulh(u, v){\n\t var UINT16 = 0xffff\n\t , $u = +u\n\t , $v = +v\n\t , u0 = $u & UINT16\n\t , v0 = $v & UINT16\n\t , u1 = $u >> 16\n\t , v1 = $v >> 16\n\t , t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n\t return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);\n\t }\n\t});\n\n/***/ },\n/* 483 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {\n\t isubh: function isubh(x0, x1, y0, y1){\n\t var $x0 = x0 >>> 0\n\t , $x1 = x1 >>> 0\n\t , $y0 = y0 >>> 0;\n\t return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;\n\t }\n\t});\n\n/***/ },\n/* 484 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'Math', {\n\t umulh: function umulh(u, v){\n\t var UINT16 = 0xffff\n\t , $u = +u\n\t , $v = +v\n\t , u0 = $u & UINT16\n\t , v0 = $v & UINT16\n\t , u1 = $u >>> 16\n\t , v1 = $v >>> 16\n\t , t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n\t return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);\n\t }\n\t});\n\n/***/ },\n/* 485 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , toObject = __webpack_require__(22)\n\t , aFunction = __webpack_require__(29)\n\t , $defineProperty = __webpack_require__(13);\n\t\n\t// B.2.2.2 Object.prototype.__defineGetter__(P, getter)\n\t__webpack_require__(12) && $export($export.P + __webpack_require__(100), 'Object', {\n\t __defineGetter__: function __defineGetter__(P, getter){\n\t $defineProperty.f(toObject(this), P, {get: aFunction(getter), enumerable: true, configurable: true});\n\t }\n\t});\n\n/***/ },\n/* 486 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , toObject = __webpack_require__(22)\n\t , aFunction = __webpack_require__(29)\n\t , $defineProperty = __webpack_require__(13);\n\t\n\t// B.2.2.3 Object.prototype.__defineSetter__(P, setter)\n\t__webpack_require__(12) && $export($export.P + __webpack_require__(100), 'Object', {\n\t __defineSetter__: function __defineSetter__(P, setter){\n\t $defineProperty.f(toObject(this), P, {set: aFunction(setter), enumerable: true, configurable: true});\n\t }\n\t});\n\n/***/ },\n/* 487 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/tc39/proposal-object-values-entries\n\tvar $export = __webpack_require__(2)\n\t , $entries = __webpack_require__(197)(true);\n\t\n\t$export($export.S, 'Object', {\n\t entries: function entries(it){\n\t return $entries(it);\n\t }\n\t});\n\n/***/ },\n/* 488 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/tc39/proposal-object-getownpropertydescriptors\n\tvar $export = __webpack_require__(2)\n\t , ownKeys = __webpack_require__(198)\n\t , toIObject = __webpack_require__(33)\n\t , gOPD = __webpack_require__(34)\n\t , createProperty = __webpack_require__(124);\n\t\n\t$export($export.S, 'Object', {\n\t getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object){\n\t var O = toIObject(object)\n\t , getDesc = gOPD.f\n\t , keys = ownKeys(O)\n\t , result = {}\n\t , i = 0\n\t , key;\n\t while(keys.length > i)createProperty(result, key = keys[i++], getDesc(O, key));\n\t return result;\n\t }\n\t});\n\n/***/ },\n/* 489 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , toObject = __webpack_require__(22)\n\t , toPrimitive = __webpack_require__(41)\n\t , getPrototypeOf = __webpack_require__(35)\n\t , getOwnPropertyDescriptor = __webpack_require__(34).f;\n\t\n\t// B.2.2.4 Object.prototype.__lookupGetter__(P)\n\t__webpack_require__(12) && $export($export.P + __webpack_require__(100), 'Object', {\n\t __lookupGetter__: function __lookupGetter__(P){\n\t var O = toObject(this)\n\t , K = toPrimitive(P, true)\n\t , D;\n\t do {\n\t if(D = getOwnPropertyDescriptor(O, K))return D.get;\n\t } while(O = getPrototypeOf(O));\n\t }\n\t});\n\n/***/ },\n/* 490 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $export = __webpack_require__(2)\n\t , toObject = __webpack_require__(22)\n\t , toPrimitive = __webpack_require__(41)\n\t , getPrototypeOf = __webpack_require__(35)\n\t , getOwnPropertyDescriptor = __webpack_require__(34).f;\n\t\n\t// B.2.2.5 Object.prototype.__lookupSetter__(P)\n\t__webpack_require__(12) && $export($export.P + __webpack_require__(100), 'Object', {\n\t __lookupSetter__: function __lookupSetter__(P){\n\t var O = toObject(this)\n\t , K = toPrimitive(P, true)\n\t , D;\n\t do {\n\t if(D = getOwnPropertyDescriptor(O, K))return D.set;\n\t } while(O = getPrototypeOf(O));\n\t }\n\t});\n\n/***/ },\n/* 491 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/tc39/proposal-object-values-entries\n\tvar $export = __webpack_require__(2)\n\t , $values = __webpack_require__(197)(false);\n\t\n\t$export($export.S, 'Object', {\n\t values: function values(it){\n\t return $values(it);\n\t }\n\t});\n\n/***/ },\n/* 492 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// https://github.com/zenparsing/es-observable\n\tvar $export = __webpack_require__(2)\n\t , global = __webpack_require__(7)\n\t , core = __webpack_require__(43)\n\t , microtask = __webpack_require__(136)()\n\t , OBSERVABLE = __webpack_require__(11)('observable')\n\t , aFunction = __webpack_require__(29)\n\t , anObject = __webpack_require__(6)\n\t , anInstance = __webpack_require__(59)\n\t , redefineAll = __webpack_require__(64)\n\t , hide = __webpack_require__(30)\n\t , forOf = __webpack_require__(72)\n\t , RETURN = forOf.RETURN;\n\t\n\tvar getMethod = function(fn){\n\t return fn == null ? undefined : aFunction(fn);\n\t};\n\t\n\tvar cleanupSubscription = function(subscription){\n\t var cleanup = subscription._c;\n\t if(cleanup){\n\t subscription._c = undefined;\n\t cleanup();\n\t }\n\t};\n\t\n\tvar subscriptionClosed = function(subscription){\n\t return subscription._o === undefined;\n\t};\n\t\n\tvar closeSubscription = function(subscription){\n\t if(!subscriptionClosed(subscription)){\n\t subscription._o = undefined;\n\t cleanupSubscription(subscription);\n\t }\n\t};\n\t\n\tvar Subscription = function(observer, subscriber){\n\t anObject(observer);\n\t this._c = undefined;\n\t this._o = observer;\n\t observer = new SubscriptionObserver(this);\n\t try {\n\t var cleanup = subscriber(observer)\n\t , subscription = cleanup;\n\t if(cleanup != null){\n\t if(typeof cleanup.unsubscribe === 'function')cleanup = function(){ subscription.unsubscribe(); };\n\t else aFunction(cleanup);\n\t this._c = cleanup;\n\t }\n\t } catch(e){\n\t observer.error(e);\n\t return;\n\t } if(subscriptionClosed(this))cleanupSubscription(this);\n\t};\n\t\n\tSubscription.prototype = redefineAll({}, {\n\t unsubscribe: function unsubscribe(){ closeSubscription(this); }\n\t});\n\t\n\tvar SubscriptionObserver = function(subscription){\n\t this._s = subscription;\n\t};\n\t\n\tSubscriptionObserver.prototype = redefineAll({}, {\n\t next: function next(value){\n\t var subscription = this._s;\n\t if(!subscriptionClosed(subscription)){\n\t var observer = subscription._o;\n\t try {\n\t var m = getMethod(observer.next);\n\t if(m)return m.call(observer, value);\n\t } catch(e){\n\t try {\n\t closeSubscription(subscription);\n\t } finally {\n\t throw e;\n\t }\n\t }\n\t }\n\t },\n\t error: function error(value){\n\t var subscription = this._s;\n\t if(subscriptionClosed(subscription))throw value;\n\t var observer = subscription._o;\n\t subscription._o = undefined;\n\t try {\n\t var m = getMethod(observer.error);\n\t if(!m)throw value;\n\t value = m.call(observer, value);\n\t } catch(e){\n\t try {\n\t cleanupSubscription(subscription);\n\t } finally {\n\t throw e;\n\t }\n\t } cleanupSubscription(subscription);\n\t return value;\n\t },\n\t complete: function complete(value){\n\t var subscription = this._s;\n\t if(!subscriptionClosed(subscription)){\n\t var observer = subscription._o;\n\t subscription._o = undefined;\n\t try {\n\t var m = getMethod(observer.complete);\n\t value = m ? m.call(observer, value) : undefined;\n\t } catch(e){\n\t try {\n\t cleanupSubscription(subscription);\n\t } finally {\n\t throw e;\n\t }\n\t } cleanupSubscription(subscription);\n\t return value;\n\t }\n\t }\n\t});\n\t\n\tvar $Observable = function Observable(subscriber){\n\t anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);\n\t};\n\t\n\tredefineAll($Observable.prototype, {\n\t subscribe: function subscribe(observer){\n\t return new Subscription(observer, this._f);\n\t },\n\t forEach: function forEach(fn){\n\t var that = this;\n\t return new (core.Promise || global.Promise)(function(resolve, reject){\n\t aFunction(fn);\n\t var subscription = that.subscribe({\n\t next : function(value){\n\t try {\n\t return fn(value);\n\t } catch(e){\n\t reject(e);\n\t subscription.unsubscribe();\n\t }\n\t },\n\t error: reject,\n\t complete: resolve\n\t });\n\t });\n\t }\n\t});\n\t\n\tredefineAll($Observable, {\n\t from: function from(x){\n\t var C = typeof this === 'function' ? this : $Observable;\n\t var method = getMethod(anObject(x)[OBSERVABLE]);\n\t if(method){\n\t var observable = anObject(method.call(x));\n\t return observable.constructor === C ? observable : new C(function(observer){\n\t return observable.subscribe(observer);\n\t });\n\t }\n\t return new C(function(observer){\n\t var done = false;\n\t microtask(function(){\n\t if(!done){\n\t try {\n\t if(forOf(x, false, function(it){\n\t observer.next(it);\n\t if(done)return RETURN;\n\t }) === RETURN)return;\n\t } catch(e){\n\t if(done)throw e;\n\t observer.error(e);\n\t return;\n\t } observer.complete();\n\t }\n\t });\n\t return function(){ done = true; };\n\t });\n\t },\n\t of: function of(){\n\t for(var i = 0, l = arguments.length, items = Array(l); i < l;)items[i] = arguments[i++];\n\t return new (typeof this === 'function' ? this : $Observable)(function(observer){\n\t var done = false;\n\t microtask(function(){\n\t if(!done){\n\t for(var i = 0; i < items.length; ++i){\n\t observer.next(items[i]);\n\t if(done)return;\n\t } observer.complete();\n\t }\n\t });\n\t return function(){ done = true; };\n\t });\n\t }\n\t});\n\t\n\thide($Observable.prototype, OBSERVABLE, function(){ return this; });\n\t\n\t$export($export.G, {Observable: $Observable});\n\t\n\t__webpack_require__(65)('Observable');\n\n/***/ },\n/* 493 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar metadata = __webpack_require__(45)\n\t , anObject = __webpack_require__(6)\n\t , toMetaKey = metadata.key\n\t , ordinaryDefineOwnMetadata = metadata.set;\n\t\n\tmetadata.exp({defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey){\n\t ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey));\n\t}});\n\n/***/ },\n/* 494 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar metadata = __webpack_require__(45)\n\t , anObject = __webpack_require__(6)\n\t , toMetaKey = metadata.key\n\t , getOrCreateMetadataMap = metadata.map\n\t , store = metadata.store;\n\t\n\tmetadata.exp({deleteMetadata: function deleteMetadata(metadataKey, target /*, targetKey */){\n\t var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2])\n\t , metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);\n\t if(metadataMap === undefined || !metadataMap['delete'](metadataKey))return false;\n\t if(metadataMap.size)return true;\n\t var targetMetadata = store.get(target);\n\t targetMetadata['delete'](targetKey);\n\t return !!targetMetadata.size || store['delete'](target);\n\t}});\n\n/***/ },\n/* 495 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Set = __webpack_require__(206)\n\t , from = __webpack_require__(182)\n\t , metadata = __webpack_require__(45)\n\t , anObject = __webpack_require__(6)\n\t , getPrototypeOf = __webpack_require__(35)\n\t , ordinaryOwnMetadataKeys = metadata.keys\n\t , toMetaKey = metadata.key;\n\t\n\tvar ordinaryMetadataKeys = function(O, P){\n\t var oKeys = ordinaryOwnMetadataKeys(O, P)\n\t , parent = getPrototypeOf(O);\n\t if(parent === null)return oKeys;\n\t var pKeys = ordinaryMetadataKeys(parent, P);\n\t return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;\n\t};\n\t\n\tmetadata.exp({getMetadataKeys: function getMetadataKeys(target /*, targetKey */){\n\t return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n\t}});\n\n/***/ },\n/* 496 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar metadata = __webpack_require__(45)\n\t , anObject = __webpack_require__(6)\n\t , getPrototypeOf = __webpack_require__(35)\n\t , ordinaryHasOwnMetadata = metadata.has\n\t , ordinaryGetOwnMetadata = metadata.get\n\t , toMetaKey = metadata.key;\n\t\n\tvar ordinaryGetMetadata = function(MetadataKey, O, P){\n\t var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n\t if(hasOwn)return ordinaryGetOwnMetadata(MetadataKey, O, P);\n\t var parent = getPrototypeOf(O);\n\t return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;\n\t};\n\t\n\tmetadata.exp({getMetadata: function getMetadata(metadataKey, target /*, targetKey */){\n\t return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n\t}});\n\n/***/ },\n/* 497 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar metadata = __webpack_require__(45)\n\t , anObject = __webpack_require__(6)\n\t , ordinaryOwnMetadataKeys = metadata.keys\n\t , toMetaKey = metadata.key;\n\t\n\tmetadata.exp({getOwnMetadataKeys: function getOwnMetadataKeys(target /*, targetKey */){\n\t return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n\t}});\n\n/***/ },\n/* 498 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar metadata = __webpack_require__(45)\n\t , anObject = __webpack_require__(6)\n\t , ordinaryGetOwnMetadata = metadata.get\n\t , toMetaKey = metadata.key;\n\t\n\tmetadata.exp({getOwnMetadata: function getOwnMetadata(metadataKey, target /*, targetKey */){\n\t return ordinaryGetOwnMetadata(metadataKey, anObject(target)\n\t , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n\t}});\n\n/***/ },\n/* 499 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar metadata = __webpack_require__(45)\n\t , anObject = __webpack_require__(6)\n\t , getPrototypeOf = __webpack_require__(35)\n\t , ordinaryHasOwnMetadata = metadata.has\n\t , toMetaKey = metadata.key;\n\t\n\tvar ordinaryHasMetadata = function(MetadataKey, O, P){\n\t var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n\t if(hasOwn)return true;\n\t var parent = getPrototypeOf(O);\n\t return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;\n\t};\n\t\n\tmetadata.exp({hasMetadata: function hasMetadata(metadataKey, target /*, targetKey */){\n\t return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n\t}});\n\n/***/ },\n/* 500 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar metadata = __webpack_require__(45)\n\t , anObject = __webpack_require__(6)\n\t , ordinaryHasOwnMetadata = metadata.has\n\t , toMetaKey = metadata.key;\n\t\n\tmetadata.exp({hasOwnMetadata: function hasOwnMetadata(metadataKey, target /*, targetKey */){\n\t return ordinaryHasOwnMetadata(metadataKey, anObject(target)\n\t , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n\t}});\n\n/***/ },\n/* 501 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar metadata = __webpack_require__(45)\n\t , anObject = __webpack_require__(6)\n\t , aFunction = __webpack_require__(29)\n\t , toMetaKey = metadata.key\n\t , ordinaryDefineOwnMetadata = metadata.set;\n\t\n\tmetadata.exp({metadata: function metadata(metadataKey, metadataValue){\n\t return function decorator(target, targetKey){\n\t ordinaryDefineOwnMetadata(\n\t metadataKey, metadataValue,\n\t (targetKey !== undefined ? anObject : aFunction)(target),\n\t toMetaKey(targetKey)\n\t );\n\t };\n\t}});\n\n/***/ },\n/* 502 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/DavidBruant/Map-Set.prototype.toJSON\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.P + $export.R, 'Set', {toJSON: __webpack_require__(186)('Set')});\n\n/***/ },\n/* 503 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// https://github.com/mathiasbynens/String.prototype.at\n\tvar $export = __webpack_require__(2)\n\t , $at = __webpack_require__(140)(true);\n\t\n\t$export($export.P, 'String', {\n\t at: function at(pos){\n\t return $at(this, pos);\n\t }\n\t});\n\n/***/ },\n/* 504 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// https://tc39.github.io/String.prototype.matchAll/\n\tvar $export = __webpack_require__(2)\n\t , defined = __webpack_require__(37)\n\t , toLength = __webpack_require__(19)\n\t , isRegExp = __webpack_require__(98)\n\t , getFlags = __webpack_require__(96)\n\t , RegExpProto = RegExp.prototype;\n\t\n\tvar $RegExpStringIterator = function(regexp, string){\n\t this._r = regexp;\n\t this._s = string;\n\t};\n\t\n\t__webpack_require__(132)($RegExpStringIterator, 'RegExp String', function next(){\n\t var match = this._r.exec(this._s);\n\t return {value: match, done: match === null};\n\t});\n\t\n\t$export($export.P, 'String', {\n\t matchAll: function matchAll(regexp){\n\t defined(this);\n\t if(!isRegExp(regexp))throw TypeError(regexp + ' is not a regexp!');\n\t var S = String(this)\n\t , flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp)\n\t , rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);\n\t rx.lastIndex = toLength(regexp.lastIndex);\n\t return new $RegExpStringIterator(rx, S);\n\t }\n\t});\n\n/***/ },\n/* 505 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// https://github.com/tc39/proposal-string-pad-start-end\n\tvar $export = __webpack_require__(2)\n\t , $pad = __webpack_require__(202);\n\t\n\t$export($export.P, 'String', {\n\t padEnd: function padEnd(maxLength /*, fillString = ' ' */){\n\t return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n\t }\n\t});\n\n/***/ },\n/* 506 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// https://github.com/tc39/proposal-string-pad-start-end\n\tvar $export = __webpack_require__(2)\n\t , $pad = __webpack_require__(202);\n\t\n\t$export($export.P, 'String', {\n\t padStart: function padStart(maxLength /*, fillString = ' ' */){\n\t return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n\t }\n\t});\n\n/***/ },\n/* 507 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n\t__webpack_require__(75)('trimLeft', function($trim){\n\t return function trimLeft(){\n\t return $trim(this, 1);\n\t };\n\t}, 'trimStart');\n\n/***/ },\n/* 508 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n\t__webpack_require__(75)('trimRight', function($trim){\n\t return function trimRight(){\n\t return $trim(this, 2);\n\t };\n\t}, 'trimEnd');\n\n/***/ },\n/* 509 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(146)('asyncIterator');\n\n/***/ },\n/* 510 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(146)('observable');\n\n/***/ },\n/* 511 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/ljharb/proposal-global\n\tvar $export = __webpack_require__(2);\n\t\n\t$export($export.S, 'System', {global: __webpack_require__(7)});\n\n/***/ },\n/* 512 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $iterators = __webpack_require__(148)\n\t , redefine = __webpack_require__(31)\n\t , global = __webpack_require__(7)\n\t , hide = __webpack_require__(30)\n\t , Iterators = __webpack_require__(73)\n\t , wks = __webpack_require__(11)\n\t , ITERATOR = wks('iterator')\n\t , TO_STRING_TAG = wks('toStringTag')\n\t , ArrayValues = Iterators.Array;\n\t\n\tfor(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){\n\t var NAME = collections[i]\n\t , Collection = global[NAME]\n\t , proto = Collection && Collection.prototype\n\t , key;\n\t if(proto){\n\t if(!proto[ITERATOR])hide(proto, ITERATOR, ArrayValues);\n\t if(!proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME);\n\t Iterators[NAME] = ArrayValues;\n\t for(key in $iterators)if(!proto[key])redefine(proto, key, $iterators[key], true);\n\t }\n\t}\n\n/***/ },\n/* 513 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(2)\n\t , $task = __webpack_require__(144);\n\t$export($export.G + $export.B, {\n\t setImmediate: $task.set,\n\t clearImmediate: $task.clear\n\t});\n\n/***/ },\n/* 514 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// ie9- setTimeout & setInterval additional parameters fix\n\tvar global = __webpack_require__(7)\n\t , $export = __webpack_require__(2)\n\t , invoke = __webpack_require__(97)\n\t , partial = __webpack_require__(341)\n\t , navigator = global.navigator\n\t , MSIE = !!navigator && /MSIE .\\./.test(navigator.userAgent); // <- dirty ie9- check\n\tvar wrap = function(set){\n\t return MSIE ? function(fn, time /*, ...args */){\n\t return set(invoke(\n\t partial,\n\t [].slice.call(arguments, 2),\n\t typeof fn == 'function' ? fn : Function(fn)\n\t ), time);\n\t } : set;\n\t};\n\t$export($export.G + $export.B + $export.F * MSIE, {\n\t setTimeout: wrap(global.setTimeout),\n\t setInterval: wrap(global.setInterval)\n\t});\n\n/***/ },\n/* 515 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(464);\n\t__webpack_require__(403);\n\t__webpack_require__(405);\n\t__webpack_require__(404);\n\t__webpack_require__(407);\n\t__webpack_require__(409);\n\t__webpack_require__(414);\n\t__webpack_require__(408);\n\t__webpack_require__(406);\n\t__webpack_require__(416);\n\t__webpack_require__(415);\n\t__webpack_require__(411);\n\t__webpack_require__(412);\n\t__webpack_require__(410);\n\t__webpack_require__(402);\n\t__webpack_require__(413);\n\t__webpack_require__(417);\n\t__webpack_require__(418);\n\t__webpack_require__(370);\n\t__webpack_require__(372);\n\t__webpack_require__(371);\n\t__webpack_require__(420);\n\t__webpack_require__(419);\n\t__webpack_require__(390);\n\t__webpack_require__(400);\n\t__webpack_require__(401);\n\t__webpack_require__(391);\n\t__webpack_require__(392);\n\t__webpack_require__(393);\n\t__webpack_require__(394);\n\t__webpack_require__(395);\n\t__webpack_require__(396);\n\t__webpack_require__(397);\n\t__webpack_require__(398);\n\t__webpack_require__(399);\n\t__webpack_require__(373);\n\t__webpack_require__(374);\n\t__webpack_require__(375);\n\t__webpack_require__(376);\n\t__webpack_require__(377);\n\t__webpack_require__(378);\n\t__webpack_require__(379);\n\t__webpack_require__(380);\n\t__webpack_require__(381);\n\t__webpack_require__(382);\n\t__webpack_require__(383);\n\t__webpack_require__(384);\n\t__webpack_require__(385);\n\t__webpack_require__(386);\n\t__webpack_require__(387);\n\t__webpack_require__(388);\n\t__webpack_require__(389);\n\t__webpack_require__(451);\n\t__webpack_require__(456);\n\t__webpack_require__(463);\n\t__webpack_require__(454);\n\t__webpack_require__(446);\n\t__webpack_require__(447);\n\t__webpack_require__(452);\n\t__webpack_require__(457);\n\t__webpack_require__(459);\n\t__webpack_require__(442);\n\t__webpack_require__(443);\n\t__webpack_require__(444);\n\t__webpack_require__(445);\n\t__webpack_require__(448);\n\t__webpack_require__(449);\n\t__webpack_require__(450);\n\t__webpack_require__(453);\n\t__webpack_require__(455);\n\t__webpack_require__(458);\n\t__webpack_require__(460);\n\t__webpack_require__(461);\n\t__webpack_require__(462);\n\t__webpack_require__(365);\n\t__webpack_require__(367);\n\t__webpack_require__(366);\n\t__webpack_require__(369);\n\t__webpack_require__(368);\n\t__webpack_require__(354);\n\t__webpack_require__(352);\n\t__webpack_require__(358);\n\t__webpack_require__(355);\n\t__webpack_require__(361);\n\t__webpack_require__(363);\n\t__webpack_require__(351);\n\t__webpack_require__(357);\n\t__webpack_require__(348);\n\t__webpack_require__(362);\n\t__webpack_require__(346);\n\t__webpack_require__(360);\n\t__webpack_require__(359);\n\t__webpack_require__(353);\n\t__webpack_require__(356);\n\t__webpack_require__(345);\n\t__webpack_require__(347);\n\t__webpack_require__(350);\n\t__webpack_require__(349);\n\t__webpack_require__(364);\n\t__webpack_require__(148);\n\t__webpack_require__(436);\n\t__webpack_require__(441);\n\t__webpack_require__(205);\n\t__webpack_require__(437);\n\t__webpack_require__(438);\n\t__webpack_require__(439);\n\t__webpack_require__(440);\n\t__webpack_require__(421);\n\t__webpack_require__(204);\n\t__webpack_require__(206);\n\t__webpack_require__(207);\n\t__webpack_require__(476);\n\t__webpack_require__(465);\n\t__webpack_require__(466);\n\t__webpack_require__(471);\n\t__webpack_require__(474);\n\t__webpack_require__(475);\n\t__webpack_require__(469);\n\t__webpack_require__(472);\n\t__webpack_require__(470);\n\t__webpack_require__(473);\n\t__webpack_require__(467);\n\t__webpack_require__(468);\n\t__webpack_require__(422);\n\t__webpack_require__(423);\n\t__webpack_require__(424);\n\t__webpack_require__(425);\n\t__webpack_require__(426);\n\t__webpack_require__(429);\n\t__webpack_require__(427);\n\t__webpack_require__(428);\n\t__webpack_require__(430);\n\t__webpack_require__(431);\n\t__webpack_require__(432);\n\t__webpack_require__(433);\n\t__webpack_require__(435);\n\t__webpack_require__(434);\n\t__webpack_require__(477);\n\t__webpack_require__(503);\n\t__webpack_require__(506);\n\t__webpack_require__(505);\n\t__webpack_require__(507);\n\t__webpack_require__(508);\n\t__webpack_require__(504);\n\t__webpack_require__(509);\n\t__webpack_require__(510);\n\t__webpack_require__(488);\n\t__webpack_require__(491);\n\t__webpack_require__(487);\n\t__webpack_require__(485);\n\t__webpack_require__(486);\n\t__webpack_require__(489);\n\t__webpack_require__(490);\n\t__webpack_require__(480);\n\t__webpack_require__(502);\n\t__webpack_require__(511);\n\t__webpack_require__(479);\n\t__webpack_require__(481);\n\t__webpack_require__(483);\n\t__webpack_require__(482);\n\t__webpack_require__(484);\n\t__webpack_require__(493);\n\t__webpack_require__(494);\n\t__webpack_require__(496);\n\t__webpack_require__(495);\n\t__webpack_require__(498);\n\t__webpack_require__(497);\n\t__webpack_require__(499);\n\t__webpack_require__(500);\n\t__webpack_require__(501);\n\t__webpack_require__(478);\n\t__webpack_require__(492);\n\t__webpack_require__(514);\n\t__webpack_require__(513);\n\t__webpack_require__(512);\n\tmodule.exports = __webpack_require__(43);\n\n/***/ },\n/* 516 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) {\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else if (typeof exports === 'object') {\n\t module.exports = factory();\n\t } else {\n\t root.deepmerge = factory();\n\t }\n\t}(this, function () {\n\t\n\tfunction isMergeableObject(val) {\n\t var nonNullObject = val && typeof val === 'object'\n\t\n\t return nonNullObject\n\t && Object.prototype.toString.call(val) !== '[object RegExp]'\n\t && Object.prototype.toString.call(val) !== '[object Date]'\n\t}\n\t\n\tfunction emptyTarget(val) {\n\t return Array.isArray(val) ? [] : {}\n\t}\n\t\n\tfunction cloneIfNecessary(value, optionsArgument) {\n\t var clone = optionsArgument && optionsArgument.clone === true\n\t return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value\n\t}\n\t\n\tfunction defaultArrayMerge(target, source, optionsArgument) {\n\t var destination = target.slice()\n\t source.forEach(function(e, i) {\n\t if (typeof destination[i] === 'undefined') {\n\t destination[i] = cloneIfNecessary(e, optionsArgument)\n\t } else if (isMergeableObject(e)) {\n\t destination[i] = deepmerge(target[i], e, optionsArgument)\n\t } else if (target.indexOf(e) === -1) {\n\t destination.push(cloneIfNecessary(e, optionsArgument))\n\t }\n\t })\n\t return destination\n\t}\n\t\n\tfunction mergeObject(target, source, optionsArgument) {\n\t var destination = {}\n\t if (isMergeableObject(target)) {\n\t Object.keys(target).forEach(function (key) {\n\t destination[key] = cloneIfNecessary(target[key], optionsArgument)\n\t })\n\t }\n\t Object.keys(source).forEach(function (key) {\n\t if (!isMergeableObject(source[key]) || !target[key]) {\n\t destination[key] = cloneIfNecessary(source[key], optionsArgument)\n\t } else {\n\t destination[key] = deepmerge(target[key], source[key], optionsArgument)\n\t }\n\t })\n\t return destination\n\t}\n\t\n\tfunction deepmerge(target, source, optionsArgument) {\n\t var array = Array.isArray(source);\n\t var options = optionsArgument || { arrayMerge: defaultArrayMerge }\n\t var arrayMerge = options.arrayMerge || defaultArrayMerge\n\t\n\t if (array) {\n\t return Array.isArray(target) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument)\n\t } else {\n\t return mergeObject(target, source, optionsArgument)\n\t }\n\t}\n\t\n\tdeepmerge.all = function deepmergeAll(array, optionsArgument) {\n\t if (!Array.isArray(array) || array.length < 2) {\n\t throw new Error('first argument should be an array with at least two elements')\n\t }\n\t\n\t // we are sure there are at least 2 values, so it is safe to have no initial value\n\t return array.reduce(function(prev, next) {\n\t return deepmerge(prev, next, optionsArgument)\n\t })\n\t}\n\t\n\treturn deepmerge\n\t\n\t}));\n\n\n/***/ },\n/* 517 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Export echarts as CommonJS module\n\t */\n\tmodule.exports = __webpack_require__(3);\n\t\n\t// Import all charts and components\n\t__webpack_require__(568);\n\t__webpack_require__(519);\n\t__webpack_require__(588);\n\t__webpack_require__(603);\n\t__webpack_require__(593);\n\t\n\t__webpack_require__(577);\n\t__webpack_require__(606);\n\t__webpack_require__(545);\n\t__webpack_require__(541);\n\t__webpack_require__(537);\n\t__webpack_require__(584);\n\t__webpack_require__(598);\n\t__webpack_require__(523);\n\t__webpack_require__(528);\n\t__webpack_require__(534);\n\t__webpack_require__(573);\n\t__webpack_require__(558);\n\t\n\t__webpack_require__(640);\n\t__webpack_require__(105);\n\t__webpack_require__(641);\n\t__webpack_require__(680);\n\t__webpack_require__(656);\n\t__webpack_require__(638);\n\t__webpack_require__(225);\n\t__webpack_require__(660);\n\t__webpack_require__(621);\n\t\n\t__webpack_require__(670);\n\t\n\t__webpack_require__(628);\n\t__webpack_require__(684);\n\t\n\t__webpack_require__(648);\n\t__webpack_require__(647);\n\t__webpack_require__(646);\n\t\n\t__webpack_require__(661);\n\t__webpack_require__(671);\n\t\n\t__webpack_require__(822);\n\n\n/***/ },\n/* 518 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var echartsAPIList = [\n\t 'getDom', 'getZr', 'getWidth', 'getHeight', 'dispatchAction', 'isDisposed',\n\t 'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption'\n\t ];\n\t\n\t function ExtensionAPI(chartInstance) {\n\t zrUtil.each(echartsAPIList, function (name) {\n\t this[name] = zrUtil.bind(chartInstance[name], chartInstance);\n\t }, this);\n\t }\n\t\n\t module.exports = ExtensionAPI;\n\n\n/***/ },\n/* 519 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t __webpack_require__(237);\n\t\n\t __webpack_require__(520);\n\t __webpack_require__(521);\n\t\n\t var barLayoutGrid = __webpack_require__(721);\n\t var echarts = __webpack_require__(3);\n\t\n\t echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'bar'));\n\t // Visual coding for legend\n\t echarts.registerVisual(function (ecModel) {\n\t ecModel.eachSeriesByType('bar', function (seriesModel) {\n\t var data = seriesModel.getData();\n\t data.setVisual('legendSymbol', 'roundRect');\n\t });\n\t });\n\t\n\t // In case developer forget to include grid component\n\t __webpack_require__(105);\n\n\n/***/ },\n/* 520 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var SeriesModel = __webpack_require__(26);\n\t var createListFromArray = __webpack_require__(76);\n\t\n\t module.exports = SeriesModel.extend({\n\t\n\t type: 'series.bar',\n\t\n\t dependencies: ['grid', 'polar'],\n\t\n\t getInitialData: function (option, ecModel) {\n\t if (__DEV__) {\n\t var coordSys = option.coordinateSystem;\n\t if (coordSys !== 'cartesian2d') {\n\t throw new Error('Bar only support cartesian2d coordinateSystem');\n\t }\n\t }\n\t return createListFromArray(option.data, this, ecModel);\n\t },\n\t\n\t getMarkerPosition: function (value) {\n\t var coordSys = this.coordinateSystem;\n\t if (coordSys) {\n\t // PENDING if clamp ?\n\t var pt = coordSys.dataToPoint(value, true);\n\t var data = this.getData();\n\t var offset = data.getLayout('offset');\n\t var size = data.getLayout('size');\n\t var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1;\n\t pt[offsetIndex] += offset + size / 2;\n\t return pt;\n\t }\n\t return [NaN, NaN];\n\t },\n\t\n\t brushSelector: 'rect',\n\t\n\t defaultOption: {\n\t zlevel: 0, // 一级层叠\n\t z: 2, // 二级层叠\n\t coordinateSystem: 'cartesian2d',\n\t legendHoverLink: true,\n\t // stack: null\n\t\n\t // Cartesian coordinate system\n\t // xAxisIndex: 0,\n\t // yAxisIndex: 0,\n\t\n\t // 最小高度改为0\n\t barMinHeight: 0,\n\t\n\t // barMaxWidth: null,\n\t // 默认自适应\n\t // barWidth: null,\n\t // 柱间距离,默认为柱形宽度的30%,可设固定值\n\t // barGap: '30%',\n\t // 类目间柱形距离,默认为类目间距的20%,可设固定值\n\t // barCategoryGap: '20%',\n\t // label: {\n\t // normal: {\n\t // show: false\n\t // }\n\t // },\n\t itemStyle: {\n\t normal: {\n\t // color: '各异'\n\t },\n\t emphasis: {}\n\t }\n\t }\n\t });\n\n\n/***/ },\n/* 521 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t\n\t zrUtil.extend(__webpack_require__(21).prototype, __webpack_require__(522));\n\t\n\t function fixLayoutWithLineWidth(layout, lineWidth) {\n\t var signX = layout.width > 0 ? 1 : -1;\n\t var signY = layout.height > 0 ? 1 : -1;\n\t // In case width or height are too small.\n\t lineWidth = Math.min(lineWidth, Math.abs(layout.width), Math.abs(layout.height));\n\t layout.x += signX * lineWidth / 2;\n\t layout.y += signY * lineWidth / 2;\n\t layout.width -= signX * lineWidth;\n\t layout.height -= signY * lineWidth;\n\t }\n\t\n\t module.exports = __webpack_require__(3).extendChartView({\n\t\n\t type: 'bar',\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var coordinateSystemType = seriesModel.get('coordinateSystem');\n\t\n\t if (coordinateSystemType === 'cartesian2d') {\n\t this._renderOnCartesian(seriesModel, ecModel, api);\n\t }\n\t\n\t return this.group;\n\t },\n\t\n\t dispose: zrUtil.noop,\n\t\n\t _renderOnCartesian: function (seriesModel, ecModel, api) {\n\t var group = this.group;\n\t var data = seriesModel.getData();\n\t var oldData = this._data;\n\t\n\t var cartesian = seriesModel.coordinateSystem;\n\t var baseAxis = cartesian.getBaseAxis();\n\t var isHorizontal = baseAxis.isHorizontal();\n\t\n\t var enableAnimation = seriesModel.get('animation');\n\t\n\t var barBorderWidthQuery = ['itemStyle', 'normal', 'barBorderWidth'];\n\t\n\t function createRect(dataIndex, isUpdate) {\n\t var layout = data.getItemLayout(dataIndex);\n\t var lineWidth = data.getItemModel(dataIndex).get(barBorderWidthQuery) || 0;\n\t fixLayoutWithLineWidth(layout, lineWidth);\n\t\n\t var rect = new graphic.Rect({\n\t shape: zrUtil.extend({}, layout)\n\t });\n\t // Animation\n\t if (enableAnimation) {\n\t var rectShape = rect.shape;\n\t var animateProperty = isHorizontal ? 'height' : 'width';\n\t var animateTarget = {};\n\t rectShape[animateProperty] = 0;\n\t animateTarget[animateProperty] = layout[animateProperty];\n\t graphic[isUpdate? 'updateProps' : 'initProps'](rect, {\n\t shape: animateTarget\n\t }, seriesModel, dataIndex);\n\t }\n\t return rect;\n\t }\n\t data.diff(oldData)\n\t .add(function (dataIndex) {\n\t // 空数据\n\t if (!data.hasValue(dataIndex)) {\n\t return;\n\t }\n\t\n\t var rect = createRect(dataIndex);\n\t\n\t data.setItemGraphicEl(dataIndex, rect);\n\t\n\t group.add(rect);\n\t\n\t })\n\t .update(function (newIndex, oldIndex) {\n\t var rect = oldData.getItemGraphicEl(oldIndex);\n\t // 空数据\n\t if (!data.hasValue(newIndex)) {\n\t group.remove(rect);\n\t return;\n\t }\n\t if (!rect) {\n\t rect = createRect(newIndex, true);\n\t }\n\t\n\t var layout = data.getItemLayout(newIndex);\n\t var lineWidth = data.getItemModel(newIndex).get(barBorderWidthQuery) || 0;\n\t fixLayoutWithLineWidth(layout, lineWidth);\n\t\n\t graphic.updateProps(rect, {\n\t shape: layout\n\t }, seriesModel, newIndex);\n\t\n\t data.setItemGraphicEl(newIndex, rect);\n\t\n\t // Add back\n\t group.add(rect);\n\t })\n\t .remove(function (idx) {\n\t var rect = oldData.getItemGraphicEl(idx);\n\t if (rect) {\n\t // Not show text when animating\n\t rect.style.text = '';\n\t graphic.updateProps(rect, {\n\t shape: {\n\t width: 0\n\t }\n\t }, seriesModel, idx, function () {\n\t group.remove(rect);\n\t });\n\t }\n\t })\n\t .execute();\n\t\n\t this._updateStyle(seriesModel, data, isHorizontal);\n\t\n\t this._data = data;\n\t },\n\t\n\t _updateStyle: function (seriesModel, data, isHorizontal) {\n\t function setLabel(style, model, color, labelText, labelPositionOutside) {\n\t graphic.setText(style, model, color);\n\t style.text = labelText;\n\t if (style.textPosition === 'outside') {\n\t style.textPosition = labelPositionOutside;\n\t }\n\t }\n\t\n\t data.eachItemGraphicEl(function (rect, idx) {\n\t var itemModel = data.getItemModel(idx);\n\t var color = data.getItemVisual(idx, 'color');\n\t var opacity = data.getItemVisual(idx, 'opacity');\n\t var layout = data.getItemLayout(idx);\n\t var itemStyleModel = itemModel.getModel('itemStyle.normal');\n\t\n\t var hoverStyle = itemModel.getModel('itemStyle.emphasis').getBarItemStyle();\n\t\n\t rect.setShape('r', itemStyleModel.get('barBorderRadius') || 0);\n\t\n\t rect.useStyle(zrUtil.defaults(\n\t {\n\t fill: color,\n\t opacity: opacity\n\t },\n\t itemStyleModel.getBarItemStyle()\n\t ));\n\t\n\t var labelPositionOutside = isHorizontal\n\t ? (layout.height > 0 ? 'bottom' : 'top')\n\t : (layout.width > 0 ? 'left' : 'right');\n\t\n\t var labelModel = itemModel.getModel('label.normal');\n\t var hoverLabelModel = itemModel.getModel('label.emphasis');\n\t var rectStyle = rect.style;\n\t if (labelModel.get('show')) {\n\t setLabel(\n\t rectStyle, labelModel, color,\n\t zrUtil.retrieve(\n\t seriesModel.getFormattedLabel(idx, 'normal'),\n\t seriesModel.getRawValue(idx)\n\t ),\n\t labelPositionOutside\n\t );\n\t }\n\t else {\n\t rectStyle.text = '';\n\t }\n\t if (hoverLabelModel.get('show')) {\n\t setLabel(\n\t hoverStyle, hoverLabelModel, color,\n\t zrUtil.retrieve(\n\t seriesModel.getFormattedLabel(idx, 'emphasis'),\n\t seriesModel.getRawValue(idx)\n\t ),\n\t labelPositionOutside\n\t );\n\t }\n\t else {\n\t hoverStyle.text = '';\n\t }\n\t graphic.setHoverStyle(rect, hoverStyle);\n\t });\n\t },\n\t\n\t remove: function (ecModel, api) {\n\t var group = this.group;\n\t if (ecModel.get('animation')) {\n\t if (this._data) {\n\t this._data.eachItemGraphicEl(function (el) {\n\t // Not show text when animating\n\t el.style.text = '';\n\t graphic.updateProps(el, {\n\t shape: {\n\t width: 0\n\t }\n\t }, ecModel, el.dataIndex, function () {\n\t group.remove(el);\n\t });\n\t });\n\t }\n\t }\n\t else {\n\t group.removeAll();\n\t }\n\t }\n\t });\n\n\n/***/ },\n/* 522 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t\n\t var getBarItemStyle = __webpack_require__(89)(\n\t [\n\t ['fill', 'color'],\n\t ['stroke', 'borderColor'],\n\t ['lineWidth', 'borderWidth'],\n\t // Compatitable with 2\n\t ['stroke', 'barBorderColor'],\n\t ['lineWidth', 'barBorderWidth'],\n\t ['opacity'],\n\t ['shadowBlur'],\n\t ['shadowOffsetX'],\n\t ['shadowOffsetY'],\n\t ['shadowColor']\n\t ]\n\t );\n\t module.exports = {\n\t getBarItemStyle: function (excludes) {\n\t var style = getBarItemStyle.call(this, excludes);\n\t if (this.getBorderLineDash) {\n\t var lineDash = this.getBorderLineDash();\n\t lineDash && (style.lineDash = lineDash);\n\t }\n\t return style;\n\t }\n\t };\n\n\n/***/ },\n/* 523 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t\n\t __webpack_require__(524);\n\t __webpack_require__(525);\n\t\n\t echarts.registerVisual(__webpack_require__(527));\n\t echarts.registerLayout(__webpack_require__(526));\n\t\n\n\n/***/ },\n/* 524 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var SeriesModel = __webpack_require__(26);\n\t var whiskerBoxCommon = __webpack_require__(104);\n\t\n\t var BoxplotSeries = SeriesModel.extend({\n\t\n\t type: 'series.boxplot',\n\t\n\t dependencies: ['xAxis', 'yAxis', 'grid'],\n\t\n\t // TODO\n\t // box width represents group size, so dimension should have 'size'.\n\t\n\t /**\n\t * @see \n\t * The meanings of 'min' and 'max' depend on user,\n\t * and echarts do not need to know it.\n\t * @readOnly\n\t */\n\t valueDimensions: ['min', 'Q1', 'median', 'Q3', 'max'],\n\t\n\t /**\n\t * @type {Array.}\n\t * @readOnly\n\t */\n\t dimensions: null,\n\t\n\t /**\n\t * @override\n\t */\n\t defaultOption: {\n\t zlevel: 0, // 一级层叠\n\t z: 2, // 二级层叠\n\t coordinateSystem: 'cartesian2d',\n\t legendHoverLink: true,\n\t\n\t hoverAnimation: true,\n\t\n\t // xAxisIndex: 0,\n\t // yAxisIndex: 0,\n\t\n\t layout: null, // 'horizontal' or 'vertical'\n\t boxWidth: [7, 50], // [min, max] can be percent of band width.\n\t\n\t itemStyle: {\n\t normal: {\n\t color: '#fff',\n\t borderWidth: 1\n\t },\n\t emphasis: {\n\t borderWidth: 2,\n\t shadowBlur: 5,\n\t shadowOffsetX: 2,\n\t shadowOffsetY: 2,\n\t shadowColor: 'rgba(0,0,0,0.4)'\n\t }\n\t },\n\t\n\t animationEasing: 'elasticOut',\n\t animationDuration: 800\n\t }\n\t });\n\t\n\t zrUtil.mixin(BoxplotSeries, whiskerBoxCommon.seriesModelMixin, true);\n\t\n\t module.exports = BoxplotSeries;\n\t\n\n\n/***/ },\n/* 525 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var ChartView = __webpack_require__(56);\n\t var graphic = __webpack_require__(4);\n\t var whiskerBoxCommon = __webpack_require__(104);\n\t\n\t var BoxplotView = ChartView.extend({\n\t\n\t type: 'boxplot',\n\t\n\t getStyleUpdater: function () {\n\t return updateStyle;\n\t },\n\t\n\t dispose: zrUtil.noop\n\t });\n\t\n\t zrUtil.mixin(BoxplotView, whiskerBoxCommon.viewMixin, true);\n\t\n\t // Update common properties\n\t var normalStyleAccessPath = ['itemStyle', 'normal'];\n\t var emphasisStyleAccessPath = ['itemStyle', 'emphasis'];\n\t\n\t function updateStyle(itemGroup, data, idx) {\n\t var itemModel = data.getItemModel(idx);\n\t var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath);\n\t var borderColor = data.getItemVisual(idx, 'color');\n\t\n\t // Exclude borderColor.\n\t var itemStyle = normalItemStyleModel.getItemStyle(['borderColor']);\n\t\n\t var whiskerEl = itemGroup.childAt(itemGroup.whiskerIndex);\n\t whiskerEl.style.set(itemStyle);\n\t whiskerEl.style.stroke = borderColor;\n\t whiskerEl.dirty();\n\t\n\t var bodyEl = itemGroup.childAt(itemGroup.bodyIndex);\n\t bodyEl.style.set(itemStyle);\n\t bodyEl.style.stroke = borderColor;\n\t bodyEl.dirty();\n\t\n\t var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle();\n\t graphic.setHoverStyle(itemGroup, hoverStyle);\n\t }\n\t\n\t module.exports = BoxplotView;\n\t\n\n\n/***/ },\n/* 526 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var numberUtil = __webpack_require__(5);\n\t var parsePercent = numberUtil.parsePercent;\n\t var each = zrUtil.each;\n\t\n\t module.exports = function (ecModel) {\n\t\n\t var groupResult = groupSeriesByAxis(ecModel);\n\t\n\t each(groupResult, function (groupItem) {\n\t var seriesModels = groupItem.seriesModels;\n\t\n\t if (!seriesModels.length) {\n\t return;\n\t }\n\t\n\t calculateBase(groupItem);\n\t\n\t each(seriesModels, function (seriesModel, idx) {\n\t layoutSingleSeries(\n\t seriesModel,\n\t groupItem.boxOffsetList[idx],\n\t groupItem.boxWidthList[idx]\n\t );\n\t });\n\t });\n\t };\n\t\n\t /**\n\t * Group series by axis.\n\t */\n\t function groupSeriesByAxis(ecModel) {\n\t var result = [];\n\t var axisList = [];\n\t\n\t ecModel.eachSeriesByType('boxplot', function (seriesModel) {\n\t var baseAxis = seriesModel.getBaseAxis();\n\t var idx = zrUtil.indexOf(axisList, baseAxis);\n\t\n\t if (idx < 0) {\n\t idx = axisList.length;\n\t axisList[idx] = baseAxis;\n\t result[idx] = {axis: baseAxis, seriesModels: []};\n\t }\n\t\n\t result[idx].seriesModels.push(seriesModel);\n\t });\n\t\n\t return result;\n\t }\n\t\n\t /**\n\t * Calculate offset and box width for each series.\n\t */\n\t function calculateBase(groupItem) {\n\t var extent;\n\t var baseAxis = groupItem.axis;\n\t var seriesModels = groupItem.seriesModels;\n\t var seriesCount = seriesModels.length;\n\t\n\t var boxWidthList = groupItem.boxWidthList = [];\n\t var boxOffsetList = groupItem.boxOffsetList = [];\n\t var boundList = [];\n\t\n\t var bandWidth;\n\t if (baseAxis.type === 'category') {\n\t bandWidth = baseAxis.getBandWidth();\n\t }\n\t else {\n\t var maxDataCount = 0;\n\t each(seriesModels, function (seriesModel) {\n\t maxDataCount = Math.max(maxDataCount, seriesModel.getData().count());\n\t });\n\t extent = baseAxis.getExtent(),\n\t Math.abs(extent[1] - extent[0]) / maxDataCount;\n\t }\n\t\n\t each(seriesModels, function (seriesModel) {\n\t var boxWidthBound = seriesModel.get('boxWidth');\n\t if (!zrUtil.isArray(boxWidthBound)) {\n\t boxWidthBound = [boxWidthBound, boxWidthBound];\n\t }\n\t boundList.push([\n\t parsePercent(boxWidthBound[0], bandWidth) || 0,\n\t parsePercent(boxWidthBound[1], bandWidth) || 0\n\t ]);\n\t });\n\t\n\t var availableWidth = bandWidth * 0.8 - 2;\n\t var boxGap = availableWidth / seriesCount * 0.3;\n\t var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount;\n\t var base = boxWidth / 2 - availableWidth / 2;\n\t\n\t each(seriesModels, function (seriesModel, idx) {\n\t boxOffsetList.push(base);\n\t base += boxGap + boxWidth;\n\t\n\t boxWidthList.push(\n\t Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1])\n\t );\n\t });\n\t }\n\t\n\t /**\n\t * Calculate points location for each series.\n\t */\n\t function layoutSingleSeries(seriesModel, offset, boxWidth) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var data = seriesModel.getData();\n\t var dimensions = seriesModel.dimensions;\n\t var chartLayout = seriesModel.get('layout');\n\t var halfWidth = boxWidth / 2;\n\t\n\t data.each(dimensions, function () {\n\t var args = arguments;\n\t var dimLen = dimensions.length;\n\t var axisDimVal = args[0];\n\t var idx = args[dimLen];\n\t var variableDim = chartLayout === 'horizontal' ? 0 : 1;\n\t var constDim = 1 - variableDim;\n\t\n\t var median = getPoint(args[3]);\n\t var end1 = getPoint(args[1]);\n\t var end5 = getPoint(args[5]);\n\t var whiskerEnds = [\n\t [end1, getPoint(args[2])],\n\t [end5, getPoint(args[4])]\n\t ];\n\t layEndLine(end1);\n\t layEndLine(end5);\n\t layEndLine(median);\n\t\n\t var bodyEnds = [];\n\t addBodyEnd(whiskerEnds[0][1], 0);\n\t addBodyEnd(whiskerEnds[1][1], 1);\n\t\n\t data.setItemLayout(idx, {\n\t chartLayout: chartLayout,\n\t initBaseline: median[constDim],\n\t median: median,\n\t bodyEnds: bodyEnds,\n\t whiskerEnds: whiskerEnds\n\t });\n\t\n\t function getPoint(val) {\n\t var p = [];\n\t p[variableDim] = axisDimVal;\n\t p[constDim] = val;\n\t var point;\n\t if (isNaN(axisDimVal) || isNaN(val)) {\n\t point = [NaN, NaN];\n\t }\n\t else {\n\t point = coordSys.dataToPoint(p);\n\t point[variableDim] += offset;\n\t }\n\t return point;\n\t }\n\t\n\t function addBodyEnd(point, start) {\n\t var point1 = point.slice();\n\t var point2 = point.slice();\n\t point1[variableDim] += halfWidth;\n\t point2[variableDim] -= halfWidth;\n\t start\n\t ? bodyEnds.push(point1, point2)\n\t : bodyEnds.push(point2, point1);\n\t }\n\t\n\t function layEndLine(endCenter) {\n\t var line = [endCenter.slice(), endCenter.slice()];\n\t line[0][variableDim] -= halfWidth;\n\t line[1][variableDim] += halfWidth;\n\t whiskerEnds.push(line);\n\t }\n\t });\n\t }\n\t\n\n\n/***/ },\n/* 527 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t var borderColorQuery = ['itemStyle', 'normal', 'borderColor'];\n\t\n\t module.exports = function (ecModel, api) {\n\t\n\t var globalColors = ecModel.get('color');\n\t\n\t ecModel.eachRawSeriesByType('boxplot', function (seriesModel) {\n\t\n\t var defaulColor = globalColors[seriesModel.seriesIndex % globalColors.length];\n\t var data = seriesModel.getData();\n\t\n\t data.setVisual({\n\t legendSymbol: 'roundRect',\n\t // Use name 'color' but not 'borderColor' for legend usage and\n\t // visual coding from other component like dataRange.\n\t color: seriesModel.get(borderColorQuery) || defaulColor\n\t });\n\t\n\t // Only visible series has each data be visual encoded\n\t if (!ecModel.isSeriesFiltered(seriesModel)) {\n\t data.each(function (idx) {\n\t var itemModel = data.getItemModel(idx);\n\t data.setItemVisual(\n\t idx,\n\t {color: itemModel.get(borderColorQuery, true)}\n\t );\n\t });\n\t }\n\t });\n\t\n\t };\n\n\n/***/ },\n/* 528 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t\n\t __webpack_require__(529);\n\t __webpack_require__(530);\n\t\n\t echarts.registerPreprocessor(\n\t __webpack_require__(533)\n\t );\n\t\n\t echarts.registerVisual(__webpack_require__(532));\n\t echarts.registerLayout(__webpack_require__(531));\n\t\n\n\n/***/ },\n/* 529 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var SeriesModel = __webpack_require__(26);\n\t var whiskerBoxCommon = __webpack_require__(104);\n\t var formatUtil = __webpack_require__(18);\n\t var encodeHTML = formatUtil.encodeHTML;\n\t var addCommas = formatUtil.addCommas;\n\t\n\t var CandlestickSeries = SeriesModel.extend({\n\t\n\t type: 'series.candlestick',\n\t\n\t dependencies: ['xAxis', 'yAxis', 'grid'],\n\t\n\t /**\n\t * @readOnly\n\t */\n\t valueDimensions: ['open', 'close', 'lowest', 'highest'],\n\t\n\t /**\n\t * @type {Array.}\n\t * @readOnly\n\t */\n\t dimensions: null,\n\t\n\t /**\n\t * @override\n\t */\n\t defaultOption: {\n\t zlevel: 0, // 一级层叠\n\t z: 2, // 二级层叠\n\t coordinateSystem: 'cartesian2d',\n\t legendHoverLink: true,\n\t\n\t hoverAnimation: true,\n\t\n\t // xAxisIndex: 0,\n\t // yAxisIndex: 0,\n\t\n\t layout: null, // 'horizontal' or 'vertical'\n\t\n\t itemStyle: {\n\t normal: {\n\t color: '#c23531', // 阳线 positive\n\t color0: '#314656', // 阴线 negative '#c23531', '#314656'\n\t borderWidth: 1,\n\t // FIXME\n\t // ec2中使用的是lineStyle.color 和 lineStyle.color0\n\t borderColor: '#c23531',\n\t borderColor0: '#314656'\n\t },\n\t emphasis: {\n\t borderWidth: 2\n\t }\n\t },\n\t\n\t animationUpdate: false,\n\t animationEasing: 'linear',\n\t animationDuration: 300\n\t },\n\t\n\t /**\n\t * Get dimension for shadow in dataZoom\n\t * @return {string} dimension name\n\t */\n\t getShadowDim: function () {\n\t return 'open';\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t formatTooltip: function (dataIndex, mutipleSeries) {\n\t // It rearly use mutiple candlestick series in one cartesian,\n\t // so only consider one series in this default tooltip.\n\t var valueHTMLArr = zrUtil.map(this.valueDimensions, function (dim) {\n\t return dim + ': ' + addCommas(this._data.get(dim, dataIndex));\n\t }, this);\n\t\n\t return encodeHTML(this.name) + ' ' + valueHTMLArr.join(' ');\n\t },\n\t\n\t brushSelector: function (itemLayout, selectors) {\n\t return selectors.rect(itemLayout.brushRect);\n\t }\n\t\n\t });\n\t\n\t zrUtil.mixin(CandlestickSeries, whiskerBoxCommon.seriesModelMixin, true);\n\t\n\t module.exports = CandlestickSeries;\n\t\n\n\n/***/ },\n/* 530 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var ChartView = __webpack_require__(56);\n\t var graphic = __webpack_require__(4);\n\t var whiskerBoxCommon = __webpack_require__(104);\n\t\n\t var CandlestickView = ChartView.extend({\n\t\n\t type: 'candlestick',\n\t\n\t getStyleUpdater: function () {\n\t return updateStyle;\n\t },\n\t\n\t dispose: zrUtil.noop\n\t });\n\t\n\t zrUtil.mixin(CandlestickView, whiskerBoxCommon.viewMixin, true);\n\t\n\t // Update common properties\n\t var normalStyleAccessPath = ['itemStyle', 'normal'];\n\t var emphasisStyleAccessPath = ['itemStyle', 'emphasis'];\n\t\n\t function updateStyle(itemGroup, data, idx) {\n\t var itemModel = data.getItemModel(idx);\n\t var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath);\n\t var color = data.getItemVisual(idx, 'color');\n\t var borderColor = data.getItemVisual(idx, 'borderColor') || color;\n\t\n\t // Color must be excluded.\n\t // Because symbol provide setColor individually to set fill and stroke\n\t var itemStyle = normalItemStyleModel.getItemStyle(\n\t ['color', 'color0', 'borderColor', 'borderColor0']\n\t );\n\t\n\t var whiskerEl = itemGroup.childAt(itemGroup.whiskerIndex);\n\t whiskerEl.useStyle(itemStyle);\n\t whiskerEl.style.stroke = borderColor;\n\t\n\t var bodyEl = itemGroup.childAt(itemGroup.bodyIndex);\n\t bodyEl.useStyle(itemStyle);\n\t bodyEl.style.fill = color;\n\t bodyEl.style.stroke = borderColor;\n\t\n\t var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle();\n\t graphic.setHoverStyle(itemGroup, hoverStyle);\n\t }\n\t\n\t\n\t module.exports = CandlestickView;\n\t\n\n\n/***/ },\n/* 531 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t var CANDLE_MIN_WIDTH = 2;\n\t var CANDLE_MIN_NICE_WIDTH = 5;\n\t var GPA_MIN = 4;\n\t\n\t module.exports = function (ecModel) {\n\t\n\t ecModel.eachSeriesByType('candlestick', function (seriesModel) {\n\t\n\t var coordSys = seriesModel.coordinateSystem;\n\t var data = seriesModel.getData();\n\t var dimensions = seriesModel.dimensions;\n\t var chartLayout = seriesModel.get('layout');\n\t\n\t var candleWidth = calculateCandleWidth(seriesModel, data);\n\t\n\t data.each(dimensions, function () {\n\t var args = arguments;\n\t var dimLen = dimensions.length;\n\t var axisDimVal = args[0];\n\t var idx = args[dimLen];\n\t var variableDim = chartLayout === 'horizontal' ? 0 : 1;\n\t var constDim = 1 - variableDim;\n\t\n\t var openVal = args[1];\n\t var closeVal = args[2];\n\t var lowestVal = args[3];\n\t var highestVal = args[4];\n\t\n\t var ocLow = Math.min(openVal, closeVal);\n\t var ocHigh = Math.max(openVal, closeVal);\n\t\n\t var ocLowPoint = getPoint(ocLow);\n\t var ocHighPoint = getPoint(ocHigh);\n\t var lowestPoint = getPoint(lowestVal);\n\t var highestPoint = getPoint(highestVal);\n\t\n\t var whiskerEnds = [\n\t [highestPoint, ocHighPoint],\n\t [lowestPoint, ocLowPoint]\n\t ];\n\t\n\t var bodyEnds = [];\n\t addBodyEnd(ocHighPoint, 0);\n\t addBodyEnd(ocLowPoint, 1);\n\t\n\t data.setItemLayout(idx, {\n\t chartLayout: chartLayout,\n\t sign: openVal > closeVal ? -1 : openVal < closeVal ? 1 : 0,\n\t initBaseline: openVal > closeVal\n\t ? ocHighPoint[constDim] : ocLowPoint[constDim], // open point.\n\t bodyEnds: bodyEnds,\n\t whiskerEnds: whiskerEnds,\n\t brushRect: makeBrushRect()\n\t });\n\t\n\t function getPoint(val) {\n\t var p = [];\n\t p[variableDim] = axisDimVal;\n\t p[constDim] = val;\n\t return (isNaN(axisDimVal) || isNaN(val))\n\t ? [NaN, NaN]\n\t : coordSys.dataToPoint(p);\n\t }\n\t\n\t function addBodyEnd(point, start) {\n\t var point1 = point.slice();\n\t var point2 = point.slice();\n\t point1[variableDim] += candleWidth / 2;\n\t point2[variableDim] -= candleWidth / 2;\n\t start\n\t ? bodyEnds.push(point1, point2)\n\t : bodyEnds.push(point2, point1);\n\t }\n\t\n\t function makeBrushRect() {\n\t var pmin = getPoint(Math.min(openVal, closeVal, lowestVal, highestVal));\n\t var pmax = getPoint(Math.max(openVal, closeVal, lowestVal, highestVal));\n\t\n\t pmin[variableDim] -= candleWidth / 2;\n\t pmax[variableDim] -= candleWidth / 2;\n\t\n\t return {\n\t x: pmin[0],\n\t y: pmin[1],\n\t width: constDim ? candleWidth : pmax[0] - pmin[0],\n\t height: constDim ? pmax[1] - pmin[1] : candleWidth\n\t };\n\t }\n\t\n\t }, true);\n\t });\n\t };\n\t\n\t function calculateCandleWidth(seriesModel, data) {\n\t var baseAxis = seriesModel.getBaseAxis();\n\t var extent;\n\t\n\t var bandWidth = baseAxis.type === 'category'\n\t ? baseAxis.getBandWidth()\n\t : (\n\t extent = baseAxis.getExtent(),\n\t Math.abs(extent[1] - extent[0]) / data.count()\n\t );\n\t\n\t // Half band width is perfect when space is enouph, otherwise\n\t // try not to be smaller than CANDLE_MIN_NICE_WIDTH (and only\n\t // gap is compressed), otherwise ensure not to be smaller than\n\t // CANDLE_MIN_WIDTH in spite of overlap.\n\t\n\t return bandWidth / 2 - 2 > CANDLE_MIN_NICE_WIDTH // \"- 2\" is minus border width\n\t ? bandWidth / 2 - 2\n\t : bandWidth - CANDLE_MIN_NICE_WIDTH > GPA_MIN\n\t ? CANDLE_MIN_NICE_WIDTH\n\t : Math.max(bandWidth - GPA_MIN, CANDLE_MIN_WIDTH);\n\t }\n\t\n\n\n/***/ },\n/* 532 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t var positiveBorderColorQuery = ['itemStyle', 'normal', 'borderColor'];\n\t var negativeBorderColorQuery = ['itemStyle', 'normal', 'borderColor0'];\n\t var positiveColorQuery = ['itemStyle', 'normal', 'color'];\n\t var negativeColorQuery = ['itemStyle', 'normal', 'color0'];\n\t\n\t module.exports = function (ecModel, api) {\n\t\n\t ecModel.eachRawSeriesByType('candlestick', function (seriesModel) {\n\t\n\t var data = seriesModel.getData();\n\t\n\t data.setVisual({\n\t legendSymbol: 'roundRect'\n\t });\n\t\n\t // Only visible series has each data be visual encoded\n\t if (!ecModel.isSeriesFiltered(seriesModel)) {\n\t data.each(function (idx) {\n\t var itemModel = data.getItemModel(idx);\n\t var sign = data.getItemLayout(idx).sign;\n\t\n\t data.setItemVisual(\n\t idx,\n\t {\n\t color: itemModel.get(\n\t sign > 0 ? positiveColorQuery : negativeColorQuery\n\t ),\n\t borderColor: itemModel.get(\n\t sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery\n\t )\n\t }\n\t );\n\t });\n\t }\n\t });\n\t\n\t };\n\n\n/***/ },\n/* 533 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t module.exports = function (option) {\n\t if (!option || !zrUtil.isArray(option.series)) {\n\t return;\n\t }\n\t\n\t // Translate 'k' to 'candlestick'.\n\t zrUtil.each(option.series, function (seriesItem) {\n\t if (zrUtil.isObject(seriesItem) && seriesItem.type === 'k') {\n\t seriesItem.type = 'candlestick';\n\t }\n\t });\n\t };\n\t\n\n\n/***/ },\n/* 534 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var echarts = __webpack_require__(3);\n\t\n\t __webpack_require__(535);\n\t __webpack_require__(536);\n\t\n\t echarts.registerVisual(zrUtil.curry(\n\t __webpack_require__(90), 'effectScatter', 'circle', null\n\t ));\n\t echarts.registerLayout(zrUtil.curry(\n\t __webpack_require__(160), 'effectScatter'\n\t ));\n\n\n/***/ },\n/* 535 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var createListFromArray = __webpack_require__(76);\n\t var SeriesModel = __webpack_require__(26);\n\t\n\t module.exports = SeriesModel.extend({\n\t\n\t type: 'series.effectScatter',\n\t\n\t dependencies: ['grid', 'polar'],\n\t\n\t getInitialData: function (option, ecModel) {\n\t var list = createListFromArray(option.data, this, ecModel);\n\t return list;\n\t },\n\t\n\t brushSelector: 'point',\n\t\n\t defaultOption: {\n\t coordinateSystem: 'cartesian2d',\n\t zlevel: 0,\n\t z: 2,\n\t legendHoverLink: true,\n\t\n\t effectType: 'ripple',\n\t\n\t progressive: 0,\n\t\n\t // When to show the effect, option: 'render'|'emphasis'\n\t showEffectOn: 'render',\n\t\n\t // Ripple effect config\n\t rippleEffect: {\n\t period: 4,\n\t // Scale of ripple\n\t scale: 2.5,\n\t // Brush type can be fill or stroke\n\t brushType: 'fill'\n\t },\n\t\n\t // Cartesian coordinate system\n\t // xAxisIndex: 0,\n\t // yAxisIndex: 0,\n\t\n\t // Polar coordinate system\n\t // polarIndex: 0,\n\t\n\t // Geo coordinate system\n\t // geoIndex: 0,\n\t\n\t // symbol: null, // 图形类型\n\t symbolSize: 10 // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2\n\t // symbolRotate: null, // 图形旋转控制\n\t\n\t // large: false,\n\t // Available when large is true\n\t // largeThreshold: 2000,\n\t\n\t // itemStyle: {\n\t // normal: {\n\t // opacity: 1\n\t // }\n\t // }\n\t }\n\t\n\t });\n\n\n/***/ },\n/* 536 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var SymbolDraw = __webpack_require__(84);\n\t var EffectSymbol = __webpack_require__(563);\n\t\n\t __webpack_require__(3).extendChartView({\n\t\n\t type: 'effectScatter',\n\t\n\t init: function () {\n\t this._symbolDraw = new SymbolDraw(EffectSymbol);\n\t },\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var data = seriesModel.getData();\n\t var effectSymbolDraw = this._symbolDraw;\n\t effectSymbolDraw.updateData(data);\n\t this.group.add(effectSymbolDraw.group);\n\t },\n\t\n\t updateLayout: function () {\n\t this._symbolDraw.updateLayout();\n\t },\n\t\n\t remove: function (ecModel, api) {\n\t this._symbolDraw && this._symbolDraw.remove(api);\n\t },\n\t\n\t dispose: function () {}\n\t });\n\n\n/***/ },\n/* 537 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var echarts = __webpack_require__(3);\n\t\n\t __webpack_require__(538);\n\t __webpack_require__(539);\n\t\n\t echarts.registerVisual(zrUtil.curry(__webpack_require__(164), 'funnel'));\n\t echarts.registerLayout(__webpack_require__(540));\n\t\n\t echarts.registerProcessor(zrUtil.curry(__webpack_require__(161), 'funnel'));\n\n\n/***/ },\n/* 538 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var List = __webpack_require__(20);\n\t var modelUtil = __webpack_require__(14);\n\t var completeDimensions = __webpack_require__(48);\n\t\n\t var FunnelSeries = __webpack_require__(3).extendSeriesModel({\n\t\n\t type: 'series.funnel',\n\t\n\t init: function (option) {\n\t FunnelSeries.superApply(this, 'init', arguments);\n\t\n\t // Enable legend selection for each data item\n\t // Use a function instead of direct access because data reference may changed\n\t this.legendDataProvider = function () {\n\t return this._dataBeforeProcessed;\n\t };\n\t // Extend labelLine emphasis\n\t this._defaultLabelLine(option);\n\t },\n\t\n\t getInitialData: function (option, ecModel) {\n\t var dimensions = completeDimensions(['value'], option.data);\n\t var list = new List(dimensions, this);\n\t list.initData(option.data);\n\t return list;\n\t },\n\t\n\t _defaultLabelLine: function (option) {\n\t // Extend labelLine emphasis\n\t modelUtil.defaultEmphasis(option.labelLine, ['show']);\n\t\n\t var labelLineNormalOpt = option.labelLine.normal;\n\t var labelLineEmphasisOpt = option.labelLine.emphasis;\n\t // Not show label line if `label.normal.show = false`\n\t labelLineNormalOpt.show = labelLineNormalOpt.show\n\t && option.label.normal.show;\n\t labelLineEmphasisOpt.show = labelLineEmphasisOpt.show\n\t && option.label.emphasis.show;\n\t },\n\t\n\t defaultOption: {\n\t zlevel: 0, // 一级层叠\n\t z: 2, // 二级层叠\n\t legendHoverLink: true,\n\t left: 80,\n\t top: 60,\n\t right: 80,\n\t bottom: 60,\n\t // width: {totalWidth} - left - right,\n\t // height: {totalHeight} - top - bottom,\n\t\n\t // 默认取数据最小最大值\n\t // min: 0,\n\t // max: 100,\n\t minSize: '0%',\n\t maxSize: '100%',\n\t sort: 'descending', // 'ascending', 'descending'\n\t gap: 0,\n\t funnelAlign: 'center',\n\t label: {\n\t normal: {\n\t show: true,\n\t position: 'outer'\n\t // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调\n\t // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE\n\t },\n\t emphasis: {\n\t show: true\n\t }\n\t },\n\t labelLine: {\n\t normal: {\n\t show: true,\n\t length: 20,\n\t lineStyle: {\n\t // color: 各异,\n\t width: 1,\n\t type: 'solid'\n\t }\n\t },\n\t emphasis: {}\n\t },\n\t itemStyle: {\n\t normal: {\n\t // color: 各异,\n\t borderColor: '#fff',\n\t borderWidth: 1\n\t },\n\t emphasis: {\n\t // color: 各异,\n\t }\n\t }\n\t }\n\t });\n\t\n\t module.exports = FunnelSeries;\n\n\n/***/ },\n/* 539 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var graphic = __webpack_require__(4);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t /**\n\t * Piece of pie including Sector, Label, LabelLine\n\t * @constructor\n\t * @extends {module:zrender/graphic/Group}\n\t */\n\t function FunnelPiece(data, idx) {\n\t\n\t graphic.Group.call(this);\n\t\n\t var polygon = new graphic.Polygon();\n\t var labelLine = new graphic.Polyline();\n\t var text = new graphic.Text();\n\t this.add(polygon);\n\t this.add(labelLine);\n\t this.add(text);\n\t\n\t this.updateData(data, idx, true);\n\t\n\t // Hover to change label and labelLine\n\t function onEmphasis() {\n\t labelLine.ignore = labelLine.hoverIgnore;\n\t text.ignore = text.hoverIgnore;\n\t }\n\t function onNormal() {\n\t labelLine.ignore = labelLine.normalIgnore;\n\t text.ignore = text.normalIgnore;\n\t }\n\t this.on('emphasis', onEmphasis)\n\t .on('normal', onNormal)\n\t .on('mouseover', onEmphasis)\n\t .on('mouseout', onNormal);\n\t }\n\t\n\t var funnelPieceProto = FunnelPiece.prototype;\n\t\n\t function getLabelStyle(data, idx, state, labelModel) {\n\t var textStyleModel = labelModel.getModel('textStyle');\n\t var position = labelModel.get('position');\n\t var isLabelInside = position === 'inside' || position === 'inner' || position === 'center';\n\t return {\n\t fill: textStyleModel.getTextColor()\n\t || (isLabelInside ? '#fff' : data.getItemVisual(idx, 'color')),\n\t textFont: textStyleModel.getFont(),\n\t text: zrUtil.retrieve(\n\t data.hostModel.getFormattedLabel(idx, state),\n\t data.getName(idx)\n\t )\n\t };\n\t }\n\t\n\t var opacityAccessPath = ['itemStyle', 'normal', 'opacity'];\n\t funnelPieceProto.updateData = function (data, idx, firstCreate) {\n\t\n\t var polygon = this.childAt(0);\n\t\n\t var seriesModel = data.hostModel;\n\t var itemModel = data.getItemModel(idx);\n\t var layout = data.getItemLayout(idx);\n\t var opacity = data.getItemModel(idx).get(opacityAccessPath);\n\t opacity = opacity == null ? 1 : opacity;\n\t\n\t // Reset style\n\t polygon.useStyle({});\n\t\n\t if (firstCreate) {\n\t polygon.setShape({\n\t points: layout.points\n\t });\n\t polygon.setStyle({ opacity : 0 });\n\t graphic.initProps(polygon, {\n\t style: {\n\t opacity: opacity\n\t }\n\t }, seriesModel, idx);\n\t }\n\t else {\n\t graphic.updateProps(polygon, {\n\t style: {\n\t opacity: opacity\n\t },\n\t shape: {\n\t points: layout.points\n\t }\n\t }, seriesModel, idx);\n\t }\n\t\n\t // Update common style\n\t var itemStyleModel = itemModel.getModel('itemStyle');\n\t var visualColor = data.getItemVisual(idx, 'color');\n\t\n\t polygon.setStyle(\n\t zrUtil.defaults(\n\t {\n\t lineJoin: 'round',\n\t fill: visualColor\n\t },\n\t itemStyleModel.getModel('normal').getItemStyle(['opacity'])\n\t )\n\t );\n\t polygon.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle();\n\t\n\t this._updateLabel(data, idx);\n\t\n\t graphic.setHoverStyle(this);\n\t };\n\t\n\t funnelPieceProto._updateLabel = function (data, idx) {\n\t\n\t var labelLine = this.childAt(1);\n\t var labelText = this.childAt(2);\n\t\n\t var seriesModel = data.hostModel;\n\t var itemModel = data.getItemModel(idx);\n\t var layout = data.getItemLayout(idx);\n\t var labelLayout = layout.label;\n\t var visualColor = data.getItemVisual(idx, 'color');\n\t\n\t graphic.updateProps(labelLine, {\n\t shape: {\n\t points: labelLayout.linePoints || labelLayout.linePoints\n\t }\n\t }, seriesModel, idx);\n\t\n\t graphic.updateProps(labelText, {\n\t style: {\n\t x: labelLayout.x,\n\t y: labelLayout.y\n\t }\n\t }, seriesModel, idx);\n\t labelText.attr({\n\t style: {\n\t textAlign: labelLayout.textAlign,\n\t textVerticalAlign: labelLayout.verticalAlign,\n\t textFont: labelLayout.font\n\t },\n\t rotation: labelLayout.rotation,\n\t origin: [labelLayout.x, labelLayout.y],\n\t z2: 10\n\t });\n\t\n\t var labelModel = itemModel.getModel('label.normal');\n\t var labelHoverModel = itemModel.getModel('label.emphasis');\n\t var labelLineModel = itemModel.getModel('labelLine.normal');\n\t var labelLineHoverModel = itemModel.getModel('labelLine.emphasis');\n\t\n\t labelText.setStyle(getLabelStyle(data, idx, 'normal', labelModel));\n\t\n\t labelText.ignore = labelText.normalIgnore = !labelModel.get('show');\n\t labelText.hoverIgnore = !labelHoverModel.get('show');\n\t\n\t labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show');\n\t labelLine.hoverIgnore = !labelLineHoverModel.get('show');\n\t\n\t // Default use item visual color\n\t labelLine.setStyle({\n\t stroke: visualColor\n\t });\n\t labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle());\n\t\n\t labelText.hoverStyle = getLabelStyle(data, idx, 'emphasis', labelHoverModel);\n\t labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle();\n\t };\n\t\n\t zrUtil.inherits(FunnelPiece, graphic.Group);\n\t\n\t\n\t var Funnel = __webpack_require__(56).extend({\n\t\n\t type: 'funnel',\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var data = seriesModel.getData();\n\t var oldData = this._data;\n\t\n\t var group = this.group;\n\t\n\t data.diff(oldData)\n\t .add(function (idx) {\n\t var funnelPiece = new FunnelPiece(data, idx);\n\t\n\t data.setItemGraphicEl(idx, funnelPiece);\n\t\n\t group.add(funnelPiece);\n\t })\n\t .update(function (newIdx, oldIdx) {\n\t var piePiece = oldData.getItemGraphicEl(oldIdx);\n\t\n\t piePiece.updateData(data, newIdx);\n\t\n\t group.add(piePiece);\n\t data.setItemGraphicEl(newIdx, piePiece);\n\t })\n\t .remove(function (idx) {\n\t var piePiece = oldData.getItemGraphicEl(idx);\n\t group.remove(piePiece);\n\t })\n\t .execute();\n\t\n\t this._data = data;\n\t },\n\t\n\t remove: function () {\n\t this.group.removeAll();\n\t this._data = null;\n\t },\n\t\n\t dispose: function () {}\n\t });\n\t\n\t module.exports = Funnel;\n\n\n/***/ },\n/* 540 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var layout = __webpack_require__(16);\n\t var number = __webpack_require__(5);\n\t\n\t var parsePercent = number.parsePercent;\n\t\n\t function getViewRect(seriesModel, api) {\n\t return layout.getLayoutRect(\n\t seriesModel.getBoxLayoutParams(), {\n\t width: api.getWidth(),\n\t height: api.getHeight()\n\t }\n\t );\n\t }\n\t\n\t function getSortedIndices(data, sort) {\n\t var valueArr = data.mapArray('value', function (val) {\n\t return val;\n\t });\n\t var indices = [];\n\t var isAscending = sort === 'ascending';\n\t for (var i = 0, len = data.count(); i < len; i++) {\n\t indices[i] = i;\n\t }\n\t indices.sort(function (a, b) {\n\t return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a];\n\t });\n\t return indices;\n\t }\n\t\n\t function labelLayout (data) {\n\t data.each(function (idx) {\n\t var itemModel = data.getItemModel(idx);\n\t var labelModel = itemModel.getModel('label.normal');\n\t var labelPosition = labelModel.get('position');\n\t\n\t var labelLineModel = itemModel.getModel('labelLine.normal');\n\t\n\t var layout = data.getItemLayout(idx);\n\t var points = layout.points;\n\t\n\t var isLabelInside = labelPosition === 'inner'\n\t || labelPosition === 'inside' || labelPosition === 'center';\n\t\n\t var textAlign;\n\t var textX;\n\t var textY;\n\t var linePoints;\n\t\n\t if (isLabelInside) {\n\t textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4;\n\t textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4;\n\t textAlign = 'center';\n\t linePoints = [\n\t [textX, textY], [textX, textY]\n\t ];\n\t }\n\t else {\n\t var x1;\n\t var y1;\n\t var x2;\n\t var labelLineLen = labelLineModel.get('length');\n\t if (labelPosition === 'left') {\n\t // Left side\n\t x1 = (points[3][0] + points[0][0]) / 2;\n\t y1 = (points[3][1] + points[0][1]) / 2;\n\t x2 = x1 - labelLineLen;\n\t textX = x2 - 5;\n\t textAlign = 'right';\n\t }\n\t else {\n\t // Right side\n\t x1 = (points[1][0] + points[2][0]) / 2;\n\t y1 = (points[1][1] + points[2][1]) / 2;\n\t x2 = x1 + labelLineLen;\n\t textX = x2 + 5;\n\t textAlign = 'left';\n\t }\n\t var y2 = y1;\n\t\n\t linePoints = [[x1, y1], [x2, y2]];\n\t textY = y2;\n\t }\n\t\n\t layout.label = {\n\t linePoints: linePoints,\n\t x: textX,\n\t y: textY,\n\t verticalAlign: 'middle',\n\t textAlign: textAlign,\n\t inside: isLabelInside\n\t };\n\t });\n\t }\n\t\n\t module.exports = function (ecModel, api, payload) {\n\t ecModel.eachSeriesByType('funnel', function (seriesModel) {\n\t var data = seriesModel.getData();\n\t var sort = seriesModel.get('sort');\n\t var viewRect = getViewRect(seriesModel, api);\n\t var indices = getSortedIndices(data, sort);\n\t\n\t var sizeExtent = [\n\t parsePercent(seriesModel.get('minSize'), viewRect.width),\n\t parsePercent(seriesModel.get('maxSize'), viewRect.width)\n\t ];\n\t var dataExtent = data.getDataExtent('value');\n\t var min = seriesModel.get('min');\n\t var max = seriesModel.get('max');\n\t if (min == null) {\n\t min = Math.min(dataExtent[0], 0);\n\t }\n\t if (max == null) {\n\t max = dataExtent[1];\n\t }\n\t\n\t var funnelAlign = seriesModel.get('funnelAlign');\n\t var gap = seriesModel.get('gap');\n\t var itemHeight = (viewRect.height - gap * (data.count() - 1)) / data.count();\n\t\n\t var y = viewRect.y;\n\t\n\t var getLinePoints = function (idx, offY) {\n\t // End point index is data.count() and we assign it 0\n\t var val = data.get('value', idx) || 0;\n\t var itemWidth = number.linearMap(val, [min, max], sizeExtent, true);\n\t var x0;\n\t switch (funnelAlign) {\n\t case 'left':\n\t x0 = viewRect.x;\n\t break;\n\t case 'center':\n\t x0 = viewRect.x + (viewRect.width - itemWidth) / 2;\n\t break;\n\t case 'right':\n\t x0 = viewRect.x + viewRect.width - itemWidth;\n\t break;\n\t }\n\t return [\n\t [x0, offY],\n\t [x0 + itemWidth, offY]\n\t ];\n\t };\n\t\n\t if (sort === 'ascending') {\n\t // From bottom to top\n\t itemHeight = -itemHeight;\n\t gap = -gap;\n\t y += viewRect.height;\n\t indices = indices.reverse();\n\t }\n\t\n\t for (var i = 0; i < indices.length; i++) {\n\t var idx = indices[i];\n\t var nextIdx = indices[i + 1];\n\t var start = getLinePoints(idx, y);\n\t var end = getLinePoints(nextIdx, y + itemHeight);\n\t\n\t y += itemHeight + gap;\n\t\n\t data.setItemLayout(idx, {\n\t points: start.concat(end.slice().reverse())\n\t });\n\t }\n\t\n\t labelLayout(data);\n\t });\n\t };\n\n\n/***/ },\n/* 541 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t __webpack_require__(542);\n\t __webpack_require__(543);\n\n\n/***/ },\n/* 542 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var List = __webpack_require__(20);\n\t var SeriesModel = __webpack_require__(26);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var GaugeSeries = SeriesModel.extend({\n\t\n\t type: 'series.gauge',\n\t\n\t getInitialData: function (option, ecModel) {\n\t var list = new List(['value'], this);\n\t var dataOpt = option.data || [];\n\t if (!zrUtil.isArray(dataOpt)) {\n\t dataOpt = [dataOpt];\n\t }\n\t // Only use the first data item\n\t list.initData(dataOpt);\n\t return list;\n\t },\n\t\n\t defaultOption: {\n\t zlevel: 0,\n\t z: 2,\n\t // 默认全局居中\n\t center: ['50%', '50%'],\n\t legendHoverLink: true,\n\t radius: '75%',\n\t startAngle: 225,\n\t endAngle: -45,\n\t clockwise: true,\n\t // 最小值\n\t min: 0,\n\t // 最大值\n\t max: 100,\n\t // 分割段数,默认为10\n\t splitNumber: 10,\n\t // 坐标轴线\n\t axisLine: {\n\t // 默认显示,属性show控制显示与否\n\t show: true,\n\t lineStyle: { // 属性lineStyle控制线条样式\n\t color: [[0.2, '#91c7ae'], [0.8, '#63869e'], [1, '#c23531']],\n\t width: 30\n\t }\n\t },\n\t // 分隔线\n\t splitLine: {\n\t // 默认显示,属性show控制显示与否\n\t show: true,\n\t // 属性length控制线长\n\t length: 30,\n\t // 属性lineStyle(详见lineStyle)控制线条样式\n\t lineStyle: {\n\t color: '#eee',\n\t width: 2,\n\t type: 'solid'\n\t }\n\t },\n\t // 坐标轴小标记\n\t axisTick: {\n\t // 属性show控制显示与否,默认不显示\n\t show: true,\n\t // 每份split细分多少段\n\t splitNumber: 5,\n\t // 属性length控制线长\n\t length: 8,\n\t // 属性lineStyle控制线条样式\n\t lineStyle: {\n\t color: '#eee',\n\t width: 1,\n\t type: 'solid'\n\t }\n\t },\n\t axisLabel: {\n\t show: true,\n\t distance: 5,\n\t // formatter: null,\n\t textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE\n\t color: 'auto'\n\t }\n\t },\n\t pointer: {\n\t show: true,\n\t length: '80%',\n\t width: 8\n\t },\n\t itemStyle: {\n\t normal: {\n\t color: 'auto'\n\t }\n\t },\n\t title: {\n\t show: true,\n\t // x, y,单位px\n\t offsetCenter: [0, '-40%'],\n\t // 其余属性默认使用全局文本样式,详见TEXTSTYLE\n\t textStyle: {\n\t color: '#333',\n\t fontSize: 15\n\t }\n\t },\n\t detail: {\n\t show: true,\n\t backgroundColor: 'rgba(0,0,0,0)',\n\t borderWidth: 0,\n\t borderColor: '#ccc',\n\t width: 100,\n\t height: 40,\n\t // x, y,单位px\n\t offsetCenter: [0, '40%'],\n\t // formatter: null,\n\t // 其余属性默认使用全局文本样式,详见TEXTSTYLE\n\t textStyle: {\n\t color: 'auto',\n\t fontSize: 30\n\t }\n\t }\n\t }\n\t });\n\t\n\t module.exports = GaugeSeries;\n\n\n/***/ },\n/* 543 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var PointerPath = __webpack_require__(544);\n\t\n\t var graphic = __webpack_require__(4);\n\t var numberUtil = __webpack_require__(5);\n\t var parsePercent = numberUtil.parsePercent;\n\t\n\t function parsePosition(seriesModel, api) {\n\t var center = seriesModel.get('center');\n\t var width = api.getWidth();\n\t var height = api.getHeight();\n\t var size = Math.min(width, height);\n\t var cx = parsePercent(center[0], api.getWidth());\n\t var cy = parsePercent(center[1], api.getHeight());\n\t var r = parsePercent(seriesModel.get('radius'), size / 2);\n\t\n\t return {\n\t cx: cx,\n\t cy: cy,\n\t r: r\n\t };\n\t }\n\t\n\t function formatLabel(label, labelFormatter) {\n\t if (labelFormatter) {\n\t if (typeof labelFormatter === 'string') {\n\t label = labelFormatter.replace('{value}', label != null ? label : '');\n\t }\n\t else if (typeof labelFormatter === 'function') {\n\t label = labelFormatter(label);\n\t }\n\t }\n\t\n\t return label;\n\t }\n\t\n\t var PI2 = Math.PI * 2;\n\t\n\t var GaugeView = __webpack_require__(56).extend({\n\t\n\t type: 'gauge',\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t\n\t this.group.removeAll();\n\t\n\t var colorList = seriesModel.get('axisLine.lineStyle.color');\n\t var posInfo = parsePosition(seriesModel, api);\n\t\n\t this._renderMain(\n\t seriesModel, ecModel, api, colorList, posInfo\n\t );\n\t },\n\t\n\t dispose: function () {},\n\t\n\t _renderMain: function (seriesModel, ecModel, api, colorList, posInfo) {\n\t var group = this.group;\n\t\n\t var axisLineModel = seriesModel.getModel('axisLine');\n\t var lineStyleModel = axisLineModel.getModel('lineStyle');\n\t\n\t var clockwise = seriesModel.get('clockwise');\n\t var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI;\n\t var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI;\n\t\n\t var angleRangeSpan = (endAngle - startAngle) % PI2;\n\t\n\t var prevEndAngle = startAngle;\n\t var axisLineWidth = lineStyleModel.get('width');\n\t\n\t for (var i = 0; i < colorList.length; i++) {\n\t // Clamp\n\t var percent = Math.min(Math.max(colorList[i][0], 0), 1);\n\t var endAngle = startAngle + angleRangeSpan * percent;\n\t var sector = new graphic.Sector({\n\t shape: {\n\t startAngle: prevEndAngle,\n\t endAngle: endAngle,\n\t cx: posInfo.cx,\n\t cy: posInfo.cy,\n\t clockwise: clockwise,\n\t r0: posInfo.r - axisLineWidth,\n\t r: posInfo.r\n\t },\n\t silent: true\n\t });\n\t\n\t sector.setStyle({\n\t fill: colorList[i][1]\n\t });\n\t\n\t sector.setStyle(lineStyleModel.getLineStyle(\n\t // Because we use sector to simulate arc\n\t // so the properties for stroking are useless\n\t ['color', 'borderWidth', 'borderColor']\n\t ));\n\t\n\t group.add(sector);\n\t\n\t prevEndAngle = endAngle;\n\t }\n\t\n\t var getColor = function (percent) {\n\t // Less than 0\n\t if (percent <= 0) {\n\t return colorList[0][1];\n\t }\n\t for (var i = 0; i < colorList.length; i++) {\n\t if (colorList[i][0] >= percent\n\t && (i === 0 ? 0 : colorList[i - 1][0]) < percent\n\t ) {\n\t return colorList[i][1];\n\t }\n\t }\n\t // More than 1\n\t return colorList[i - 1][1];\n\t };\n\t\n\t if (!clockwise) {\n\t var tmp = startAngle;\n\t startAngle = endAngle;\n\t endAngle = tmp;\n\t }\n\t\n\t this._renderTicks(\n\t seriesModel, ecModel, api, getColor, posInfo,\n\t startAngle, endAngle, clockwise\n\t );\n\t\n\t this._renderPointer(\n\t seriesModel, ecModel, api, getColor, posInfo,\n\t startAngle, endAngle, clockwise\n\t );\n\t\n\t this._renderTitle(\n\t seriesModel, ecModel, api, getColor, posInfo\n\t );\n\t this._renderDetail(\n\t seriesModel, ecModel, api, getColor, posInfo\n\t );\n\t },\n\t\n\t _renderTicks: function (\n\t seriesModel, ecModel, api, getColor, posInfo,\n\t startAngle, endAngle, clockwise\n\t ) {\n\t var group = this.group;\n\t var cx = posInfo.cx;\n\t var cy = posInfo.cy;\n\t var r = posInfo.r;\n\t\n\t var minVal = seriesModel.get('min');\n\t var maxVal = seriesModel.get('max');\n\t\n\t var splitLineModel = seriesModel.getModel('splitLine');\n\t var tickModel = seriesModel.getModel('axisTick');\n\t var labelModel = seriesModel.getModel('axisLabel');\n\t\n\t var splitNumber = seriesModel.get('splitNumber');\n\t var subSplitNumber = tickModel.get('splitNumber');\n\t\n\t var splitLineLen = parsePercent(\n\t splitLineModel.get('length'), r\n\t );\n\t var tickLen = parsePercent(\n\t tickModel.get('length'), r\n\t );\n\t\n\t var angle = startAngle;\n\t var step = (endAngle - startAngle) / splitNumber;\n\t var subStep = step / subSplitNumber;\n\t\n\t var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();\n\t var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();\n\t var textStyleModel = labelModel.getModel('textStyle');\n\t\n\t for (var i = 0; i <= splitNumber; i++) {\n\t var unitX = Math.cos(angle);\n\t var unitY = Math.sin(angle);\n\t // Split line\n\t if (splitLineModel.get('show')) {\n\t var splitLine = new graphic.Line({\n\t shape: {\n\t x1: unitX * r + cx,\n\t y1: unitY * r + cy,\n\t x2: unitX * (r - splitLineLen) + cx,\n\t y2: unitY * (r - splitLineLen) + cy\n\t },\n\t style: splitLineStyle,\n\t silent: true\n\t });\n\t if (splitLineStyle.stroke === 'auto') {\n\t splitLine.setStyle({\n\t stroke: getColor(i / splitNumber)\n\t });\n\t }\n\t\n\t group.add(splitLine);\n\t }\n\t\n\t // Label\n\t if (labelModel.get('show')) {\n\t var label = formatLabel(\n\t numberUtil.round(i / splitNumber * (maxVal - minVal) + minVal),\n\t labelModel.get('formatter')\n\t );\n\t var distance = labelModel.get('distance');\n\t\n\t var text = new graphic.Text({\n\t style: {\n\t text: label,\n\t x: unitX * (r - splitLineLen - distance) + cx,\n\t y: unitY * (r - splitLineLen - distance) + cy,\n\t fill: textStyleModel.getTextColor(),\n\t textFont: textStyleModel.getFont(),\n\t textVerticalAlign: unitY < -0.4 ? 'top' : (unitY > 0.4 ? 'bottom' : 'middle'),\n\t textAlign: unitX < -0.4 ? 'left' : (unitX > 0.4 ? 'right' : 'center')\n\t },\n\t silent: true\n\t });\n\t if (text.style.fill === 'auto') {\n\t text.setStyle({\n\t fill: getColor(i / splitNumber)\n\t });\n\t }\n\t\n\t group.add(text);\n\t }\n\t\n\t // Axis tick\n\t if (tickModel.get('show') && i !== splitNumber) {\n\t for (var j = 0; j <= subSplitNumber; j++) {\n\t var unitX = Math.cos(angle);\n\t var unitY = Math.sin(angle);\n\t var tickLine = new graphic.Line({\n\t shape: {\n\t x1: unitX * r + cx,\n\t y1: unitY * r + cy,\n\t x2: unitX * (r - tickLen) + cx,\n\t y2: unitY * (r - tickLen) + cy\n\t },\n\t silent: true,\n\t style: tickLineStyle\n\t });\n\t\n\t if (tickLineStyle.stroke === 'auto') {\n\t tickLine.setStyle({\n\t stroke: getColor((i + j / subSplitNumber) / splitNumber)\n\t });\n\t }\n\t\n\t group.add(tickLine);\n\t angle += subStep;\n\t }\n\t angle -= subStep;\n\t }\n\t else {\n\t angle += step;\n\t }\n\t }\n\t },\n\t\n\t _renderPointer: function (\n\t seriesModel, ecModel, api, getColor, posInfo,\n\t startAngle, endAngle, clockwise\n\t ) {\n\t var valueExtent = [+seriesModel.get('min'), +seriesModel.get('max')];\n\t var angleExtent = [startAngle, endAngle];\n\t\n\t var data = seriesModel.getData();\n\t var oldData = this._data;\n\t\n\t var group = this.group;\n\t\n\t data.diff(oldData)\n\t .add(function (idx) {\n\t var pointer = new PointerPath({\n\t shape: {\n\t angle: startAngle\n\t }\n\t });\n\t\n\t graphic.updateProps(pointer, {\n\t shape: {\n\t angle: numberUtil.linearMap(data.get('value', idx), valueExtent, angleExtent, true)\n\t }\n\t }, seriesModel);\n\t\n\t group.add(pointer);\n\t data.setItemGraphicEl(idx, pointer);\n\t })\n\t .update(function (newIdx, oldIdx) {\n\t var pointer = oldData.getItemGraphicEl(oldIdx);\n\t\n\t graphic.updateProps(pointer, {\n\t shape: {\n\t angle: numberUtil.linearMap(data.get('value', newIdx), valueExtent, angleExtent, true)\n\t }\n\t }, seriesModel);\n\t\n\t group.add(pointer);\n\t data.setItemGraphicEl(newIdx, pointer);\n\t })\n\t .remove(function (idx) {\n\t var pointer = oldData.getItemGraphicEl(idx);\n\t group.remove(pointer);\n\t })\n\t .execute();\n\t\n\t data.eachItemGraphicEl(function (pointer, idx) {\n\t var itemModel = data.getItemModel(idx);\n\t var pointerModel = itemModel.getModel('pointer');\n\t\n\t pointer.setShape({\n\t x: posInfo.cx,\n\t y: posInfo.cy,\n\t width: parsePercent(\n\t pointerModel.get('width'), posInfo.r\n\t ),\n\t r: parsePercent(pointerModel.get('length'), posInfo.r)\n\t });\n\t\n\t pointer.useStyle(itemModel.getModel('itemStyle.normal').getItemStyle());\n\t\n\t if (pointer.style.fill === 'auto') {\n\t pointer.setStyle('fill', getColor(\n\t (data.get('value', idx) - valueExtent[0]) / (valueExtent[1] - valueExtent[0])\n\t ));\n\t }\n\t\n\t graphic.setHoverStyle(\n\t pointer, itemModel.getModel('itemStyle.emphasis').getItemStyle()\n\t );\n\t });\n\t\n\t this._data = data;\n\t },\n\t\n\t _renderTitle: function (\n\t seriesModel, ecModel, api, getColor, posInfo\n\t ) {\n\t var titleModel = seriesModel.getModel('title');\n\t if (titleModel.get('show')) {\n\t var textStyleModel = titleModel.getModel('textStyle');\n\t var offsetCenter = titleModel.get('offsetCenter');\n\t var x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);\n\t var y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);\n\t var text = new graphic.Text({\n\t style: {\n\t x: x,\n\t y: y,\n\t // FIXME First data name ?\n\t text: seriesModel.getData().getName(0),\n\t fill: textStyleModel.getTextColor(),\n\t textFont: textStyleModel.getFont(),\n\t textAlign: 'center',\n\t textVerticalAlign: 'middle'\n\t }\n\t });\n\t this.group.add(text);\n\t }\n\t },\n\t\n\t _renderDetail: function (\n\t seriesModel, ecModel, api, getColor, posInfo\n\t ) {\n\t var detailModel = seriesModel.getModel('detail');\n\t var minVal = seriesModel.get('min');\n\t var maxVal = seriesModel.get('max');\n\t if (detailModel.get('show')) {\n\t var textStyleModel = detailModel.getModel('textStyle');\n\t var offsetCenter = detailModel.get('offsetCenter');\n\t var x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);\n\t var y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);\n\t var width = parsePercent(detailModel.get('width'), posInfo.r);\n\t var height = parsePercent(detailModel.get('height'), posInfo.r);\n\t var value = seriesModel.getData().get('value', 0);\n\t var rect = new graphic.Rect({\n\t shape: {\n\t x: x - width / 2,\n\t y: y - height / 2,\n\t width: width,\n\t height: height\n\t },\n\t style: {\n\t text: formatLabel(\n\t // FIXME First data name ?\n\t value, detailModel.get('formatter')\n\t ),\n\t fill: detailModel.get('backgroundColor'),\n\t textFill: textStyleModel.getTextColor(),\n\t textFont: textStyleModel.getFont()\n\t }\n\t });\n\t if (rect.style.textFill === 'auto') {\n\t rect.setStyle('textFill', getColor(\n\t numberUtil.linearMap(value, [minVal, maxVal], [0, 1], true)\n\t ));\n\t }\n\t rect.setStyle(detailModel.getItemStyle(['color']));\n\t this.group.add(rect);\n\t }\n\t }\n\t });\n\t\n\t module.exports = GaugeView;\n\n\n/***/ },\n/* 544 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t module.exports = __webpack_require__(24).extend({\n\t\n\t type: 'echartsGaugePointer',\n\t\n\t shape: {\n\t angle: 0,\n\t\n\t width: 10,\n\t\n\t r: 10,\n\t\n\t x: 0,\n\t\n\t y: 0\n\t },\n\t\n\t buildPath: function (ctx, shape) {\n\t var mathCos = Math.cos;\n\t var mathSin = Math.sin;\n\t\n\t var r = shape.r;\n\t var width = shape.width;\n\t var angle = shape.angle;\n\t var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2);\n\t var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2);\n\t\n\t angle = shape.angle - Math.PI / 2;\n\t ctx.moveTo(x, y);\n\t ctx.lineTo(\n\t shape.x + mathCos(angle) * width,\n\t shape.y + mathSin(angle) * width\n\t );\n\t ctx.lineTo(\n\t shape.x + mathCos(shape.angle) * r,\n\t shape.y + mathSin(shape.angle) * r\n\t );\n\t ctx.lineTo(\n\t shape.x - mathCos(angle) * width,\n\t shape.y - mathSin(angle) * width\n\t );\n\t ctx.lineTo(x, y);\n\t return;\n\t }\n\t });\n\n\n/***/ },\n/* 545 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t __webpack_require__(546);\n\t __webpack_require__(547);\n\t\n\t __webpack_require__(556);\n\t\n\t echarts.registerProcessor(__webpack_require__(549));\n\t\n\t echarts.registerVisual(zrUtil.curry(\n\t __webpack_require__(90), 'graph', 'circle', null\n\t ));\n\t echarts.registerVisual(__webpack_require__(550));\n\t echarts.registerVisual(__webpack_require__(553));\n\t\n\t echarts.registerLayout(__webpack_require__(557));\n\t echarts.registerLayout(__webpack_require__(551));\n\t echarts.registerLayout(__webpack_require__(555));\n\t\n\t // Graph view coordinate system\n\t echarts.registerCoordinateSystem('graphView', {\n\t create: __webpack_require__(552)\n\t });\n\n\n/***/ },\n/* 546 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var List = __webpack_require__(20);\n\t var zrUtil = __webpack_require__(1);\n\t var modelUtil = __webpack_require__(14);\n\t var Model = __webpack_require__(21);\n\t\n\t var createGraphFromNodeEdge = __webpack_require__(216);\n\t\n\t var GraphSeries = __webpack_require__(3).extendSeriesModel({\n\t\n\t type: 'series.graph',\n\t\n\t init: function (option) {\n\t GraphSeries.superApply(this, 'init', arguments);\n\t\n\t // Provide data for legend select\n\t this.legendDataProvider = function () {\n\t return this._categoriesData;\n\t };\n\t\n\t this.fillDataTextStyle(option.edges || option.links);\n\t\n\t this._updateCategoriesData();\n\t },\n\t\n\t mergeOption: function (option) {\n\t GraphSeries.superApply(this, 'mergeOption', arguments);\n\t\n\t this.fillDataTextStyle(option.edges || option.links);\n\t\n\t this._updateCategoriesData();\n\t },\n\t\n\t mergeDefaultAndTheme: function (option) {\n\t GraphSeries.superApply(this, 'mergeDefaultAndTheme', arguments);\n\t modelUtil.defaultEmphasis(option.edgeLabel, modelUtil.LABEL_OPTIONS);\n\t },\n\t\n\t getInitialData: function (option, ecModel) {\n\t var edges = option.edges || option.links || [];\n\t var nodes = option.data || option.nodes || [];\n\t var self = this;\n\t\n\t if (nodes && edges) {\n\t return createGraphFromNodeEdge(nodes, edges, this, true, beforeLink).data;\n\t }\n\t\n\t function beforeLink(nodeData, edgeData) {\n\t // Overwrite nodeData.getItemModel to\n\t nodeData.wrapMethod('getItemModel', function (model) {\n\t var categoriesModels = self._categoriesModels;\n\t var categoryIdx = model.getShallow('category');\n\t var categoryModel = categoriesModels[categoryIdx];\n\t if (categoryModel) {\n\t categoryModel.parentModel = model.parentModel;\n\t model.parentModel = categoryModel;\n\t }\n\t return model;\n\t });\n\t\n\t var edgeLabelModel = self.getModel('edgeLabel');\n\t var wrappedGetEdgeModel = function (path, parentModel) {\n\t var pathArr = (path || '').split('.');\n\t if (pathArr[0] === 'label') {\n\t parentModel = parentModel\n\t || edgeLabelModel.getModel(pathArr.slice(1));\n\t }\n\t var model = Model.prototype.getModel.call(this, pathArr, parentModel);\n\t model.getModel = wrappedGetEdgeModel;\n\t return model;\n\t };\n\t edgeData.wrapMethod('getItemModel', function (model) {\n\t // FIXME Wrap get method ?\n\t model.getModel = wrappedGetEdgeModel;\n\t return model;\n\t });\n\t }\n\t },\n\t\n\t /**\n\t * @return {module:echarts/data/Graph}\n\t */\n\t getGraph: function () {\n\t return this.getData().graph;\n\t },\n\t\n\t /**\n\t * @return {module:echarts/data/List}\n\t */\n\t getEdgeData: function () {\n\t return this.getGraph().edgeData;\n\t },\n\t\n\t /**\n\t * @return {module:echarts/data/List}\n\t */\n\t getCategoriesData: function () {\n\t return this._categoriesData;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t formatTooltip: function (dataIndex, multipleSeries, dataType) {\n\t if (dataType === 'edge') {\n\t var nodeData = this.getData();\n\t var params = this.getDataParams(dataIndex, dataType);\n\t var edge = nodeData.graph.getEdgeByIndex(dataIndex);\n\t var sourceName = nodeData.getName(edge.node1.dataIndex);\n\t var targetName = nodeData.getName(edge.node2.dataIndex);\n\t var html = sourceName + ' > ' + targetName;\n\t if (params.value) {\n\t html += ' : ' + params.value;\n\t }\n\t return html;\n\t }\n\t else { // dataType === 'node' or empty\n\t return GraphSeries.superApply(this, 'formatTooltip', arguments);\n\t }\n\t },\n\t\n\t _updateCategoriesData: function () {\n\t var categories = zrUtil.map(this.option.categories || [], function (category) {\n\t // Data must has value\n\t return category.value != null ? category : zrUtil.extend({\n\t value: 0\n\t }, category);\n\t });\n\t var categoriesData = new List(['value'], this);\n\t categoriesData.initData(categories);\n\t\n\t this._categoriesData = categoriesData;\n\t\n\t this._categoriesModels = categoriesData.mapArray(function (idx) {\n\t return categoriesData.getItemModel(idx, true);\n\t });\n\t },\n\t\n\t setZoom: function (zoom) {\n\t this.option.zoom = zoom;\n\t },\n\t\n\t setCenter: function (center) {\n\t this.option.center = center;\n\t },\n\t\n\t ifEnableAnimation: function () {\n\t return GraphSeries.superCall(this, 'ifEnableAnimation')\n\t // Not enable animation when do force layout\n\t && !(this.get('layout') === 'force' && this.get('force.layoutAnimation'));\n\t },\n\t\n\t defaultOption: {\n\t zlevel: 0,\n\t z: 2,\n\t\n\t coordinateSystem: 'view',\n\t\n\t // Default option for all coordinate systems\n\t // xAxisIndex: 0,\n\t // yAxisIndex: 0,\n\t // polarIndex: 0,\n\t // geoIndex: 0,\n\t\n\t legendHoverLink: true,\n\t\n\t hoverAnimation: true,\n\t\n\t layout: null,\n\t\n\t focusNodeAdjacency: false,\n\t\n\t // Configuration of circular layout\n\t circular: {\n\t rotateLabel: false\n\t },\n\t // Configuration of force directed layout\n\t force: {\n\t initLayout: null,\n\t // Node repulsion. Can be an array to represent range.\n\t repulsion: [0, 50],\n\t gravity: 0.1,\n\t\n\t // Edge length. Can be an array to represent range.\n\t edgeLength: 30,\n\t\n\t layoutAnimation: true\n\t },\n\t\n\t left: 'center',\n\t top: 'center',\n\t // right: null,\n\t // bottom: null,\n\t // width: '80%',\n\t // height: '80%',\n\t\n\t symbol: 'circle',\n\t symbolSize: 10,\n\t\n\t edgeSymbol: ['none', 'none'],\n\t edgeSymbolSize: 10,\n\t edgeLabel: {\n\t normal: {\n\t position: 'middle'\n\t },\n\t emphasis: {}\n\t },\n\t\n\t draggable: false,\n\t\n\t roam: false,\n\t\n\t // Default on center of graph\n\t center: null,\n\t\n\t zoom: 1,\n\t // Symbol size scale ratio in roam\n\t nodeScaleRatio: 0.6,\n\t\n\t // categories: [],\n\t\n\t // data: []\n\t // Or\n\t // nodes: []\n\t //\n\t // links: []\n\t // Or\n\t // edges: []\n\t\n\t label: {\n\t normal: {\n\t show: false,\n\t formatter: '{b}'\n\t },\n\t emphasis: {\n\t show: true\n\t }\n\t },\n\t\n\t itemStyle: {\n\t normal: {},\n\t emphasis: {}\n\t },\n\t\n\t lineStyle: {\n\t normal: {\n\t color: '#aaa',\n\t width: 1,\n\t curveness: 0,\n\t opacity: 0.5\n\t },\n\t emphasis: {}\n\t }\n\t }\n\t });\n\t\n\t module.exports = GraphSeries;\n\n\n/***/ },\n/* 547 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t\n\t var SymbolDraw = __webpack_require__(84);\n\t var LineDraw = __webpack_require__(150);\n\t var RoamController = __webpack_require__(106);\n\t\n\t var graphic = __webpack_require__(4);\n\t var adjustEdge = __webpack_require__(548);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var nodeOpacityPath = ['itemStyle', 'normal', 'opacity'];\n\t var lineOpacityPath = ['lineStyle', 'normal', 'opacity'];\n\t\n\t function getItemOpacity(item, opacityPath) {\n\t return item.getVisual('opacity') || item.getModel().get(opacityPath);\n\t }\n\t\n\t __webpack_require__(3).extendChartView({\n\t\n\t type: 'graph',\n\t\n\t init: function (ecModel, api) {\n\t var symbolDraw = new SymbolDraw();\n\t var lineDraw = new LineDraw();\n\t var group = this.group;\n\t\n\t var controller = new RoamController(api.getZr(), group);\n\t\n\t group.add(symbolDraw.group);\n\t group.add(lineDraw.group);\n\t\n\t this._symbolDraw = symbolDraw;\n\t this._lineDraw = lineDraw;\n\t this._controller = controller;\n\t\n\t this._firstRender = true;\n\t },\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t\n\t this._model = seriesModel;\n\t this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');\n\t\n\t var symbolDraw = this._symbolDraw;\n\t var lineDraw = this._lineDraw;\n\t\n\t var group = this.group;\n\t\n\t if (coordSys.type === 'view') {\n\t var groupNewProp = {\n\t position: coordSys.position,\n\t scale: coordSys.scale\n\t };\n\t if (this._firstRender) {\n\t group.attr(groupNewProp);\n\t }\n\t else {\n\t graphic.updateProps(group, groupNewProp, seriesModel);\n\t }\n\t }\n\t // Fix edge contact point with node\n\t adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel));\n\t\n\t var data = seriesModel.getData();\n\t symbolDraw.updateData(data);\n\t\n\t var edgeData = seriesModel.getEdgeData();\n\t lineDraw.updateData(edgeData);\n\t\n\t this._updateNodeAndLinkScale();\n\t\n\t this._updateController(seriesModel, api);\n\t\n\t clearTimeout(this._layoutTimeout);\n\t var forceLayout = seriesModel.forceLayout;\n\t var layoutAnimation = seriesModel.get('force.layoutAnimation');\n\t if (forceLayout) {\n\t this._startForceLayoutIteration(forceLayout, layoutAnimation);\n\t }\n\t data.eachItemGraphicEl(function (el, idx) {\n\t var itemModel = data.getItemModel(idx);\n\t // Update draggable\n\t el.off('drag').off('dragend');\n\t var draggable = data.getItemModel(idx).get('draggable');\n\t if (draggable) {\n\t el.on('drag', function () {\n\t if (forceLayout) {\n\t forceLayout.warmUp();\n\t !this._layouting\n\t && this._startForceLayoutIteration(forceLayout, layoutAnimation);\n\t forceLayout.setFixed(idx);\n\t // Write position back to layout\n\t data.setItemLayout(idx, el.position);\n\t }\n\t }, this).on('dragend', function () {\n\t if (forceLayout) {\n\t forceLayout.setUnfixed(idx);\n\t }\n\t }, this);\n\t }\n\t el.setDraggable(draggable && forceLayout);\n\t\n\t el.off('mouseover', this._focusNodeAdjacency);\n\t el.off('mouseout', this._unfocusAll);\n\t if (itemModel.get('focusNodeAdjacency')) {\n\t el.on('mouseover', this._focusNodeAdjacency, this);\n\t el.on('mouseout', this._unfocusAll, this);\n\t }\n\t }, this);\n\t\n\t var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get('circular.rotateLabel');\n\t var cx = data.getLayout('cx');\n\t var cy = data.getLayout('cy');\n\t data.eachItemGraphicEl(function (el, idx) {\n\t var symbolPath = el.getSymbolPath();\n\t if (circularRotateLabel) {\n\t var pos = data.getItemLayout(idx);\n\t var rad = Math.atan2(pos[1] - cy, pos[0] - cx);\n\t if (rad < 0) {\n\t rad = Math.PI * 2 + rad;\n\t }\n\t var isLeft = pos[0] < cx;\n\t if (isLeft) {\n\t rad = rad - Math.PI;\n\t }\n\t var textPosition = isLeft ? 'left' : 'right';\n\t symbolPath.setStyle({\n\t textRotation: rad,\n\t textPosition: textPosition\n\t });\n\t symbolPath.hoverStyle && (symbolPath.hoverStyle.textPosition = textPosition);\n\t }\n\t else {\n\t symbolPath.setStyle({\n\t textRotation: 0\n\t });\n\t }\n\t });\n\t\n\t this._firstRender = false;\n\t },\n\t\n\t dispose: function () {\n\t this._controller && this._controller.dispose();\n\t },\n\t\n\t _focusNodeAdjacency: function (e) {\n\t var data = this._model.getData();\n\t var graph = data.graph;\n\t var el = e.target;\n\t var dataIndex = el.dataIndex;\n\t var dataType = el.dataType;\n\t\n\t function fadeOutItem(item, opacityPath) {\n\t var opacity = getItemOpacity(item, opacityPath);\n\t var el = item.getGraphicEl();\n\t if (opacity == null) {\n\t opacity = 1;\n\t }\n\t\n\t el.traverse(function (child) {\n\t child.trigger('normal');\n\t if (child.type !== 'group') {\n\t child.setStyle('opacity', opacity * 0.1);\n\t }\n\t });\n\t }\n\t\n\t function fadeInItem(item, opacityPath) {\n\t var opacity = getItemOpacity(item, opacityPath);\n\t var el = item.getGraphicEl();\n\t\n\t el.traverse(function (child) {\n\t child.trigger('emphasis');\n\t if (child.type !== 'group') {\n\t child.setStyle('opacity', opacity);\n\t }\n\t });\n\t }\n\t if (dataIndex !== null && dataType !== 'edge') {\n\t graph.eachNode(function (node) {\n\t fadeOutItem(node, nodeOpacityPath);\n\t });\n\t graph.eachEdge(function (edge) {\n\t fadeOutItem(edge, lineOpacityPath);\n\t });\n\t\n\t var node = graph.getNodeByIndex(dataIndex);\n\t fadeInItem(node, nodeOpacityPath);\n\t zrUtil.each(node.edges, function (edge) {\n\t if (edge.dataIndex < 0) {\n\t return;\n\t }\n\t fadeInItem(edge, lineOpacityPath);\n\t fadeInItem(edge.node1, nodeOpacityPath);\n\t fadeInItem(edge.node2, nodeOpacityPath);\n\t });\n\t }\n\t },\n\t\n\t _unfocusAll: function () {\n\t var data = this._model.getData();\n\t var graph = data.graph;\n\t graph.eachNode(function (node) {\n\t var opacity = getItemOpacity(node, nodeOpacityPath);\n\t node.getGraphicEl().traverse(function (child) {\n\t child.trigger('normal');\n\t if (child.type !== 'group') {\n\t child.setStyle('opacity', opacity);\n\t }\n\t });\n\t });\n\t graph.eachEdge(function (edge) {\n\t var opacity = getItemOpacity(edge, lineOpacityPath);\n\t edge.getGraphicEl().traverse(function (child) {\n\t child.trigger('normal');\n\t if (child.type !== 'group') {\n\t child.setStyle('opacity', opacity);\n\t }\n\t });\n\t });\n\t },\n\t\n\t _startForceLayoutIteration: function (forceLayout, layoutAnimation) {\n\t var self = this;\n\t (function step() {\n\t forceLayout.step(function (stopped) {\n\t self.updateLayout(self._model);\n\t (self._layouting = !stopped) && (\n\t layoutAnimation\n\t ? (self._layoutTimeout = setTimeout(step, 16))\n\t : step()\n\t );\n\t });\n\t })();\n\t },\n\t\n\t _updateController: function (seriesModel, api) {\n\t var controller = this._controller;\n\t var group = this.group;\n\t\n\t controller.setContainsPoint(function (x, y) {\n\t var rect = group.getBoundingRect();\n\t rect.applyTransform(group.transform);\n\t return rect.contain(x, y);\n\t });\n\t\n\t if (seriesModel.coordinateSystem.type !== 'view') {\n\t controller.disable();\n\t return;\n\t }\n\t controller.enable(seriesModel.get('roam'));\n\t controller.zoomLimit = seriesModel.get('scaleLimit');\n\t // Update zoom from model\n\t controller.zoom = seriesModel.coordinateSystem.getZoom();\n\t\n\t controller\n\t .off('pan')\n\t .off('zoom')\n\t .on('pan', function (dx, dy) {\n\t api.dispatchAction({\n\t seriesId: seriesModel.id,\n\t type: 'graphRoam',\n\t dx: dx,\n\t dy: dy\n\t });\n\t })\n\t .on('zoom', function (zoom, mouseX, mouseY) {\n\t api.dispatchAction({\n\t seriesId: seriesModel.id,\n\t type: 'graphRoam',\n\t zoom: zoom,\n\t originX: mouseX,\n\t originY: mouseY\n\t });\n\t this._updateNodeAndLinkScale();\n\t adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel));\n\t this._lineDraw.updateLayout();\n\t }, this);\n\t },\n\t\n\t _updateNodeAndLinkScale: function () {\n\t var seriesModel = this._model;\n\t var data = seriesModel.getData();\n\t\n\t var nodeScale = this._getNodeGlobalScale(seriesModel);\n\t var invScale = [nodeScale, nodeScale];\n\t\n\t data.eachItemGraphicEl(function (el, idx) {\n\t el.attr('scale', invScale);\n\t });\n\t },\n\t\n\t _getNodeGlobalScale: function (seriesModel) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t if (coordSys.type !== 'view') {\n\t return 1;\n\t }\n\t\n\t var nodeScaleRatio = this._nodeScaleRatio;\n\t\n\t var groupScale = coordSys.scale;\n\t var groupZoom = (groupScale && groupScale[0]) || 1;\n\t // Scale node when zoom changes\n\t var roamZoom = coordSys.getZoom();\n\t var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;\n\t\n\t return nodeScale / groupZoom;\n\t },\n\t\n\t updateLayout: function (seriesModel) {\n\t adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel));\n\t\n\t this._symbolDraw.updateLayout();\n\t this._lineDraw.updateLayout();\n\t },\n\t\n\t remove: function (ecModel, api) {\n\t this._symbolDraw && this._symbolDraw.remove();\n\t this._lineDraw && this._lineDraw.remove();\n\t }\n\t });\n\n\n/***/ },\n/* 548 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var curveTool = __webpack_require__(58);\n\t var vec2 = __webpack_require__(10);\n\t\n\t var v1 = [];\n\t var v2 = [];\n\t var v3 = [];\n\t var quadraticAt = curveTool.quadraticAt;\n\t var v2DistSquare = vec2.distSquare;\n\t var mathAbs = Math.abs;\n\t function intersectCurveCircle(curvePoints, center, radius) {\n\t var p0 = curvePoints[0];\n\t var p1 = curvePoints[1];\n\t var p2 = curvePoints[2];\n\t\n\t var d = Infinity;\n\t var t;\n\t var radiusSquare = radius * radius;\n\t var interval = 0.1;\n\t\n\t for (var _t = 0.1; _t <= 0.9; _t += 0.1) {\n\t v1[0] = quadraticAt(p0[0], p1[0], p2[0], _t);\n\t v1[1] = quadraticAt(p0[1], p1[1], p2[1], _t);\n\t var diff = mathAbs(v2DistSquare(v1, center) - radiusSquare);\n\t if (diff < d) {\n\t d = diff;\n\t t = _t;\n\t }\n\t }\n\t\n\t // Assume the segment is monotone,Find root through Bisection method\n\t // At most 32 iteration\n\t for (var i = 0; i < 32; i++) {\n\t // var prev = t - interval;\n\t var next = t + interval;\n\t // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev);\n\t // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev);\n\t v2[0] = quadraticAt(p0[0], p1[0], p2[0], t);\n\t v2[1] = quadraticAt(p0[1], p1[1], p2[1], t);\n\t v3[0] = quadraticAt(p0[0], p1[0], p2[0], next);\n\t v3[1] = quadraticAt(p0[1], p1[1], p2[1], next);\n\t\n\t var diff = v2DistSquare(v2, center) - radiusSquare;\n\t if (mathAbs(diff) < 1e-2) {\n\t break;\n\t }\n\t\n\t // var prevDiff = v2DistSquare(v1, center) - radiusSquare;\n\t var nextDiff = v2DistSquare(v3, center) - radiusSquare;\n\t\n\t interval /= 2;\n\t if (diff < 0) {\n\t if (nextDiff >= 0) {\n\t t = t + interval;\n\t }\n\t else {\n\t t = t - interval;\n\t }\n\t }\n\t else {\n\t if (nextDiff >= 0) {\n\t t = t - interval;\n\t }\n\t else {\n\t t = t + interval;\n\t }\n\t }\n\t }\n\t\n\t return t;\n\t }\n\t // Adjust edge to avoid\n\t module.exports = function (graph, scale) {\n\t var tmp0 = [];\n\t var quadraticSubdivide = curveTool.quadraticSubdivide;\n\t var pts = [[], [], []];\n\t var pts2 = [[], []];\n\t var v = [];\n\t scale /= 2;\n\t\n\t function getSymbolSize(node) {\n\t var symbolSize = node.getVisual('symbolSize');\n\t if (symbolSize instanceof Array) {\n\t symbolSize = (symbolSize[0] + symbolSize[1]) / 2;\n\t }\n\t return symbolSize;\n\t }\n\t graph.eachEdge(function (edge, idx) {\n\t var linePoints = edge.getLayout();\n\t var fromSymbol = edge.getVisual('fromSymbol');\n\t var toSymbol = edge.getVisual('toSymbol');\n\t\n\t if (!linePoints.__original) {\n\t linePoints.__original = [\n\t vec2.clone(linePoints[0]),\n\t vec2.clone(linePoints[1])\n\t ];\n\t if (linePoints[2]) {\n\t linePoints.__original.push(vec2.clone(linePoints[2]));\n\t }\n\t }\n\t var originalPoints = linePoints.__original;\n\t // Quadratic curve\n\t if (linePoints[2] != null) {\n\t vec2.copy(pts[0], originalPoints[0]);\n\t vec2.copy(pts[1], originalPoints[2]);\n\t vec2.copy(pts[2], originalPoints[1]);\n\t if (fromSymbol && fromSymbol != 'none') {\n\t var symbolSize = getSymbolSize(edge.node1);\n\t\n\t var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale);\n\t // Subdivide and get the second\n\t quadraticSubdivide(pts[0][0], pts[1][0], pts[2][0], t, tmp0);\n\t pts[0][0] = tmp0[3];\n\t pts[1][0] = tmp0[4];\n\t quadraticSubdivide(pts[0][1], pts[1][1], pts[2][1], t, tmp0);\n\t pts[0][1] = tmp0[3];\n\t pts[1][1] = tmp0[4];\n\t }\n\t if (toSymbol && toSymbol != 'none') {\n\t var symbolSize = getSymbolSize(edge.node2);\n\t\n\t var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale);\n\t // Subdivide and get the first\n\t quadraticSubdivide(pts[0][0], pts[1][0], pts[2][0], t, tmp0);\n\t pts[1][0] = tmp0[1];\n\t pts[2][0] = tmp0[2];\n\t quadraticSubdivide(pts[0][1], pts[1][1], pts[2][1], t, tmp0);\n\t pts[1][1] = tmp0[1];\n\t pts[2][1] = tmp0[2];\n\t }\n\t // Copy back to layout\n\t vec2.copy(linePoints[0], pts[0]);\n\t vec2.copy(linePoints[1], pts[2]);\n\t vec2.copy(linePoints[2], pts[1]);\n\t }\n\t // Line\n\t else {\n\t vec2.copy(pts2[0], originalPoints[0]);\n\t vec2.copy(pts2[1], originalPoints[1]);\n\t\n\t vec2.sub(v, pts2[1], pts2[0]);\n\t vec2.normalize(v, v);\n\t if (fromSymbol && fromSymbol != 'none') {\n\t\n\t var symbolSize = getSymbolSize(edge.node1);\n\t\n\t vec2.scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale);\n\t }\n\t if (toSymbol && toSymbol != 'none') {\n\t var symbolSize = getSymbolSize(edge.node2);\n\t\n\t vec2.scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale);\n\t }\n\t vec2.copy(linePoints[0], pts2[0]);\n\t vec2.copy(linePoints[1], pts2[1]);\n\t }\n\t });\n\t };\n\n\n/***/ },\n/* 549 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t module.exports = function (ecModel) {\n\t var legendModels = ecModel.findComponents({\n\t mainType: 'legend'\n\t });\n\t if (!legendModels || !legendModels.length) {\n\t return;\n\t }\n\t ecModel.eachSeriesByType('graph', function (graphSeries) {\n\t var categoriesData = graphSeries.getCategoriesData();\n\t var graph = graphSeries.getGraph();\n\t var data = graph.data;\n\t\n\t var categoryNames = categoriesData.mapArray(categoriesData.getName);\n\t\n\t data.filterSelf(function (idx) {\n\t var model = data.getItemModel(idx);\n\t var category = model.getShallow('category');\n\t if (category != null) {\n\t if (typeof category === 'number') {\n\t category = categoryNames[category];\n\t }\n\t // If in any legend component the status is not selected.\n\t for (var i = 0; i < legendModels.length; i++) {\n\t if (!legendModels[i].isSelected(category)) {\n\t return false;\n\t }\n\t }\n\t }\n\t return true;\n\t });\n\t }, this);\n\t };\n\n\n/***/ },\n/* 550 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t module.exports = function (ecModel) {\n\t\n\t var paletteScope = {};\n\t ecModel.eachSeriesByType('graph', function (seriesModel) {\n\t var categoriesData = seriesModel.getCategoriesData();\n\t var data = seriesModel.getData();\n\t\n\t var categoryNameIdxMap = {};\n\t\n\t categoriesData.each(function (idx) {\n\t var name = categoriesData.getName(idx);\n\t categoryNameIdxMap[name] = idx;\n\t\n\t var itemModel = categoriesData.getItemModel(idx);\n\t var color = itemModel.get('itemStyle.normal.color')\n\t || seriesModel.getColorFromPalette(name, paletteScope);\n\t categoriesData.setItemVisual(idx, 'color', color);\n\t });\n\t\n\t // Assign category color to visual\n\t if (categoriesData.count()) {\n\t data.each(function (idx) {\n\t var model = data.getItemModel(idx);\n\t var category = model.getShallow('category');\n\t if (category != null) {\n\t if (typeof category === 'string') {\n\t category = categoryNameIdxMap[category];\n\t }\n\t if (!data.getItemVisual(idx, 'color', true)) {\n\t data.setItemVisual(\n\t idx, 'color',\n\t categoriesData.getItemVisual(category, 'color')\n\t );\n\t }\n\t }\n\t });\n\t }\n\t });\n\t };\n\n\n/***/ },\n/* 551 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t var circularLayoutHelper = __webpack_require__(211);\n\t module.exports = function (ecModel) {\n\t ecModel.eachSeriesByType('graph', function (seriesModel) {\n\t if (seriesModel.get('layout') === 'circular') {\n\t circularLayoutHelper(seriesModel);\n\t }\n\t });\n\t };\n\n\n/***/ },\n/* 552 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t // FIXME Where to create the simple view coordinate system\n\t var View = __webpack_require__(233);\n\t var layout = __webpack_require__(16);\n\t var bbox = __webpack_require__(170);\n\t\n\t function getViewRect(seriesModel, api, aspect) {\n\t var option = seriesModel.getBoxLayoutParams();\n\t option.aspect = aspect;\n\t return layout.getLayoutRect(option, {\n\t width: api.getWidth(),\n\t height: api.getHeight()\n\t });\n\t }\n\t\n\t module.exports = function (ecModel, api) {\n\t var viewList = [];\n\t ecModel.eachSeriesByType('graph', function (seriesModel) {\n\t var coordSysType = seriesModel.get('coordinateSystem');\n\t if (!coordSysType || coordSysType === 'view') {\n\t\n\t var data = seriesModel.getData();\n\t var positions = data.mapArray(function (idx) {\n\t var itemModel = data.getItemModel(idx);\n\t return [+itemModel.get('x'), +itemModel.get('y')];\n\t });\n\t\n\t var min = [];\n\t var max = [];\n\t\n\t bbox.fromPoints(positions, min, max);\n\t\n\t // If width or height is 0\n\t if (max[0] - min[0] === 0) {\n\t max[0] += 1;\n\t min[0] -= 1;\n\t }\n\t if (max[1] - min[1] === 0) {\n\t max[1] += 1;\n\t min[1] -= 1;\n\t }\n\t var aspect = (max[0] - min[0]) / (max[1] - min[1]);\n\t // FIXME If get view rect after data processed?\n\t var viewRect = getViewRect(seriesModel, api, aspect);\n\t // Position may be NaN, use view rect instead\n\t if (isNaN(aspect)) {\n\t min = [viewRect.x, viewRect.y];\n\t max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height];\n\t }\n\t\n\t var bbWidth = max[0] - min[0];\n\t var bbHeight = max[1] - min[1];\n\t\n\t var viewWidth = viewRect.width;\n\t var viewHeight = viewRect.height;\n\t\n\t var viewCoordSys = seriesModel.coordinateSystem = new View();\n\t viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');\n\t\n\t viewCoordSys.setBoundingRect(\n\t min[0], min[1], bbWidth, bbHeight\n\t );\n\t viewCoordSys.setViewRect(\n\t viewRect.x, viewRect.y, viewWidth, viewHeight\n\t );\n\t\n\t // Update roam info\n\t viewCoordSys.setCenter(seriesModel.get('center'));\n\t viewCoordSys.setZoom(seriesModel.get('zoom'));\n\t\n\t viewList.push(viewCoordSys);\n\t }\n\t });\n\t return viewList;\n\t };\n\n\n/***/ },\n/* 553 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t function normalize(a) {\n\t if (!(a instanceof Array)) {\n\t a = [a, a];\n\t }\n\t return a;\n\t }\n\t module.exports = function (ecModel) {\n\t ecModel.eachSeriesByType('graph', function (seriesModel) {\n\t var graph = seriesModel.getGraph();\n\t var edgeData = seriesModel.getEdgeData();\n\t var symbolType = normalize(seriesModel.get('edgeSymbol'));\n\t var symbolSize = normalize(seriesModel.get('edgeSymbolSize'));\n\t\n\t var colorQuery = 'lineStyle.normal.color'.split('.');\n\t var opacityQuery = 'lineStyle.normal.opacity'.split('.');\n\t\n\t edgeData.setVisual('fromSymbol', symbolType && symbolType[0]);\n\t edgeData.setVisual('toSymbol', symbolType && symbolType[1]);\n\t edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]);\n\t edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]);\n\t edgeData.setVisual('color', seriesModel.get(colorQuery));\n\t edgeData.setVisual('opacity', seriesModel.get(opacityQuery));\n\t\n\t edgeData.each(function (idx) {\n\t var itemModel = edgeData.getItemModel(idx);\n\t var edge = graph.getEdgeByIndex(idx);\n\t var symbolType = normalize(itemModel.getShallow('symbol', true));\n\t var symbolSize = normalize(itemModel.getShallow('symbolSize', true));\n\t // Edge visual must after node visual\n\t var color = itemModel.get(colorQuery);\n\t var opacity = itemModel.get(opacityQuery);\n\t switch (color) {\n\t case 'source':\n\t color = edge.node1.getVisual('color');\n\t break;\n\t case 'target':\n\t color = edge.node2.getVisual('color');\n\t break;\n\t }\n\t\n\t symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]);\n\t symbolType[1] && edge.setVisual('toSymbol', symbolType[1]);\n\t symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]);\n\t symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]);\n\t\n\t edge.setVisual('color', color);\n\t edge.setVisual('opacity', opacity);\n\t });\n\t });\n\t };\n\n\n/***/ },\n/* 554 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var vec2 = __webpack_require__(10);\n\t var scaleAndAdd = vec2.scaleAndAdd;\n\t\n\t // function adjacentNode(n, e) {\n\t // return e.n1 === n ? e.n2 : e.n1;\n\t // }\n\t\n\t module.exports = function (nodes, edges, opts) {\n\t var rect = opts.rect;\n\t var width = rect.width;\n\t var height = rect.height;\n\t var center = [rect.x + width / 2, rect.y + height / 2];\n\t // var scale = opts.scale || 1;\n\t var gravity = opts.gravity == null ? 0.1 : opts.gravity;\n\t\n\t // for (var i = 0; i < edges.length; i++) {\n\t // var e = edges[i];\n\t // var n1 = e.n1;\n\t // var n2 = e.n2;\n\t // n1.edges = n1.edges || [];\n\t // n2.edges = n2.edges || [];\n\t // n1.edges.push(e);\n\t // n2.edges.push(e);\n\t // }\n\t // Init position\n\t for (var i = 0; i < nodes.length; i++) {\n\t var n = nodes[i];\n\t if (!n.p) {\n\t // Use the position from first adjecent node with defined position\n\t // Or use a random position\n\t // From d3\n\t // if (n.edges) {\n\t // var j = -1;\n\t // while (++j < n.edges.length) {\n\t // var e = n.edges[j];\n\t // var other = adjacentNode(n, e);\n\t // if (other.p) {\n\t // n.p = vec2.clone(other.p);\n\t // break;\n\t // }\n\t // }\n\t // }\n\t // if (!n.p) {\n\t n.p = vec2.create(\n\t width * (Math.random() - 0.5) + center[0],\n\t height * (Math.random() - 0.5) + center[1]\n\t );\n\t // }\n\t }\n\t n.pp = vec2.clone(n.p);\n\t n.edges = null;\n\t }\n\t\n\t // Formula in 'Graph Drawing by Force-directed Placement'\n\t // var k = scale * Math.sqrt(width * height / nodes.length);\n\t // var k2 = k * k;\n\t\n\t var friction = 0.6;\n\t\n\t return {\n\t warmUp: function () {\n\t friction = 0.5;\n\t },\n\t\n\t setFixed: function (idx) {\n\t nodes[idx].fixed = true;\n\t },\n\t\n\t setUnfixed: function (idx) {\n\t nodes[idx].fixed = false;\n\t },\n\t\n\t step: function (cb) {\n\t var v12 = [];\n\t var nLen = nodes.length;\n\t for (var i = 0; i < edges.length; i++) {\n\t var e = edges[i];\n\t var n1 = e.n1;\n\t var n2 = e.n2;\n\t\n\t vec2.sub(v12, n2.p, n1.p);\n\t var d = vec2.len(v12) - e.d;\n\t var w = n2.w / (n1.w + n2.w);\n\t vec2.normalize(v12, v12);\n\t\n\t !n1.fixed && scaleAndAdd(n1.p, n1.p, v12, w * d * friction);\n\t !n2.fixed && scaleAndAdd(n2.p, n2.p, v12, -(1 - w) * d * friction);\n\t }\n\t // Gravity\n\t for (var i = 0; i < nLen; i++) {\n\t var n = nodes[i];\n\t if (!n.fixed) {\n\t vec2.sub(v12, center, n.p);\n\t // var d = vec2.len(v12);\n\t // vec2.scale(v12, v12, 1 / d);\n\t // var gravityFactor = gravity;\n\t vec2.scaleAndAdd(n.p, n.p, v12, gravity * friction);\n\t }\n\t }\n\t\n\t // Repulsive\n\t // PENDING\n\t for (var i = 0; i < nLen; i++) {\n\t var n1 = nodes[i];\n\t for (var j = i + 1; j < nLen; j++) {\n\t var n2 = nodes[j];\n\t vec2.sub(v12, n2.p, n1.p);\n\t var d = vec2.len(v12);\n\t if (d === 0) {\n\t // Random repulse\n\t vec2.set(v12, Math.random() - 0.5, Math.random() - 0.5);\n\t d = 1;\n\t }\n\t var repFact = (n1.rep + n2.rep) / d / d;\n\t !n1.fixed && scaleAndAdd(n1.pp, n1.pp, v12, repFact);\n\t !n2.fixed && scaleAndAdd(n2.pp, n2.pp, v12, -repFact);\n\t }\n\t }\n\t var v = [];\n\t for (var i = 0; i < nLen; i++) {\n\t var n = nodes[i];\n\t if (!n.fixed) {\n\t vec2.sub(v, n.p, n.pp);\n\t vec2.scaleAndAdd(n.p, n.p, v, friction);\n\t vec2.copy(n.pp, n.p);\n\t }\n\t }\n\t\n\t friction = friction * 0.992;\n\t\n\t cb && cb(nodes, edges, friction < 0.01);\n\t }\n\t };\n\t };\n\n\n/***/ },\n/* 555 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var forceHelper = __webpack_require__(554);\n\t var numberUtil = __webpack_require__(5);\n\t var simpleLayoutHelper = __webpack_require__(213);\n\t var circularLayoutHelper = __webpack_require__(211);\n\t var vec2 = __webpack_require__(10);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t module.exports = function (ecModel) {\n\t ecModel.eachSeriesByType('graph', function (graphSeries) {\n\t var coordSys = graphSeries.coordinateSystem;\n\t if (coordSys && coordSys.type !== 'view') {\n\t return;\n\t }\n\t if (graphSeries.get('layout') === 'force') {\n\t var preservedPoints = graphSeries.preservedPoints || {};\n\t var graph = graphSeries.getGraph();\n\t var nodeData = graph.data;\n\t var edgeData = graph.edgeData;\n\t var forceModel = graphSeries.getModel('force');\n\t var initLayout = forceModel.get('initLayout');\n\t if (graphSeries.preservedPoints) {\n\t nodeData.each(function (idx) {\n\t var id = nodeData.getId(idx);\n\t nodeData.setItemLayout(idx, preservedPoints[id] || [NaN, NaN]);\n\t });\n\t }\n\t else if (!initLayout || initLayout === 'none') {\n\t simpleLayoutHelper(graphSeries);\n\t }\n\t else if (initLayout === 'circular') {\n\t circularLayoutHelper(graphSeries);\n\t }\n\t\n\t var nodeDataExtent = nodeData.getDataExtent('value');\n\t var edgeDataExtent = edgeData.getDataExtent('value');\n\t // var edgeDataExtent = edgeData.getDataExtent('value');\n\t var repulsion = forceModel.get('repulsion');\n\t var edgeLength = forceModel.get('edgeLength');\n\t if (!zrUtil.isArray(repulsion)) {\n\t repulsion = [repulsion, repulsion];\n\t }\n\t if (!zrUtil.isArray(edgeLength)) {\n\t edgeLength = [edgeLength, edgeLength];\n\t }\n\t // Larger value has smaller length\n\t edgeLength = [edgeLength[1], edgeLength[0]];\n\t\n\t var nodes = nodeData.mapArray('value', function (value, idx) {\n\t var point = nodeData.getItemLayout(idx);\n\t // var w = numberUtil.linearMap(value, nodeDataExtent, [0, 50]);\n\t var rep = numberUtil.linearMap(value, nodeDataExtent, repulsion);\n\t if (isNaN(rep)) {\n\t rep = (repulsion[0] + repulsion[1]) / 2;\n\t }\n\t return {\n\t w: rep,\n\t rep: rep,\n\t p: (!point || isNaN(point[0]) || isNaN(point[1])) ? null : point\n\t };\n\t });\n\t var edges = edgeData.mapArray('value', function (value, idx) {\n\t var edge = graph.getEdgeByIndex(idx);\n\t var d = numberUtil.linearMap(value, edgeDataExtent, edgeLength);\n\t if (isNaN(d)) {\n\t d = (edgeLength[0] + edgeLength[1]) / 2;\n\t }\n\t return {\n\t n1: nodes[edge.node1.dataIndex],\n\t n2: nodes[edge.node2.dataIndex],\n\t d: d,\n\t curveness: edge.getModel().get('lineStyle.normal.curveness') || 0\n\t };\n\t });\n\t\n\t var coordSys = graphSeries.coordinateSystem;\n\t var rect = coordSys.getBoundingRect();\n\t var forceInstance = forceHelper(nodes, edges, {\n\t rect: rect,\n\t gravity: forceModel.get('gravity')\n\t });\n\t var oldStep = forceInstance.step;\n\t forceInstance.step = function (cb) {\n\t for (var i = 0, l = nodes.length; i < l; i++) {\n\t if (nodes[i].fixed) {\n\t // Write back to layout instance\n\t vec2.copy(nodes[i].p, graph.getNodeByIndex(i).getLayout());\n\t }\n\t }\n\t oldStep(function (nodes, edges, stopped) {\n\t for (var i = 0, l = nodes.length; i < l; i++) {\n\t if (!nodes[i].fixed) {\n\t graph.getNodeByIndex(i).setLayout(nodes[i].p);\n\t }\n\t preservedPoints[nodeData.getId(i)] = nodes[i].p;\n\t }\n\t for (var i = 0, l = edges.length; i < l; i++) {\n\t var e = edges[i];\n\t var edge = graph.getEdgeByIndex(i);\n\t var p1 = e.n1.p;\n\t var p2 = e.n2.p;\n\t var points = edge.getLayout();\n\t points = points ? points.slice() : [];\n\t points[0] = points[0] || [];\n\t points[1] = points[1] || [];\n\t vec2.copy(points[0], p1);\n\t vec2.copy(points[1], p2);\n\t if (+e.curveness) {\n\t points[2] = [\n\t (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness,\n\t (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness\n\t ];\n\t }\n\t edge.setLayout(points);\n\t }\n\t // Update layout\n\t\n\t cb && cb(stopped);\n\t });\n\t };\n\t graphSeries.forceLayout = forceInstance;\n\t graphSeries.preservedPoints = preservedPoints;\n\t\n\t // Step to get the layout\n\t forceInstance.step();\n\t }\n\t else {\n\t // Remove prev injected forceLayout instance\n\t graphSeries.forceLayout = null;\n\t }\n\t });\n\t };\n\n\n/***/ },\n/* 556 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var roamHelper = __webpack_require__(210);\n\t\n\t var actionInfo = {\n\t type: 'graphRoam',\n\t event: 'graphRoam',\n\t update: 'none'\n\t };\n\t\n\t /**\n\t * @payload\n\t * @property {string} name Series name\n\t * @property {number} [dx]\n\t * @property {number} [dy]\n\t * @property {number} [zoom]\n\t * @property {number} [originX]\n\t * @property {number} [originY]\n\t */\n\t\n\t echarts.registerAction(actionInfo, function (payload, ecModel) {\n\t ecModel.eachComponent({mainType: 'series', query: payload}, function (seriesModel) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t\n\t var res = roamHelper.updateCenterAndZoom(coordSys, payload);\n\t\n\t seriesModel.setCenter\n\t && seriesModel.setCenter(res.center);\n\t\n\t seriesModel.setZoom\n\t && seriesModel.setZoom(res.zoom);\n\t });\n\t });\n\n\n/***/ },\n/* 557 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var simpleLayoutHelper = __webpack_require__(213);\n\t var simpleLayoutEdge = __webpack_require__(212);\n\t module.exports = function (ecModel, api) {\n\t ecModel.eachSeriesByType('graph', function (seriesModel) {\n\t var layout = seriesModel.get('layout');\n\t var coordSys = seriesModel.coordinateSystem;\n\t if (coordSys && coordSys.type !== 'view') {\n\t var data = seriesModel.getData();\n\t data.each(coordSys.dimensions, function (x, y, idx) {\n\t if (!isNaN(x) && !isNaN(y)) {\n\t data.setItemLayout(idx, coordSys.dataToPoint([x, y]));\n\t }\n\t else {\n\t // Also {Array.}, not undefined to avoid if...else... statement\n\t data.setItemLayout(idx, [NaN, NaN]);\n\t }\n\t });\n\t\n\t simpleLayoutEdge(data.graph);\n\t }\n\t else if (!layout || layout === 'none') {\n\t simpleLayoutHelper(seriesModel);\n\t }\n\t });\n\t };\n\n\n/***/ },\n/* 558 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(560);\n\t __webpack_require__(561);\n\n\n/***/ },\n/* 559 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file defines echarts Heatmap Chart\n\t * @author Ovilia (me@zhangwenli.com)\n\t * Inspired by https://github.com/mourner/simpleheat\n\t *\n\t * @module\n\t */\n\t\n\t\n\t var GRADIENT_LEVELS = 256;\n\t var zrUtil = __webpack_require__(1);\n\t\n\t /**\n\t * Heatmap Chart\n\t *\n\t * @class\n\t */\n\t function Heatmap() {\n\t var canvas = zrUtil.createCanvas();\n\t this.canvas = canvas;\n\t\n\t this.blurSize = 30;\n\t this.pointSize = 20;\n\t\n\t this.maxOpacity = 1;\n\t this.minOpacity = 0;\n\t\n\t this._gradientPixels = {};\n\t }\n\t\n\t Heatmap.prototype = {\n\t /**\n\t * Renders Heatmap and returns the rendered canvas\n\t * @param {Array} data array of data, each has x, y, value\n\t * @param {number} width canvas width\n\t * @param {number} height canvas height\n\t */\n\t update: function(data, width, height, normalize, colorFunc, isInRange) {\n\t var brush = this._getBrush();\n\t var gradientInRange = this._getGradient(data, colorFunc, 'inRange');\n\t var gradientOutOfRange = this._getGradient(data, colorFunc, 'outOfRange');\n\t var r = this.pointSize + this.blurSize;\n\t\n\t var canvas = this.canvas;\n\t var ctx = canvas.getContext('2d');\n\t var len = data.length;\n\t canvas.width = width;\n\t canvas.height = height;\n\t for (var i = 0; i < len; ++i) {\n\t var p = data[i];\n\t var x = p[0];\n\t var y = p[1];\n\t var value = p[2];\n\t\n\t // calculate alpha using value\n\t var alpha = normalize(value);\n\t\n\t // draw with the circle brush with alpha\n\t ctx.globalAlpha = alpha;\n\t ctx.drawImage(brush, x - r, y - r);\n\t }\n\t\n\t // colorize the canvas using alpha value and set with gradient\n\t var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\t var pixels = imageData.data;\n\t var offset = 0;\n\t var pixelLen = pixels.length;\n\t var minOpacity = this.minOpacity;\n\t var maxOpacity = this.maxOpacity;\n\t var diffOpacity = maxOpacity - minOpacity;\n\t\n\t while(offset < pixelLen) {\n\t var alpha = pixels[offset + 3] / 256;\n\t var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4;\n\t // Simple optimize to ignore the empty data\n\t if (alpha > 0) {\n\t var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange;\n\t // Any alpha > 0 will be mapped to [minOpacity, maxOpacity]\n\t alpha > 0 && (alpha = alpha * diffOpacity + minOpacity);\n\t pixels[offset++] = gradient[gradientOffset];\n\t pixels[offset++] = gradient[gradientOffset + 1];\n\t pixels[offset++] = gradient[gradientOffset + 2];\n\t pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256;\n\t }\n\t else {\n\t offset += 4;\n\t }\n\t }\n\t ctx.putImageData(imageData, 0, 0);\n\t\n\t return canvas;\n\t },\n\t\n\t /**\n\t * get canvas of a black circle brush used for canvas to draw later\n\t * @private\n\t * @returns {Object} circle brush canvas\n\t */\n\t _getBrush: function() {\n\t var brushCanvas = this._brushCanvas || (this._brushCanvas = zrUtil.createCanvas());\n\t // set brush size\n\t var r = this.pointSize + this.blurSize;\n\t var d = r * 2;\n\t brushCanvas.width = d;\n\t brushCanvas.height = d;\n\t\n\t var ctx = brushCanvas.getContext('2d');\n\t ctx.clearRect(0, 0, d, d);\n\t\n\t // in order to render shadow without the distinct circle,\n\t // draw the distinct circle in an invisible place,\n\t // and use shadowOffset to draw shadow in the center of the canvas\n\t ctx.shadowOffsetX = d;\n\t ctx.shadowBlur = this.blurSize;\n\t // draw the shadow in black, and use alpha and shadow blur to generate\n\t // color in color map\n\t ctx.shadowColor = '#000';\n\t\n\t // draw circle in the left to the canvas\n\t ctx.beginPath();\n\t ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true);\n\t ctx.closePath();\n\t ctx.fill();\n\t return brushCanvas;\n\t },\n\t\n\t /**\n\t * get gradient color map\n\t * @private\n\t */\n\t _getGradient: function (data, colorFunc, state) {\n\t var gradientPixels = this._gradientPixels;\n\t var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4));\n\t var color = [];\n\t var off = 0;\n\t for (var i = 0; i < 256; i++) {\n\t colorFunc[state](i / 255, true, color);\n\t pixelsSingleState[off++] = color[0];\n\t pixelsSingleState[off++] = color[1];\n\t pixelsSingleState[off++] = color[2];\n\t pixelsSingleState[off++] = color[3];\n\t }\n\t return pixelsSingleState;\n\t }\n\t };\n\t\n\t module.exports = Heatmap;\n\t\n\n\n/***/ },\n/* 560 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var SeriesModel = __webpack_require__(26);\n\t var createListFromArray = __webpack_require__(76);\n\t\n\t module.exports = SeriesModel.extend({\n\t type: 'series.heatmap',\n\t\n\t getInitialData: function (option, ecModel) {\n\t return createListFromArray(option.data, this, ecModel);\n\t },\n\t\n\t defaultOption: {\n\t\n\t // Cartesian2D or geo\n\t coordinateSystem: 'cartesian2d',\n\t\n\t zlevel: 0,\n\t\n\t z: 2,\n\t\n\t // Cartesian coordinate system\n\t // xAxisIndex: 0,\n\t // yAxisIndex: 0,\n\t\n\t // Geo coordinate system\n\t geoIndex: 0,\n\t\n\t blurSize: 30,\n\t\n\t pointSize: 20,\n\t\n\t maxOpacity: 1,\n\t\n\t minOpacity: 0\n\t }\n\t });\n\n\n/***/ },\n/* 561 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var graphic = __webpack_require__(4);\n\t var HeatmapLayer = __webpack_require__(559);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t function getIsInPiecewiseRange(dataExtent, pieceList, selected) {\n\t var dataSpan = dataExtent[1] - dataExtent[0];\n\t pieceList = zrUtil.map(pieceList, function (piece) {\n\t return {\n\t interval: [\n\t (piece.interval[0] - dataExtent[0]) / dataSpan,\n\t (piece.interval[1] - dataExtent[0]) / dataSpan\n\t ]\n\t };\n\t });\n\t var len = pieceList.length;\n\t var lastIndex = 0;\n\t return function (val) {\n\t // Try to find in the location of the last found\n\t for (var i = lastIndex; i < len; i++) {\n\t var interval = pieceList[i].interval;\n\t if (interval[0] <= val && val <= interval[1]) {\n\t lastIndex = i;\n\t break;\n\t }\n\t }\n\t if (i === len) { // Not found, back interation\n\t for (var i = lastIndex - 1; i >= 0; i--) {\n\t var interval = pieceList[i].interval;\n\t if (interval[0] <= val && val <= interval[1]) {\n\t lastIndex = i;\n\t break;\n\t }\n\t }\n\t }\n\t return i >= 0 && i < len && selected[i];\n\t };\n\t }\n\t\n\t function getIsInContinuousRange(dataExtent, range) {\n\t var dataSpan = dataExtent[1] - dataExtent[0];\n\t range = [\n\t (range[0] - dataExtent[0]) / dataSpan,\n\t (range[1] - dataExtent[0]) / dataSpan\n\t ];\n\t return function (val) {\n\t return val >= range[0] && val <= range[1];\n\t };\n\t }\n\t\n\t function isGeoCoordSys(coordSys) {\n\t var dimensions = coordSys.dimensions;\n\t // Not use coorSys.type === 'geo' because coordSys maybe extended\n\t return dimensions[0] === 'lng' && dimensions[1] === 'lat';\n\t }\n\t\n\t module.exports = __webpack_require__(3).extendChartView({\n\t\n\t type: 'heatmap',\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var visualMapOfThisSeries;\n\t ecModel.eachComponent('visualMap', function (visualMap) {\n\t visualMap.eachTargetSeries(function (targetSeries) {\n\t if (targetSeries === seriesModel) {\n\t visualMapOfThisSeries = visualMap;\n\t }\n\t });\n\t });\n\t\n\t if (__DEV__) {\n\t if (!visualMapOfThisSeries) {\n\t throw new Error('Heatmap must use with visualMap');\n\t }\n\t }\n\t\n\t this.group.removeAll();\n\t var coordSys = seriesModel.coordinateSystem;\n\t if (coordSys.type === 'cartesian2d') {\n\t this._renderOnCartesian(coordSys, seriesModel, api);\n\t }\n\t else if (isGeoCoordSys(coordSys)) {\n\t this._renderOnGeo(\n\t coordSys, seriesModel, visualMapOfThisSeries, api\n\t );\n\t }\n\t },\n\t\n\t dispose: function () {},\n\t\n\t _renderOnCartesian: function (cartesian, seriesModel, api) {\n\t var xAxis = cartesian.getAxis('x');\n\t var yAxis = cartesian.getAxis('y');\n\t var group = this.group;\n\t\n\t if (__DEV__) {\n\t if (!(xAxis.type === 'category' && yAxis.type === 'category')) {\n\t throw new Error('Heatmap on cartesian must have two category axes');\n\t }\n\t if (!(xAxis.onBand && yAxis.onBand)) {\n\t throw new Error('Heatmap on cartesian must have two axes with boundaryGap true');\n\t }\n\t }\n\t\n\t var width = xAxis.getBandWidth();\n\t var height = yAxis.getBandWidth();\n\t\n\t var data = seriesModel.getData();\n\t\n\t var itemStyleQuery = 'itemStyle.normal';\n\t var hoverItemStyleQuery = 'itemStyle.emphasis';\n\t var labelQuery = 'label.normal';\n\t var hoverLabelQuery = 'label.emphasis';\n\t var style = seriesModel.getModel(itemStyleQuery).getItemStyle(['color']);\n\t var hoverStl = seriesModel.getModel(hoverItemStyleQuery).getItemStyle();\n\t var labelModel = seriesModel.getModel('label.normal');\n\t var hoverLabelModel = seriesModel.getModel('label.emphasis');\n\t\n\t data.each(['x', 'y', 'z'], function (x, y, z, idx) {\n\t var itemModel = data.getItemModel(idx);\n\t var point = cartesian.dataToPoint([x, y]);\n\t // Ignore empty data\n\t if (isNaN(z)) {\n\t return;\n\t }\n\t var rect = new graphic.Rect({\n\t shape: {\n\t x: point[0] - width / 2,\n\t y: point[1] - height / 2,\n\t width: width,\n\t height: height\n\t },\n\t style: {\n\t fill: data.getItemVisual(idx, 'color'),\n\t opacity: data.getItemVisual(idx, 'opacity')\n\t }\n\t });\n\t // Optimization for large datset\n\t if (data.hasItemOption) {\n\t style = itemModel.getModel(itemStyleQuery).getItemStyle(['color']);\n\t hoverStl = itemModel.getModel(hoverItemStyleQuery).getItemStyle();\n\t labelModel = itemModel.getModel(labelQuery);\n\t hoverLabelModel = itemModel.getModel(hoverLabelQuery);\n\t }\n\t\n\t var rawValue = seriesModel.getRawValue(idx);\n\t var defaultText = '-';\n\t if (rawValue && rawValue[2] != null) {\n\t defaultText = rawValue[2];\n\t }\n\t if (labelModel.getShallow('show')) {\n\t graphic.setText(style, labelModel);\n\t style.text = seriesModel.getFormattedLabel(idx, 'normal') || defaultText;\n\t }\n\t if (hoverLabelModel.getShallow('show')) {\n\t graphic.setText(hoverStl, hoverLabelModel);\n\t hoverStl.text = seriesModel.getFormattedLabel(idx, 'emphasis') || defaultText;\n\t }\n\t\n\t rect.setStyle(style);\n\t\n\t graphic.setHoverStyle(rect, data.hasItemOption ? hoverStl : zrUtil.extend({}, hoverStl));\n\t\n\t group.add(rect);\n\t data.setItemGraphicEl(idx, rect);\n\t });\n\t },\n\t\n\t _renderOnGeo: function (geo, seriesModel, visualMapModel, api) {\n\t var inRangeVisuals = visualMapModel.targetVisuals.inRange;\n\t var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange;\n\t // if (!visualMapping) {\n\t // throw new Error('Data range must have color visuals');\n\t // }\n\t\n\t var data = seriesModel.getData();\n\t var hmLayer = this._hmLayer || (this._hmLayer || new HeatmapLayer());\n\t hmLayer.blurSize = seriesModel.get('blurSize');\n\t hmLayer.pointSize = seriesModel.get('pointSize');\n\t hmLayer.minOpacity = seriesModel.get('minOpacity');\n\t hmLayer.maxOpacity = seriesModel.get('maxOpacity');\n\t\n\t var rect = geo.getViewRect().clone();\n\t var roamTransform = geo.getRoamTransform().transform;\n\t rect.applyTransform(roamTransform);\n\t\n\t // Clamp on viewport\n\t var x = Math.max(rect.x, 0);\n\t var y = Math.max(rect.y, 0);\n\t var x2 = Math.min(rect.width + rect.x, api.getWidth());\n\t var y2 = Math.min(rect.height + rect.y, api.getHeight());\n\t var width = x2 - x;\n\t var height = y2 - y;\n\t\n\t var points = data.mapArray(['lng', 'lat', 'value'], function (lng, lat, value) {\n\t var pt = geo.dataToPoint([lng, lat]);\n\t pt[0] -= x;\n\t pt[1] -= y;\n\t pt.push(value);\n\t return pt;\n\t });\n\t\n\t var dataExtent = visualMapModel.getExtent();\n\t var isInRange = visualMapModel.type === 'visualMap.continuous'\n\t ? getIsInContinuousRange(dataExtent, visualMapModel.option.range)\n\t : getIsInPiecewiseRange(\n\t dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected\n\t );\n\t\n\t hmLayer.update(\n\t points, width, height,\n\t inRangeVisuals.color.getNormalizer(),\n\t {\n\t inRange: inRangeVisuals.color.getColorMapper(),\n\t outOfRange: outOfRangeVisuals.color.getColorMapper()\n\t },\n\t isInRange\n\t );\n\t var img = new graphic.Image({\n\t style: {\n\t width: width,\n\t height: height,\n\t x: x,\n\t y: y,\n\t image: hmLayer.canvas\n\t },\n\t silent: true\n\t });\n\t this.group.add(img);\n\t }\n\t });\n\n\n/***/ },\n/* 562 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Provide effect for line\n\t * @module echarts/chart/helper/EffectLine\n\t */\n\t\n\t\n\t var Polyline = __webpack_require__(215);\n\t var zrUtil = __webpack_require__(1);\n\t var EffectLine = __webpack_require__(214);\n\t var vec2 = __webpack_require__(10);\n\t\n\t /**\n\t * @constructor\n\t * @extends {module:echarts/chart/helper/EffectLine}\n\t * @alias {module:echarts/chart/helper/Polyline}\n\t */\n\t function EffectPolyline(lineData, idx, seriesScope) {\n\t EffectLine.call(this, lineData, idx, seriesScope);\n\t this._lastFrame = 0;\n\t this._lastFramePercent = 0;\n\t }\n\t\n\t var effectPolylineProto = EffectPolyline.prototype;\n\t\n\t // Overwrite\n\t effectPolylineProto.createLine = function (lineData, idx, seriesScope) {\n\t return new Polyline(lineData, idx, seriesScope);\n\t };\n\t\n\t // Overwrite\n\t effectPolylineProto.updateAnimationPoints = function (symbol, points) {\n\t this._points = points;\n\t var accLenArr = [0];\n\t var len = 0;\n\t for (var i = 1; i < points.length; i++) {\n\t var p1 = points[i - 1];\n\t var p2 = points[i];\n\t len += vec2.dist(p1, p2);\n\t accLenArr.push(len);\n\t }\n\t if (len === 0) {\n\t return;\n\t }\n\t\n\t for (var i = 0; i < accLenArr.length; i++) {\n\t accLenArr[i] /= len;\n\t }\n\t this._offsets = accLenArr;\n\t this._length = len;\n\t };\n\t\n\t // Overwrite\n\t effectPolylineProto.getLineLength = function (symbol) {\n\t return this._length;\n\t };\n\t\n\t // Overwrite\n\t effectPolylineProto.updateSymbolPosition = function (symbol) {\n\t var t = symbol.__t;\n\t var points = this._points;\n\t var offsets = this._offsets;\n\t var len = points.length;\n\t\n\t if (!offsets) {\n\t // Has length 0\n\t return;\n\t }\n\t\n\t var lastFrame = this._lastFrame;\n\t var frame;\n\t\n\t if (t < this._lastFramePercent) {\n\t // Start from the next frame\n\t // PENDING start from lastFrame ?\n\t var start = Math.min(lastFrame + 1, len - 1);\n\t for (frame = start; frame >= 0; frame--) {\n\t if (offsets[frame] <= t) {\n\t break;\n\t }\n\t }\n\t // PENDING really need to do this ?\n\t frame = Math.min(frame, len - 2);\n\t }\n\t else {\n\t for (var frame = lastFrame; frame < len; frame++) {\n\t if (offsets[frame] > t) {\n\t break;\n\t }\n\t }\n\t frame = Math.min(frame - 1, len - 2);\n\t }\n\t\n\t vec2.lerp(\n\t symbol.position, points[frame], points[frame + 1],\n\t (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame])\n\t );\n\t\n\t var tx = points[frame + 1][0] - points[frame][0];\n\t var ty = points[frame + 1][1] - points[frame][1];\n\t symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;\n\t\n\t this._lastFrame = frame;\n\t this._lastFramePercent = t;\n\t\n\t symbol.ignore = false;\n\t };\n\t\n\t zrUtil.inherits(EffectPolyline, EffectLine);\n\t\n\t module.exports = EffectPolyline;\n\n\n/***/ },\n/* 563 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Symbol with ripple effect\n\t * @module echarts/chart/helper/EffectSymbol\n\t */\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var symbolUtil = __webpack_require__(49);\n\t var graphic = __webpack_require__(4);\n\t var numberUtil = __webpack_require__(5);\n\t var Symbol = __webpack_require__(151);\n\t var Group = graphic.Group;\n\t\n\t var EFFECT_RIPPLE_NUMBER = 3;\n\t\n\t function normalizeSymbolSize(symbolSize) {\n\t if (!zrUtil.isArray(symbolSize)) {\n\t symbolSize = [+symbolSize, +symbolSize];\n\t }\n\t return symbolSize;\n\t }\n\t\n\t function updateRipplePath(rippleGroup, effectCfg) {\n\t rippleGroup.eachChild(function (ripplePath) {\n\t ripplePath.attr({\n\t z: effectCfg.z,\n\t zlevel: effectCfg.zlevel,\n\t style: {\n\t stroke: effectCfg.brushType === 'stroke' ? effectCfg.color : null,\n\t fill: effectCfg.brushType === 'fill' ? effectCfg.color : null\n\t }\n\t });\n\t });\n\t }\n\t /**\n\t * @constructor\n\t * @param {module:echarts/data/List} data\n\t * @param {number} idx\n\t * @extends {module:zrender/graphic/Group}\n\t */\n\t function EffectSymbol(data, idx) {\n\t Group.call(this);\n\t\n\t var symbol = new Symbol(data, idx);\n\t var rippleGroup = new Group();\n\t this.add(symbol);\n\t this.add(rippleGroup);\n\t\n\t rippleGroup.beforeUpdate = function () {\n\t this.attr(symbol.getScale());\n\t };\n\t this.updateData(data, idx);\n\t }\n\t\n\t var effectSymbolProto = EffectSymbol.prototype;\n\t\n\t effectSymbolProto.stopEffectAnimation = function () {\n\t this.childAt(1).removeAll();\n\t };\n\t\n\t effectSymbolProto.startEffectAnimation = function (effectCfg) {\n\t var symbolType = effectCfg.symbolType;\n\t var color = effectCfg.color;\n\t var rippleGroup = this.childAt(1);\n\t\n\t for (var i = 0; i < EFFECT_RIPPLE_NUMBER; i++) {\n\t // var ripplePath = symbolUtil.createSymbol(\n\t // symbolType, -0.5, -0.5, 1, 1, color\n\t // );\n\t // If width/height are set too small (e.g., set to 1) on ios10\n\t // and macOS Sierra, a circle stroke become a rect, no matter what\n\t // the scale is set. So we set width/height as 2. See #4136.\n\t var ripplePath = symbolUtil.createSymbol(\n\t symbolType, -1, -1, 2, 2, color\n\t );\n\t ripplePath.attr({\n\t style: {\n\t strokeNoScale: true\n\t },\n\t z2: 99,\n\t silent: true,\n\t scale: [0.5, 0.5]\n\t });\n\t\n\t var delay = -i / EFFECT_RIPPLE_NUMBER * effectCfg.period + effectCfg.effectOffset;\n\t // TODO Configurable effectCfg.period\n\t ripplePath.animate('', true)\n\t .when(effectCfg.period, {\n\t scale: [effectCfg.rippleScale / 2, effectCfg.rippleScale / 2]\n\t })\n\t .delay(delay)\n\t .start();\n\t ripplePath.animateStyle(true)\n\t .when(effectCfg.period, {\n\t opacity: 0\n\t })\n\t .delay(delay)\n\t .start();\n\t\n\t rippleGroup.add(ripplePath);\n\t }\n\t\n\t updateRipplePath(rippleGroup, effectCfg);\n\t };\n\t\n\t /**\n\t * Update effect symbol\n\t */\n\t effectSymbolProto.updateEffectAnimation = function (effectCfg) {\n\t var oldEffectCfg = this._effectCfg;\n\t var rippleGroup = this.childAt(1);\n\t\n\t // Must reinitialize effect if following configuration changed\n\t var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale'];\n\t for (var i = 0; i < DIFFICULT_PROPS; i++) {\n\t var propName = DIFFICULT_PROPS[i];\n\t if (oldEffectCfg[propName] !== effectCfg[propName]) {\n\t this.stopEffectAnimation();\n\t this.startEffectAnimation(effectCfg);\n\t return;\n\t }\n\t }\n\t\n\t updateRipplePath(rippleGroup, effectCfg);\n\t };\n\t\n\t /**\n\t * Highlight symbol\n\t */\n\t effectSymbolProto.highlight = function () {\n\t this.trigger('emphasis');\n\t };\n\t\n\t /**\n\t * Downplay symbol\n\t */\n\t effectSymbolProto.downplay = function () {\n\t this.trigger('normal');\n\t };\n\t\n\t /**\n\t * Update symbol properties\n\t * @param {module:echarts/data/List} data\n\t * @param {number} idx\n\t */\n\t effectSymbolProto.updateData = function (data, idx) {\n\t var seriesModel = data.hostModel;\n\t\n\t this.childAt(0).updateData(data, idx);\n\t\n\t var rippleGroup = this.childAt(1);\n\t var itemModel = data.getItemModel(idx);\n\t var symbolType = data.getItemVisual(idx, 'symbol');\n\t var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));\n\t var color = data.getItemVisual(idx, 'color');\n\t\n\t rippleGroup.attr('scale', symbolSize);\n\t\n\t rippleGroup.traverse(function (ripplePath) {\n\t ripplePath.attr({\n\t fill: color\n\t });\n\t });\n\t\n\t var symbolOffset = itemModel.getShallow('symbolOffset');\n\t if (symbolOffset) {\n\t var pos = rippleGroup.position;\n\t pos[0] = numberUtil.parsePercent(symbolOffset[0], symbolSize[0]);\n\t pos[1] = numberUtil.parsePercent(symbolOffset[1], symbolSize[1]);\n\t }\n\t rippleGroup.rotation = (itemModel.getShallow('symbolRotate') || 0) * Math.PI / 180 || 0;\n\t\n\t var effectCfg = {};\n\t\n\t effectCfg.showEffectOn = seriesModel.get('showEffectOn');\n\t effectCfg.rippleScale = itemModel.get('rippleEffect.scale');\n\t effectCfg.brushType = itemModel.get('rippleEffect.brushType');\n\t effectCfg.period = itemModel.get('rippleEffect.period') * 1000;\n\t effectCfg.effectOffset = idx / data.count();\n\t effectCfg.z = itemModel.getShallow('z') || 0;\n\t effectCfg.zlevel = itemModel.getShallow('zlevel') || 0;\n\t effectCfg.symbolType = symbolType;\n\t effectCfg.color = color;\n\t\n\t this.off('mouseover').off('mouseout').off('emphasis').off('normal');\n\t\n\t if (effectCfg.showEffectOn === 'render') {\n\t this._effectCfg\n\t ? this.updateEffectAnimation(effectCfg)\n\t : this.startEffectAnimation(effectCfg);\n\t\n\t this._effectCfg = effectCfg;\n\t }\n\t else {\n\t // Not keep old effect config\n\t this._effectCfg = null;\n\t\n\t this.stopEffectAnimation();\n\t var symbol = this.childAt(0);\n\t var onEmphasis = function () {\n\t symbol.trigger('emphasis');\n\t if (effectCfg.showEffectOn !== 'render') {\n\t this.startEffectAnimation(effectCfg);\n\t }\n\t };\n\t var onNormal = function () {\n\t symbol.trigger('normal');\n\t if (effectCfg.showEffectOn !== 'render') {\n\t this.stopEffectAnimation();\n\t }\n\t };\n\t this.on('mouseover', onEmphasis, this)\n\t .on('mouseout', onNormal, this)\n\t .on('emphasis', onEmphasis, this)\n\t .on('normal', onNormal, this);\n\t }\n\t\n\t this._effectCfg = effectCfg;\n\t };\n\t\n\t effectSymbolProto.fadeOut = function (cb) {\n\t this.off('mouseover').off('mouseout').off('emphasis').off('normal');\n\t cb && cb();\n\t };\n\t\n\t zrUtil.inherits(EffectSymbol, Group);\n\t\n\t module.exports = EffectSymbol;\n\n\n/***/ },\n/* 564 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// TODO Batch by color\n\t\n\t\n\t\n\t var graphic = __webpack_require__(4);\n\t\n\t var quadraticContain = __webpack_require__(258);\n\t var lineContain = __webpack_require__(256);\n\t\n\t var LargeLineShape = graphic.extendShape({\n\t shape: {\n\t polyline: false,\n\t\n\t segs: []\n\t },\n\t\n\t buildPath: function (path, shape) {\n\t var segs = shape.segs;\n\t var isPolyline = shape.polyline;\n\t\n\t for (var i = 0; i < segs.length; i++) {\n\t var seg = segs[i];\n\t if (isPolyline) {\n\t path.moveTo(seg[0][0], seg[0][1]);\n\t for (var j = 1; j < seg.length; j++) {\n\t path.lineTo(seg[j][0], seg[j][1]);\n\t }\n\t }\n\t else {\n\t path.moveTo(seg[0][0], seg[0][1]);\n\t if (seg.length > 2) {\n\t path.quadraticCurveTo(seg[2][0], seg[2][1], seg[1][0], seg[1][1]);\n\t }\n\t else {\n\t path.lineTo(seg[1][0], seg[1][1]);\n\t }\n\t }\n\t }\n\t },\n\t\n\t findDataIndex: function (x, y) {\n\t var shape = this.shape;\n\t var segs = shape.segs;\n\t var isPolyline = shape.polyline;\n\t var lineWidth = Math.max(this.style.lineWidth, 1);\n\t\n\t // Not consider transform\n\t for (var i = 0; i < segs.length; i++) {\n\t var seg = segs[i];\n\t if (isPolyline) {\n\t for (var j = 1; j < seg.length; j++) {\n\t if (lineContain.containStroke(\n\t seg[j - 1][0], seg[j - 1][1], seg[j][0], seg[j][1], lineWidth, x, y\n\t )) {\n\t return i;\n\t }\n\t }\n\t }\n\t else {\n\t if (seg.length > 2) {\n\t if (quadraticContain.containStroke(\n\t seg[0][0], seg[0][1], seg[2][0], seg[2][1], seg[1][0], seg[1][1], lineWidth, x, y\n\t )) {\n\t return i;\n\t }\n\t }\n\t else {\n\t if (lineContain.containStroke(\n\t seg[0][0], seg[0][1], seg[1][0], seg[1][1], lineWidth, x, y\n\t )) {\n\t return i;\n\t }\n\t }\n\t }\n\t }\n\t\n\t return -1;\n\t }\n\t });\n\t\n\t function LargeLineDraw() {\n\t this.group = new graphic.Group();\n\t\n\t this._lineEl = new LargeLineShape();\n\t }\n\t\n\t var largeLineProto = LargeLineDraw.prototype;\n\t\n\t /**\n\t * Update symbols draw by new data\n\t * @param {module:echarts/data/List} data\n\t */\n\t largeLineProto.updateData = function (data) {\n\t this.group.removeAll();\n\t\n\t var lineEl = this._lineEl;\n\t\n\t var seriesModel = data.hostModel;\n\t\n\t lineEl.setShape({\n\t segs: data.mapArray(data.getItemLayout),\n\t polyline: seriesModel.get('polyline')\n\t });\n\t\n\t lineEl.useStyle(\n\t seriesModel.getModel('lineStyle.normal').getLineStyle()\n\t );\n\t\n\t var visualColor = data.getVisual('color');\n\t if (visualColor) {\n\t lineEl.setStyle('stroke', visualColor);\n\t }\n\t lineEl.setStyle('fill');\n\t\n\t // Enable tooltip\n\t // PENDING May have performance issue when path is extremely large\n\t lineEl.seriesIndex = seriesModel.seriesIndex;\n\t lineEl.on('mousemove', function (e) {\n\t lineEl.dataIndex = null;\n\t var dataIndex = lineEl.findDataIndex(e.offsetX, e.offsetY);\n\t if (dataIndex > 0) {\n\t // Provide dataIndex for tooltip\n\t lineEl.dataIndex = dataIndex;\n\t }\n\t });\n\t\n\t // Add back\n\t this.group.add(lineEl);\n\t };\n\t\n\t largeLineProto.updateLayout = function (seriesModel) {\n\t var data = seriesModel.getData();\n\t this._lineEl.setShape({\n\t segs: data.mapArray(data.getItemLayout)\n\t });\n\t };\n\t\n\t largeLineProto.remove = function () {\n\t this.group.removeAll();\n\t };\n\t\n\t module.exports = LargeLineDraw;\n\n\n/***/ },\n/* 565 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// TODO Batch by color\n\t\n\t\n\t\n\t var graphic = __webpack_require__(4);\n\t var symbolUtil = __webpack_require__(49);\n\t\n\t var LargeSymbolPath = graphic.extendShape({\n\t\n\t shape: {\n\t points: null,\n\t sizes: null\n\t },\n\t\n\t symbolProxy: null,\n\t\n\t buildPath: function (path, shape) {\n\t var points = shape.points;\n\t var sizes = shape.sizes;\n\t\n\t var symbolProxy = this.symbolProxy;\n\t var symbolProxyShape = symbolProxy.shape;\n\t for (var i = 0; i < points.length; i++) {\n\t var pt = points[i];\n\t var size = sizes[i];\n\t if (size[0] < 4) {\n\t // Optimize for small symbol\n\t path.rect(\n\t pt[0] - size[0] / 2, pt[1] - size[1] / 2,\n\t size[0], size[1]\n\t );\n\t }\n\t else {\n\t symbolProxyShape.x = pt[0] - size[0] / 2;\n\t symbolProxyShape.y = pt[1] - size[1] / 2;\n\t symbolProxyShape.width = size[0];\n\t symbolProxyShape.height = size[1];\n\t\n\t symbolProxy.buildPath(path, symbolProxyShape, true);\n\t }\n\t }\n\t },\n\t\n\t findDataIndex: function (x, y) {\n\t var shape = this.shape;\n\t var points = shape.points;\n\t var sizes = shape.sizes;\n\t\n\t // Not consider transform\n\t // Treat each element as a rect\n\t // top down traverse\n\t for (var i = points.length - 1; i >= 0; i--) {\n\t var pt = points[i];\n\t var size = sizes[i];\n\t var x0 = pt[0] - size[0] / 2;\n\t var y0 = pt[1] - size[1] / 2;\n\t if (x >= x0 && y >= y0 && x <= x0 + size[0] && y <= y0 + size[1]) {\n\t // i is dataIndex\n\t return i;\n\t }\n\t }\n\t\n\t return -1;\n\t }\n\t });\n\t\n\t function LargeSymbolDraw() {\n\t this.group = new graphic.Group();\n\t\n\t this._symbolEl = new LargeSymbolPath({\n\t // rectHover: true,\n\t // cursor: 'default'\n\t });\n\t }\n\t\n\t var largeSymbolProto = LargeSymbolDraw.prototype;\n\t\n\t /**\n\t * Update symbols draw by new data\n\t * @param {module:echarts/data/List} data\n\t */\n\t largeSymbolProto.updateData = function (data) {\n\t this.group.removeAll();\n\t\n\t var symbolEl = this._symbolEl;\n\t\n\t var seriesModel = data.hostModel;\n\t\n\t symbolEl.setShape({\n\t points: data.mapArray(data.getItemLayout),\n\t sizes: data.mapArray(\n\t function (idx) {\n\t var size = data.getItemVisual(idx, 'symbolSize');\n\t if (!(size instanceof Array)) {\n\t size = [size, size];\n\t }\n\t return size;\n\t }\n\t )\n\t });\n\t\n\t // Create symbolProxy to build path for each data\n\t symbolEl.symbolProxy = symbolUtil.createSymbol(\n\t data.getVisual('symbol'), 0, 0, 0, 0\n\t );\n\t // Use symbolProxy setColor method\n\t symbolEl.setColor = symbolEl.symbolProxy.setColor;\n\t\n\t symbolEl.useStyle(\n\t seriesModel.getModel('itemStyle.normal').getItemStyle(['color'])\n\t );\n\t\n\t var visualColor = data.getVisual('color');\n\t if (visualColor) {\n\t symbolEl.setColor(visualColor);\n\t }\n\t\n\t // Enable tooltip\n\t // PENDING May have performance issue when path is extremely large\n\t symbolEl.seriesIndex = seriesModel.seriesIndex;\n\t symbolEl.on('mousemove', function (e) {\n\t symbolEl.dataIndex = null;\n\t var dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY);\n\t if (dataIndex > 0) {\n\t // Provide dataIndex for tooltip\n\t symbolEl.dataIndex = dataIndex;\n\t }\n\t });\n\t\n\t // Add back\n\t this.group.add(symbolEl);\n\t };\n\t\n\t largeSymbolProto.updateLayout = function (seriesModel) {\n\t var data = seriesModel.getData();\n\t this._symbolEl.setShape({\n\t points: data.mapArray(data.getItemLayout)\n\t });\n\t };\n\t\n\t largeSymbolProto.remove = function () {\n\t this.group.removeAll();\n\t };\n\t\n\t module.exports = LargeSymbolDraw;\n\n\n/***/ },\n/* 566 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Line path for bezier and straight line draw\n\t */\n\t\n\t var graphic = __webpack_require__(4);\n\t var vec2 = __webpack_require__(10);\n\t\n\t var straightLineProto = graphic.Line.prototype;\n\t var bezierCurveProto = graphic.BezierCurve.prototype;\n\t\n\t function isLine(shape) {\n\t return isNaN(+shape.cpx1) || isNaN(+shape.cpy1);\n\t }\n\t\n\t module.exports = graphic.extendShape({\n\t\n\t type: 'ec-line',\n\t\n\t style: {\n\t stroke: '#000',\n\t fill: null\n\t },\n\t\n\t shape: {\n\t x1: 0,\n\t y1: 0,\n\t x2: 0,\n\t y2: 0,\n\t percent: 1,\n\t cpx1: null,\n\t cpy1: null\n\t },\n\t\n\t buildPath: function (ctx, shape) {\n\t (isLine(shape) ? straightLineProto : bezierCurveProto).buildPath(ctx, shape);\n\t },\n\t\n\t pointAt: function (t) {\n\t return isLine(this.shape)\n\t ? straightLineProto.pointAt.call(this, t)\n\t : bezierCurveProto.pointAt.call(this, t);\n\t },\n\t\n\t tangentAt: function (t) {\n\t var shape = this.shape;\n\t var p = isLine(shape)\n\t ? [shape.x2 - shape.x1, shape.y2 - shape.y1]\n\t : bezierCurveProto.tangentAt.call(this, t);\n\t return vec2.normalize(p, p);\n\t }\n\t });\n\n\n/***/ },\n/* 567 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @module echarts/chart/helper/Symbol\n\t */\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var Path = __webpack_require__(24);\n\t\n\t var WhiskerPath = Path.extend({\n\t\n\t type: 'whiskerInBox',\n\t\n\t shape: {},\n\t\n\t buildPath: function (ctx, shape) {\n\t for (var i in shape) {\n\t if (shape.hasOwnProperty(i) && i.indexOf('ends') === 0) {\n\t var pts = shape[i];\n\t ctx.moveTo(pts[0][0], pts[0][1]);\n\t ctx.lineTo(pts[1][0], pts[1][1]);\n\t }\n\t }\n\t }\n\t });\n\t\n\t /**\n\t * @constructor\n\t * @alias {module:echarts/chart/helper/WhiskerBox}\n\t * @param {module:echarts/data/List} data\n\t * @param {number} idx\n\t * @param {Function} styleUpdater\n\t * @param {boolean} isInit\n\t * @extends {module:zrender/graphic/Group}\n\t */\n\t function WhiskerBox(data, idx, styleUpdater, isInit) {\n\t graphic.Group.call(this);\n\t\n\t /**\n\t * @type {number}\n\t * @readOnly\n\t */\n\t this.bodyIndex;\n\t\n\t /**\n\t * @type {number}\n\t * @readOnly\n\t */\n\t this.whiskerIndex;\n\t\n\t /**\n\t * @type {Function}\n\t */\n\t this.styleUpdater = styleUpdater;\n\t\n\t this._createContent(data, idx, isInit);\n\t\n\t this.updateData(data, idx, isInit);\n\t\n\t /**\n\t * Last series model.\n\t * @type {module:echarts/model/Series}\n\t */\n\t this._seriesModel;\n\t }\n\t\n\t var whiskerBoxProto = WhiskerBox.prototype;\n\t\n\t whiskerBoxProto._createContent = function (data, idx, isInit) {\n\t var itemLayout = data.getItemLayout(idx);\n\t var constDim = itemLayout.chartLayout === 'horizontal' ? 1 : 0;\n\t var count = 0;\n\t\n\t // Whisker element.\n\t this.add(new graphic.Polygon({\n\t shape: {\n\t points: isInit\n\t ? transInit(itemLayout.bodyEnds, constDim, itemLayout)\n\t : itemLayout.bodyEnds\n\t },\n\t style: {strokeNoScale: true},\n\t z2: 100\n\t }));\n\t this.bodyIndex = count++;\n\t\n\t // Box element.\n\t var whiskerEnds = zrUtil.map(itemLayout.whiskerEnds, function (ends) {\n\t return isInit ? transInit(ends, constDim, itemLayout) : ends;\n\t });\n\t this.add(new WhiskerPath({\n\t shape: makeWhiskerEndsShape(whiskerEnds),\n\t style: {strokeNoScale: true},\n\t z2: 100\n\t }));\n\t this.whiskerIndex = count++;\n\t };\n\t\n\t function transInit(points, dim, itemLayout) {\n\t return zrUtil.map(points, function (point) {\n\t point = point.slice();\n\t point[dim] = itemLayout.initBaseline;\n\t return point;\n\t });\n\t }\n\t\n\t function makeWhiskerEndsShape(whiskerEnds) {\n\t // zr animation only support 2-dim array.\n\t var shape = {};\n\t zrUtil.each(whiskerEnds, function (ends, i) {\n\t shape['ends' + i] = ends;\n\t });\n\t return shape;\n\t }\n\t\n\t /**\n\t * Update symbol properties\n\t * @param {module:echarts/data/List} data\n\t * @param {number} idx\n\t */\n\t whiskerBoxProto.updateData = function (data, idx, isInit) {\n\t var seriesModel = this._seriesModel = data.hostModel;\n\t var itemLayout = data.getItemLayout(idx);\n\t var updateMethod = graphic[isInit ? 'initProps' : 'updateProps'];\n\t // this.childAt(this.bodyIndex).stopAnimation(true);\n\t // this.childAt(this.whiskerIndex).stopAnimation(true);\n\t updateMethod(\n\t this.childAt(this.bodyIndex),\n\t {shape: {points: itemLayout.bodyEnds}},\n\t seriesModel, idx\n\t );\n\t updateMethod(\n\t this.childAt(this.whiskerIndex),\n\t {shape: makeWhiskerEndsShape(itemLayout.whiskerEnds)},\n\t seriesModel, idx\n\t );\n\t\n\t this.styleUpdater.call(null, this, data, idx);\n\t };\n\t\n\t zrUtil.inherits(WhiskerBox, graphic.Group);\n\t\n\t\n\t /**\n\t * @constructor\n\t * @alias module:echarts/chart/helper/WhiskerBoxDraw\n\t */\n\t function WhiskerBoxDraw(styleUpdater) {\n\t this.group = new graphic.Group();\n\t this.styleUpdater = styleUpdater;\n\t }\n\t\n\t var whiskerBoxDrawProto = WhiskerBoxDraw.prototype;\n\t\n\t /**\n\t * Update symbols draw by new data\n\t * @param {module:echarts/data/List} data\n\t */\n\t whiskerBoxDrawProto.updateData = function (data) {\n\t var group = this.group;\n\t var oldData = this._data;\n\t var styleUpdater = this.styleUpdater;\n\t\n\t data.diff(oldData)\n\t .add(function (newIdx) {\n\t if (data.hasValue(newIdx)) {\n\t var symbolEl = new WhiskerBox(data, newIdx, styleUpdater, true);\n\t data.setItemGraphicEl(newIdx, symbolEl);\n\t group.add(symbolEl);\n\t }\n\t })\n\t .update(function (newIdx, oldIdx) {\n\t var symbolEl = oldData.getItemGraphicEl(oldIdx);\n\t\n\t // Empty data\n\t if (!data.hasValue(newIdx)) {\n\t group.remove(symbolEl);\n\t return;\n\t }\n\t\n\t if (!symbolEl) {\n\t symbolEl = new WhiskerBox(data, newIdx, styleUpdater);\n\t }\n\t else {\n\t symbolEl.updateData(data, newIdx);\n\t }\n\t\n\t // Add back\n\t group.add(symbolEl);\n\t\n\t data.setItemGraphicEl(newIdx, symbolEl);\n\t })\n\t .remove(function (oldIdx) {\n\t var el = oldData.getItemGraphicEl(oldIdx);\n\t el && group.remove(el);\n\t })\n\t .execute();\n\t\n\t this._data = data;\n\t };\n\t\n\t /**\n\t * Remove symbols.\n\t * @param {module:echarts/data/List} data\n\t */\n\t whiskerBoxDrawProto.remove = function () {\n\t var group = this.group;\n\t var data = this._data;\n\t this._data = null;\n\t data && data.eachItemGraphicEl(function (el) {\n\t el && group.remove(el);\n\t });\n\t };\n\t\n\t module.exports = WhiskerBoxDraw;\n\n\n/***/ },\n/* 568 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var echarts = __webpack_require__(3);\n\t var PRIORITY = echarts.PRIORITY;\n\t\n\t __webpack_require__(569);\n\t __webpack_require__(570);\n\t\n\t echarts.registerVisual(zrUtil.curry(\n\t __webpack_require__(90), 'line', 'circle', 'line'\n\t ));\n\t echarts.registerLayout(zrUtil.curry(\n\t __webpack_require__(160), 'line'\n\t ));\n\t\n\t // Down sample after filter\n\t echarts.registerProcessor(PRIORITY.PROCESSOR.STATISTIC, zrUtil.curry(\n\t __webpack_require__(733), 'line'\n\t ));\n\t\n\t // In case developer forget to include grid component\n\t __webpack_require__(105);\n\n\n/***/ },\n/* 569 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var createListFromArray = __webpack_require__(76);\n\t var SeriesModel = __webpack_require__(26);\n\t\n\t module.exports = SeriesModel.extend({\n\t\n\t type: 'series.line',\n\t\n\t dependencies: ['grid', 'polar'],\n\t\n\t getInitialData: function (option, ecModel) {\n\t if (__DEV__) {\n\t var coordSys = option.coordinateSystem;\n\t if (coordSys !== 'polar' && coordSys !== 'cartesian2d') {\n\t throw new Error('Line not support coordinateSystem besides cartesian and polar');\n\t }\n\t }\n\t return createListFromArray(option.data, this, ecModel);\n\t },\n\t\n\t defaultOption: {\n\t zlevel: 0, // 一级层叠\n\t z: 2, // 二级层叠\n\t coordinateSystem: 'cartesian2d',\n\t legendHoverLink: true,\n\t\n\t hoverAnimation: true,\n\t // stack: null\n\t // xAxisIndex: 0,\n\t // yAxisIndex: 0,\n\t\n\t // polarIndex: 0,\n\t\n\t // If clip the overflow value\n\t clipOverflow: true,\n\t\n\t label: {\n\t normal: {\n\t position: 'top'\n\t }\n\t },\n\t // itemStyle: {\n\t // normal: {},\n\t // emphasis: {}\n\t // },\n\t lineStyle: {\n\t normal: {\n\t width: 2,\n\t type: 'solid'\n\t }\n\t },\n\t // areaStyle: {},\n\t // false, 'start', 'end', 'middle'\n\t step: false,\n\t\n\t // Disabled if step is true\n\t smooth: false,\n\t smoothMonotone: null,\n\t // 拐点图形类型\n\t symbol: 'emptyCircle',\n\t // 拐点图形大小\n\t symbolSize: 4,\n\t // 拐点图形旋转控制\n\t symbolRotate: null,\n\t\n\t // 是否显示 symbol, 只有在 tooltip hover 的时候显示\n\t showSymbol: true,\n\t // 标志图形默认只有主轴显示(随主轴标签间隔隐藏策略)\n\t showAllSymbol: false,\n\t\n\t // 是否连接断点\n\t connectNulls: false,\n\t\n\t // 数据过滤,'average', 'max', 'min', 'sum'\n\t sampling: 'none',\n\t\n\t animationEasing: 'linear',\n\t\n\t // Disable progressive\n\t progressive: 0,\n\t hoverLayerThreshold: Infinity\n\t }\n\t });\n\n\n/***/ },\n/* 570 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// FIXME step not support polar\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var SymbolDraw = __webpack_require__(84);\n\t var Symbol = __webpack_require__(151);\n\t var lineAnimationDiff = __webpack_require__(571);\n\t var graphic = __webpack_require__(4);\n\t var modelUtil = __webpack_require__(14);\n\t var polyHelper = __webpack_require__(572);\n\t var ChartView = __webpack_require__(56);\n\t\n\t function isPointsSame(points1, points2) {\n\t if (points1.length !== points2.length) {\n\t return;\n\t }\n\t for (var i = 0; i < points1.length; i++) {\n\t var p1 = points1[i];\n\t var p2 = points2[i];\n\t if (p1[0] !== p2[0] || p1[1] !== p2[1]) {\n\t return;\n\t }\n\t }\n\t return true;\n\t }\n\t\n\t function getSmooth(smooth) {\n\t return typeof (smooth) === 'number' ? smooth : (smooth ? 0.3 : 0);\n\t }\n\t\n\t function getAxisExtentWithGap(axis) {\n\t var extent = axis.getGlobalExtent();\n\t if (axis.onBand) {\n\t // Remove extra 1px to avoid line miter in clipped edge\n\t var halfBandWidth = axis.getBandWidth() / 2 - 1;\n\t var dir = extent[1] > extent[0] ? 1 : -1;\n\t extent[0] += dir * halfBandWidth;\n\t extent[1] -= dir * halfBandWidth;\n\t }\n\t return extent;\n\t }\n\t\n\t function sign(val) {\n\t return val >= 0 ? 1 : -1;\n\t }\n\t /**\n\t * @param {module:echarts/coord/cartesian/Cartesian2D|module:echarts/coord/polar/Polar} coordSys\n\t * @param {module:echarts/data/List} data\n\t * @param {Array.>} points\n\t * @private\n\t */\n\t function getStackedOnPoints(coordSys, data) {\n\t var baseAxis = coordSys.getBaseAxis();\n\t var valueAxis = coordSys.getOtherAxis(baseAxis);\n\t var valueStart = baseAxis.onZero\n\t ? 0 : valueAxis.scale.getExtent()[0];\n\t\n\t var valueDim = valueAxis.dim;\n\t\n\t var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0;\n\t\n\t return data.mapArray([valueDim], function (val, idx) {\n\t var stackedOnSameSign;\n\t var stackedOn = data.stackedOn;\n\t // Find first stacked value with same sign\n\t while (stackedOn &&\n\t sign(stackedOn.get(valueDim, idx)) === sign(val)\n\t ) {\n\t stackedOnSameSign = stackedOn;\n\t break;\n\t }\n\t var stackedData = [];\n\t stackedData[baseDataOffset] = data.get(baseAxis.dim, idx);\n\t stackedData[1 - baseDataOffset] = stackedOnSameSign\n\t ? stackedOnSameSign.get(valueDim, idx, true) : valueStart;\n\t\n\t return coordSys.dataToPoint(stackedData);\n\t }, true);\n\t }\n\t\n\t function createGridClipShape(cartesian, hasAnimation, seriesModel) {\n\t var xExtent = getAxisExtentWithGap(cartesian.getAxis('x'));\n\t var yExtent = getAxisExtentWithGap(cartesian.getAxis('y'));\n\t var isHorizontal = cartesian.getBaseAxis().isHorizontal();\n\t\n\t var x = Math.min(xExtent[0], xExtent[1]);\n\t var y = Math.min(yExtent[0], yExtent[1]);\n\t var width = Math.max(xExtent[0], xExtent[1]) - x;\n\t var height = Math.max(yExtent[0], yExtent[1]) - y;\n\t var lineWidth = seriesModel.get('lineStyle.normal.width') || 2;\n\t // Expand clip shape to avoid clipping when line value exceeds axis\n\t var expandSize = seriesModel.get('clipOverflow') ? lineWidth / 2 : Math.max(width, height);\n\t if (isHorizontal) {\n\t y -= expandSize;\n\t height += expandSize * 2;\n\t }\n\t else {\n\t x -= expandSize;\n\t width += expandSize * 2;\n\t }\n\t\n\t var clipPath = new graphic.Rect({\n\t shape: {\n\t x: x,\n\t y: y,\n\t width: width,\n\t height: height\n\t }\n\t });\n\t\n\t if (hasAnimation) {\n\t clipPath.shape[isHorizontal ? 'width' : 'height'] = 0;\n\t graphic.initProps(clipPath, {\n\t shape: {\n\t width: width,\n\t height: height\n\t }\n\t }, seriesModel);\n\t }\n\t\n\t return clipPath;\n\t }\n\t\n\t function createPolarClipShape(polar, hasAnimation, seriesModel) {\n\t var angleAxis = polar.getAngleAxis();\n\t var radiusAxis = polar.getRadiusAxis();\n\t\n\t var radiusExtent = radiusAxis.getExtent();\n\t var angleExtent = angleAxis.getExtent();\n\t\n\t var RADIAN = Math.PI / 180;\n\t\n\t var clipPath = new graphic.Sector({\n\t shape: {\n\t cx: polar.cx,\n\t cy: polar.cy,\n\t r0: radiusExtent[0],\n\t r: radiusExtent[1],\n\t startAngle: -angleExtent[0] * RADIAN,\n\t endAngle: -angleExtent[1] * RADIAN,\n\t clockwise: angleAxis.inverse\n\t }\n\t });\n\t\n\t if (hasAnimation) {\n\t clipPath.shape.endAngle = -angleExtent[0] * RADIAN;\n\t graphic.initProps(clipPath, {\n\t shape: {\n\t endAngle: -angleExtent[1] * RADIAN\n\t }\n\t }, seriesModel);\n\t }\n\t\n\t return clipPath;\n\t }\n\t\n\t function createClipShape(coordSys, hasAnimation, seriesModel) {\n\t return coordSys.type === 'polar'\n\t ? createPolarClipShape(coordSys, hasAnimation, seriesModel)\n\t : createGridClipShape(coordSys, hasAnimation, seriesModel);\n\t }\n\t\n\t function turnPointsIntoStep(points, coordSys, stepTurnAt) {\n\t var baseAxis = coordSys.getBaseAxis();\n\t var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1;\n\t\n\t var stepPoints = [];\n\t for (var i = 0; i < points.length - 1; i++) {\n\t var nextPt = points[i + 1];\n\t var pt = points[i];\n\t stepPoints.push(pt);\n\t\n\t var stepPt = [];\n\t switch (stepTurnAt) {\n\t case 'end':\n\t stepPt[baseIndex] = nextPt[baseIndex];\n\t stepPt[1 - baseIndex] = pt[1 - baseIndex];\n\t // default is start\n\t stepPoints.push(stepPt);\n\t break;\n\t case 'middle':\n\t // default is start\n\t var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2;\n\t var stepPt2 = [];\n\t stepPt[baseIndex] = stepPt2[baseIndex] = middle;\n\t stepPt[1 - baseIndex] = pt[1 - baseIndex];\n\t stepPt2[1 - baseIndex] = nextPt[1 - baseIndex];\n\t stepPoints.push(stepPt);\n\t stepPoints.push(stepPt2);\n\t break;\n\t default:\n\t stepPt[baseIndex] = pt[baseIndex];\n\t stepPt[1 - baseIndex] = nextPt[1 - baseIndex];\n\t // default is start\n\t stepPoints.push(stepPt);\n\t }\n\t }\n\t // Last points\n\t points[i] && stepPoints.push(points[i]);\n\t return stepPoints;\n\t }\n\t\n\t function getVisualGradient(data, coordSys) {\n\t var visualMetaList = data.getVisual('visualMeta');\n\t if (!visualMetaList || !visualMetaList.length || !data.count()) {\n\t // When data.count() is 0, gradient range can not be calculated.\n\t return;\n\t }\n\t\n\t var visualMeta;\n\t for (var i = visualMetaList.length - 1; i >= 0; i--) {\n\t // Can only be x or y\n\t if (visualMetaList[i].dimension < 2) {\n\t visualMeta = visualMetaList[i];\n\t break;\n\t }\n\t }\n\t if (!visualMeta || coordSys.type !== 'cartesian2d') {\n\t if (__DEV__) {\n\t console.warn('Visual map on line style only support x or y dimension.');\n\t }\n\t return;\n\t }\n\t\n\t // If the area to be rendered is bigger than area defined by LinearGradient,\n\t // the canvas spec prescribes that the color of the first stop and the last\n\t // stop should be used. But if two stops are added at offset 0, in effect\n\t // browsers use the color of the second stop to render area outside\n\t // LinearGradient. So we can only infinitesimally extend area defined in\n\t // LinearGradient to render `outerColors`.\n\t\n\t var dimension = visualMeta.dimension;\n\t var dimName = data.dimensions[dimension];\n\t var axis = coordSys.getAxis(dimName);\n\t\n\t // dataToCoor mapping may not be linear, but must be monotonic.\n\t var colorStops = zrUtil.map(visualMeta.stops, function (stop) {\n\t return {\n\t coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)),\n\t color: stop.color\n\t };\n\t });\n\t var stopLen = colorStops.length;\n\t var outerColors = visualMeta.outerColors.slice();\n\t\n\t if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) {\n\t colorStops.reverse();\n\t outerColors.reverse();\n\t }\n\t\n\t var tinyExtent = 10; // Arbitrary value: 10px\n\t var minCoord = colorStops[0].coord - tinyExtent;\n\t var maxCoord = colorStops[stopLen - 1].coord + tinyExtent;\n\t var coordSpan = maxCoord - minCoord;\n\t\n\t if (coordSpan < 1e-3) {\n\t return 'transparent';\n\t }\n\t\n\t zrUtil.each(colorStops, function (stop) {\n\t stop.offset = (stop.coord - minCoord) / coordSpan;\n\t });\n\t colorStops.push({\n\t offset: stopLen ? colorStops[stopLen - 1].offset : 0.5,\n\t color: outerColors[1] || 'transparent'\n\t });\n\t colorStops.unshift({ // notice colorStops.length have been changed.\n\t offset: stopLen ? colorStops[0].offset : 0.5,\n\t color: outerColors[0] || 'transparent'\n\t });\n\t\n\t // zrUtil.each(colorStops, function (colorStop) {\n\t // // Make sure each offset has rounded px to avoid not sharp edge\n\t // colorStop.offset = (Math.round(colorStop.offset * (end - start) + start) - start) / (end - start);\n\t // });\n\t\n\t var gradient = new graphic.LinearGradient(0, 0, 0, 0, colorStops, true);\n\t gradient[dimName] = minCoord;\n\t gradient[dimName + '2'] = maxCoord;\n\t\n\t return gradient;\n\t }\n\t\n\t module.exports = ChartView.extend({\n\t\n\t type: 'line',\n\t\n\t init: function () {\n\t var lineGroup = new graphic.Group();\n\t\n\t var symbolDraw = new SymbolDraw();\n\t this.group.add(symbolDraw.group);\n\t\n\t this._symbolDraw = symbolDraw;\n\t this._lineGroup = lineGroup;\n\t },\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var group = this.group;\n\t var data = seriesModel.getData();\n\t var lineStyleModel = seriesModel.getModel('lineStyle.normal');\n\t var areaStyleModel = seriesModel.getModel('areaStyle.normal');\n\t\n\t var points = data.mapArray(data.getItemLayout, true);\n\t\n\t var isCoordSysPolar = coordSys.type === 'polar';\n\t var prevCoordSys = this._coordSys;\n\t\n\t var symbolDraw = this._symbolDraw;\n\t var polyline = this._polyline;\n\t var polygon = this._polygon;\n\t\n\t var lineGroup = this._lineGroup;\n\t\n\t var hasAnimation = seriesModel.get('animation');\n\t\n\t var isAreaChart = !areaStyleModel.isEmpty();\n\t var stackedOnPoints = getStackedOnPoints(coordSys, data);\n\t\n\t var showSymbol = seriesModel.get('showSymbol');\n\t\n\t var isSymbolIgnore = showSymbol && !isCoordSysPolar && !seriesModel.get('showAllSymbol')\n\t && this._getSymbolIgnoreFunc(data, coordSys);\n\t\n\t // Remove temporary symbols\n\t var oldData = this._data;\n\t oldData && oldData.eachItemGraphicEl(function (el, idx) {\n\t if (el.__temp) {\n\t group.remove(el);\n\t oldData.setItemGraphicEl(idx, null);\n\t }\n\t });\n\t\n\t // Remove previous created symbols if showSymbol changed to false\n\t if (!showSymbol) {\n\t symbolDraw.remove();\n\t }\n\t\n\t group.add(lineGroup);\n\t\n\t // FIXME step not support polar\n\t var step = !isCoordSysPolar && seriesModel.get('step');\n\t // Initialization animation or coordinate system changed\n\t if (\n\t !(polyline && prevCoordSys.type === coordSys.type && step === this._step)\n\t ) {\n\t showSymbol && symbolDraw.updateData(data, isSymbolIgnore);\n\t\n\t if (step) {\n\t // TODO If stacked series is not step\n\t points = turnPointsIntoStep(points, coordSys, step);\n\t stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step);\n\t }\n\t\n\t polyline = this._newPolyline(points, coordSys, hasAnimation);\n\t if (isAreaChart) {\n\t polygon = this._newPolygon(\n\t points, stackedOnPoints,\n\t coordSys, hasAnimation\n\t );\n\t }\n\t lineGroup.setClipPath(createClipShape(coordSys, true, seriesModel));\n\t }\n\t else {\n\t if (isAreaChart && !polygon) {\n\t // If areaStyle is added\n\t polygon = this._newPolygon(\n\t points, stackedOnPoints,\n\t coordSys, hasAnimation\n\t );\n\t }\n\t else if (polygon && !isAreaChart) {\n\t // If areaStyle is removed\n\t lineGroup.remove(polygon);\n\t polygon = this._polygon = null;\n\t }\n\t\n\t // Update clipPath\n\t lineGroup.setClipPath(createClipShape(coordSys, false, seriesModel));\n\t\n\t // Always update, or it is wrong in the case turning on legend\n\t // because points are not changed\n\t showSymbol && symbolDraw.updateData(data, isSymbolIgnore);\n\t\n\t // Stop symbol animation and sync with line points\n\t // FIXME performance?\n\t data.eachItemGraphicEl(function (el) {\n\t el.stopAnimation(true);\n\t });\n\t\n\t // In the case data zoom triggerred refreshing frequently\n\t // Data may not change if line has a category axis. So it should animate nothing\n\t if (!isPointsSame(this._stackedOnPoints, stackedOnPoints)\n\t || !isPointsSame(this._points, points)\n\t ) {\n\t if (hasAnimation) {\n\t this._updateAnimation(\n\t data, stackedOnPoints, coordSys, api, step\n\t );\n\t }\n\t else {\n\t // Not do it in update with animation\n\t if (step) {\n\t // TODO If stacked series is not step\n\t points = turnPointsIntoStep(points, coordSys, step);\n\t stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step);\n\t }\n\t\n\t polyline.setShape({\n\t points: points\n\t });\n\t polygon && polygon.setShape({\n\t points: points,\n\t stackedOnPoints: stackedOnPoints\n\t });\n\t }\n\t }\n\t }\n\t\n\t var visualColor = getVisualGradient(data, coordSys) || data.getVisual('color');\n\t\n\t polyline.useStyle(zrUtil.defaults(\n\t // Use color in lineStyle first\n\t lineStyleModel.getLineStyle(),\n\t {\n\t fill: 'none',\n\t stroke: visualColor,\n\t lineJoin: 'bevel'\n\t }\n\t ));\n\t\n\t var smooth = seriesModel.get('smooth');\n\t smooth = getSmooth(seriesModel.get('smooth'));\n\t polyline.setShape({\n\t smooth: smooth,\n\t smoothMonotone: seriesModel.get('smoothMonotone'),\n\t connectNulls: seriesModel.get('connectNulls')\n\t });\n\t\n\t if (polygon) {\n\t var stackedOn = data.stackedOn;\n\t var stackedOnSmooth = 0;\n\t\n\t polygon.useStyle(zrUtil.defaults(\n\t areaStyleModel.getAreaStyle(),\n\t {\n\t fill: visualColor,\n\t opacity: 0.7,\n\t lineJoin: 'bevel'\n\t }\n\t ));\n\t\n\t if (stackedOn) {\n\t var stackedOnSeries = stackedOn.hostModel;\n\t stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth'));\n\t }\n\t\n\t polygon.setShape({\n\t smooth: smooth,\n\t stackedOnSmooth: stackedOnSmooth,\n\t smoothMonotone: seriesModel.get('smoothMonotone'),\n\t connectNulls: seriesModel.get('connectNulls')\n\t });\n\t }\n\t\n\t this._data = data;\n\t // Save the coordinate system for transition animation when data changed\n\t this._coordSys = coordSys;\n\t this._stackedOnPoints = stackedOnPoints;\n\t this._points = points;\n\t this._step = step;\n\t },\n\t\n\t dispose: function () {},\n\t\n\t highlight: function (seriesModel, ecModel, api, payload) {\n\t var data = seriesModel.getData();\n\t var dataIndex = modelUtil.queryDataIndex(data, payload);\n\t\n\t if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) {\n\t var symbol = data.getItemGraphicEl(dataIndex);\n\t if (!symbol) {\n\t // Create a temporary symbol if it is not exists\n\t var pt = data.getItemLayout(dataIndex);\n\t if (!pt) {\n\t // Null data\n\t return;\n\t }\n\t symbol = new Symbol(data, dataIndex);\n\t symbol.position = pt;\n\t symbol.setZ(\n\t seriesModel.get('zlevel'),\n\t seriesModel.get('z')\n\t );\n\t symbol.ignore = isNaN(pt[0]) || isNaN(pt[1]);\n\t symbol.__temp = true;\n\t data.setItemGraphicEl(dataIndex, symbol);\n\t\n\t // Stop scale animation\n\t symbol.stopSymbolAnimation(true);\n\t\n\t this.group.add(symbol);\n\t }\n\t symbol.highlight();\n\t }\n\t else {\n\t // Highlight whole series\n\t ChartView.prototype.highlight.call(\n\t this, seriesModel, ecModel, api, payload\n\t );\n\t }\n\t },\n\t\n\t downplay: function (seriesModel, ecModel, api, payload) {\n\t var data = seriesModel.getData();\n\t var dataIndex = modelUtil.queryDataIndex(data, payload);\n\t if (dataIndex != null && dataIndex >= 0) {\n\t var symbol = data.getItemGraphicEl(dataIndex);\n\t if (symbol) {\n\t if (symbol.__temp) {\n\t data.setItemGraphicEl(dataIndex, null);\n\t this.group.remove(symbol);\n\t }\n\t else {\n\t symbol.downplay();\n\t }\n\t }\n\t }\n\t else {\n\t // Downplay whole series\n\t ChartView.prototype.downplay.call(\n\t this, seriesModel, ecModel, api, payload\n\t );\n\t }\n\t },\n\t\n\t /**\n\t * @param {module:zrender/container/Group} group\n\t * @param {Array.>} points\n\t * @private\n\t */\n\t _newPolyline: function (points) {\n\t var polyline = this._polyline;\n\t // Remove previous created polyline\n\t if (polyline) {\n\t this._lineGroup.remove(polyline);\n\t }\n\t\n\t polyline = new polyHelper.Polyline({\n\t shape: {\n\t points: points\n\t },\n\t silent: true,\n\t z2: 10\n\t });\n\t\n\t this._lineGroup.add(polyline);\n\t\n\t this._polyline = polyline;\n\t\n\t return polyline;\n\t },\n\t\n\t /**\n\t * @param {module:zrender/container/Group} group\n\t * @param {Array.>} stackedOnPoints\n\t * @param {Array.>} points\n\t * @private\n\t */\n\t _newPolygon: function (points, stackedOnPoints) {\n\t var polygon = this._polygon;\n\t // Remove previous created polygon\n\t if (polygon) {\n\t this._lineGroup.remove(polygon);\n\t }\n\t\n\t polygon = new polyHelper.Polygon({\n\t shape: {\n\t points: points,\n\t stackedOnPoints: stackedOnPoints\n\t },\n\t silent: true\n\t });\n\t\n\t this._lineGroup.add(polygon);\n\t\n\t this._polygon = polygon;\n\t return polygon;\n\t },\n\t /**\n\t * @private\n\t */\n\t _getSymbolIgnoreFunc: function (data, coordSys) {\n\t var categoryAxis = coordSys.getAxesByScale('ordinal')[0];\n\t // `getLabelInterval` is provided by echarts/component/axis\n\t if (categoryAxis && categoryAxis.isLabelIgnored) {\n\t return zrUtil.bind(categoryAxis.isLabelIgnored, categoryAxis);\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t // FIXME Two value axis\n\t _updateAnimation: function (data, stackedOnPoints, coordSys, api, step) {\n\t var polyline = this._polyline;\n\t var polygon = this._polygon;\n\t var seriesModel = data.hostModel;\n\t\n\t var diff = lineAnimationDiff(\n\t this._data, data,\n\t this._stackedOnPoints, stackedOnPoints,\n\t this._coordSys, coordSys\n\t );\n\t\n\t var current = diff.current;\n\t var stackedOnCurrent = diff.stackedOnCurrent;\n\t var next = diff.next;\n\t var stackedOnNext = diff.stackedOnNext;\n\t if (step) {\n\t // TODO If stacked series is not step\n\t current = turnPointsIntoStep(diff.current, coordSys, step);\n\t stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, coordSys, step);\n\t next = turnPointsIntoStep(diff.next, coordSys, step);\n\t stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, coordSys, step);\n\t }\n\t // `diff.current` is subset of `current` (which should be ensured by\n\t // turnPointsIntoStep), so points in `__points` can be updated when\n\t // points in `current` are update during animation.\n\t polyline.shape.__points = diff.current;\n\t polyline.shape.points = current;\n\t\n\t graphic.updateProps(polyline, {\n\t shape: {\n\t points: next\n\t }\n\t }, seriesModel);\n\t\n\t if (polygon) {\n\t polygon.setShape({\n\t points: current,\n\t stackedOnPoints: stackedOnCurrent\n\t });\n\t graphic.updateProps(polygon, {\n\t shape: {\n\t points: next,\n\t stackedOnPoints: stackedOnNext\n\t }\n\t }, seriesModel);\n\t }\n\t\n\t var updatedDataInfo = [];\n\t var diffStatus = diff.status;\n\t\n\t for (var i = 0; i < diffStatus.length; i++) {\n\t var cmd = diffStatus[i].cmd;\n\t if (cmd === '=') {\n\t var el = data.getItemGraphicEl(diffStatus[i].idx1);\n\t if (el) {\n\t updatedDataInfo.push({\n\t el: el,\n\t ptIdx: i // Index of points\n\t });\n\t }\n\t }\n\t }\n\t\n\t if (polyline.animators && polyline.animators.length) {\n\t polyline.animators[0].during(function () {\n\t for (var i = 0; i < updatedDataInfo.length; i++) {\n\t var el = updatedDataInfo[i].el;\n\t el.attr('position', polyline.shape.__points[updatedDataInfo[i].ptIdx]);\n\t }\n\t });\n\t }\n\t },\n\t\n\t remove: function (ecModel) {\n\t var group = this.group;\n\t var oldData = this._data;\n\t this._lineGroup.removeAll();\n\t this._symbolDraw.remove(true);\n\t // Remove temporary created elements when highlighting\n\t oldData && oldData.eachItemGraphicEl(function (el, idx) {\n\t if (el.__temp) {\n\t group.remove(el);\n\t oldData.setItemGraphicEl(idx, null);\n\t }\n\t });\n\t\n\t this._polyline =\n\t this._polygon =\n\t this._coordSys =\n\t this._points =\n\t this._stackedOnPoints =\n\t this._data = null;\n\t }\n\t });\n\n\n/***/ },\n/* 571 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t // var arrayDiff = require('zrender/lib/core/arrayDiff');\n\t // 'zrender/core/arrayDiff' has been used before, but it did\n\t // not do well in performance when roam with fixed dataZoom window.\n\t\n\t function sign(val) {\n\t return val >= 0 ? 1 : -1;\n\t }\n\t\n\t function getStackedOnPoint(coordSys, data, idx) {\n\t var baseAxis = coordSys.getBaseAxis();\n\t var valueAxis = coordSys.getOtherAxis(baseAxis);\n\t var valueStart = baseAxis.onZero\n\t ? 0 : valueAxis.scale.getExtent()[0];\n\t\n\t var valueDim = valueAxis.dim;\n\t var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0;\n\t\n\t var stackedOnSameSign;\n\t var stackedOn = data.stackedOn;\n\t var val = data.get(valueDim, idx);\n\t // Find first stacked value with same sign\n\t while (stackedOn &&\n\t sign(stackedOn.get(valueDim, idx)) === sign(val)\n\t ) {\n\t stackedOnSameSign = stackedOn;\n\t break;\n\t }\n\t var stackedData = [];\n\t stackedData[baseDataOffset] = data.get(baseAxis.dim, idx);\n\t stackedData[1 - baseDataOffset] = stackedOnSameSign\n\t ? stackedOnSameSign.get(valueDim, idx, true) : valueStart;\n\t\n\t return coordSys.dataToPoint(stackedData);\n\t }\n\t\n\t // function convertToIntId(newIdList, oldIdList) {\n\t // // Generate int id instead of string id.\n\t // // Compare string maybe slow in score function of arrDiff\n\t\n\t // // Assume id in idList are all unique\n\t // var idIndicesMap = {};\n\t // var idx = 0;\n\t // for (var i = 0; i < newIdList.length; i++) {\n\t // idIndicesMap[newIdList[i]] = idx;\n\t // newIdList[i] = idx++;\n\t // }\n\t // for (var i = 0; i < oldIdList.length; i++) {\n\t // var oldId = oldIdList[i];\n\t // // Same with newIdList\n\t // if (idIndicesMap[oldId]) {\n\t // oldIdList[i] = idIndicesMap[oldId];\n\t // }\n\t // else {\n\t // oldIdList[i] = idx++;\n\t // }\n\t // }\n\t // }\n\t\n\t function diffData(oldData, newData) {\n\t var diffResult = [];\n\t\n\t newData.diff(oldData)\n\t .add(function (idx) {\n\t diffResult.push({cmd: '+', idx: idx});\n\t })\n\t .update(function (newIdx, oldIdx) {\n\t diffResult.push({cmd: '=', idx: oldIdx, idx1: newIdx});\n\t })\n\t .remove(function (idx) {\n\t diffResult.push({cmd: '-', idx: idx});\n\t })\n\t .execute();\n\t\n\t return diffResult;\n\t }\n\t\n\t module.exports = function (\n\t oldData, newData,\n\t oldStackedOnPoints, newStackedOnPoints,\n\t oldCoordSys, newCoordSys\n\t ) {\n\t var diff = diffData(oldData, newData);\n\t\n\t // var newIdList = newData.mapArray(newData.getId);\n\t // var oldIdList = oldData.mapArray(oldData.getId);\n\t\n\t // convertToIntId(newIdList, oldIdList);\n\t\n\t // // FIXME One data ?\n\t // diff = arrayDiff(oldIdList, newIdList);\n\t\n\t var currPoints = [];\n\t var nextPoints = [];\n\t // Points for stacking base line\n\t var currStackedPoints = [];\n\t var nextStackedPoints = [];\n\t\n\t var status = [];\n\t var sortedIndices = [];\n\t var rawIndices = [];\n\t var dims = newCoordSys.dimensions;\n\t for (var i = 0; i < diff.length; i++) {\n\t var diffItem = diff[i];\n\t var pointAdded = true;\n\t\n\t // FIXME, animation is not so perfect when dataZoom window moves fast\n\t // Which is in case remvoing or add more than one data in the tail or head\n\t switch (diffItem.cmd) {\n\t case '=':\n\t var currentPt = oldData.getItemLayout(diffItem.idx);\n\t var nextPt = newData.getItemLayout(diffItem.idx1);\n\t // If previous data is NaN, use next point directly\n\t if (isNaN(currentPt[0]) || isNaN(currentPt[1])) {\n\t currentPt = nextPt.slice();\n\t }\n\t currPoints.push(currentPt);\n\t nextPoints.push(nextPt);\n\t\n\t currStackedPoints.push(oldStackedOnPoints[diffItem.idx]);\n\t nextStackedPoints.push(newStackedOnPoints[diffItem.idx1]);\n\t\n\t rawIndices.push(newData.getRawIndex(diffItem.idx1));\n\t break;\n\t case '+':\n\t var idx = diffItem.idx;\n\t currPoints.push(\n\t oldCoordSys.dataToPoint([\n\t newData.get(dims[0], idx, true), newData.get(dims[1], idx, true)\n\t ])\n\t );\n\t\n\t nextPoints.push(newData.getItemLayout(idx).slice());\n\t\n\t currStackedPoints.push(\n\t getStackedOnPoint(oldCoordSys, newData, idx)\n\t );\n\t nextStackedPoints.push(newStackedOnPoints[idx]);\n\t\n\t rawIndices.push(newData.getRawIndex(idx));\n\t break;\n\t case '-':\n\t var idx = diffItem.idx;\n\t var rawIndex = oldData.getRawIndex(idx);\n\t // Data is replaced. In the case of dynamic data queue\n\t // FIXME FIXME FIXME\n\t if (rawIndex !== idx) {\n\t currPoints.push(oldData.getItemLayout(idx));\n\t nextPoints.push(newCoordSys.dataToPoint([\n\t oldData.get(dims[0], idx, true), oldData.get(dims[1], idx, true)\n\t ]));\n\t\n\t currStackedPoints.push(oldStackedOnPoints[idx]);\n\t nextStackedPoints.push(\n\t getStackedOnPoint(\n\t newCoordSys, oldData, idx\n\t )\n\t );\n\t\n\t rawIndices.push(rawIndex);\n\t }\n\t else {\n\t pointAdded = false;\n\t }\n\t }\n\t\n\t // Original indices\n\t if (pointAdded) {\n\t status.push(diffItem);\n\t sortedIndices.push(sortedIndices.length);\n\t }\n\t }\n\t\n\t // Diff result may be crossed if all items are changed\n\t // Sort by data index\n\t sortedIndices.sort(function (a, b) {\n\t return rawIndices[a] - rawIndices[b];\n\t });\n\t\n\t var sortedCurrPoints = [];\n\t var sortedNextPoints = [];\n\t\n\t var sortedCurrStackedPoints = [];\n\t var sortedNextStackedPoints = [];\n\t\n\t var sortedStatus = [];\n\t for (var i = 0; i < sortedIndices.length; i++) {\n\t var idx = sortedIndices[i];\n\t sortedCurrPoints[i] = currPoints[idx];\n\t sortedNextPoints[i] = nextPoints[idx];\n\t\n\t sortedCurrStackedPoints[i] = currStackedPoints[idx];\n\t sortedNextStackedPoints[i] = nextStackedPoints[idx];\n\t\n\t sortedStatus[i] = status[idx];\n\t }\n\t\n\t return {\n\t current: sortedCurrPoints,\n\t next: sortedNextPoints,\n\t\n\t stackedOnCurrent: sortedCurrStackedPoints,\n\t stackedOnNext: sortedNextStackedPoints,\n\t\n\t status: sortedStatus\n\t };\n\t };\n\n\n/***/ },\n/* 572 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Poly path support NaN point\n\t\n\t\n\t var Path = __webpack_require__(24);\n\t var vec2 = __webpack_require__(10);\n\t\n\t var vec2Min = vec2.min;\n\t var vec2Max = vec2.max;\n\t\n\t var scaleAndAdd = vec2.scaleAndAdd;\n\t var v2Copy = vec2.copy;\n\t\n\t // Temporary variable\n\t var v = [];\n\t var cp0 = [];\n\t var cp1 = [];\n\t\n\t function isPointNull(p) {\n\t return isNaN(p[0]) || isNaN(p[1]);\n\t }\n\t\n\t function drawSegment(\n\t ctx, points, start, segLen, allLen,\n\t dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls\n\t ) {\n\t var prevIdx = 0;\n\t var idx = start;\n\t for (var k = 0; k < segLen; k++) {\n\t var p = points[idx];\n\t if (idx >= allLen || idx < 0) {\n\t break;\n\t }\n\t if (isPointNull(p)) {\n\t if (connectNulls) {\n\t idx += dir;\n\t continue;\n\t }\n\t break;\n\t }\n\t\n\t if (idx === start) {\n\t ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]);\n\t v2Copy(cp0, p);\n\t }\n\t else {\n\t if (smooth > 0) {\n\t var nextIdx = idx + dir;\n\t var nextP = points[nextIdx];\n\t if (connectNulls) {\n\t // Find next point not null\n\t while (nextP && isPointNull(points[nextIdx])) {\n\t nextIdx += dir;\n\t nextP = points[nextIdx];\n\t }\n\t }\n\t\n\t var ratioNextSeg = 0.5;\n\t var prevP = points[prevIdx];\n\t var nextP = points[nextIdx];\n\t // Last point\n\t if (!nextP || isPointNull(nextP)) {\n\t v2Copy(cp1, p);\n\t }\n\t else {\n\t // If next data is null in not connect case\n\t if (isPointNull(nextP) && !connectNulls) {\n\t nextP = p;\n\t }\n\t\n\t vec2.sub(v, nextP, prevP);\n\t\n\t var lenPrevSeg;\n\t var lenNextSeg;\n\t if (smoothMonotone === 'x' || smoothMonotone === 'y') {\n\t var dim = smoothMonotone === 'x' ? 0 : 1;\n\t lenPrevSeg = Math.abs(p[dim] - prevP[dim]);\n\t lenNextSeg = Math.abs(p[dim] - nextP[dim]);\n\t }\n\t else {\n\t lenPrevSeg = vec2.dist(p, prevP);\n\t lenNextSeg = vec2.dist(p, nextP);\n\t }\n\t\n\t // Use ratio of seg length\n\t ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg);\n\t\n\t scaleAndAdd(cp1, p, v, -smooth * (1 - ratioNextSeg));\n\t }\n\t // Smooth constraint\n\t vec2Min(cp0, cp0, smoothMax);\n\t vec2Max(cp0, cp0, smoothMin);\n\t vec2Min(cp1, cp1, smoothMax);\n\t vec2Max(cp1, cp1, smoothMin);\n\t\n\t ctx.bezierCurveTo(\n\t cp0[0], cp0[1],\n\t cp1[0], cp1[1],\n\t p[0], p[1]\n\t );\n\t // cp0 of next segment\n\t scaleAndAdd(cp0, p, v, smooth * ratioNextSeg);\n\t }\n\t else {\n\t ctx.lineTo(p[0], p[1]);\n\t }\n\t }\n\t\n\t prevIdx = idx;\n\t idx += dir;\n\t }\n\t\n\t return k;\n\t }\n\t\n\t function getBoundingBox(points, smoothConstraint) {\n\t var ptMin = [Infinity, Infinity];\n\t var ptMax = [-Infinity, -Infinity];\n\t if (smoothConstraint) {\n\t for (var i = 0; i < points.length; i++) {\n\t var pt = points[i];\n\t if (pt[0] < ptMin[0]) { ptMin[0] = pt[0]; }\n\t if (pt[1] < ptMin[1]) { ptMin[1] = pt[1]; }\n\t if (pt[0] > ptMax[0]) { ptMax[0] = pt[0]; }\n\t if (pt[1] > ptMax[1]) { ptMax[1] = pt[1]; }\n\t }\n\t }\n\t return {\n\t min: smoothConstraint ? ptMin : ptMax,\n\t max: smoothConstraint ? ptMax : ptMin\n\t };\n\t }\n\t\n\t module.exports = {\n\t\n\t Polyline: Path.extend({\n\t\n\t type: 'ec-polyline',\n\t\n\t shape: {\n\t points: [],\n\t\n\t smooth: 0,\n\t\n\t smoothConstraint: true,\n\t\n\t smoothMonotone: null,\n\t\n\t connectNulls: false\n\t },\n\t\n\t style: {\n\t fill: null,\n\t\n\t stroke: '#000'\n\t },\n\t\n\t buildPath: function (ctx, shape) {\n\t var points = shape.points;\n\t\n\t var i = 0;\n\t var len = points.length;\n\t\n\t var result = getBoundingBox(points, shape.smoothConstraint);\n\t\n\t if (shape.connectNulls) {\n\t // Must remove first and last null values avoid draw error in polygon\n\t for (; len > 0; len--) {\n\t if (!isPointNull(points[len - 1])) {\n\t break;\n\t }\n\t }\n\t for (; i < len; i++) {\n\t if (!isPointNull(points[i])) {\n\t break;\n\t }\n\t }\n\t }\n\t while (i < len) {\n\t i += drawSegment(\n\t ctx, points, i, len, len,\n\t 1, result.min, result.max, shape.smooth,\n\t shape.smoothMonotone, shape.connectNulls\n\t ) + 1;\n\t }\n\t }\n\t }),\n\t\n\t Polygon: Path.extend({\n\t\n\t type: 'ec-polygon',\n\t\n\t shape: {\n\t points: [],\n\t\n\t // Offset between stacked base points and points\n\t stackedOnPoints: [],\n\t\n\t smooth: 0,\n\t\n\t stackedOnSmooth: 0,\n\t\n\t smoothConstraint: true,\n\t\n\t smoothMonotone: null,\n\t\n\t connectNulls: false\n\t },\n\t\n\t buildPath: function (ctx, shape) {\n\t var points = shape.points;\n\t var stackedOnPoints = shape.stackedOnPoints;\n\t\n\t var i = 0;\n\t var len = points.length;\n\t var smoothMonotone = shape.smoothMonotone;\n\t var bbox = getBoundingBox(points, shape.smoothConstraint);\n\t var stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint);\n\t\n\t if (shape.connectNulls) {\n\t // Must remove first and last null values avoid draw error in polygon\n\t for (; len > 0; len--) {\n\t if (!isPointNull(points[len - 1])) {\n\t break;\n\t }\n\t }\n\t for (; i < len; i++) {\n\t if (!isPointNull(points[i])) {\n\t break;\n\t }\n\t }\n\t }\n\t while (i < len) {\n\t var k = drawSegment(\n\t ctx, points, i, len, len,\n\t 1, bbox.min, bbox.max, shape.smooth,\n\t smoothMonotone, shape.connectNulls\n\t );\n\t drawSegment(\n\t ctx, stackedOnPoints, i + k - 1, k, len,\n\t -1, stackedOnBBox.min, stackedOnBBox.max, shape.stackedOnSmooth,\n\t smoothMonotone, shape.connectNulls\n\t );\n\t i += k + 1;\n\t\n\t ctx.closePath();\n\t }\n\t }\n\t })\n\t };\n\n\n/***/ },\n/* 573 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(574);\n\t __webpack_require__(575);\n\t\n\t var echarts = __webpack_require__(3);\n\t echarts.registerLayout(\n\t __webpack_require__(576)\n\t );\n\n\n/***/ },\n/* 574 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var SeriesModel = __webpack_require__(26);\n\t var List = __webpack_require__(20);\n\t var zrUtil = __webpack_require__(1);\n\t var CoordinateSystem = __webpack_require__(47);\n\t\n\t // Convert [ [{coord: []}, {coord: []}] ]\n\t // to [ { coords: [[]] } ]\n\t function preprocessOption (seriesOpt) {\n\t var data = seriesOpt.data;\n\t if (data && data[0] && data[0][0] && data[0][0].coord) {\n\t if (__DEV__) {\n\t console.warn('Lines data configuration has been changed to'\n\t + ' { coords:[[1,2],[2,3]] }');\n\t }\n\t seriesOpt.data = zrUtil.map(data, function (itemOpt) {\n\t var coords = [\n\t itemOpt[0].coord, itemOpt[1].coord\n\t ];\n\t var target = {\n\t coords: coords\n\t };\n\t if (itemOpt[0].name) {\n\t target.fromName = itemOpt[0].name;\n\t }\n\t if (itemOpt[1].name) {\n\t target.toName = itemOpt[1].name;\n\t }\n\t return zrUtil.mergeAll([target, itemOpt[0], itemOpt[1]]);\n\t });\n\t }\n\t }\n\t\n\t var LinesSeries = SeriesModel.extend({\n\t\n\t type: 'series.lines',\n\t\n\t dependencies: ['grid', 'polar'],\n\t\n\t visualColorAccessPath: 'lineStyle.normal.color',\n\t\n\t init: function (option) {\n\t // Not using preprocessor because mergeOption may not have series.type\n\t preprocessOption(option);\n\t\n\t LinesSeries.superApply(this, 'init', arguments);\n\t },\n\t\n\t mergeOption: function (option) {\n\t preprocessOption(option);\n\t\n\t LinesSeries.superApply(this, 'mergeOption', arguments);\n\t },\n\t\n\t getInitialData: function (option, ecModel) {\n\t if (__DEV__) {\n\t var CoordSys = CoordinateSystem.get(option.coordinateSystem);\n\t if (!CoordSys) {\n\t throw new Error('Unkown coordinate system ' + option.coordinateSystem);\n\t }\n\t }\n\t\n\t var lineData = new List(['value'], this);\n\t lineData.hasItemOption = false;\n\t lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) {\n\t // dataItem is simply coords\n\t if (dataItem instanceof Array) {\n\t return NaN;\n\t }\n\t else {\n\t lineData.hasItemOption = true;\n\t var value = dataItem.value;\n\t if (value != null) {\n\t return value instanceof Array ? value[dimIndex] : value;\n\t }\n\t }\n\t });\n\t\n\t return lineData;\n\t },\n\t\n\t formatTooltip: function (dataIndex) {\n\t var data = this.getData();\n\t var itemModel = data.getItemModel(dataIndex);\n\t var name = itemModel.get('name');\n\t if (name) {\n\t return name;\n\t }\n\t var fromName = itemModel.get('fromName');\n\t var toName = itemModel.get('toName');\n\t return fromName + ' > ' + toName;\n\t },\n\t\n\t defaultOption: {\n\t coordinateSystem: 'geo',\n\t zlevel: 0,\n\t z: 2,\n\t legendHoverLink: true,\n\t\n\t hoverAnimation: true,\n\t // Cartesian coordinate system\n\t xAxisIndex: 0,\n\t yAxisIndex: 0,\n\t\n\t // Geo coordinate system\n\t geoIndex: 0,\n\t\n\t effect: {\n\t show: false,\n\t period: 4,\n\t // Animation delay. support callback\n\t // delay: 0,\n\t // If move with constant speed px/sec\n\t // period will be ignored if this property is > 0,\n\t constantSpeed: 0,\n\t symbol: 'circle',\n\t symbolSize: 3,\n\t loop: true,\n\t // Length of trail, 0 - 1\n\t trailLength: 0.2\n\t // Same with lineStyle.normal.color\n\t // color\n\t },\n\t\n\t large: false,\n\t // Available when large is true\n\t largeThreshold: 2000,\n\t\n\t // If lines are polyline\n\t // polyline not support curveness, label, animation\n\t polyline: false,\n\t\n\t label: {\n\t normal: {\n\t show: false,\n\t position: 'end'\n\t // distance: 5,\n\t // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调\n\t }\n\t },\n\t\n\t lineStyle: {\n\t normal: {\n\t opacity: 0.5\n\t }\n\t }\n\t }\n\t });\n\n\n/***/ },\n/* 575 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var LineDraw = __webpack_require__(150);\n\t var EffectLine = __webpack_require__(214);\n\t var Line = __webpack_require__(149);\n\t var Polyline = __webpack_require__(215);\n\t var EffectPolyline = __webpack_require__(562);\n\t var LargeLineDraw = __webpack_require__(564);\n\t\n\t __webpack_require__(3).extendChartView({\n\t\n\t type: 'lines',\n\t\n\t init: function () {},\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var data = seriesModel.getData();\n\t var lineDraw = this._lineDraw;\n\t\n\t var hasEffect = seriesModel.get('effect.show');\n\t var isPolyline = seriesModel.get('polyline');\n\t var isLarge = seriesModel.get('large') && data.count() >= seriesModel.get('largeThreshold');\n\t\n\t if (__DEV__) {\n\t if (hasEffect && isLarge) {\n\t console.warn('Large lines not support effect');\n\t }\n\t }\n\t if (hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLarge !== this._isLarge) {\n\t if (lineDraw) {\n\t lineDraw.remove();\n\t }\n\t lineDraw = this._lineDraw = isLarge\n\t ? new LargeLineDraw()\n\t : new LineDraw(\n\t isPolyline\n\t ? (hasEffect ? EffectPolyline : Polyline)\n\t : (hasEffect ? EffectLine : Line)\n\t );\n\t this._hasEffet = hasEffect;\n\t this._isPolyline = isPolyline;\n\t this._isLarge = isLarge;\n\t }\n\t\n\t var zlevel = seriesModel.get('zlevel');\n\t var trailLength = seriesModel.get('effect.trailLength');\n\t\n\t var zr = api.getZr();\n\t // Avoid the drag cause ghost shadow\n\t // FIXME Better way ?\n\t zr.painter.getLayer(zlevel).clear(true);\n\t // Config layer with motion blur\n\t if (this._lastZlevel != null) {\n\t zr.configLayer(this._lastZlevel, {\n\t motionBlur: false\n\t });\n\t }\n\t if (hasEffect && trailLength) {\n\t if (__DEV__) {\n\t var notInIndividual = false;\n\t ecModel.eachSeries(function (otherSeriesModel) {\n\t if (otherSeriesModel !== seriesModel && otherSeriesModel.get('zlevel') === zlevel) {\n\t notInIndividual = true;\n\t }\n\t });\n\t notInIndividual && console.warn('Lines with trail effect should have an individual zlevel');\n\t }\n\t\n\t zr.configLayer(zlevel, {\n\t motionBlur: true,\n\t lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0)\n\t });\n\t }\n\t\n\t this.group.add(lineDraw.group);\n\t\n\t lineDraw.updateData(data);\n\t\n\t this._lastZlevel = zlevel;\n\t },\n\t\n\t updateLayout: function (seriesModel, ecModel, api) {\n\t this._lineDraw.updateLayout(seriesModel);\n\t // Not use motion when dragging or zooming\n\t var zr = api.getZr();\n\t zr.painter.getLayer(this._lastZlevel).clear(true);\n\t },\n\t\n\t remove: function (ecModel, api) {\n\t this._lineDraw && this._lineDraw.remove(api, true);\n\t },\n\t\n\t dispose: function () {}\n\t });\n\n\n/***/ },\n/* 576 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t module.exports = function (ecModel) {\n\t ecModel.eachSeriesByType('lines', function (seriesModel) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var lineData = seriesModel.getData();\n\t\n\t // FIXME Use data dimensions ?\n\t lineData.each(function (idx) {\n\t var itemModel = lineData.getItemModel(idx);\n\t // TODO Support pure array\n\t var coords = (itemModel.option instanceof Array) ?\n\t itemModel.option : itemModel.get('coords');\n\t\n\t if (__DEV__) {\n\t if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) {\n\t throw new Error('Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.');\n\t }\n\t }\n\t var pts = [];\n\t\n\t if (seriesModel.get('polyline')) {\n\t for (var i = 0; i < coords.length; i++) {\n\t pts.push(coordSys.dataToPoint(coords[i]));\n\t }\n\t }\n\t else {\n\t pts[0] = coordSys.dataToPoint(coords[0]);\n\t pts[1] = coordSys.dataToPoint(coords[1]);\n\t\n\t var curveness = itemModel.get('lineStyle.normal.curveness');\n\t if (+curveness) {\n\t pts[2] = [\n\t (pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness,\n\t (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness\n\t ];\n\t }\n\t }\n\t lineData.setItemLayout(idx, pts);\n\t });\n\t });\n\t };\n\n\n/***/ },\n/* 577 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var PRIORITY = echarts.PRIORITY;\n\t\n\t __webpack_require__(578);\n\t\n\t __webpack_require__(579);\n\t\n\t __webpack_require__(209);\n\t\n\t __webpack_require__(108);\n\t\n\t echarts.registerLayout(__webpack_require__(582));\n\t\n\t echarts.registerVisual(__webpack_require__(583));\n\t\n\t echarts.registerProcessor(PRIORITY.PROCESSOR.STATISTIC, __webpack_require__(581));\n\t\n\t echarts.registerPreprocessor(__webpack_require__(580));\n\t\n\t __webpack_require__(208)('map', [{\n\t type: 'mapToggleSelect',\n\t event: 'mapselectchanged',\n\t method: 'toggleSelected'\n\t }, {\n\t type: 'mapSelect',\n\t event: 'mapselected',\n\t method: 'select'\n\t }, {\n\t type: 'mapUnSelect',\n\t event: 'mapunselected',\n\t method: 'unSelect'\n\t }]);\n\n\n/***/ },\n/* 578 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var List = __webpack_require__(20);\n\t var SeriesModel = __webpack_require__(26);\n\t var zrUtil = __webpack_require__(1);\n\t var completeDimensions = __webpack_require__(48);\n\t\n\t var formatUtil = __webpack_require__(18);\n\t var encodeHTML = formatUtil.encodeHTML;\n\t var addCommas = formatUtil.addCommas;\n\t\n\t var dataSelectableMixin = __webpack_require__(154);\n\t\n\t var geoCreator = __webpack_require__(108);\n\t\n\t var MapSeries = SeriesModel.extend({\n\t\n\t type: 'series.map',\n\t\n\t layoutMode: 'box',\n\t\n\t /**\n\t * Only first map series of same mapType will drawMap\n\t * @type {boolean}\n\t */\n\t needsDrawMap: false,\n\t\n\t /**\n\t * Group of all map series with same mapType\n\t * @type {boolean}\n\t */\n\t seriesGroup: [],\n\t\n\t init: function (option) {\n\t\n\t option = this._fillOption(option, option.map);\n\t this.option = option;\n\t\n\t MapSeries.superApply(this, 'init', arguments);\n\t\n\t this.updateSelectedMap(option.data);\n\t },\n\t\n\t getInitialData: function (option) {\n\t var dimensions = completeDimensions(['value'], option.data || []);\n\t\n\t var list = new List(dimensions, this);\n\t\n\t list.initData(option.data);\n\t\n\t return list;\n\t },\n\t\n\t mergeOption: function (newOption) {\n\t if (newOption.data) {\n\t newOption = this._fillOption(newOption, this.option.map);\n\t }\n\t\n\t MapSeries.superCall(this, 'mergeOption', newOption);\n\t\n\t this.updateSelectedMap(this.option.data);\n\t },\n\t\n\t _fillOption: function (option, mapName) {\n\t // Shallow clone\n\t option = zrUtil.extend({}, option);\n\t\n\t option.data = geoCreator.getFilledRegions(option.data, mapName);\n\t\n\t return option;\n\t },\n\t\n\t getRawValue: function (dataIndex) {\n\t // Use value stored in data instead because it is calculated from multiple series\n\t // FIXME Provide all value of multiple series ?\n\t return this._data.get('value', dataIndex);\n\t },\n\t\n\t /**\n\t * Get model of region\n\t * @param {string} name\n\t * @return {module:echarts/model/Model}\n\t */\n\t getRegionModel: function (regionName) {\n\t var data = this.getData();\n\t return data.getItemModel(data.indexOfName(regionName));\n\t },\n\t\n\t /**\n\t * Map tooltip formatter\n\t *\n\t * @param {number} dataIndex\n\t */\n\t formatTooltip: function (dataIndex) {\n\t // FIXME orignalData and data is a bit confusing\n\t var data = this.getData();\n\t var formattedValue = addCommas(this.getRawValue(dataIndex));\n\t var name = data.getName(dataIndex);\n\t\n\t var seriesGroup = this.seriesGroup;\n\t var seriesNames = [];\n\t for (var i = 0; i < seriesGroup.length; i++) {\n\t var otherIndex = seriesGroup[i].originalData.indexOfName(name);\n\t if (!isNaN(seriesGroup[i].originalData.get('value', otherIndex))) {\n\t seriesNames.push(\n\t encodeHTML(seriesGroup[i].name)\n\t );\n\t }\n\t }\n\t\n\t return seriesNames.join(', ') + ' '\n\t + name + ' : ' + formattedValue;\n\t },\n\t\n\t /**\n\t * @implement\n\t */\n\t getTooltipPosition: function (dataIndex) {\n\t if (dataIndex != null) {\n\t var name = this.getData().getName(dataIndex);\n\t var geo = this.coordinateSystem;\n\t var region = geo.getRegion(name);\n\t\n\t return region && geo.dataToPoint(region.center);\n\t }\n\t },\n\t\n\t setZoom: function (zoom) {\n\t this.option.zoom = zoom;\n\t },\n\t\n\t setCenter: function (center) {\n\t this.option.center = center;\n\t },\n\t\n\t defaultOption: {\n\t // 一级层叠\n\t zlevel: 0,\n\t // 二级层叠\n\t z: 2,\n\t coordinateSystem: 'geo',\n\t // 各省的 map 暂时都用中文\n\t map: 'china',\n\t\n\t // 'center' | 'left' | 'right' | 'x%' | {number}\n\t left: 'center',\n\t // 'center' | 'top' | 'bottom' | 'x%' | {number}\n\t top: 'center',\n\t // right\n\t // bottom\n\t // width:\n\t // height\n\t\n\t // Aspect is width / height. Inited to be geoJson bbox aspect\n\t // This parameter is used for scale this aspect\n\t aspectScale: 0.75,\n\t\n\t ///// Layout with center and size\n\t // If you wan't to put map in a fixed size box with right aspect ratio\n\t // This two properties may more conveninet\n\t // layoutCenter: [50%, 50%]\n\t // layoutSize: 100\n\t\n\t\n\t // 数值合并方式,默认加和,可选为:\n\t // 'sum' | 'average' | 'max' | 'min'\n\t // mapValueCalculation: 'sum',\n\t // 地图数值计算结果小数精度\n\t // mapValuePrecision: 0,\n\t\n\t\n\t // 显示图例颜色标识(系列标识的小圆点),图例开启时有效\n\t showLegendSymbol: true,\n\t // 选择模式,默认关闭,可选single,multiple\n\t // selectedMode: false,\n\t dataRangeHoverLink: true,\n\t // 是否开启缩放及漫游模式\n\t // roam: false,\n\t\n\t // Default on center of map\n\t center: null,\n\t\n\t zoom: 1,\n\t\n\t scaleLimit: null,\n\t\n\t label: {\n\t normal: {\n\t show: false,\n\t textStyle: {\n\t color: '#000'\n\t }\n\t },\n\t emphasis: {\n\t show: true,\n\t textStyle: {\n\t color: 'rgb(100,0,0)'\n\t }\n\t }\n\t },\n\t // scaleLimit: null,\n\t itemStyle: {\n\t normal: {\n\t // color: 各异,\n\t borderWidth: 0.5,\n\t borderColor: '#444',\n\t areaColor: '#eee'\n\t },\n\t // 也是选中样式\n\t emphasis: {\n\t areaColor: 'rgba(255,215,0,0.8)'\n\t }\n\t }\n\t }\n\t\n\t });\n\t\n\t zrUtil.mixin(MapSeries, dataSelectableMixin);\n\t\n\t module.exports = MapSeries;\n\n\n/***/ },\n/* 579 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t // var zrUtil = require('zrender/lib/core/util');\n\t var graphic = __webpack_require__(4);\n\t\n\t var MapDraw = __webpack_require__(222);\n\t\n\t __webpack_require__(3).extendChartView({\n\t\n\t type: 'map',\n\t\n\t render: function (mapModel, ecModel, api, payload) {\n\t // Not render if it is an toggleSelect action from self\n\t if (payload && payload.type === 'mapToggleSelect'\n\t && payload.from === this.uid\n\t ) {\n\t return;\n\t }\n\t\n\t var group = this.group;\n\t group.removeAll();\n\t // Not update map if it is an roam action from self\n\t if (!(payload && payload.type === 'geoRoam'\n\t && payload.componentType === 'series'\n\t && payload.seriesId === mapModel.id)) {\n\t\n\t if (mapModel.needsDrawMap) {\n\t var mapDraw = this._mapDraw || new MapDraw(api, true);\n\t group.add(mapDraw.group);\n\t\n\t mapDraw.draw(mapModel, ecModel, api, this, payload);\n\t\n\t this._mapDraw = mapDraw;\n\t }\n\t else {\n\t // Remove drawed map\n\t this._mapDraw && this._mapDraw.remove();\n\t this._mapDraw = null;\n\t }\n\t }\n\t else {\n\t var mapDraw = this._mapDraw;\n\t mapDraw && group.add(mapDraw.group);\n\t }\n\t\n\t mapModel.get('showLegendSymbol') && ecModel.getComponent('legend')\n\t && this._renderSymbols(mapModel, ecModel, api);\n\t },\n\t\n\t remove: function () {\n\t this._mapDraw && this._mapDraw.remove();\n\t this._mapDraw = null;\n\t this.group.removeAll();\n\t },\n\t\n\t dispose: function () {\n\t this._mapDraw && this._mapDraw.remove();\n\t this._mapDraw = null;\n\t },\n\t\n\t _renderSymbols: function (mapModel, ecModel, api) {\n\t var originalData = mapModel.originalData;\n\t var group = this.group;\n\t\n\t originalData.each('value', function (value, idx) {\n\t if (isNaN(value)) {\n\t return;\n\t }\n\t\n\t var layout = originalData.getItemLayout(idx);\n\t\n\t if (!layout || !layout.point) {\n\t // Not exists in map\n\t return;\n\t }\n\t\n\t var point = layout.point;\n\t var offset = layout.offset;\n\t\n\t var circle = new graphic.Circle({\n\t style: {\n\t // Because the special of map draw.\n\t // Which needs statistic of multiple series and draw on one map.\n\t // And each series also need a symbol with legend color\n\t //\n\t // Layout and visual are put one the different data\n\t fill: mapModel.getData().getVisual('color')\n\t },\n\t shape: {\n\t cx: point[0] + offset * 9,\n\t cy: point[1],\n\t r: 3\n\t },\n\t silent: true,\n\t z2: 10\n\t });\n\t\n\t // First data on the same region\n\t if (!offset) {\n\t var fullData = mapModel.mainSeries.getData();\n\t var name = originalData.getName(idx);\n\t var labelText = name;\n\t var fullIndex = fullData.indexOfName(name);\n\t\n\t var itemModel = originalData.getItemModel(idx);\n\t var labelModel = itemModel.getModel('label.normal');\n\t var hoverLabelModel = itemModel.getModel('label.emphasis');\n\t\n\t var textStyleModel = labelModel.getModel('textStyle');\n\t var hoverTextStyleModel = hoverLabelModel.getModel('textStyle');\n\t\n\t var polygonGroups = fullData.getItemGraphicEl(fullIndex);\n\t circle.setStyle({\n\t textPosition: 'bottom'\n\t });\n\t\n\t var onEmphasis = function () {\n\t circle.setStyle({\n\t text: hoverLabelModel.get('show') ? labelText : '',\n\t textFill: hoverTextStyleModel.getTextColor(),\n\t textFont: hoverTextStyleModel.getFont()\n\t });\n\t };\n\t\n\t var onNormal = function () {\n\t circle.setStyle({\n\t text: labelModel.get('show') ? labelText : '',\n\t textFill: textStyleModel.getTextColor(),\n\t textFont: textStyleModel.getFont()\n\t });\n\t };\n\t\n\t polygonGroups.on('mouseover', onEmphasis)\n\t .on('mouseout', onNormal)\n\t .on('emphasis', onEmphasis)\n\t .on('normal', onNormal);\n\t\n\t onNormal();\n\t }\n\t\n\t group.add(circle);\n\t });\n\t }\n\t });\n\n\n/***/ },\n/* 580 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t module.exports = function (option) {\n\t // Save geoCoord\n\t var mapSeries = [];\n\t zrUtil.each(option.series, function (seriesOpt) {\n\t if (seriesOpt.type === 'map') {\n\t mapSeries.push(seriesOpt);\n\t }\n\t });\n\t\n\t zrUtil.each(mapSeries, function (seriesOpt) {\n\t seriesOpt.map = seriesOpt.map || seriesOpt.mapType;\n\t // Put x, y, width, height, x2, y2 in the top level\n\t zrUtil.defaults(seriesOpt, seriesOpt.mapLocation);\n\t });\n\t };\n\n\n/***/ },\n/* 581 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t // FIXME 公用?\n\t /**\n\t * @param {Array.} datas\n\t * @param {string} statisticType 'average' 'sum'\n\t * @inner\n\t */\n\t function dataStatistics(datas, statisticType) {\n\t var dataNameMap = {};\n\t var dims = ['value'];\n\t\n\t for (var i = 0; i < datas.length; i++) {\n\t datas[i].each(dims, function (value, idx) {\n\t var name = datas[i].getName(idx);\n\t dataNameMap[name] = dataNameMap[name] || [];\n\t if (!isNaN(value)) {\n\t dataNameMap[name].push(value);\n\t }\n\t });\n\t }\n\t\n\t return datas[0].map(dims, function (value, idx) {\n\t var name = datas[0].getName(idx);\n\t var sum = 0;\n\t var min = Infinity;\n\t var max = -Infinity;\n\t var len = dataNameMap[name].length;\n\t for (var i = 0; i < len; i++) {\n\t min = Math.min(min, dataNameMap[name][i]);\n\t max = Math.max(max, dataNameMap[name][i]);\n\t sum += dataNameMap[name][i];\n\t }\n\t var result;\n\t if (statisticType === 'min') {\n\t result = min;\n\t }\n\t else if (statisticType === 'max') {\n\t result = max;\n\t }\n\t else if (statisticType === 'average') {\n\t result = sum / len;\n\t }\n\t else {\n\t result = sum;\n\t }\n\t return len === 0 ? NaN : result;\n\t });\n\t }\n\t\n\t module.exports = function (ecModel) {\n\t var seriesGroupByMapType = {};\n\t ecModel.eachSeriesByType('map', function (seriesModel) {\n\t var mapType = seriesModel.get('map');\n\t seriesGroupByMapType[mapType] = seriesGroupByMapType[mapType] || [];\n\t seriesGroupByMapType[mapType].push(seriesModel);\n\t });\n\t\n\t zrUtil.each(seriesGroupByMapType, function (seriesList, mapType) {\n\t var data = dataStatistics(\n\t zrUtil.map(seriesList, function (seriesModel) {\n\t return seriesModel.getData();\n\t }),\n\t seriesList[0].get('mapValueCalculation')\n\t );\n\t\n\t for (var i = 0; i < seriesList.length; i++) {\n\t seriesList[i].originalData = seriesList[i].getData();\n\t }\n\t\n\t // FIXME Put where?\n\t for (var i = 0; i < seriesList.length; i++) {\n\t seriesList[i].seriesGroup = seriesList;\n\t seriesList[i].needsDrawMap = i === 0;\n\t\n\t seriesList[i].setData(data.cloneShallow());\n\t seriesList[i].mainSeries = seriesList[0];\n\t }\n\t });\n\t };\n\n\n/***/ },\n/* 582 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t module.exports = function (ecModel) {\n\t\n\t var processedMapType = {};\n\t\n\t ecModel.eachSeriesByType('map', function (mapSeries) {\n\t var mapType = mapSeries.get('map');\n\t if (processedMapType[mapType]) {\n\t return;\n\t }\n\t\n\t var mapSymbolOffsets = {};\n\t\n\t zrUtil.each(mapSeries.seriesGroup, function (subMapSeries) {\n\t var geo = subMapSeries.coordinateSystem;\n\t var data = subMapSeries.originalData;\n\t if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) {\n\t data.each('value', function (value, idx) {\n\t var name = data.getName(idx);\n\t var region = geo.getRegion(name);\n\t\n\t // If input series.data is [11, 22, '-'/null/undefined, 44],\n\t // it will be filled with NaN: [11, 22, NaN, 44] and NaN will\n\t // not be drawn. So here must validate if value is NaN.\n\t if (!region || isNaN(value)) {\n\t return;\n\t }\n\t\n\t var offset = mapSymbolOffsets[name] || 0;\n\t\n\t var point = geo.dataToPoint(region.center);\n\t\n\t mapSymbolOffsets[name] = offset + 1;\n\t\n\t data.setItemLayout(idx, {\n\t point: point,\n\t offset: offset\n\t });\n\t });\n\t }\n\t });\n\t\n\t // Show label of those region not has legendSymbol(which is offset 0)\n\t var data = mapSeries.getData();\n\t data.each(function (idx) {\n\t var name = data.getName(idx);\n\t var layout = data.getItemLayout(idx) || {};\n\t layout.showLabel = !mapSymbolOffsets[name];\n\t data.setItemLayout(idx, layout);\n\t });\n\t\n\t processedMapType[mapType] = true;\n\t });\n\t };\n\n\n/***/ },\n/* 583 */\n/***/ function(module, exports) {\n\n\t\n\t module.exports = function (ecModel) {\n\t ecModel.eachSeriesByType('map', function (seriesModel) {\n\t var colorList = seriesModel.get('color');\n\t var itemStyleModel = seriesModel.getModel('itemStyle.normal');\n\t\n\t var areaColor = itemStyleModel.get('areaColor');\n\t var color = itemStyleModel.get('color')\n\t || colorList[seriesModel.seriesIndex % colorList.length];\n\t\n\t seriesModel.getData().setVisual({\n\t 'areaColor': areaColor,\n\t 'color': color\n\t });\n\t });\n\t };\n\n\n/***/ },\n/* 584 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t\n\t __webpack_require__(225);\n\t\n\t __webpack_require__(585);\n\t __webpack_require__(586);\n\t\n\t echarts.registerVisual(__webpack_require__(587));\n\t\n\n\n/***/ },\n/* 585 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var List = __webpack_require__(20);\n\t var zrUtil = __webpack_require__(1);\n\t var SeriesModel = __webpack_require__(26);\n\t var completeDimensions = __webpack_require__(48);\n\t\n\t module.exports = SeriesModel.extend({\n\t\n\t type: 'series.parallel',\n\t\n\t dependencies: ['parallel'],\n\t\n\t getInitialData: function (option, ecModel) {\n\t var parallelModel = ecModel.getComponent(\n\t 'parallel', this.get('parallelIndex')\n\t );\n\t var parallelAxisIndices = parallelModel.parallelAxisIndex;\n\t\n\t var rawData = option.data;\n\t var modelDims = parallelModel.dimensions;\n\t\n\t var dataDims = generateDataDims(modelDims, rawData);\n\t\n\t var dataDimsInfo = zrUtil.map(dataDims, function (dim, dimIndex) {\n\t\n\t var modelDimsIndex = zrUtil.indexOf(modelDims, dim);\n\t var axisModel = modelDimsIndex >= 0 && ecModel.getComponent(\n\t 'parallelAxis', parallelAxisIndices[modelDimsIndex]\n\t );\n\t\n\t if (axisModel && axisModel.get('type') === 'category') {\n\t translateCategoryValue(axisModel, dim, rawData);\n\t return {name: dim, type: 'ordinal'};\n\t }\n\t else if (modelDimsIndex < 0) {\n\t return completeDimensions.guessOrdinal(rawData, dimIndex)\n\t ? {name: dim, type: 'ordinal'}\n\t : dim;\n\t }\n\t else {\n\t return dim;\n\t }\n\t });\n\t\n\t var list = new List(dataDimsInfo, this);\n\t list.initData(rawData);\n\t\n\t // Anication is forbiden in progressive data mode.\n\t if (this.option.progressive) {\n\t this.option.animation = false;\n\t }\n\t\n\t return list;\n\t },\n\t\n\t /**\n\t * User can get data raw indices on 'axisAreaSelected' event received.\n\t *\n\t * @public\n\t * @param {string} activeState 'active' or 'inactive' or 'normal'\n\t * @return {Array.} Raw indices\n\t */\n\t getRawIndicesByActiveState: function (activeState) {\n\t var coordSys = this.coordinateSystem;\n\t var data = this.getData();\n\t var indices = [];\n\t\n\t coordSys.eachActiveState(data, function (theActiveState, dataIndex) {\n\t if (activeState === theActiveState) {\n\t indices.push(data.getRawIndex(dataIndex));\n\t }\n\t });\n\t\n\t return indices;\n\t },\n\t\n\t defaultOption: {\n\t zlevel: 0, // 一级层叠\n\t z: 2, // 二级层叠\n\t\n\t coordinateSystem: 'parallel',\n\t parallelIndex: 0,\n\t\n\t label: {\n\t normal: {\n\t show: false\n\t },\n\t emphasis: {\n\t show: false\n\t }\n\t },\n\t\n\t inactiveOpacity: 0.05,\n\t activeOpacity: 1,\n\t\n\t lineStyle: {\n\t normal: {\n\t width: 1,\n\t opacity: 0.45,\n\t type: 'solid'\n\t }\n\t },\n\t progressive: false, // 100\n\t smooth: false,\n\t\n\t animationEasing: 'linear'\n\t }\n\t });\n\t\n\t function translateCategoryValue(axisModel, dim, rawData) {\n\t var axisData = axisModel.get('data');\n\t var numberDim = convertDimNameToNumber(dim);\n\t\n\t if (axisData && axisData.length) {\n\t zrUtil.each(rawData, function (dataItem) {\n\t if (!dataItem) {\n\t return;\n\t }\n\t // FIXME\n\t // time consuming, should use hash?\n\t var index = zrUtil.indexOf(axisData, dataItem[numberDim]);\n\t dataItem[numberDim] = index >= 0 ? index : NaN;\n\t });\n\t }\n\t // FIXME\n\t // 如果没有设置axis data, 应自动算出,或者提示。\n\t }\n\t\n\t function convertDimNameToNumber(dimName) {\n\t return +dimName.replace('dim', '');\n\t }\n\t\n\t function generateDataDims(modelDims, rawData) {\n\t // parallelModel.dimension should not be regarded as data\n\t // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6'];\n\t\n\t // We detect max dim by parallelModel.dimensions and fist\n\t // item in rawData arbitrarily.\n\t var maxDimNum = 0;\n\t zrUtil.each(modelDims, function (dimName) {\n\t var numberDim = convertDimNameToNumber(dimName);\n\t numberDim > maxDimNum && (maxDimNum = numberDim);\n\t });\n\t\n\t var firstItem = rawData[0];\n\t if (firstItem && firstItem.length - 1 > maxDimNum) {\n\t maxDimNum = firstItem.length - 1;\n\t }\n\t\n\t var dataDims = [];\n\t for (var i = 0; i <= maxDimNum; i++) {\n\t dataDims.push('dim' + i);\n\t }\n\t\n\t return dataDims;\n\t }\n\n\n/***/ },\n/* 586 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var graphic = __webpack_require__(4);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var SMOOTH = 0.3;\n\t\n\t var ParallelView = __webpack_require__(56).extend({\n\t\n\t type: 'parallel',\n\t\n\t init: function () {\n\t\n\t /**\n\t * @type {module:zrender/container/Group}\n\t * @private\n\t */\n\t this._dataGroup = new graphic.Group();\n\t\n\t this.group.add(this._dataGroup);\n\t\n\t /**\n\t * @type {module:echarts/data/List}\n\t */\n\t this._data;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t render: function (seriesModel, ecModel, api, payload) {\n\t this._renderForNormal(seriesModel);\n\t // this[\n\t // seriesModel.option.progressive\n\t // ? '_renderForProgressive'\n\t // : '_renderForNormal'\n\t // ](seriesModel);\n\t },\n\t\n\t dispose: function () {},\n\t\n\t /**\n\t * @private\n\t */\n\t _renderForNormal: function (seriesModel) {\n\t var dataGroup = this._dataGroup;\n\t var data = seriesModel.getData();\n\t var oldData = this._data;\n\t var coordSys = seriesModel.coordinateSystem;\n\t var dimensions = coordSys.dimensions;\n\t var option = seriesModel.option;\n\t var smooth = option.smooth ? SMOOTH : null;\n\t\n\t // Consider switch between progressive and not.\n\t // oldData && oldData.__plProgressive && dataGroup.removeAll();\n\t\n\t data.diff(oldData)\n\t .add(add)\n\t .update(update)\n\t .remove(remove)\n\t .execute();\n\t\n\t // Update style\n\t updateElCommon(data, smooth);\n\t\n\t // First create\n\t if (!this._data) {\n\t var clipPath = createGridClipShape(\n\t coordSys, seriesModel, function () {\n\t // Callback will be invoked immediately if there is no animation\n\t setTimeout(function () {\n\t dataGroup.removeClipPath();\n\t });\n\t }\n\t );\n\t dataGroup.setClipPath(clipPath);\n\t }\n\t\n\t this._data = data;\n\t\n\t function add(newDataIndex) {\n\t addEl(data, dataGroup, newDataIndex, dimensions, coordSys, null, smooth);\n\t }\n\t\n\t function update(newDataIndex, oldDataIndex) {\n\t var line = oldData.getItemGraphicEl(oldDataIndex);\n\t var points = createLinePoints(data, newDataIndex, dimensions, coordSys);\n\t data.setItemGraphicEl(newDataIndex, line);\n\t graphic.updateProps(line, {shape: {points: points}}, seriesModel, newDataIndex);\n\t }\n\t\n\t function remove(oldDataIndex) {\n\t var line = oldData.getItemGraphicEl(oldDataIndex);\n\t dataGroup.remove(line);\n\t }\n\t\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t // _renderForProgressive: function (seriesModel) {\n\t // var dataGroup = this._dataGroup;\n\t // var data = seriesModel.getData();\n\t // var oldData = this._data;\n\t // var coordSys = seriesModel.coordinateSystem;\n\t // var dimensions = coordSys.dimensions;\n\t // var option = seriesModel.option;\n\t // var progressive = option.progressive;\n\t // var smooth = option.smooth ? SMOOTH : null;\n\t\n\t // // In progressive animation is disabled, so use simple data diff,\n\t // // which effects performance less.\n\t // // (Typically performance for data with length 7000+ like:\n\t // // simpleDiff: 60ms, addEl: 184ms,\n\t // // in RMBP 2.4GHz intel i7, OSX 10.9 chrome 50.0.2661.102 (64-bit))\n\t // if (simpleDiff(oldData, data, dimensions)) {\n\t // dataGroup.removeAll();\n\t // data.each(function (dataIndex) {\n\t // addEl(data, dataGroup, dataIndex, dimensions, coordSys);\n\t // });\n\t // }\n\t\n\t // updateElCommon(data, progressive, smooth);\n\t\n\t // // Consider switch between progressive and not.\n\t // data.__plProgressive = true;\n\t // this._data = data;\n\t // },\n\t\n\t /**\n\t * @override\n\t */\n\t remove: function () {\n\t this._dataGroup && this._dataGroup.removeAll();\n\t this._data = null;\n\t }\n\t });\n\t\n\t function createGridClipShape(coordSys, seriesModel, cb) {\n\t var parallelModel = coordSys.model;\n\t var rect = coordSys.getRect();\n\t var rectEl = new graphic.Rect({\n\t shape: {\n\t x: rect.x,\n\t y: rect.y,\n\t width: rect.width,\n\t height: rect.height\n\t }\n\t });\n\t\n\t var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height';\n\t rectEl.setShape(dim, 0);\n\t graphic.initProps(rectEl, {\n\t shape: {\n\t width: rect.width,\n\t height: rect.height\n\t }\n\t }, seriesModel, cb);\n\t return rectEl;\n\t }\n\t\n\t function createLinePoints(data, dataIndex, dimensions, coordSys) {\n\t var points = [];\n\t for (var i = 0; i < dimensions.length; i++) {\n\t var dimName = dimensions[i];\n\t var value = data.get(dimName, dataIndex);\n\t if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) {\n\t points.push(coordSys.dataToPoint(value, dimName));\n\t }\n\t }\n\t return points;\n\t }\n\t\n\t function addEl(data, dataGroup, dataIndex, dimensions, coordSys) {\n\t var points = createLinePoints(data, dataIndex, dimensions, coordSys);\n\t var line = new graphic.Polyline({\n\t shape: {points: points},\n\t silent: true,\n\t z2: 10\n\t });\n\t dataGroup.add(line);\n\t data.setItemGraphicEl(dataIndex, line);\n\t }\n\t\n\t function updateElCommon(data, smooth) {\n\t var seriesStyleModel = data.hostModel.getModel('lineStyle.normal');\n\t var lineStyle = seriesStyleModel.getLineStyle();\n\t data.eachItemGraphicEl(function (line, dataIndex) {\n\t if (data.hasItemOption) {\n\t var itemModel = data.getItemModel(dataIndex);\n\t var lineStyleModel = itemModel.getModel('lineStyle.normal', seriesStyleModel);\n\t lineStyle = lineStyleModel.getLineStyle();\n\t }\n\t\n\t line.useStyle(zrUtil.extend(\n\t lineStyle,\n\t {\n\t fill: null,\n\t stroke: data.getItemVisual(dataIndex, 'color'),\n\t opacity: data.getItemVisual(dataIndex, 'opacity')\n\t }\n\t ));\n\t line.shape.smooth = smooth;\n\t });\n\t }\n\t\n\t // function simpleDiff(oldData, newData, dimensions) {\n\t // var oldLen;\n\t // if (!oldData\n\t // || !oldData.__plProgressive\n\t // || (oldLen = oldData.count()) !== newData.count()\n\t // ) {\n\t // return true;\n\t // }\n\t\n\t // var dimLen = dimensions.length;\n\t // for (var i = 0; i < oldLen; i++) {\n\t // for (var j = 0; j < dimLen; j++) {\n\t // if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) {\n\t // return true;\n\t // }\n\t // }\n\t // }\n\t\n\t // return false;\n\t // }\n\t\n\t // FIXME\n\t // 公用方法?\n\t function isEmptyValue(val, axisType) {\n\t return axisType === 'category'\n\t ? val == null\n\t : (val == null || isNaN(val)); // axisType === 'value'\n\t }\n\t\n\t module.exports = ParallelView;\n\n\n/***/ },\n/* 587 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t module.exports = function (ecModel) {\n\t\n\t ecModel.eachSeriesByType('parallel', function (seriesModel) {\n\t\n\t var itemStyleModel = seriesModel.getModel('itemStyle.normal');\n\t var lineStyleModel = seriesModel.getModel('lineStyle.normal');\n\t var globalColors = ecModel.get('color');\n\t\n\t var color = lineStyleModel.get('color')\n\t || itemStyleModel.get('color')\n\t || globalColors[seriesModel.seriesIndex % globalColors.length];\n\t var inactiveOpacity = seriesModel.get('inactiveOpacity');\n\t var activeOpacity = seriesModel.get('activeOpacity');\n\t var lineStyle = seriesModel.getModel('lineStyle.normal').getLineStyle();\n\t\n\t var coordSys = seriesModel.coordinateSystem;\n\t var data = seriesModel.getData();\n\t\n\t var opacityMap = {\n\t normal: lineStyle.opacity,\n\t active: activeOpacity,\n\t inactive: inactiveOpacity\n\t };\n\t\n\t coordSys.eachActiveState(data, function (activeState, dataIndex) {\n\t data.setItemVisual(dataIndex, 'opacity', opacityMap[activeState]);\n\t });\n\t\n\t data.setVisual('color', color);\n\t });\n\t };\n\n\n/***/ },\n/* 588 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var echarts = __webpack_require__(3);\n\t\n\t __webpack_require__(589);\n\t __webpack_require__(590);\n\t\n\t __webpack_require__(208)('pie', [{\n\t type: 'pieToggleSelect',\n\t event: 'pieselectchanged',\n\t method: 'toggleSelected'\n\t }, {\n\t type: 'pieSelect',\n\t event: 'pieselected',\n\t method: 'select'\n\t }, {\n\t type: 'pieUnSelect',\n\t event: 'pieunselected',\n\t method: 'unSelect'\n\t }]);\n\t\n\t echarts.registerVisual(zrUtil.curry(__webpack_require__(164), 'pie'));\n\t\n\t echarts.registerLayout(zrUtil.curry(\n\t __webpack_require__(592), 'pie'\n\t ));\n\t\n\t echarts.registerProcessor(zrUtil.curry(__webpack_require__(161), 'pie'));\n\n\n/***/ },\n/* 589 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var List = __webpack_require__(20);\n\t var zrUtil = __webpack_require__(1);\n\t var modelUtil = __webpack_require__(14);\n\t var completeDimensions = __webpack_require__(48);\n\t\n\t var dataSelectableMixin = __webpack_require__(154);\n\t\n\t var PieSeries = __webpack_require__(3).extendSeriesModel({\n\t\n\t type: 'series.pie',\n\t\n\t // Overwrite\n\t init: function (option) {\n\t PieSeries.superApply(this, 'init', arguments);\n\t\n\t // Enable legend selection for each data item\n\t // Use a function instead of direct access because data reference may changed\n\t this.legendDataProvider = function () {\n\t return this._dataBeforeProcessed;\n\t };\n\t\n\t this.updateSelectedMap(option.data);\n\t\n\t this._defaultLabelLine(option);\n\t },\n\t\n\t // Overwrite\n\t mergeOption: function (newOption) {\n\t PieSeries.superCall(this, 'mergeOption', newOption);\n\t this.updateSelectedMap(this.option.data);\n\t },\n\t\n\t getInitialData: function (option, ecModel) {\n\t var dimensions = completeDimensions(['value'], option.data);\n\t var list = new List(dimensions, this);\n\t list.initData(option.data);\n\t return list;\n\t },\n\t\n\t // Overwrite\n\t getDataParams: function (dataIndex) {\n\t var data = this._data;\n\t var params = PieSeries.superCall(this, 'getDataParams', dataIndex);\n\t var sum = data.getSum('value');\n\t // FIXME toFixed?\n\t //\n\t // Percent is 0 if sum is 0\n\t params.percent = !sum ? 0 : +(data.get('value', dataIndex) / sum * 100).toFixed(2);\n\t\n\t params.$vars.push('percent');\n\t return params;\n\t },\n\t\n\t _defaultLabelLine: function (option) {\n\t // Extend labelLine emphasis\n\t modelUtil.defaultEmphasis(option.labelLine, ['show']);\n\t\n\t var labelLineNormalOpt = option.labelLine.normal;\n\t var labelLineEmphasisOpt = option.labelLine.emphasis;\n\t // Not show label line if `label.normal.show = false`\n\t labelLineNormalOpt.show = labelLineNormalOpt.show\n\t && option.label.normal.show;\n\t labelLineEmphasisOpt.show = labelLineEmphasisOpt.show\n\t && option.label.emphasis.show;\n\t },\n\t\n\t defaultOption: {\n\t zlevel: 0,\n\t z: 2,\n\t legendHoverLink: true,\n\t\n\t hoverAnimation: true,\n\t // 默认全局居中\n\t center: ['50%', '50%'],\n\t radius: [0, '75%'],\n\t // 默认顺时针\n\t clockwise: true,\n\t startAngle: 90,\n\t // 最小角度改为0\n\t minAngle: 0,\n\t // 选中是扇区偏移量\n\t selectedOffset: 10,\n\t\n\t // If use strategy to avoid label overlapping\n\t avoidLabelOverlap: true,\n\t // 选择模式,默认关闭,可选single,multiple\n\t // selectedMode: false,\n\t // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积)\n\t // roseType: null,\n\t\n\t label: {\n\t normal: {\n\t // If rotate around circle\n\t rotate: false,\n\t show: true,\n\t // 'outer', 'inside', 'center'\n\t position: 'outer'\n\t // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调\n\t // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE\n\t // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数\n\t },\n\t emphasis: {}\n\t },\n\t // Enabled when label.normal.position is 'outer'\n\t labelLine: {\n\t normal: {\n\t show: true,\n\t // 引导线两段中的第一段长度\n\t length: 15,\n\t // 引导线两段中的第二段长度\n\t length2: 15,\n\t smooth: false,\n\t lineStyle: {\n\t // color: 各异,\n\t width: 1,\n\t type: 'solid'\n\t }\n\t }\n\t },\n\t itemStyle: {\n\t normal: {\n\t borderWidth: 1\n\t },\n\t emphasis: {}\n\t },\n\t\n\t animationEasing: 'cubicOut',\n\t\n\t data: []\n\t }\n\t });\n\t\n\t zrUtil.mixin(PieSeries, dataSelectableMixin);\n\t\n\t module.exports = PieSeries;\n\n\n/***/ },\n/* 590 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var graphic = __webpack_require__(4);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t /**\n\t * @param {module:echarts/model/Series} seriesModel\n\t * @param {boolean} hasAnimation\n\t * @inner\n\t */\n\t function updateDataSelected(uid, seriesModel, hasAnimation, api) {\n\t var data = seriesModel.getData();\n\t var dataIndex = this.dataIndex;\n\t var name = data.getName(dataIndex);\n\t var selectedOffset = seriesModel.get('selectedOffset');\n\t\n\t api.dispatchAction({\n\t type: 'pieToggleSelect',\n\t from: uid,\n\t name: name,\n\t seriesId: seriesModel.id\n\t });\n\t\n\t data.each(function (idx) {\n\t toggleItemSelected(\n\t data.getItemGraphicEl(idx),\n\t data.getItemLayout(idx),\n\t seriesModel.isSelected(data.getName(idx)),\n\t selectedOffset,\n\t hasAnimation\n\t );\n\t });\n\t }\n\t\n\t /**\n\t * @param {module:zrender/graphic/Sector} el\n\t * @param {Object} layout\n\t * @param {boolean} isSelected\n\t * @param {number} selectedOffset\n\t * @param {boolean} hasAnimation\n\t * @inner\n\t */\n\t function toggleItemSelected(el, layout, isSelected, selectedOffset, hasAnimation) {\n\t var midAngle = (layout.startAngle + layout.endAngle) / 2;\n\t\n\t var dx = Math.cos(midAngle);\n\t var dy = Math.sin(midAngle);\n\t\n\t var offset = isSelected ? selectedOffset : 0;\n\t var position = [dx * offset, dy * offset];\n\t\n\t hasAnimation\n\t // animateTo will stop revious animation like update transition\n\t ? el.animate()\n\t .when(200, {\n\t position: position\n\t })\n\t .start('bounceOut')\n\t : el.attr('position', position);\n\t }\n\t\n\t /**\n\t * Piece of pie including Sector, Label, LabelLine\n\t * @constructor\n\t * @extends {module:zrender/graphic/Group}\n\t */\n\t function PiePiece(data, idx) {\n\t\n\t graphic.Group.call(this);\n\t\n\t var sector = new graphic.Sector({\n\t z2: 2\n\t });\n\t var polyline = new graphic.Polyline();\n\t var text = new graphic.Text();\n\t this.add(sector);\n\t this.add(polyline);\n\t this.add(text);\n\t\n\t this.updateData(data, idx, true);\n\t\n\t // Hover to change label and labelLine\n\t function onEmphasis() {\n\t polyline.ignore = polyline.hoverIgnore;\n\t text.ignore = text.hoverIgnore;\n\t }\n\t function onNormal() {\n\t polyline.ignore = polyline.normalIgnore;\n\t text.ignore = text.normalIgnore;\n\t }\n\t this.on('emphasis', onEmphasis)\n\t .on('normal', onNormal)\n\t .on('mouseover', onEmphasis)\n\t .on('mouseout', onNormal);\n\t }\n\t\n\t var piePieceProto = PiePiece.prototype;\n\t\n\t function getLabelStyle(data, idx, state, labelModel, labelPosition) {\n\t var textStyleModel = labelModel.getModel('textStyle');\n\t var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';\n\t return {\n\t fill: textStyleModel.getTextColor()\n\t || (isLabelInside ? '#fff' : data.getItemVisual(idx, 'color')),\n\t opacity: data.getItemVisual(idx, 'opacity'),\n\t textFont: textStyleModel.getFont(),\n\t text: zrUtil.retrieve(\n\t data.hostModel.getFormattedLabel(idx, state), data.getName(idx)\n\t )\n\t };\n\t }\n\t\n\t piePieceProto.updateData = function (data, idx, firstCreate) {\n\t\n\t var sector = this.childAt(0);\n\t\n\t var seriesModel = data.hostModel;\n\t var itemModel = data.getItemModel(idx);\n\t var layout = data.getItemLayout(idx);\n\t var sectorShape = zrUtil.extend({}, layout);\n\t sectorShape.label = null;\n\t if (firstCreate) {\n\t sector.setShape(sectorShape);\n\t sector.shape.endAngle = layout.startAngle;\n\t graphic.updateProps(sector, {\n\t shape: {\n\t endAngle: layout.endAngle\n\t }\n\t }, seriesModel, idx);\n\t }\n\t else {\n\t graphic.updateProps(sector, {\n\t shape: sectorShape\n\t }, seriesModel, idx);\n\t }\n\t\n\t // Update common style\n\t var itemStyleModel = itemModel.getModel('itemStyle');\n\t var visualColor = data.getItemVisual(idx, 'color');\n\t\n\t sector.useStyle(\n\t zrUtil.defaults(\n\t {\n\t lineJoin: 'bevel',\n\t fill: visualColor\n\t },\n\t itemStyleModel.getModel('normal').getItemStyle()\n\t )\n\t );\n\t sector.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle();\n\t\n\t // Toggle selected\n\t toggleItemSelected(\n\t this,\n\t data.getItemLayout(idx),\n\t itemModel.get('selected'),\n\t seriesModel.get('selectedOffset'),\n\t seriesModel.get('animation')\n\t );\n\t\n\t function onEmphasis() {\n\t // Sector may has animation of updating data. Force to move to the last frame\n\t // Or it may stopped on the wrong shape\n\t sector.stopAnimation(true);\n\t sector.animateTo({\n\t shape: {\n\t r: layout.r + 10\n\t }\n\t }, 300, 'elasticOut');\n\t }\n\t function onNormal() {\n\t sector.stopAnimation(true);\n\t sector.animateTo({\n\t shape: {\n\t r: layout.r\n\t }\n\t }, 300, 'elasticOut');\n\t }\n\t sector.off('mouseover').off('mouseout').off('emphasis').off('normal');\n\t if (itemModel.get('hoverAnimation') && seriesModel.ifEnableAnimation()) {\n\t sector\n\t .on('mouseover', onEmphasis)\n\t .on('mouseout', onNormal)\n\t .on('emphasis', onEmphasis)\n\t .on('normal', onNormal);\n\t }\n\t\n\t this._updateLabel(data, idx);\n\t\n\t graphic.setHoverStyle(this);\n\t };\n\t\n\t piePieceProto._updateLabel = function (data, idx) {\n\t\n\t var labelLine = this.childAt(1);\n\t var labelText = this.childAt(2);\n\t\n\t var seriesModel = data.hostModel;\n\t var itemModel = data.getItemModel(idx);\n\t var layout = data.getItemLayout(idx);\n\t var labelLayout = layout.label;\n\t var visualColor = data.getItemVisual(idx, 'color');\n\t\n\t graphic.updateProps(labelLine, {\n\t shape: {\n\t points: labelLayout.linePoints || [\n\t [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y]\n\t ]\n\t }\n\t }, seriesModel, idx);\n\t\n\t graphic.updateProps(labelText, {\n\t style: {\n\t x: labelLayout.x,\n\t y: labelLayout.y\n\t }\n\t }, seriesModel, idx);\n\t labelText.attr({\n\t style: {\n\t textVerticalAlign: labelLayout.verticalAlign,\n\t textAlign: labelLayout.textAlign,\n\t textFont: labelLayout.font\n\t },\n\t rotation: labelLayout.rotation,\n\t origin: [labelLayout.x, labelLayout.y],\n\t z2: 10\n\t });\n\t\n\t var labelModel = itemModel.getModel('label.normal');\n\t var labelHoverModel = itemModel.getModel('label.emphasis');\n\t var labelLineModel = itemModel.getModel('labelLine.normal');\n\t var labelLineHoverModel = itemModel.getModel('labelLine.emphasis');\n\t var labelPosition = labelModel.get('position') || labelHoverModel.get('position');\n\t\n\t labelText.setStyle(getLabelStyle(data, idx, 'normal', labelModel, labelPosition));\n\t\n\t labelText.ignore = labelText.normalIgnore = !labelModel.get('show');\n\t labelText.hoverIgnore = !labelHoverModel.get('show');\n\t\n\t labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show');\n\t labelLine.hoverIgnore = !labelLineHoverModel.get('show');\n\t\n\t // Default use item visual color\n\t labelLine.setStyle({\n\t stroke: visualColor,\n\t opacity: data.getItemVisual(idx, 'opacity')\n\t });\n\t labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle());\n\t\n\t labelText.hoverStyle = getLabelStyle(data, idx, 'emphasis', labelHoverModel, labelPosition);\n\t labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle();\n\t\n\t var smooth = labelLineModel.get('smooth');\n\t if (smooth && smooth === true) {\n\t smooth = 0.4;\n\t }\n\t labelLine.setShape({\n\t smooth: smooth\n\t });\n\t };\n\t\n\t zrUtil.inherits(PiePiece, graphic.Group);\n\t\n\t\n\t // Pie view\n\t var Pie = __webpack_require__(56).extend({\n\t\n\t type: 'pie',\n\t\n\t init: function () {\n\t var sectorGroup = new graphic.Group();\n\t this._sectorGroup = sectorGroup;\n\t },\n\t\n\t render: function (seriesModel, ecModel, api, payload) {\n\t if (payload && (payload.from === this.uid)) {\n\t return;\n\t }\n\t\n\t var data = seriesModel.getData();\n\t var oldData = this._data;\n\t var group = this.group;\n\t\n\t var hasAnimation = ecModel.get('animation');\n\t var isFirstRender = !oldData;\n\t\n\t var onSectorClick = zrUtil.curry(\n\t updateDataSelected, this.uid, seriesModel, hasAnimation, api\n\t );\n\t\n\t var selectedMode = seriesModel.get('selectedMode');\n\t\n\t data.diff(oldData)\n\t .add(function (idx) {\n\t var piePiece = new PiePiece(data, idx);\n\t if (isFirstRender) {\n\t piePiece.eachChild(function (child) {\n\t child.stopAnimation(true);\n\t });\n\t }\n\t\n\t selectedMode && piePiece.on('click', onSectorClick);\n\t\n\t data.setItemGraphicEl(idx, piePiece);\n\t\n\t group.add(piePiece);\n\t })\n\t .update(function (newIdx, oldIdx) {\n\t var piePiece = oldData.getItemGraphicEl(oldIdx);\n\t\n\t piePiece.updateData(data, newIdx);\n\t\n\t piePiece.off('click');\n\t selectedMode && piePiece.on('click', onSectorClick);\n\t group.add(piePiece);\n\t data.setItemGraphicEl(newIdx, piePiece);\n\t })\n\t .remove(function (idx) {\n\t var piePiece = oldData.getItemGraphicEl(idx);\n\t group.remove(piePiece);\n\t })\n\t .execute();\n\t\n\t if (hasAnimation && isFirstRender && data.count() > 0) {\n\t var shape = data.getItemLayout(0);\n\t var r = Math.max(api.getWidth(), api.getHeight()) / 2;\n\t\n\t var removeClipPath = zrUtil.bind(group.removeClipPath, group);\n\t group.setClipPath(this._createClipPath(\n\t shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath, seriesModel\n\t ));\n\t }\n\t\n\t this._data = data;\n\t },\n\t\n\t dispose: function () {},\n\t\n\t _createClipPath: function (\n\t cx, cy, r, startAngle, clockwise, cb, seriesModel\n\t ) {\n\t var clipPath = new graphic.Sector({\n\t shape: {\n\t cx: cx,\n\t cy: cy,\n\t r0: 0,\n\t r: r,\n\t startAngle: startAngle,\n\t endAngle: startAngle,\n\t clockwise: clockwise\n\t }\n\t });\n\t\n\t graphic.initProps(clipPath, {\n\t shape: {\n\t endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2\n\t }\n\t }, seriesModel, cb);\n\t\n\t return clipPath;\n\t },\n\t\n\t /**\n\t * @implement\n\t */\n\t containPoint: function (point, seriesModel) {\n\t var data = seriesModel.getData();\n\t var itemLayout = data.getItemLayout(0);\n\t if (itemLayout) {\n\t var dx = point[0] - itemLayout.cx;\n\t var dy = point[1] - itemLayout.cy;\n\t var radius = Math.sqrt(dx * dx + dy * dy);\n\t return radius <= itemLayout.r && radius >= itemLayout.r0;\n\t }\n\t }\n\t\n\t });\n\t\n\t module.exports = Pie;\n\n\n/***/ },\n/* 591 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// FIXME emphasis label position is not same with normal label position\n\t\n\t\n\t var textContain = __webpack_require__(57);\n\t\n\t function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {\n\t list.sort(function (a, b) {\n\t return a.y - b.y;\n\t });\n\t\n\t // 压\n\t function shiftDown(start, end, delta, dir) {\n\t for (var j = start; j < end; j++) {\n\t list[j].y += delta;\n\t if (j > start\n\t && j + 1 < end\n\t && list[j + 1].y > list[j].y + list[j].height\n\t ) {\n\t shiftUp(j, delta / 2);\n\t return;\n\t }\n\t }\n\t\n\t shiftUp(end - 1, delta / 2);\n\t }\n\t\n\t // 弹\n\t function shiftUp(end, delta) {\n\t for (var j = end; j >= 0; j--) {\n\t list[j].y -= delta;\n\t if (j > 0\n\t && list[j].y > list[j - 1].y + list[j - 1].height\n\t ) {\n\t break;\n\t }\n\t }\n\t }\n\t\n\t function changeX(list, isDownList, cx, cy, r, dir) {\n\t var lastDeltaX = dir > 0\n\t ? isDownList // 右侧\n\t ? Number.MAX_VALUE // 下\n\t : 0 // 上\n\t : isDownList // 左侧\n\t ? Number.MAX_VALUE // 下\n\t : 0; // 上\n\t\n\t for (var i = 0, l = list.length; i < l; i++) {\n\t // Not change x for center label\n\t if (list[i].position === 'center') {\n\t continue;\n\t }\n\t var deltaY = Math.abs(list[i].y - cy);\n\t var length = list[i].len;\n\t var length2 = list[i].len2;\n\t var deltaX = (deltaY < r + length)\n\t ? Math.sqrt(\n\t (r + length + length2) * (r + length + length2)\n\t - deltaY * deltaY\n\t )\n\t : Math.abs(list[i].x - cx);\n\t if (isDownList && deltaX >= lastDeltaX) {\n\t // 右下,左下\n\t deltaX = lastDeltaX - 10;\n\t }\n\t if (!isDownList && deltaX <= lastDeltaX) {\n\t // 右上,左上\n\t deltaX = lastDeltaX + 10;\n\t }\n\t\n\t list[i].x = cx + deltaX * dir;\n\t lastDeltaX = deltaX;\n\t }\n\t }\n\t\n\t var lastY = 0;\n\t var delta;\n\t var len = list.length;\n\t var upList = [];\n\t var downList = [];\n\t for (var i = 0; i < len; i++) {\n\t delta = list[i].y - lastY;\n\t if (delta < 0) {\n\t shiftDown(i, len, -delta, dir);\n\t }\n\t lastY = list[i].y + list[i].height;\n\t }\n\t if (viewHeight - lastY < 0) {\n\t shiftUp(len - 1, lastY - viewHeight);\n\t }\n\t for (var i = 0; i < len; i++) {\n\t if (list[i].y >= cy) {\n\t downList.push(list[i]);\n\t }\n\t else {\n\t upList.push(list[i]);\n\t }\n\t }\n\t changeX(upList, false, cx, cy, r, dir);\n\t changeX(downList, true, cx, cy, r, dir);\n\t }\n\t\n\t function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) {\n\t var leftList = [];\n\t var rightList = [];\n\t for (var i = 0; i < labelLayoutList.length; i++) {\n\t if (labelLayoutList[i].x < cx) {\n\t leftList.push(labelLayoutList[i]);\n\t }\n\t else {\n\t rightList.push(labelLayoutList[i]);\n\t }\n\t }\n\t\n\t adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight);\n\t adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight);\n\t\n\t for (var i = 0; i < labelLayoutList.length; i++) {\n\t var linePoints = labelLayoutList[i].linePoints;\n\t if (linePoints) {\n\t var dist = linePoints[1][0] - linePoints[2][0];\n\t if (labelLayoutList[i].x < cx) {\n\t linePoints[2][0] = labelLayoutList[i].x + 3;\n\t }\n\t else {\n\t linePoints[2][0] = labelLayoutList[i].x - 3;\n\t }\n\t linePoints[1][1] = linePoints[2][1] = labelLayoutList[i].y;\n\t linePoints[1][0] = linePoints[2][0] + dist;\n\t }\n\t }\n\t }\n\t\n\t module.exports = function (seriesModel, r, viewWidth, viewHeight) {\n\t var data = seriesModel.getData();\n\t var labelLayoutList = [];\n\t var cx;\n\t var cy;\n\t var hasLabelRotate = false;\n\t\n\t data.each(function (idx) {\n\t var layout = data.getItemLayout(idx);\n\t\n\t var itemModel = data.getItemModel(idx);\n\t var labelModel = itemModel.getModel('label.normal');\n\t // Use position in normal or emphasis\n\t var labelPosition = labelModel.get('position') || itemModel.get('label.emphasis.position');\n\t\n\t var labelLineModel = itemModel.getModel('labelLine.normal');\n\t var labelLineLen = labelLineModel.get('length');\n\t var labelLineLen2 = labelLineModel.get('length2');\n\t\n\t var midAngle = (layout.startAngle + layout.endAngle) / 2;\n\t var dx = Math.cos(midAngle);\n\t var dy = Math.sin(midAngle);\n\t\n\t var textX;\n\t var textY;\n\t var linePoints;\n\t var textAlign;\n\t\n\t cx = layout.cx;\n\t cy = layout.cy;\n\t\n\t var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';\n\t if (labelPosition === 'center') {\n\t textX = layout.cx;\n\t textY = layout.cy;\n\t textAlign = 'center';\n\t }\n\t else {\n\t var x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx;\n\t var y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy;\n\t\n\t textX = x1 + dx * 3;\n\t textY = y1 + dy * 3;\n\t\n\t if (!isLabelInside) {\n\t // For roseType\n\t var x2 = x1 + dx * (labelLineLen + r - layout.r);\n\t var y2 = y1 + dy * (labelLineLen + r - layout.r);\n\t var x3 = x2 + ((dx < 0 ? -1 : 1) * labelLineLen2);\n\t var y3 = y2;\n\t\n\t textX = x3 + (dx < 0 ? -5 : 5);\n\t textY = y3;\n\t linePoints = [[x1, y1], [x2, y2], [x3, y3]];\n\t }\n\t\n\t textAlign = isLabelInside ? 'center' : (dx > 0 ? 'left' : 'right');\n\t }\n\t var font = labelModel.getModel('textStyle').getFont();\n\t\n\t var labelRotate = labelModel.get('rotate')\n\t ? (dx < 0 ? -midAngle + Math.PI : -midAngle) : 0;\n\t var text = seriesModel.getFormattedLabel(idx, 'normal')\n\t || data.getName(idx);\n\t var textRect = textContain.getBoundingRect(\n\t text, font, textAlign, 'top'\n\t );\n\t hasLabelRotate = !!labelRotate;\n\t layout.label = {\n\t x: textX,\n\t y: textY,\n\t position: labelPosition,\n\t height: textRect.height,\n\t len: labelLineLen,\n\t len2: labelLineLen2,\n\t linePoints: linePoints,\n\t textAlign: textAlign,\n\t verticalAlign: 'middle',\n\t font: font,\n\t rotation: labelRotate\n\t };\n\t\n\t // Not layout the inside label\n\t if (!isLabelInside) {\n\t labelLayoutList.push(layout.label);\n\t }\n\t });\n\t if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) {\n\t avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight);\n\t }\n\t };\n\n\n/***/ },\n/* 592 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// TODO minAngle\n\t\n\t\n\t\n\t var numberUtil = __webpack_require__(5);\n\t var parsePercent = numberUtil.parsePercent;\n\t var labelLayout = __webpack_require__(591);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var PI2 = Math.PI * 2;\n\t var RADIAN = Math.PI / 180;\n\t\n\t module.exports = function (seriesType, ecModel, api, payload) {\n\t ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n\t var center = seriesModel.get('center');\n\t var radius = seriesModel.get('radius');\n\t\n\t if (!zrUtil.isArray(radius)) {\n\t radius = [0, radius];\n\t }\n\t if (!zrUtil.isArray(center)) {\n\t center = [center, center];\n\t }\n\t\n\t var width = api.getWidth();\n\t var height = api.getHeight();\n\t var size = Math.min(width, height);\n\t var cx = parsePercent(center[0], width);\n\t var cy = parsePercent(center[1], height);\n\t var r0 = parsePercent(radius[0], size / 2);\n\t var r = parsePercent(radius[1], size / 2);\n\t\n\t var data = seriesModel.getData();\n\t\n\t var startAngle = -seriesModel.get('startAngle') * RADIAN;\n\t\n\t var minAngle = seriesModel.get('minAngle') * RADIAN;\n\t\n\t var sum = data.getSum('value');\n\t // Sum may be 0\n\t var unitRadian = Math.PI / (sum || data.count()) * 2;\n\t\n\t var clockwise = seriesModel.get('clockwise');\n\t\n\t var roseType = seriesModel.get('roseType');\n\t\n\t // [0...max]\n\t var extent = data.getDataExtent('value');\n\t extent[0] = 0;\n\t\n\t // In the case some sector angle is smaller than minAngle\n\t var restAngle = PI2;\n\t var valueSumLargerThanMinAngle = 0;\n\t\n\t var currentAngle = startAngle;\n\t\n\t var dir = clockwise ? 1 : -1;\n\t data.each('value', function (value, idx) {\n\t var angle;\n\t // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样?\n\t if (roseType !== 'area') {\n\t angle = sum === 0 ? unitRadian : (value * unitRadian);\n\t }\n\t else {\n\t angle = PI2 / (data.count() || 1);\n\t }\n\t\n\t if (angle < minAngle) {\n\t angle = minAngle;\n\t restAngle -= minAngle;\n\t }\n\t else {\n\t valueSumLargerThanMinAngle += value;\n\t }\n\t\n\t var endAngle = currentAngle + dir * angle;\n\t data.setItemLayout(idx, {\n\t angle: angle,\n\t startAngle: currentAngle,\n\t endAngle: endAngle,\n\t clockwise: clockwise,\n\t cx: cx,\n\t cy: cy,\n\t r0: r0,\n\t r: roseType\n\t ? numberUtil.linearMap(value, extent, [r0, r])\n\t : r\n\t });\n\t\n\t currentAngle = endAngle;\n\t }, true);\n\t\n\t // Some sector is constrained by minAngle\n\t // Rest sectors needs recalculate angle\n\t if (restAngle < PI2) {\n\t // Average the angle if rest angle is not enough after all angles is\n\t // Constrained by minAngle\n\t if (restAngle <= 1e-3) {\n\t var angle = PI2 / data.count();\n\t data.each(function (idx) {\n\t var layout = data.getItemLayout(idx);\n\t layout.startAngle = startAngle + dir * idx * angle;\n\t layout.endAngle = startAngle + dir * (idx + 1) * angle;\n\t });\n\t }\n\t else {\n\t unitRadian = restAngle / valueSumLargerThanMinAngle;\n\t currentAngle = startAngle;\n\t data.each('value', function (value, idx) {\n\t var layout = data.getItemLayout(idx);\n\t var angle = layout.angle === minAngle\n\t ? minAngle : value * unitRadian;\n\t layout.startAngle = currentAngle;\n\t layout.endAngle = currentAngle + dir * angle;\n\t currentAngle += dir * angle;\n\t });\n\t }\n\t }\n\t\n\t labelLayout(seriesModel, r, width, height);\n\t });\n\t };\n\n\n/***/ },\n/* 593 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var echarts = __webpack_require__(3);\n\t\n\t // Must use radar component\n\t __webpack_require__(657);\n\t\n\t __webpack_require__(594);\n\t __webpack_require__(595);\n\t\n\t echarts.registerVisual(zrUtil.curry(__webpack_require__(164), 'radar'));\n\t echarts.registerVisual(zrUtil.curry(\n\t __webpack_require__(90), 'radar', 'circle', null\n\t ));\n\t echarts.registerLayout(__webpack_require__(597));\n\t\n\t echarts.registerProcessor(\n\t zrUtil.curry(__webpack_require__(161), 'radar')\n\t );\n\t\n\t echarts.registerPreprocessor(__webpack_require__(596));\n\n\n/***/ },\n/* 594 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var SeriesModel = __webpack_require__(26);\n\t var List = __webpack_require__(20);\n\t var completeDimensions = __webpack_require__(48);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var RadarSeries = SeriesModel.extend({\n\t\n\t type: 'series.radar',\n\t\n\t dependencies: ['radar'],\n\t\n\t\n\t // Overwrite\n\t init: function (option) {\n\t RadarSeries.superApply(this, 'init', arguments);\n\t\n\t // Enable legend selection for each data item\n\t // Use a function instead of direct access because data reference may changed\n\t this.legendDataProvider = function () {\n\t return this._dataBeforeProcessed;\n\t };\n\t },\n\t\n\t getInitialData: function (option, ecModel) {\n\t var data = option.data || [];\n\t var dimensions = completeDimensions(\n\t [], data, [], 'indicator_'\n\t );\n\t var list = new List(dimensions, this);\n\t list.initData(data);\n\t return list;\n\t },\n\t\n\t formatTooltip: function (dataIndex) {\n\t var value = this.getRawValue(dataIndex);\n\t var coordSys = this.coordinateSystem;\n\t var indicatorAxes = coordSys.getIndicatorAxes();\n\t return (this._data.getName(dataIndex) == '' ? this.name : this._data.getName(dataIndex)) + ' '\n\t + zrUtil.map(indicatorAxes, function (axis, idx) {\n\t return axis.name + ' : ' + value[idx];\n\t }).join(' ');\n\t },\n\t\n\t defaultOption: {\n\t zlevel: 0,\n\t z: 2,\n\t coordinateSystem: 'radar',\n\t legendHoverLink: true,\n\t radarIndex: 0,\n\t lineStyle: {\n\t normal: {\n\t width: 2,\n\t type: 'solid'\n\t }\n\t },\n\t label: {\n\t normal: {\n\t position: 'top'\n\t }\n\t },\n\t // areaStyle: {\n\t // },\n\t // itemStyle: {}\n\t symbol: 'emptyCircle',\n\t symbolSize: 4\n\t // symbolRotate: null\n\t }\n\t });\n\t\n\t module.exports = RadarSeries;\n\n\n/***/ },\n/* 595 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var graphic = __webpack_require__(4);\n\t var zrUtil = __webpack_require__(1);\n\t var symbolUtil = __webpack_require__(49);\n\t\n\t function normalizeSymbolSize(symbolSize) {\n\t if (!zrUtil.isArray(symbolSize)) {\n\t symbolSize = [+symbolSize, +symbolSize];\n\t }\n\t return symbolSize;\n\t }\n\t module.exports = __webpack_require__(3).extendChartView({\n\t type: 'radar',\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var polar = seriesModel.coordinateSystem;\n\t var group = this.group;\n\t\n\t var data = seriesModel.getData();\n\t var oldData = this._data;\n\t\n\t function createSymbol(data, idx) {\n\t var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';\n\t var color = data.getItemVisual(idx, 'color');\n\t if (symbolType === 'none') {\n\t return;\n\t }\n\t var symbolPath = symbolUtil.createSymbol(\n\t symbolType, -0.5, -0.5, 1, 1, color\n\t );\n\t symbolPath.attr({\n\t style: {\n\t strokeNoScale: true\n\t },\n\t z2: 100,\n\t scale: normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'))\n\t });\n\t return symbolPath;\n\t }\n\t\n\t function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) {\n\t // Simply rerender all\n\t symbolGroup.removeAll();\n\t for (var i = 0; i < newPoints.length - 1; i++) {\n\t var symbolPath = createSymbol(data, idx);\n\t if (symbolPath) {\n\t symbolPath.__dimIdx = i;\n\t if (oldPoints[i]) {\n\t symbolPath.attr('position', oldPoints[i]);\n\t graphic[isInit ? 'initProps' : 'updateProps'](\n\t symbolPath, {\n\t position: newPoints[i]\n\t }, seriesModel, idx\n\t );\n\t }\n\t else {\n\t symbolPath.attr('position', newPoints[i]);\n\t }\n\t symbolGroup.add(symbolPath);\n\t }\n\t }\n\t }\n\t\n\t function getInitialPoints(points) {\n\t return zrUtil.map(points, function (pt) {\n\t return [polar.cx, polar.cy];\n\t });\n\t }\n\t data.diff(oldData)\n\t .add(function (idx) {\n\t var points = data.getItemLayout(idx);\n\t if (!points) {\n\t return;\n\t }\n\t var polygon = new graphic.Polygon();\n\t var polyline = new graphic.Polyline();\n\t var target = {\n\t shape: {\n\t points: points\n\t }\n\t };\n\t polygon.shape.points = getInitialPoints(points);\n\t polyline.shape.points = getInitialPoints(points);\n\t graphic.initProps(polygon, target, seriesModel, idx);\n\t graphic.initProps(polyline, target, seriesModel, idx);\n\t\n\t var itemGroup = new graphic.Group();\n\t var symbolGroup = new graphic.Group();\n\t itemGroup.add(polyline);\n\t itemGroup.add(polygon);\n\t itemGroup.add(symbolGroup);\n\t\n\t updateSymbols(\n\t polyline.shape.points, points, symbolGroup, data, idx, true\n\t );\n\t\n\t data.setItemGraphicEl(idx, itemGroup);\n\t })\n\t .update(function (newIdx, oldIdx) {\n\t var itemGroup = oldData.getItemGraphicEl(oldIdx);\n\t var polyline = itemGroup.childAt(0);\n\t var polygon = itemGroup.childAt(1);\n\t var symbolGroup = itemGroup.childAt(2);\n\t var target = {\n\t shape: {\n\t points: data.getItemLayout(newIdx)\n\t }\n\t };\n\t if (!target.shape.points) {\n\t return;\n\t }\n\t updateSymbols(\n\t polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false\n\t );\n\t\n\t graphic.updateProps(polyline, target, seriesModel);\n\t graphic.updateProps(polygon, target, seriesModel);\n\t\n\t data.setItemGraphicEl(newIdx, itemGroup);\n\t })\n\t .remove(function (idx) {\n\t group.remove(oldData.getItemGraphicEl(idx));\n\t })\n\t .execute();\n\t\n\t data.eachItemGraphicEl(function (itemGroup, idx) {\n\t var itemModel = data.getItemModel(idx);\n\t var polyline = itemGroup.childAt(0);\n\t var polygon = itemGroup.childAt(1);\n\t var symbolGroup = itemGroup.childAt(2);\n\t var color = data.getItemVisual(idx, 'color');\n\t\n\t group.add(itemGroup);\n\t\n\t polyline.useStyle(\n\t zrUtil.defaults(\n\t itemModel.getModel('lineStyle.normal').getLineStyle(),\n\t {\n\t fill: 'none',\n\t stroke: color\n\t }\n\t )\n\t );\n\t polyline.hoverStyle = itemModel.getModel('lineStyle.emphasis').getLineStyle();\n\t\n\t var areaStyleModel = itemModel.getModel('areaStyle.normal');\n\t var hoverAreaStyleModel = itemModel.getModel('areaStyle.emphasis');\n\t var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty();\n\t var hoverPolygonIgnore = hoverAreaStyleModel.isEmpty() && hoverAreaStyleModel.parentModel.isEmpty();\n\t\n\t hoverPolygonIgnore = hoverPolygonIgnore && polygonIgnore;\n\t polygon.ignore = polygonIgnore;\n\t\n\t polygon.useStyle(\n\t zrUtil.defaults(\n\t areaStyleModel.getAreaStyle(),\n\t {\n\t fill: color,\n\t opacity: 0.7\n\t }\n\t )\n\t );\n\t polygon.hoverStyle = hoverAreaStyleModel.getAreaStyle();\n\t\n\t var itemStyle = itemModel.getModel('itemStyle.normal').getItemStyle(['color']);\n\t var itemHoverStyle = itemModel.getModel('itemStyle.emphasis').getItemStyle();\n\t var labelModel = itemModel.getModel('label.normal');\n\t var labelHoverModel = itemModel.getModel('label.emphasis');\n\t symbolGroup.eachChild(function (symbolPath) {\n\t symbolPath.setStyle(itemStyle);\n\t symbolPath.hoverStyle = zrUtil.clone(itemHoverStyle);\n\t\n\t var defaultText = data.get(data.dimensions[symbolPath.__dimIdx], idx);\n\t graphic.setText(symbolPath.style, labelModel, color);\n\t symbolPath.setStyle({\n\t text: labelModel.get('show') ? zrUtil.retrieve(\n\t seriesModel.getFormattedLabel(\n\t idx, 'normal', null, symbolPath.__dimIdx\n\t ),\n\t defaultText\n\t ) : ''\n\t });\n\t\n\t graphic.setText(symbolPath.hoverStyle, labelHoverModel, color);\n\t symbolPath.hoverStyle.text = labelHoverModel.get('show') ? zrUtil.retrieve(\n\t seriesModel.getFormattedLabel(\n\t idx, 'emphasis', null, symbolPath.__dimIdx\n\t ),\n\t defaultText\n\t ) : '';\n\t });\n\t\n\t function onEmphasis() {\n\t polygon.attr('ignore', hoverPolygonIgnore);\n\t }\n\t\n\t function onNormal() {\n\t polygon.attr('ignore', polygonIgnore);\n\t }\n\t\n\t itemGroup.off('mouseover').off('mouseout').off('normal').off('emphasis');\n\t itemGroup.on('emphasis', onEmphasis)\n\t .on('mouseover', onEmphasis)\n\t .on('normal', onNormal)\n\t .on('mouseout', onNormal);\n\t\n\t graphic.setHoverStyle(itemGroup);\n\t });\n\t\n\t this._data = data;\n\t },\n\t\n\t remove: function () {\n\t this.group.removeAll();\n\t this._data = null;\n\t },\n\t\n\t dispose: function () {}\n\t });\n\n\n/***/ },\n/* 596 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Backward compat for radar chart in 2\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t module.exports = function (option) {\n\t var polarOptArr = option.polar;\n\t if (polarOptArr) {\n\t if (!zrUtil.isArray(polarOptArr)) {\n\t polarOptArr = [polarOptArr];\n\t }\n\t var polarNotRadar = [];\n\t zrUtil.each(polarOptArr, function (polarOpt, idx) {\n\t if (polarOpt.indicator) {\n\t if (polarOpt.type && !polarOpt.shape) {\n\t polarOpt.shape = polarOpt.type;\n\t }\n\t option.radar = option.radar || [];\n\t if (!zrUtil.isArray(option.radar)) {\n\t option.radar = [option.radar];\n\t }\n\t option.radar.push(polarOpt);\n\t }\n\t else {\n\t polarNotRadar.push(polarOpt);\n\t }\n\t });\n\t option.polar = polarNotRadar;\n\t }\n\t zrUtil.each(option.series, function (seriesOpt) {\n\t if (seriesOpt.type === 'radar' && seriesOpt.polarIndex) {\n\t seriesOpt.radarIndex = seriesOpt.polarIndex;\n\t }\n\t });\n\t };\n\n\n/***/ },\n/* 597 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t module.exports = function (ecModel) {\n\t ecModel.eachSeriesByType('radar', function (seriesModel) {\n\t var data = seriesModel.getData();\n\t var points = [];\n\t var coordSys = seriesModel.coordinateSystem;\n\t if (!coordSys) {\n\t return;\n\t }\n\t\n\t function pointsConverter(val, idx) {\n\t points[idx] = points[idx] || [];\n\t points[idx][i] = coordSys.dataToPoint(val, i);\n\t }\n\t for (var i = 0; i < coordSys.getIndicatorAxes().length; i++) {\n\t var dim = data.dimensions[i];\n\t data.each(dim, pointsConverter);\n\t }\n\t\n\t data.each(function (idx) {\n\t // Close polygon\n\t points[idx][0] && points[idx].push(points[idx][0].slice());\n\t data.setItemLayout(idx, points[idx]);\n\t });\n\t });\n\t };\n\n\n/***/ },\n/* 598 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t\n\t __webpack_require__(599);\n\t __webpack_require__(600);\n\t echarts.registerLayout(__webpack_require__(601));\n\t echarts.registerVisual(__webpack_require__(602));\n\n\n/***/ },\n/* 599 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Get initial data and define sankey view's series model\n\t * @author Deqing Li(annong035@gmail.com)\n\t */\n\t\n\t\n\t var SeriesModel = __webpack_require__(26);\n\t var createGraphFromNodeEdge = __webpack_require__(216);\n\t\n\t var SankeySeries = SeriesModel.extend({\n\t\n\t type: 'series.sankey',\n\t\n\t layoutInfo: null,\n\t\n\t /**\n\t * Init a graph data structure from data in option series\n\t *\n\t * @param {Object} option the object used to config echarts view\n\t * @return {module:echarts/data/List} storage initial data\n\t */\n\t getInitialData: function (option) {\n\t var links = option.edges || option.links;\n\t var nodes = option.data || option.nodes;\n\t if (nodes && links) {\n\t var graph = createGraphFromNodeEdge(nodes, links, this, true);\n\t return graph.data;\n\t }\n\t },\n\t\n\t /**\n\t * Return the graphic data structure\n\t *\n\t * @return {module:echarts/data/Graph} graphic data structure\n\t */\n\t getGraph: function () {\n\t return this.getData().graph;\n\t },\n\t\n\t /**\n\t * Get edge data of graphic data structure\n\t *\n\t * @return {module:echarts/data/List} data structure of list\n\t */\n\t getEdgeData: function () {\n\t return this.getGraph().edgeData;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t formatTooltip: function (dataIndex, multipleSeries, dataType) {\n\t // dataType === 'node' or empty do not show tooltip by default\n\t if (dataType === 'edge') {\n\t var params = this.getDataParams(dataIndex, dataType);\n\t var rawDataOpt = params.data;\n\t var html = rawDataOpt.source + ' -- ' + rawDataOpt.target;\n\t if (params.value) {\n\t html += ' : ' + params.value;\n\t }\n\t return html;\n\t }\n\t\n\t return SankeySeries.superCall(this, 'formatTooltip', dataIndex, multipleSeries);\n\t },\n\t\n\t defaultOption: {\n\t zlevel: 0,\n\t z: 2,\n\t\n\t coordinateSystem: 'view',\n\t\n\t layout: null,\n\t\n\t // the position of the whole view\n\t left: '5%',\n\t top: '5%',\n\t right: '20%',\n\t bottom: '5%',\n\t\n\t // the dx of the node\n\t nodeWidth: 20,\n\t\n\t // the vertical distance between two nodes\n\t nodeGap: 8,\n\t\n\t // the number of iterations to change the position of the node\n\t layoutIterations: 32,\n\t\n\t label: {\n\t normal: {\n\t show: true,\n\t position: 'right',\n\t textStyle: {\n\t color: '#000',\n\t fontSize: 12\n\t }\n\t },\n\t emphasis: {\n\t show: true\n\t }\n\t },\n\t\n\t itemStyle: {\n\t normal: {\n\t borderWidth: 1,\n\t borderColor: '#333'\n\t }\n\t },\n\t\n\t lineStyle: {\n\t normal: {\n\t color: '#314656',\n\t opacity: 0.2,\n\t curveness: 0.5\n\t },\n\t emphasis: {\n\t opacity: 0.6\n\t }\n\t },\n\t\n\t animationEasing: 'linear',\n\t\n\t animationDuration: 1000\n\t }\n\t\n\t });\n\t\n\t module.exports = SankeySeries;\n\t\n\n\n/***/ },\n/* 600 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file The file used to draw sankey view\n\t * @author Deqing Li(annong035@gmail.com)\n\t */\n\t\n\t\n\t var graphic = __webpack_require__(4);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var SankeyShape = graphic.extendShape({\n\t shape: {\n\t x1: 0, y1: 0,\n\t x2: 0, y2: 0,\n\t cpx1: 0, cpy1: 0,\n\t cpx2: 0, cpy2: 0,\n\t\n\t extent: 0\n\t },\n\t\n\t buildPath: function (ctx, shape) {\n\t var halfExtent = shape.extent / 2;\n\t ctx.moveTo(shape.x1, shape.y1 - halfExtent);\n\t ctx.bezierCurveTo(\n\t shape.cpx1, shape.cpy1 - halfExtent,\n\t shape.cpx2, shape.cpy2 - halfExtent,\n\t shape.x2, shape.y2 - halfExtent\n\t );\n\t ctx.lineTo(shape.x2, shape.y2 + halfExtent);\n\t ctx.bezierCurveTo(\n\t shape.cpx2, shape.cpy2 + halfExtent,\n\t shape.cpx1, shape.cpy1 + halfExtent,\n\t shape.x1, shape.y1 + halfExtent\n\t );\n\t ctx.closePath();\n\t }\n\t });\n\t\n\t module.exports = __webpack_require__(3).extendChartView({\n\t\n\t type: 'sankey',\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/chart/sankey/SankeySeries}\n\t */\n\t _model: null,\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var graph = seriesModel.getGraph();\n\t var group = this.group;\n\t var layoutInfo = seriesModel.layoutInfo;\n\t var nodeData = seriesModel.getData();\n\t var edgeData = seriesModel.getData('edge');\n\t\n\t this._model = seriesModel;\n\t\n\t group.removeAll();\n\t\n\t group.position = [layoutInfo.x, layoutInfo.y];\n\t\n\t // generate a bezire Curve for each edge\n\t graph.eachEdge(function (edge) {\n\t var curve = new SankeyShape();\n\t\n\t curve.dataIndex = edge.dataIndex;\n\t curve.seriesIndex = seriesModel.seriesIndex;\n\t curve.dataType = 'edge';\n\t\n\t var lineStyleModel = edge.getModel('lineStyle.normal');\n\t var curvature = lineStyleModel.get('curveness');\n\t var n1Layout = edge.node1.getLayout();\n\t var n2Layout = edge.node2.getLayout();\n\t var edgeLayout = edge.getLayout();\n\t\n\t curve.shape.extent = Math.max(1, edgeLayout.dy);\n\t\n\t var x1 = n1Layout.x + n1Layout.dx;\n\t var y1 = n1Layout.y + edgeLayout.sy + edgeLayout.dy / 2;\n\t var x2 = n2Layout.x;\n\t var y2 = n2Layout.y + edgeLayout.ty + edgeLayout.dy / 2;\n\t var cpx1 = x1 * (1 - curvature) + x2 * curvature;\n\t var cpy1 = y1;\n\t var cpx2 = x1 * curvature + x2 * (1 - curvature);\n\t var cpy2 = y2;\n\t\n\t curve.setShape({\n\t x1: x1,\n\t y1: y1,\n\t x2: x2,\n\t y2: y2,\n\t cpx1: cpx1,\n\t cpy1: cpy1,\n\t cpx2: cpx2,\n\t cpy2: cpy2\n\t });\n\t\n\t curve.setStyle(lineStyleModel.getItemStyle());\n\t // Special color, use source node color or target node color\n\t switch (curve.style.fill) {\n\t case 'source':\n\t curve.style.fill = edge.node1.getVisual('color');\n\t break;\n\t case 'target':\n\t curve.style.fill = edge.node2.getVisual('color');\n\t break;\n\t }\n\t\n\t graphic.setHoverStyle(curve, edge.getModel('lineStyle.emphasis').getItemStyle());\n\t\n\t group.add(curve);\n\t\n\t edgeData.setItemGraphicEl(edge.dataIndex, curve);\n\t });\n\t\n\t // generate a rect for each node\n\t graph.eachNode(function (node) {\n\t var layout = node.getLayout();\n\t var itemModel = node.getModel();\n\t var labelModel = itemModel.getModel('label.normal');\n\t var textStyleModel = labelModel.getModel('textStyle');\n\t var labelHoverModel = itemModel.getModel('label.emphasis');\n\t var textStyleHoverModel = labelHoverModel.getModel('textStyle');\n\t\n\t var rect = new graphic.Rect({\n\t shape: {\n\t x: layout.x,\n\t y: layout.y,\n\t width: node.getLayout().dx,\n\t height: node.getLayout().dy\n\t },\n\t style: {\n\t // Get formatted label in label.normal option\n\t // Use node id if it is not specified\n\t text: labelModel.get('show')\n\t ? seriesModel.getFormattedLabel(node.dataIndex, 'normal') || node.id\n\t // Use empty string to hide the label\n\t : '',\n\t textFont: textStyleModel.getFont(),\n\t textFill: textStyleModel.getTextColor(),\n\t textPosition: labelModel.get('position')\n\t }\n\t });\n\t\n\t rect.setStyle(zrUtil.defaults(\n\t {\n\t fill: node.getVisual('color')\n\t },\n\t itemModel.getModel('itemStyle.normal').getItemStyle()\n\t ));\n\t\n\t graphic.setHoverStyle(rect, zrUtil.extend(\n\t node.getModel('itemStyle.emphasis'),\n\t {\n\t text: labelHoverModel.get('show')\n\t ? seriesModel.getFormattedLabel(node.dataIndex, 'emphasis') || node.id\n\t : '',\n\t textFont: textStyleHoverModel.getFont(),\n\t textFill: textStyleHoverModel.getTextColor(),\n\t textPosition: labelHoverModel.get('position')\n\t }\n\t ));\n\t\n\t group.add(rect);\n\t\n\t nodeData.setItemGraphicEl(node.dataIndex, rect);\n\t\n\t rect.dataType = 'node';\n\t });\n\t\n\t if (!this._data && seriesModel.get('animation')) {\n\t group.setClipPath(createGridClipShape(group.getBoundingRect(), seriesModel, function () {\n\t group.removeClipPath();\n\t }));\n\t }\n\t\n\t this._data = seriesModel.getData();\n\t },\n\t\n\t dispose: function () {}\n\t });\n\t\n\t // add animation to the view\n\t function createGridClipShape(rect, seriesModel, cb) {\n\t var rectEl = new graphic.Rect({\n\t shape: {\n\t x: rect.x - 10,\n\t y: rect.y - 10,\n\t width: 0,\n\t height: rect.height + 20\n\t }\n\t });\n\t graphic.initProps(rectEl, {\n\t shape: {\n\t width: rect.width + 20,\n\t height: rect.height + 20\n\t }\n\t }, seriesModel, cb);\n\t\n\t return rectEl;\n\t }\n\t\n\n\n/***/ },\n/* 601 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file The layout algorithm of sankey view\n\t * @author Deqing Li(annong035@gmail.com)\n\t */\n\t\n\t\n\t var layout = __webpack_require__(16);\n\t var nest = __webpack_require__(738);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t module.exports = function (ecModel, api, payload) {\n\t\n\t ecModel.eachSeriesByType('sankey', function (seriesModel) {\n\t\n\t var nodeWidth = seriesModel.get('nodeWidth');\n\t var nodeGap = seriesModel.get('nodeGap');\n\t\n\t var layoutInfo = getViewRect(seriesModel, api);\n\t\n\t seriesModel.layoutInfo = layoutInfo;\n\t\n\t var width = layoutInfo.width;\n\t var height = layoutInfo.height;\n\t\n\t var graph = seriesModel.getGraph();\n\t\n\t var nodes = graph.nodes;\n\t var edges = graph.edges;\n\t\n\t computeNodeValues(nodes);\n\t\n\t var filteredNodes = nodes.filter(function (node) {\n\t return node.getLayout().value === 0;\n\t });\n\t\n\t var iterations = filteredNodes.length !== 0\n\t ? 0 : seriesModel.get('layoutIterations');\n\t\n\t layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations);\n\t });\n\t };\n\t\n\t /**\n\t * Get the layout position of the whole view\n\t *\n\t * @param {module:echarts/model/Series} seriesModel the model object of sankey series\n\t * @param {module:echarts/ExtensionAPI} api provide the API list that the developer can call\n\t * @return {module:zrender/core/BoundingRect} size of rect to draw the sankey view\n\t */\n\t function getViewRect(seriesModel, api) {\n\t return layout.getLayoutRect(\n\t seriesModel.getBoxLayoutParams(), {\n\t width: api.getWidth(),\n\t height: api.getHeight()\n\t }\n\t );\n\t }\n\t\n\t function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations) {\n\t computeNodeBreadths(nodes, nodeWidth, width);\n\t computeNodeDepths(nodes, edges, height, nodeGap, iterations);\n\t computeEdgeDepths(nodes);\n\t }\n\t\n\t /**\n\t * Compute the value of each node by summing the associated edge's value\n\t *\n\t * @param {module:echarts/data/Graph~Node} nodes node of sankey view\n\t */\n\t function computeNodeValues(nodes) {\n\t zrUtil.each(nodes, function (node) {\n\t var value1 = sum(node.outEdges, getEdgeValue);\n\t var value2 = sum(node.inEdges, getEdgeValue);\n\t var value = Math.max(value1, value2);\n\t node.setLayout({value: value}, true);\n\t });\n\t }\n\t\n\t /**\n\t * Compute the x-position for each node\n\t *\n\t * @param {module:echarts/data/Graph~Node} nodes node of sankey view\n\t * @param {number} nodeWidth the dx of the node\n\t * @param {number} width the whole width of the area to draw the view\n\t */\n\t function computeNodeBreadths(nodes, nodeWidth, width) {\n\t var remainNodes = nodes;\n\t var nextNode = null;\n\t var x = 0;\n\t var kx = 0;\n\t\n\t while (remainNodes.length) {\n\t nextNode = [];\n\t for (var i = 0, len = remainNodes.length; i < len; i++) {\n\t var node = remainNodes[i];\n\t node.setLayout({x: x}, true);\n\t node.setLayout({dx: nodeWidth}, true);\n\t for (var j = 0, lenj = node.outEdges.length; j < lenj; j++) {\n\t nextNode.push(node.outEdges[j].node2);\n\t }\n\t }\n\t remainNodes = nextNode;\n\t ++x;\n\t }\n\t\n\t moveSinksRight(nodes, x);\n\t kx = (width - nodeWidth) / (x - 1);\n\t\n\t scaleNodeBreadths(nodes, kx);\n\t }\n\t\n\t /**\n\t * All the node without outEgdes are assigned maximum x-position and\n\t * be aligned in the last column.\n\t *\n\t * @param {module:echarts/data/Graph~Node} nodes node of sankey view\n\t * @param {number} x value (x-1) use to assign to node without outEdges\n\t * as x-position\n\t */\n\t function moveSinksRight(nodes, x) {\n\t zrUtil.each(nodes, function (node) {\n\t if (!node.outEdges.length) {\n\t node.setLayout({x: x - 1}, true);\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Scale node x-position to the width\n\t *\n\t * @param {module:echarts/data/Graph~Node} nodes node of sankey view\n\t * @param {number} kx multiple used to scale nodes\n\t */\n\t function scaleNodeBreadths(nodes, kx) {\n\t zrUtil.each(nodes, function (node) {\n\t var nodeX = node.getLayout().x * kx;\n\t node.setLayout({x: nodeX}, true);\n\t });\n\t }\n\t\n\t /**\n\t * Using Gauss-Seidel iterations method to compute the node depth(y-position)\n\t *\n\t * @param {module:echarts/data/Graph~Node} nodes node of sankey view\n\t * @param {module:echarts/data/Graph~Edge} edges edge of sankey view\n\t * @param {number} height the whole height of the area to draw the view\n\t * @param {numbber} nodeGap the vertical distance between two nodes\n\t * in the same column.\n\t * @param {number} iterations the number of iterations for the algorithm\n\t */\n\t function computeNodeDepths(nodes, edges, height, nodeGap, iterations) {\n\t var nodesByBreadth = nest()\n\t .key(function (d) {\n\t return d.getLayout().x;\n\t })\n\t .sortKeys(ascending)\n\t .entries(nodes)\n\t .map(function (d) {\n\t return d.values;\n\t });\n\t\n\t initializeNodeDepth(nodes, nodesByBreadth, edges, height, nodeGap);\n\t resolveCollisions(nodesByBreadth, nodeGap, height);\n\t\n\t for (var alpha = 1; iterations > 0; iterations--) {\n\t // 0.99 is a experience parameter, ensure that each iterations of\n\t // changes as small as possible.\n\t alpha *= 0.99;\n\t relaxRightToLeft(nodesByBreadth, alpha);\n\t resolveCollisions(nodesByBreadth, nodeGap, height);\n\t relaxLeftToRight(nodesByBreadth, alpha);\n\t resolveCollisions(nodesByBreadth, nodeGap, height);\n\t }\n\t }\n\t\n\t /**\n\t * Compute the original y-position for each node\n\t *\n\t * @param {module:echarts/data/Graph~Node} nodes node of sankey view\n\t * @param {Array.>} nodesByBreadth\n\t * group by the array of all sankey nodes based on the nodes x-position.\n\t * @param {module:echarts/data/Graph~Edge} edges edge of sankey view\n\t * @param {number} height the whole height of the area to draw the view\n\t * @param {number} nodeGap the vertical distance between two nodes\n\t */\n\t function initializeNodeDepth(nodes, nodesByBreadth, edges, height, nodeGap) {\n\t var kyArray = [];\n\t zrUtil.each(nodesByBreadth, function (nodes) {\n\t var n = nodes.length;\n\t var sum = 0;\n\t zrUtil.each(nodes, function (node) {\n\t sum += node.getLayout().value;\n\t });\n\t var ky = (height - (n - 1) * nodeGap) / sum;\n\t kyArray.push(ky);\n\t });\n\t\n\t kyArray.sort(function (a, b) {\n\t return a - b;\n\t });\n\t var ky0 = kyArray[0];\n\t\n\t zrUtil.each(nodesByBreadth, function (nodes) {\n\t zrUtil.each(nodes, function (node, i) {\n\t node.setLayout({y: i}, true);\n\t var nodeDy = node.getLayout().value * ky0;\n\t node.setLayout({dy: nodeDy}, true);\n\t });\n\t });\n\t\n\t zrUtil.each(edges, function (edge) {\n\t var edgeDy = +edge.getValue() * ky0;\n\t edge.setLayout({dy: edgeDy}, true);\n\t });\n\t }\n\t\n\t /**\n\t * Resolve the collision of initialized depth (y-position)\n\t *\n\t * @param {Array.>} nodesByBreadth\n\t * group by the array of all sankey nodes based on the nodes x-position.\n\t * @param {number} nodeGap the vertical distance between two nodes\n\t * @param {number} height the whole height of the area to draw the view\n\t */\n\t function resolveCollisions(nodesByBreadth, nodeGap, height) {\n\t zrUtil.each(nodesByBreadth, function (nodes) {\n\t var node;\n\t var dy;\n\t var y0 = 0;\n\t var n = nodes.length;\n\t var i;\n\t\n\t nodes.sort(ascendingDepth);\n\t\n\t for (i = 0; i < n; i++) {\n\t node = nodes[i];\n\t dy = y0 - node.getLayout().y;\n\t if (dy > 0) {\n\t var nodeY = node.getLayout().y + dy;\n\t node.setLayout({y: nodeY}, true);\n\t }\n\t y0 = node.getLayout().y + node.getLayout().dy + nodeGap;\n\t }\n\t\n\t // if the bottommost node goes outside the bounds, push it back up\n\t dy = y0 - nodeGap - height;\n\t if (dy > 0) {\n\t var nodeY = node.getLayout().y - dy;\n\t node.setLayout({y: nodeY}, true);\n\t y0 = node.getLayout().y;\n\t for (i = n - 2; i >= 0; --i) {\n\t node = nodes[i];\n\t dy = node.getLayout().y + node.getLayout().dy + nodeGap - y0;\n\t if (dy > 0) {\n\t nodeY = node.getLayout().y - dy;\n\t node.setLayout({y: nodeY}, true);\n\t }\n\t y0 = node.getLayout().y;\n\t }\n\t }\n\t });\n\t }\n\t\n\t /**\n\t * Change the y-position of the nodes, except most the right side nodes\n\t *\n\t * @param {Array.>} nodesByBreadth\n\t * group by the array of all sankey nodes based on the node x-position.\n\t * @param {number} alpha parameter used to adjust the nodes y-position\n\t */\n\t function relaxRightToLeft(nodesByBreadth, alpha) {\n\t zrUtil.each(nodesByBreadth.slice().reverse(), function (nodes) {\n\t zrUtil.each(nodes, function (node) {\n\t if (node.outEdges.length) {\n\t var y = sum(node.outEdges, weightedTarget) / sum(node.outEdges, getEdgeValue);\n\t var nodeY = node.getLayout().y + (y - center(node)) * alpha;\n\t node.setLayout({y: nodeY}, true);\n\t }\n\t });\n\t });\n\t }\n\t\n\t function weightedTarget(edge) {\n\t return center(edge.node2) * edge.getValue();\n\t }\n\t\n\t /**\n\t * Change the y-position of the nodes, except most the left side nodes\n\t *\n\t * @param {Array.>} nodesByBreadth\n\t * group by the array of all sankey nodes based on the node x-position.\n\t * @param {number} alpha parameter used to adjust the nodes y-position\n\t */\n\t function relaxLeftToRight(nodesByBreadth, alpha) {\n\t zrUtil.each(nodesByBreadth, function (nodes) {\n\t zrUtil.each(nodes, function (node) {\n\t if (node.inEdges.length) {\n\t var y = sum(node.inEdges, weightedSource) / sum(node.inEdges, getEdgeValue);\n\t var nodeY = node.getLayout().y + (y - center(node)) * alpha;\n\t node.setLayout({y: nodeY}, true);\n\t }\n\t });\n\t });\n\t }\n\t\n\t function weightedSource(edge) {\n\t return center(edge.node1) * edge.getValue();\n\t }\n\t\n\t /**\n\t * Compute the depth(y-position) of each edge\n\t *\n\t * @param {module:echarts/data/Graph~Node} nodes node of sankey view\n\t */\n\t function computeEdgeDepths(nodes) {\n\t zrUtil.each(nodes, function (node) {\n\t node.outEdges.sort(ascendingTargetDepth);\n\t node.inEdges.sort(ascendingSourceDepth);\n\t });\n\t zrUtil.each(nodes, function (node) {\n\t var sy = 0;\n\t var ty = 0;\n\t zrUtil.each(node.outEdges, function (edge) {\n\t edge.setLayout({sy: sy}, true);\n\t sy += edge.getLayout().dy;\n\t });\n\t zrUtil.each(node.inEdges, function (edge) {\n\t edge.setLayout({ty: ty}, true);\n\t ty += edge.getLayout().dy;\n\t });\n\t });\n\t }\n\t\n\t function ascendingTargetDepth(a, b) {\n\t return a.node2.getLayout().y - b.node2.getLayout().y;\n\t }\n\t\n\t function ascendingSourceDepth(a, b) {\n\t return a.node1.getLayout().y - b.node1.getLayout().y;\n\t }\n\t\n\t function sum(array, f) {\n\t var sum = 0;\n\t var len = array.length;\n\t var i = -1;\n\t while (++i < len) {\n\t var value = +f.call(array, array[i], i);\n\t if (!isNaN(value)) {\n\t sum += value;\n\t }\n\t }\n\t return sum;\n\t }\n\t\n\t function center(node) {\n\t return node.getLayout().y + node.getLayout().dy / 2;\n\t }\n\t\n\t function ascendingDepth(a, b) {\n\t return a.getLayout().y - b.getLayout().y;\n\t }\n\t\n\t function ascending(a, b) {\n\t return a < b ? -1 : a > b ? 1 : a === b ? 0 : NaN;\n\t }\n\t\n\t function getEdgeValue(edge) {\n\t return edge.getValue();\n\t }\n\t\n\n\n/***/ },\n/* 602 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Visual encoding for sankey view\n\t * @author Deqing Li(annong035@gmail.com)\n\t */\n\t\n\t\n\t var VisualMapping = __webpack_require__(69);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t module.exports = function (ecModel, payload) {\n\t ecModel.eachSeriesByType('sankey', function (seriesModel) {\n\t var graph = seriesModel.getGraph();\n\t var nodes = graph.nodes;\n\t\n\t nodes.sort(function (a, b) {\n\t return a.getLayout().value - b.getLayout().value;\n\t });\n\t\n\t var minValue = nodes[0].getLayout().value;\n\t var maxValue = nodes[nodes.length - 1].getLayout().value;\n\t\n\t zrUtil.each(nodes, function (node) {\n\t var mapping = new VisualMapping({\n\t type: 'color',\n\t mappingMethod: 'linear',\n\t dataExtent: [minValue, maxValue],\n\t visual: seriesModel.get('color')\n\t });\n\t\n\t var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value);\n\t node.setVisual('color', mapValueToColor);\n\t // If set itemStyle.normal.color\n\t var itemModel = node.getModel();\n\t var customColor = itemModel.get('itemStyle.normal.color');\n\t if (customColor != null) {\n\t node.setVisual('color', customColor);\n\t }\n\t });\n\t\n\t });\n\t };\n\t\n\n\n/***/ },\n/* 603 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var echarts = __webpack_require__(3);\n\t\n\t __webpack_require__(604);\n\t __webpack_require__(605);\n\t\n\t echarts.registerVisual(zrUtil.curry(\n\t __webpack_require__(90), 'scatter', 'circle', null\n\t ));\n\t echarts.registerLayout(zrUtil.curry(\n\t __webpack_require__(160), 'scatter'\n\t ));\n\t\n\t // In case developer forget to include grid component\n\t __webpack_require__(105);\n\n\n/***/ },\n/* 604 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var createListFromArray = __webpack_require__(76);\n\t var SeriesModel = __webpack_require__(26);\n\t\n\t module.exports = SeriesModel.extend({\n\t\n\t type: 'series.scatter',\n\t\n\t dependencies: ['grid', 'polar'],\n\t\n\t getInitialData: function (option, ecModel) {\n\t var list = createListFromArray(option.data, this, ecModel);\n\t return list;\n\t },\n\t\n\t brushSelector: 'point',\n\t\n\t defaultOption: {\n\t coordinateSystem: 'cartesian2d',\n\t zlevel: 0,\n\t z: 2,\n\t legendHoverLink: true,\n\t\n\t hoverAnimation: true,\n\t // Cartesian coordinate system\n\t // xAxisIndex: 0,\n\t // yAxisIndex: 0,\n\t\n\t // Polar coordinate system\n\t // polarIndex: 0,\n\t\n\t // Geo coordinate system\n\t // geoIndex: 0,\n\t\n\t // symbol: null, // 图形类型\n\t symbolSize: 10, // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2\n\t // symbolRotate: null, // 图形旋转控制\n\t\n\t large: false,\n\t // Available when large is true\n\t largeThreshold: 2000,\n\t\n\t // label: {\n\t // normal: {\n\t // show: false\n\t // distance: 5,\n\t // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调\n\t // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为\n\t // 'inside'|'left'|'right'|'top'|'bottom'\n\t // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE\n\t // }\n\t // },\n\t itemStyle: {\n\t normal: {\n\t opacity: 0.8\n\t // color: 各异\n\t }\n\t }\n\t }\n\t\n\t });\n\n\n/***/ },\n/* 605 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var SymbolDraw = __webpack_require__(84);\n\t var LargeSymbolDraw = __webpack_require__(565);\n\t\n\t __webpack_require__(3).extendChartView({\n\t\n\t type: 'scatter',\n\t\n\t init: function () {\n\t this._normalSymbolDraw = new SymbolDraw();\n\t this._largeSymbolDraw = new LargeSymbolDraw();\n\t },\n\t\n\t render: function (seriesModel, ecModel, api) {\n\t var data = seriesModel.getData();\n\t var largeSymbolDraw = this._largeSymbolDraw;\n\t var normalSymbolDraw = this._normalSymbolDraw;\n\t var group = this.group;\n\t\n\t var symbolDraw = seriesModel.get('large') && data.count() > seriesModel.get('largeThreshold')\n\t ? largeSymbolDraw : normalSymbolDraw;\n\t\n\t this._symbolDraw = symbolDraw;\n\t symbolDraw.updateData(data);\n\t group.add(symbolDraw.group);\n\t\n\t group.remove(\n\t symbolDraw === largeSymbolDraw\n\t ? normalSymbolDraw.group : largeSymbolDraw.group\n\t );\n\t },\n\t\n\t updateLayout: function (seriesModel) {\n\t this._symbolDraw.updateLayout(seriesModel);\n\t },\n\t\n\t remove: function (ecModel, api) {\n\t this._symbolDraw && this._symbolDraw.remove(api, true);\n\t },\n\t\n\t dispose: function () {}\n\t });\n\n\n/***/ },\n/* 606 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t\n\t __webpack_require__(608);\n\t __webpack_require__(609);\n\t __webpack_require__(610);\n\t\n\t echarts.registerVisual(__webpack_require__(612));\n\t\n\t echarts.registerLayout(__webpack_require__(611));\n\n\n/***/ },\n/* 607 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t \n\t\n\t var graphic = __webpack_require__(4);\n\t var layout = __webpack_require__(16);\n\t var zrUtil = __webpack_require__(1);\n\t var helper = __webpack_require__(77);\n\t\n\t var TEXT_PADDING = 8;\n\t var ITEM_GAP = 8;\n\t var ARRAY_LENGTH = 5;\n\t\n\t function Breadcrumb(containerGroup) {\n\t /**\n\t * @private\n\t * @type {module:zrender/container/Group}\n\t */\n\t this.group = new graphic.Group();\n\t\n\t containerGroup.add(this.group);\n\t }\n\t\n\t Breadcrumb.prototype = {\n\t\n\t constructor: Breadcrumb,\n\t\n\t render: function (seriesModel, api, targetNode, onSelect) {\n\t var model = seriesModel.getModel('breadcrumb');\n\t var thisGroup = this.group;\n\t\n\t thisGroup.removeAll();\n\t\n\t if (!model.get('show') || !targetNode) {\n\t return;\n\t }\n\t\n\t var normalStyleModel = model.getModel('itemStyle.normal');\n\t // var emphasisStyleModel = model.getModel('itemStyle.emphasis');\n\t var textStyleModel = normalStyleModel.getModel('textStyle');\n\t\n\t var layoutParam = {\n\t pos: {\n\t left: model.get('left'),\n\t right: model.get('right'),\n\t top: model.get('top'),\n\t bottom: model.get('bottom')\n\t },\n\t box: {\n\t width: api.getWidth(),\n\t height: api.getHeight()\n\t },\n\t emptyItemWidth: model.get('emptyItemWidth'),\n\t totalWidth: 0,\n\t renderList: []\n\t };\n\t\n\t this._prepare(targetNode, layoutParam, textStyleModel);\n\t this._renderContent(seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect);\n\t\n\t layout.positionElement(thisGroup, layoutParam.pos, layoutParam.box);\n\t },\n\t\n\t /**\n\t * Prepare render list and total width\n\t * @private\n\t */\n\t _prepare: function (targetNode, layoutParam, textStyleModel) {\n\t for (var node = targetNode; node; node = node.parentNode) {\n\t var text = node.getModel().get('name');\n\t var textRect = textStyleModel.getTextRect(text);\n\t var itemWidth = Math.max(\n\t textRect.width + TEXT_PADDING * 2,\n\t layoutParam.emptyItemWidth\n\t );\n\t layoutParam.totalWidth += itemWidth + ITEM_GAP;\n\t layoutParam.renderList.push({node: node, text: text, width: itemWidth});\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _renderContent: function (\n\t seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect\n\t ) {\n\t // Start rendering.\n\t var lastX = 0;\n\t var emptyItemWidth = layoutParam.emptyItemWidth;\n\t var height = seriesModel.get('breadcrumb.height');\n\t var availableSize = layout.getAvailableSize(layoutParam.pos, layoutParam.box);\n\t var totalWidth = layoutParam.totalWidth;\n\t var renderList = layoutParam.renderList;\n\t\n\t for (var i = renderList.length - 1; i >= 0; i--) {\n\t var item = renderList[i];\n\t var itemNode = item.node;\n\t var itemWidth = item.width;\n\t var text = item.text;\n\t\n\t // Hdie text and shorten width if necessary.\n\t if (totalWidth > availableSize.width) {\n\t totalWidth -= itemWidth - emptyItemWidth;\n\t itemWidth = emptyItemWidth;\n\t text = '';\n\t }\n\t\n\t var el = new graphic.Polygon({\n\t shape: {\n\t points: makeItemPoints(\n\t lastX, 0, itemWidth, height,\n\t i === renderList.length - 1, i === 0\n\t )\n\t },\n\t style: zrUtil.defaults(\n\t normalStyleModel.getItemStyle(),\n\t {\n\t lineJoin: 'bevel',\n\t text: text,\n\t textFill: textStyleModel.getTextColor(),\n\t textFont: textStyleModel.getFont()\n\t }\n\t ),\n\t z: 10,\n\t onclick: zrUtil.curry(onSelect, itemNode)\n\t });\n\t this.group.add(el);\n\t\n\t packEventData(el, seriesModel, itemNode);\n\t\n\t lastX += itemWidth + ITEM_GAP;\n\t }\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t remove: function () {\n\t this.group.removeAll();\n\t }\n\t };\n\t\n\t function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) {\n\t var points = [\n\t [head ? x : x - ARRAY_LENGTH, y],\n\t [x + itemWidth, y],\n\t [x + itemWidth, y + itemHeight],\n\t [head ? x : x - ARRAY_LENGTH, y + itemHeight]\n\t ];\n\t !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]);\n\t !head && points.push([x, y + itemHeight / 2]);\n\t return points;\n\t }\n\t\n\t // Package custom mouse event.\n\t function packEventData(el, seriesModel, itemNode) {\n\t el.eventData = {\n\t componentType: 'series',\n\t componentSubType: 'treemap',\n\t seriesIndex: seriesModel.componentIndex,\n\t seriesName: seriesModel.name,\n\t seriesType: 'treemap',\n\t selfType: 'breadcrumb', // Distinguish with click event on treemap node.\n\t nodeData: {\n\t dataIndex: itemNode && itemNode.dataIndex,\n\t name: itemNode && itemNode.name\n\t },\n\t treePathInfo: itemNode && helper.wrapTreePathInfo(itemNode, seriesModel)\n\t };\n\t }\n\t\n\t module.exports = Breadcrumb;\n\n\n/***/ },\n/* 608 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var SeriesModel = __webpack_require__(26);\n\t var Tree = __webpack_require__(720);\n\t var zrUtil = __webpack_require__(1);\n\t var Model = __webpack_require__(21);\n\t var formatUtil = __webpack_require__(18);\n\t var helper = __webpack_require__(77);\n\t var encodeHTML = formatUtil.encodeHTML;\n\t var addCommas = formatUtil.addCommas;\n\t\n\t\n\t module.exports = SeriesModel.extend({\n\t\n\t type: 'series.treemap',\n\t\n\t layoutMode: 'box',\n\t\n\t dependencies: ['grid', 'polar'],\n\t\n\t /**\n\t * @type {module:echarts/data/Tree~Node}\n\t */\n\t _viewRoot: null,\n\t\n\t defaultOption: {\n\t // Disable progressive rendering\n\t progressive: 0,\n\t hoverLayerThreshold: Infinity,\n\t // center: ['50%', '50%'], // not supported in ec3.\n\t // size: ['80%', '80%'], // deprecated, compatible with ec2.\n\t left: 'center',\n\t top: 'middle',\n\t right: null,\n\t bottom: null,\n\t width: '80%',\n\t height: '80%',\n\t sort: true, // Can be null or false or true\n\t // (order by desc default, asc not supported yet (strange effect))\n\t clipWindow: 'origin', // Size of clipped window when zooming. 'origin' or 'fullscreen'\n\t squareRatio: 0.5 * (1 + Math.sqrt(5)), // golden ratio\n\t leafDepth: null, // Nodes on depth from root are regarded as leaves.\n\t // Count from zero (zero represents only view root).\n\t drillDownIcon: '▶', // Use html character temporarily because it is complicated\n\t // to align specialized icon. ▷▶❒❐▼✚\n\t\n\t zoomToNodeRatio: 0.32 * 0.32, // Be effective when using zoomToNode. Specify the proportion of the\n\t // target node area in the view area.\n\t roam: true, // true, false, 'scale' or 'zoom', 'move'.\n\t nodeClick: 'zoomToNode', // Leaf node click behaviour: 'zoomToNode', 'link', false.\n\t // If leafDepth is set and clicking a node which has children but\n\t // be on left depth, the behaviour would be changing root. Otherwise\n\t // use behavious defined above.\n\t animation: true,\n\t animationDurationUpdate: 900,\n\t animationEasing: 'quinticInOut',\n\t breadcrumb: {\n\t show: true,\n\t height: 22,\n\t left: 'center',\n\t top: 'bottom',\n\t // right\n\t // bottom\n\t emptyItemWidth: 25, // Width of empty node.\n\t itemStyle: {\n\t normal: {\n\t color: 'rgba(0,0,0,0.7)', //'#5793f3',\n\t borderColor: 'rgba(255,255,255,0.7)',\n\t borderWidth: 1,\n\t shadowColor: 'rgba(150,150,150,1)',\n\t shadowBlur: 3,\n\t shadowOffsetX: 0,\n\t shadowOffsetY: 0,\n\t textStyle: {\n\t color: '#fff'\n\t }\n\t },\n\t emphasis: {\n\t textStyle: {}\n\t }\n\t }\n\t },\n\t label: {\n\t normal: {\n\t show: true,\n\t position: 'inside', // Can be [5, '5%'] or position stirng like 'insideTopLeft', ...\n\t textStyle: {\n\t color: '#fff',\n\t ellipsis: true\n\t }\n\t }\n\t },\n\t itemStyle: {\n\t normal: {\n\t color: null, // Can be 'none' if not necessary.\n\t colorAlpha: null, // Can be 'none' if not necessary.\n\t colorSaturation: null, // Can be 'none' if not necessary.\n\t borderWidth: 0,\n\t gapWidth: 0,\n\t borderColor: '#fff',\n\t borderColorSaturation: null // If specified, borderColor will be ineffective, and the\n\t // border color is evaluated by color of current node and\n\t // borderColorSaturation.\n\t },\n\t emphasis: {\n\t\n\t }\n\t },\n\t\n\t visualDimension: 0, // Can be 0, 1, 2, 3.\n\t visualMin: null,\n\t visualMax: null,\n\t\n\t color: [], // + treemapSeries.color should not be modified. Please only modified\n\t // level[n].color (if necessary).\n\t // + Specify color list of each level. level[0].color would be global\n\t // color list if not specified. (see method `setDefault`).\n\t // + But set as a empty array to forbid fetch color from global palette\n\t // when using nodeModel.get('color'), otherwise nodes on deep level\n\t // will always has color palette set and are not able to inherit color\n\t // from parent node.\n\t // + TreemapSeries.color can not be set as 'none', otherwise effect\n\t // legend color fetching (see seriesColor.js).\n\t colorAlpha: null, // Array. Specify color alpha range of each level, like [0.2, 0.8]\n\t colorSaturation: null, // Array. Specify color saturation of each level, like [0.2, 0.5]\n\t colorMappingBy: 'index', // 'value' or 'index' or 'id'.\n\t visibleMin: 10, // If area less than this threshold (unit: pixel^2), node will not\n\t // be rendered. Only works when sort is 'asc' or 'desc'.\n\t childrenVisibleMin: null, // If area of a node less than this threshold (unit: pixel^2),\n\t // grandchildren will not show.\n\t // Why grandchildren? If not grandchildren but children,\n\t // some siblings show children and some not,\n\t // the appearance may be mess and not consistent,\n\t levels: [] // Each item: {\n\t // visibleMin, itemStyle, visualDimension, label\n\t // }\n\t // data: {\n\t // value: [],\n\t // children: [],\n\t // link: 'http://xxx.xxx.xxx',\n\t // target: 'blank' or 'self'\n\t // }\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t getInitialData: function (option, ecModel) {\n\t var data = option.data || [];\n\t var rootName = option.name;\n\t rootName == null && (rootName = option.name);\n\t\n\t // Create a virtual root.\n\t var root = {name: rootName, children: option.data};\n\t var value0 = (data[0] || {}).value;\n\t\n\t completeTreeValue(root, zrUtil.isArray(value0) ? value0.length : -1);\n\t\n\t // FIXME\n\t // sereis.mergeOption 的 getInitData是否放在merge后,从而能直接获取merege后的结果而非手动判断。\n\t var levels = option.levels || [];\n\t\n\t levels = option.levels = setDefault(levels, ecModel);\n\t\n\t // Make sure always a new tree is created when setOption,\n\t // in TreemapView, we check whether oldTree === newTree\n\t // to choose mappings approach among old shapes and new shapes.\n\t return Tree.createTree(root, this, levels).data;\n\t },\n\t\n\t optionUpdated: function () {\n\t this.resetViewRoot();\n\t },\n\t\n\t /**\n\t * @override\n\t * @param {number} dataIndex\n\t * @param {boolean} [mutipleSeries=false]\n\t */\n\t formatTooltip: function (dataIndex) {\n\t var data = this.getData();\n\t var value = this.getRawValue(dataIndex);\n\t var formattedValue = zrUtil.isArray(value)\n\t ? addCommas(value[0]) : addCommas(value);\n\t var name = data.getName(dataIndex);\n\t\n\t return encodeHTML(name) + ': ' + formattedValue;\n\t },\n\t\n\t /**\n\t * Add tree path to tooltip param\n\t *\n\t * @override\n\t * @param {number} dataIndex\n\t * @return {Object}\n\t */\n\t getDataParams: function (dataIndex) {\n\t var params = SeriesModel.prototype.getDataParams.apply(this, arguments);\n\t\n\t var node = this.getData().tree.getNodeByDataIndex(dataIndex);\n\t params.treePathInfo = helper.wrapTreePathInfo(node, this);\n\t\n\t return params;\n\t },\n\t\n\t /**\n\t * @public\n\t * @param {Object} layoutInfo {\n\t * x: containerGroup x\n\t * y: containerGroup y\n\t * width: containerGroup width\n\t * height: containerGroup height\n\t * }\n\t */\n\t setLayoutInfo: function (layoutInfo) {\n\t /**\n\t * @readOnly\n\t * @type {Object}\n\t */\n\t this.layoutInfo = this.layoutInfo || {};\n\t zrUtil.extend(this.layoutInfo, layoutInfo);\n\t },\n\t\n\t /**\n\t * @param {string} id\n\t * @return {number} index\n\t */\n\t mapIdToIndex: function (id) {\n\t // A feature is implemented:\n\t // index is monotone increasing with the sequence of\n\t // input id at the first time.\n\t // This feature can make sure that each data item and its\n\t // mapped color have the same index between data list and\n\t // color list at the beginning, which is useful for user\n\t // to adjust data-color mapping.\n\t\n\t /**\n\t * @private\n\t * @type {Object}\n\t */\n\t var idIndexMap = this._idIndexMap;\n\t\n\t if (!idIndexMap) {\n\t idIndexMap = this._idIndexMap = {};\n\t /**\n\t * @private\n\t * @type {number}\n\t */\n\t this._idIndexMapCount = 0;\n\t }\n\t\n\t var index = idIndexMap[id];\n\t if (index == null) {\n\t idIndexMap[id] = index = this._idIndexMapCount++;\n\t }\n\t\n\t return index;\n\t },\n\t\n\t getViewRoot: function () {\n\t return this._viewRoot;\n\t },\n\t\n\t /**\n\t * @param {module:echarts/data/Tree~Node} [viewRoot]\n\t */\n\t resetViewRoot: function (viewRoot) {\n\t viewRoot\n\t ? (this._viewRoot = viewRoot)\n\t : (viewRoot = this._viewRoot);\n\t\n\t var root = this.getData().tree.root;\n\t\n\t if (!viewRoot\n\t || (viewRoot !== root && !root.contains(viewRoot))\n\t ) {\n\t this._viewRoot = root;\n\t }\n\t }\n\t });\n\t\n\t /**\n\t * @param {Object} dataNode\n\t */\n\t function completeTreeValue(dataNode, arrValueLength) {\n\t // Postorder travel tree.\n\t // If value of none-leaf node is not set,\n\t // calculate it by suming up the value of all children.\n\t var sum = 0;\n\t\n\t zrUtil.each(dataNode.children, function (child) {\n\t\n\t completeTreeValue(child, arrValueLength);\n\t\n\t var childValue = child.value;\n\t zrUtil.isArray(childValue) && (childValue = childValue[0]);\n\t\n\t sum += childValue;\n\t });\n\t\n\t var thisValue = dataNode.value;\n\t\n\t if (arrValueLength >= 0) {\n\t if (!zrUtil.isArray(thisValue)) {\n\t dataNode.value = new Array(arrValueLength);\n\t }\n\t else {\n\t thisValue = thisValue[0];\n\t }\n\t }\n\t\n\t if (thisValue == null || isNaN(thisValue)) {\n\t thisValue = sum;\n\t }\n\t // Value should not less than 0.\n\t if (thisValue < 0) {\n\t thisValue = 0;\n\t }\n\t\n\t arrValueLength >= 0\n\t ? (dataNode.value[0] = thisValue)\n\t : (dataNode.value = thisValue);\n\t }\n\t\n\t /**\n\t * set default to level configuration\n\t */\n\t function setDefault(levels, ecModel) {\n\t var globalColorList = ecModel.get('color');\n\t\n\t if (!globalColorList) {\n\t return;\n\t }\n\t\n\t levels = levels || [];\n\t var hasColorDefine;\n\t zrUtil.each(levels, function (levelDefine) {\n\t var model = new Model(levelDefine);\n\t var modelColor = model.get('color');\n\t\n\t if (model.get('itemStyle.normal.color')\n\t || (modelColor && modelColor !== 'none')\n\t ) {\n\t hasColorDefine = true;\n\t }\n\t });\n\t\n\t if (!hasColorDefine) {\n\t var level0 = levels[0] || (levels[0] = {});\n\t level0.color = globalColorList.slice();\n\t }\n\t\n\t return levels;\n\t }\n\t\n\n\n/***/ },\n/* 609 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t \n\t\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var DataDiffer = __webpack_require__(109);\n\t var helper = __webpack_require__(77);\n\t var Breadcrumb = __webpack_require__(607);\n\t var RoamController = __webpack_require__(106);\n\t var BoundingRect = __webpack_require__(17);\n\t var matrix = __webpack_require__(50);\n\t var animationUtil = __webpack_require__(737);\n\t var bind = zrUtil.bind;\n\t var Group = graphic.Group;\n\t var Rect = graphic.Rect;\n\t var each = zrUtil.each;\n\t\n\t var DRAG_THRESHOLD = 3;\n\t var PATH_LABEL_NORMAL = ['label', 'normal'];\n\t var PATH_LABEL_EMPHASIS = ['label', 'emphasis'];\n\t var Z_BASE = 10; // Should bigger than every z.\n\t var Z_BG = 1;\n\t var Z_CONTENT = 2;\n\t\n\t module.exports = __webpack_require__(3).extendChartView({\n\t\n\t type: 'treemap',\n\t\n\t /**\n\t * @override\n\t */\n\t init: function (o, api) {\n\t\n\t /**\n\t * @private\n\t * @type {module:zrender/container/Group}\n\t */\n\t this._containerGroup;\n\t\n\t /**\n\t * @private\n\t * @type {Object.>}\n\t */\n\t this._storage = createStorage();\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/data/Tree}\n\t */\n\t this._oldTree;\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/chart/treemap/Breadcrumb}\n\t */\n\t this._breadcrumb;\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/component/helper/RoamController}\n\t */\n\t this._controller;\n\t\n\t /**\n\t * 'ready', 'animating'\n\t * @private\n\t */\n\t this._state = 'ready';\n\t\n\t /**\n\t * @private\n\t * @type {boolean}\n\t */\n\t this._mayClick;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t render: function (seriesModel, ecModel, api, payload) {\n\t\n\t var models = ecModel.findComponents({\n\t mainType: 'series', subType: 'treemap', query: payload\n\t });\n\t if (zrUtil.indexOf(models, seriesModel) < 0) {\n\t return;\n\t }\n\t\n\t this.seriesModel = seriesModel;\n\t this.api = api;\n\t this.ecModel = ecModel;\n\t\n\t var targetInfo = helper.retrieveTargetInfo(payload, seriesModel);\n\t var payloadType = payload && payload.type;\n\t var layoutInfo = seriesModel.layoutInfo;\n\t var isInit = !this._oldTree;\n\t var thisStorage = this._storage;\n\t\n\t // Mark new root when action is treemapRootToNode.\n\t var reRoot = (payloadType === 'treemapRootToNode' && targetInfo && thisStorage)\n\t ? {\n\t rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()],\n\t direction: payload.direction\n\t }\n\t : null;\n\t\n\t var containerGroup = this._giveContainerGroup(layoutInfo);\n\t\n\t var renderResult = this._doRender(containerGroup, seriesModel, reRoot);\n\t (\n\t !isInit && (\n\t !payloadType\n\t || payloadType === 'treemapZoomToNode'\n\t || payloadType === 'treemapRootToNode'\n\t )\n\t )\n\t ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot)\n\t : renderResult.renderFinally();\n\t\n\t this._resetController(api);\n\t\n\t this._renderBreadcrumb(seriesModel, api, targetInfo);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _giveContainerGroup: function (layoutInfo) {\n\t var containerGroup = this._containerGroup;\n\t if (!containerGroup) {\n\t // FIXME\n\t // 加一层containerGroup是为了clip,但是现在clip功能并没有实现。\n\t containerGroup = this._containerGroup = new Group();\n\t this._initEvents(containerGroup);\n\t this.group.add(containerGroup);\n\t }\n\t containerGroup.attr('position', [layoutInfo.x, layoutInfo.y]);\n\t\n\t return containerGroup;\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _doRender: function (containerGroup, seriesModel, reRoot) {\n\t var thisTree = seriesModel.getData().tree;\n\t var oldTree = this._oldTree;\n\t\n\t // Clear last shape records.\n\t var lastsForAnimation = createStorage();\n\t var thisStorage = createStorage();\n\t var oldStorage = this._storage;\n\t var willInvisibleEls = [];\n\t var doRenderNode = zrUtil.curry(\n\t renderNode, seriesModel,\n\t thisStorage, oldStorage, reRoot,\n\t lastsForAnimation, willInvisibleEls\n\t );\n\t\n\t // Notice: when thisTree and oldTree are the same tree (see list.cloneShadow),\n\t // the oldTree is actually losted, so we can not find all of the old graphic\n\t // elements from tree. So we use this stragegy: make element storage, move\n\t // from old storage to new storage, clear old storage.\n\t\n\t dualTravel(\n\t thisTree.root ? [thisTree.root] : [],\n\t (oldTree && oldTree.root) ? [oldTree.root] : [],\n\t containerGroup,\n\t thisTree === oldTree || !oldTree,\n\t 0\n\t );\n\t\n\t // Process all removing.\n\t var willDeleteEls = clearStorage(oldStorage);\n\t\n\t this._oldTree = thisTree;\n\t this._storage = thisStorage;\n\t\n\t return {\n\t lastsForAnimation: lastsForAnimation,\n\t willDeleteEls: willDeleteEls,\n\t renderFinally: renderFinally\n\t };\n\t\n\t function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) {\n\t // When 'render' is triggered by action,\n\t // 'this' and 'old' may be the same tree,\n\t // we use rawIndex in that case.\n\t if (sameTree) {\n\t oldViewChildren = thisViewChildren;\n\t each(thisViewChildren, function (child, index) {\n\t !child.isRemoved() && processNode(index, index);\n\t });\n\t }\n\t // Diff hierarchically (diff only in each subtree, but not whole).\n\t // because, consistency of view is important.\n\t else {\n\t (new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey))\n\t .add(processNode)\n\t .update(processNode)\n\t .remove(zrUtil.curry(processNode, null))\n\t .execute();\n\t }\n\t\n\t function getKey(node) {\n\t // Identify by name or raw index.\n\t return node.getId();\n\t }\n\t\n\t function processNode(newIndex, oldIndex) {\n\t var thisNode = newIndex != null ? thisViewChildren[newIndex] : null;\n\t var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null;\n\t\n\t var group = doRenderNode(thisNode, oldNode, parentGroup, depth);\n\t\n\t group && dualTravel(\n\t thisNode && thisNode.viewChildren || [],\n\t oldNode && oldNode.viewChildren || [],\n\t group,\n\t sameTree,\n\t depth + 1\n\t );\n\t }\n\t }\n\t\n\t function clearStorage(storage) {\n\t var willDeleteEls = createStorage();\n\t storage && each(storage, function (store, storageName) {\n\t var delEls = willDeleteEls[storageName];\n\t each(store, function (el) {\n\t el && (delEls.push(el), el.__tmWillDelete = 1);\n\t });\n\t });\n\t return willDeleteEls;\n\t }\n\t\n\t function renderFinally() {\n\t each(willDeleteEls, function (els) {\n\t each(els, function (el) {\n\t el.parent && el.parent.remove(el);\n\t });\n\t });\n\t each(willInvisibleEls, function (el) {\n\t el.invisible = true;\n\t // Setting invisible is for optimizing, so no need to set dirty,\n\t // just mark as invisible.\n\t el.dirty();\n\t });\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _doAnimation: function (containerGroup, renderResult, seriesModel, reRoot) {\n\t if (!seriesModel.get('animation')) {\n\t return;\n\t }\n\t\n\t var duration = seriesModel.get('animationDurationUpdate');\n\t var easing = seriesModel.get('animationEasing');\n\t var animationWrap = animationUtil.createWrap();\n\t\n\t // Make delete animations.\n\t each(renderResult.willDeleteEls, function (store, storageName) {\n\t each(store, function (el, rawIndex) {\n\t if (el.invisible) {\n\t return;\n\t }\n\t\n\t var parent = el.parent; // Always has parent, and parent is nodeGroup.\n\t var target;\n\t\n\t if (reRoot && reRoot.direction === 'drillDown') {\n\t target = parent === reRoot.rootNodeGroup\n\t // This is the content element of view root.\n\t // Only `content` will enter this branch, because\n\t // `background` and `nodeGroup` will not be deleted.\n\t ? {\n\t shape: {\n\t x: 0,\n\t y: 0,\n\t width: parent.__tmNodeWidth,\n\t height: parent.__tmNodeHeight\n\t },\n\t style: {\n\t opacity: 0\n\t }\n\t }\n\t // Others.\n\t : {style: {opacity: 0}};\n\t }\n\t else {\n\t var targetX = 0;\n\t var targetY = 0;\n\t\n\t if (!parent.__tmWillDelete) {\n\t // Let node animate to right-bottom corner, cooperating with fadeout,\n\t // which is appropriate for user understanding.\n\t // Divided by 2 for reRoot rolling up effect.\n\t targetX = parent.__tmNodeWidth / 2;\n\t targetY = parent.__tmNodeHeight / 2;\n\t }\n\t\n\t target = storageName === 'nodeGroup'\n\t ? {position: [targetX, targetY], style: {opacity: 0}}\n\t : {\n\t shape: {x: targetX, y: targetY, width: 0, height: 0},\n\t style: {opacity: 0}\n\t };\n\t }\n\t\n\t target && animationWrap.add(el, target, duration, easing);\n\t });\n\t });\n\t\n\t // Make other animations\n\t each(this._storage, function (store, storageName) {\n\t each(store, function (el, rawIndex) {\n\t var last = renderResult.lastsForAnimation[storageName][rawIndex];\n\t var target = {};\n\t\n\t if (!last) {\n\t return;\n\t }\n\t\n\t if (storageName === 'nodeGroup') {\n\t if (last.old) {\n\t target.position = el.position.slice();\n\t el.attr('position', last.old);\n\t }\n\t }\n\t else {\n\t if (last.old) {\n\t target.shape = zrUtil.extend({}, el.shape);\n\t el.setShape(last.old);\n\t }\n\t\n\t if (last.fadein) {\n\t el.setStyle('opacity', 0);\n\t target.style = {opacity: 1};\n\t }\n\t // When animation is stopped for succedent animation starting,\n\t // el.style.opacity might not be 1\n\t else if (el.style.opacity !== 1) {\n\t target.style = {opacity: 1};\n\t }\n\t }\n\t\n\t animationWrap.add(el, target, duration, easing);\n\t });\n\t }, this);\n\t\n\t this._state = 'animating';\n\t\n\t animationWrap\n\t .done(bind(function () {\n\t this._state = 'ready';\n\t renderResult.renderFinally();\n\t }, this))\n\t .start();\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _resetController: function (api) {\n\t var controller = this._controller;\n\t\n\t // Init controller.\n\t if (!controller) {\n\t controller = this._controller = new RoamController(api.getZr());\n\t controller.enable(this.seriesModel.get('roam'));\n\t controller.on('pan', bind(this._onPan, this));\n\t controller.on('zoom', bind(this._onZoom, this));\n\t }\n\t\n\t var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight());\n\t controller.setContainsPoint(function (x, y) {\n\t return rect.contain(x, y);\n\t });\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _clearController: function () {\n\t var controller = this._controller;\n\t if (controller) {\n\t controller.dispose();\n\t controller = null;\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _onPan: function (dx, dy) {\n\t this._mayClick = false;\n\t\n\t if (this._state !== 'animating'\n\t && (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD)\n\t ) {\n\t // These param must not be cached.\n\t var root = this.seriesModel.getData().tree.root;\n\t\n\t if (!root) {\n\t return;\n\t }\n\t\n\t var rootLayout = root.getLayout();\n\t\n\t if (!rootLayout) {\n\t return;\n\t }\n\t\n\t this.api.dispatchAction({\n\t type: 'treemapMove',\n\t from: this.uid,\n\t seriesId: this.seriesModel.id,\n\t rootRect: {\n\t x: rootLayout.x + dx, y: rootLayout.y + dy,\n\t width: rootLayout.width, height: rootLayout.height\n\t }\n\t });\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _onZoom: function (scale, mouseX, mouseY) {\n\t this._mayClick = false;\n\t\n\t if (this._state !== 'animating') {\n\t // These param must not be cached.\n\t var root = this.seriesModel.getData().tree.root;\n\t\n\t if (!root) {\n\t return;\n\t }\n\t\n\t var rootLayout = root.getLayout();\n\t\n\t if (!rootLayout) {\n\t return;\n\t }\n\t\n\t var rect = new BoundingRect(\n\t rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height\n\t );\n\t var layoutInfo = this.seriesModel.layoutInfo;\n\t\n\t // Transform mouse coord from global to containerGroup.\n\t mouseX -= layoutInfo.x;\n\t mouseY -= layoutInfo.y;\n\t\n\t // Scale root bounding rect.\n\t var m = matrix.create();\n\t matrix.translate(m, m, [-mouseX, -mouseY]);\n\t matrix.scale(m, m, [scale, scale]);\n\t matrix.translate(m, m, [mouseX, mouseY]);\n\t\n\t rect.applyTransform(m);\n\t\n\t this.api.dispatchAction({\n\t type: 'treemapRender',\n\t from: this.uid,\n\t seriesId: this.seriesModel.id,\n\t rootRect: {\n\t x: rect.x, y: rect.y,\n\t width: rect.width, height: rect.height\n\t }\n\t });\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _initEvents: function (containerGroup) {\n\t // FIXME\n\t // 不用click以及silent的原因是,animate时视图设置silent true来避免click生效,\n\t // 但是animate中,按下鼠标,animate结束后(silent设回为false)松开鼠标,\n\t // 还是会触发click,期望是不触发。\n\t\n\t // Mousedown occurs when drag start, and mouseup occurs when drag end,\n\t // click event should not be triggered in that case.\n\t\n\t containerGroup.on('mousedown', function (e) {\n\t this._state === 'ready' && (this._mayClick = true);\n\t }, this);\n\t containerGroup.on('mouseup', function (e) {\n\t if (this._mayClick) {\n\t this._mayClick = false;\n\t this._state === 'ready' && onClick.call(this, e);\n\t }\n\t }, this);\n\t\n\t function onClick(e) {\n\t var nodeClick = this.seriesModel.get('nodeClick', true);\n\t\n\t if (!nodeClick) {\n\t return;\n\t }\n\t\n\t var targetInfo = this.findTarget(e.offsetX, e.offsetY);\n\t\n\t if (!targetInfo) {\n\t return;\n\t }\n\t\n\t var node = targetInfo.node;\n\t if (node.getLayout().isLeafRoot) {\n\t this._rootToNode(targetInfo);\n\t }\n\t else {\n\t if (nodeClick === 'zoomToNode') {\n\t this._zoomToNode(targetInfo);\n\t }\n\t else if (nodeClick === 'link') {\n\t var itemModel = node.hostTree.data.getItemModel(node.dataIndex);\n\t var link = itemModel.get('link', true);\n\t var linkTarget = itemModel.get('target', true) || 'blank';\n\t link && window.open(link, linkTarget);\n\t }\n\t }\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _renderBreadcrumb: function (seriesModel, api, targetInfo) {\n\t if (!targetInfo) {\n\t targetInfo = seriesModel.get('leafDepth', true) != null\n\t ? {node: seriesModel.getViewRoot()}\n\t // FIXME\n\t // better way?\n\t // Find breadcrumb tail on center of containerGroup.\n\t : this.findTarget(api.getWidth() / 2, api.getHeight() / 2);\n\t\n\t if (!targetInfo) {\n\t targetInfo = {node: seriesModel.getData().tree.root};\n\t }\n\t }\n\t\n\t (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group)))\n\t .render(seriesModel, api, targetInfo.node, bind(onSelect, this));\n\t\n\t function onSelect(node) {\n\t if (this._state !== 'animating') {\n\t helper.aboveViewRoot(seriesModel.getViewRoot(), node)\n\t ? this._rootToNode({node: node})\n\t : this._zoomToNode({node: node});\n\t }\n\t }\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t remove: function () {\n\t this._clearController();\n\t this._containerGroup && this._containerGroup.removeAll();\n\t this._storage = createStorage();\n\t this._state = 'ready';\n\t this._breadcrumb && this._breadcrumb.remove();\n\t },\n\t\n\t dispose: function () {\n\t this._clearController();\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _zoomToNode: function (targetInfo) {\n\t this.api.dispatchAction({\n\t type: 'treemapZoomToNode',\n\t from: this.uid,\n\t seriesId: this.seriesModel.id,\n\t targetNode: targetInfo.node\n\t });\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _rootToNode: function (targetInfo) {\n\t this.api.dispatchAction({\n\t type: 'treemapRootToNode',\n\t from: this.uid,\n\t seriesId: this.seriesModel.id,\n\t targetNode: targetInfo.node\n\t });\n\t },\n\t\n\t /**\n\t * @public\n\t * @param {number} x Global coord x.\n\t * @param {number} y Global coord y.\n\t * @return {Object} info If not found, return undefined;\n\t * @return {number} info.node Target node.\n\t * @return {number} info.offsetX x refer to target node.\n\t * @return {number} info.offsetY y refer to target node.\n\t */\n\t findTarget: function (x, y) {\n\t var targetInfo;\n\t var viewRoot = this.seriesModel.getViewRoot();\n\t\n\t viewRoot.eachNode({attr: 'viewChildren', order: 'preorder'}, function (node) {\n\t var bgEl = this._storage.background[node.getRawIndex()];\n\t // If invisible, there might be no element.\n\t if (bgEl) {\n\t var point = bgEl.transformCoordToLocal(x, y);\n\t var shape = bgEl.shape;\n\t\n\t // For performance consideration, dont use 'getBoundingRect'.\n\t if (shape.x <= point[0]\n\t && point[0] <= shape.x + shape.width\n\t && shape.y <= point[1]\n\t && point[1] <= shape.y + shape.height\n\t ) {\n\t targetInfo = {node: node, offsetX: point[0], offsetY: point[1]};\n\t }\n\t else {\n\t return false; // Suppress visit subtree.\n\t }\n\t }\n\t }, this);\n\t\n\t return targetInfo;\n\t }\n\t\n\t });\n\t\n\t /**\n\t * @inner\n\t */\n\t function createStorage() {\n\t return {nodeGroup: [], background: [], content: []};\n\t }\n\t\n\t /**\n\t * @inner\n\t * @return Return undefined means do not travel further.\n\t */\n\t function renderNode(\n\t seriesModel, thisStorage, oldStorage, reRoot,\n\t lastsForAnimation, willInvisibleEls,\n\t thisNode, oldNode, parentGroup, depth\n\t ) {\n\t // Whether under viewRoot.\n\t if (!thisNode) {\n\t // Deleting nodes will be performed finally. This method just find\n\t // element from old storage, or create new element, set them to new\n\t // storage, and set styles.\n\t return;\n\t }\n\t\n\t var thisLayout = thisNode.getLayout();\n\t\n\t if (!thisLayout || !thisLayout.isInView) {\n\t return;\n\t }\n\t\n\t var thisWidth = thisLayout.width;\n\t var thisHeight = thisLayout.height;\n\t var thisInvisible = thisLayout.invisible;\n\t\n\t var thisRawIndex = thisNode.getRawIndex();\n\t var oldRawIndex = oldNode && oldNode.getRawIndex();\n\t\n\t // Node group\n\t var group = giveGraphic('nodeGroup', Group);\n\t\n\t if (!group) {\n\t return;\n\t }\n\t\n\t parentGroup.add(group);\n\t // x,y are not set when el is above view root.\n\t group.attr('position', [thisLayout.x || 0, thisLayout.y || 0]);\n\t group.__tmNodeWidth = thisWidth;\n\t group.__tmNodeHeight = thisHeight;\n\t\n\t if (thisLayout.isAboveViewRoot) {\n\t return group;\n\t }\n\t\n\t // Background\n\t var bg = giveGraphic('background', Rect, depth, Z_BG);\n\t if (bg) {\n\t bg.setShape({x: 0, y: 0, width: thisWidth, height: thisHeight});\n\t updateStyle(bg, function () {\n\t bg.setStyle('fill', thisNode.getVisual('borderColor', true));\n\t });\n\t group.add(bg);\n\t }\n\t\n\t var thisViewChildren = thisNode.viewChildren;\n\t\n\t // No children, render content.\n\t if (!thisViewChildren || !thisViewChildren.length) {\n\t var content = giveGraphic('content', Rect, depth, Z_CONTENT);\n\t content && renderContent(group);\n\t }\n\t\n\t return group;\n\t\n\t // ----------------------------\n\t // | Procedures in renderNode |\n\t // ----------------------------\n\t\n\t function renderContent(group) {\n\t // For tooltip.\n\t content.dataIndex = thisNode.dataIndex;\n\t content.seriesIndex = seriesModel.seriesIndex;\n\t\n\t var borderWidth = thisLayout.borderWidth;\n\t var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0);\n\t var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0);\n\t\n\t content.culling = true;\n\t content.setShape({\n\t x: borderWidth,\n\t y: borderWidth,\n\t width: contentWidth,\n\t height: contentHeight\n\t });\n\t\n\t var visualColor = thisNode.getVisual('color', true);\n\t updateStyle(content, function () {\n\t var normalStyle = {fill: visualColor};\n\t var emphasisStyle = thisNode.getModel('itemStyle.emphasis').getItemStyle();\n\t\n\t prepareText(normalStyle, emphasisStyle, visualColor, contentWidth, contentHeight);\n\t\n\t content.setStyle(normalStyle);\n\t graphic.setHoverStyle(content, emphasisStyle);\n\t });\n\t\n\t group.add(content);\n\t }\n\t\n\t function updateStyle(element, cb) {\n\t if (!thisInvisible) {\n\t // If invisible, do not set visual, otherwise the element will\n\t // change immediately before animation. We think it is OK to\n\t // remain its origin color when moving out of the view window.\n\t cb();\n\t\n\t if (!element.__tmWillVisible) {\n\t element.invisible = false;\n\t }\n\t }\n\t else {\n\t // Delay invisible setting utill animation finished,\n\t // avoid element vanish suddenly before animation.\n\t !element.invisible && willInvisibleEls.push(element);\n\t }\n\t }\n\t\n\t function prepareText(normalStyle, emphasisStyle, visualColor, contentWidth, contentHeight) {\n\t var nodeModel = thisNode.getModel();\n\t var text = nodeModel.get('name');\n\t if (thisLayout.isLeafRoot) {\n\t var iconChar = seriesModel.get('drillDownIcon', true);\n\t text = iconChar ? iconChar + ' ' + text : text;\n\t }\n\t\n\t setText(\n\t text, normalStyle, nodeModel, PATH_LABEL_NORMAL,\n\t visualColor, contentWidth, contentHeight\n\t );\n\t setText(\n\t text, emphasisStyle, nodeModel, PATH_LABEL_EMPHASIS,\n\t visualColor, contentWidth, contentHeight\n\t );\n\t }\n\t\n\t function setText(text, style, nodeModel, labelPath, visualColor, contentWidth, contentHeight) {\n\t var labelModel = nodeModel.getModel(labelPath);\n\t var labelTextStyleModel = labelModel.getModel('textStyle');\n\t\n\t graphic.setText(style, labelModel, visualColor);\n\t\n\t // text.align and text.baseline is not included by graphic.setText,\n\t // because in most cases the two attributes are not exposed to user,\n\t // except in treemap.\n\t style.textAlign = labelTextStyleModel.get('align');\n\t style.textVerticalAlign = labelTextStyleModel.get('baseline');\n\t\n\t var textRect = labelTextStyleModel.getTextRect(text);\n\t if (!labelModel.getShallow('show') || textRect.height > contentHeight) {\n\t style.text = '';\n\t }\n\t else if (textRect.width > contentWidth) {\n\t style.text = labelTextStyleModel.get('ellipsis')\n\t ? labelTextStyleModel.truncateText(\n\t text, contentWidth, null, {minChar: 2}\n\t )\n\t : '';\n\t }\n\t else {\n\t style.text = text;\n\t }\n\t }\n\t\n\t function giveGraphic(storageName, Ctor, depth, z) {\n\t var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex];\n\t var lasts = lastsForAnimation[storageName];\n\t\n\t if (element) {\n\t // Remove from oldStorage\n\t oldStorage[storageName][oldRawIndex] = null;\n\t prepareAnimationWhenHasOld(lasts, element, storageName);\n\t }\n\t // If invisible and no old element, do not create new element (for optimizing).\n\t else if (!thisInvisible) {\n\t element = new Ctor({z: calculateZ(depth, z)});\n\t element.__tmDepth = depth;\n\t element.__tmStorageName = storageName;\n\t prepareAnimationWhenNoOld(lasts, element, storageName);\n\t }\n\t\n\t // Set to thisStorage\n\t return (thisStorage[storageName][thisRawIndex] = element);\n\t }\n\t\n\t function prepareAnimationWhenHasOld(lasts, element, storageName) {\n\t var lastCfg = lasts[thisRawIndex] = {};\n\t lastCfg.old = storageName === 'nodeGroup'\n\t ? element.position.slice()\n\t : zrUtil.extend({}, element.shape);\n\t }\n\t\n\t // If a element is new, we need to find the animation start point carefully,\n\t // otherwise it will looks strange when 'zoomToNode'.\n\t function prepareAnimationWhenNoOld(lasts, element, storageName) {\n\t var lastCfg = lasts[thisRawIndex] = {};\n\t var parentNode = thisNode.parentNode;\n\t\n\t if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) {\n\t var parentOldX = 0;\n\t var parentOldY = 0;\n\t\n\t // New nodes appear from right-bottom corner in 'zoomToNode' animation.\n\t // For convenience, get old bounding rect from background.\n\t var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()];\n\t if (!reRoot && parentOldBg && parentOldBg.old) {\n\t parentOldX = parentOldBg.old.width;\n\t parentOldY = parentOldBg.old.height;\n\t }\n\t\n\t // When no parent old shape found, its parent is new too,\n\t // so we can just use {x:0, y:0}.\n\t lastCfg.old = storageName === 'nodeGroup'\n\t ? [0, parentOldY]\n\t : {x: parentOldX, y: parentOldY, width: 0, height: 0};\n\t }\n\t\n\t // Fade in, user can be aware that these nodes are new.\n\t lastCfg.fadein = storageName !== 'nodeGroup';\n\t }\n\t }\n\t\n\t // We can not set all backgroud with the same z, Because the behaviour of\n\t // drill down and roll up differ background creation sequence from tree\n\t // hierarchy sequence, which cause that lowser background element overlap\n\t // upper ones. So we calculate z based on depth.\n\t // Moreover, we try to shrink down z interval to [0, 1] to avoid that\n\t // treemap with large z overlaps other components.\n\t function calculateZ(depth, zInLevel) {\n\t var zb = depth * Z_BASE + zInLevel;\n\t return (zb - 1) / zb;\n\t }\n\t\n\n\n/***/ },\n/* 610 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Treemap action\n\t */\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var helper = __webpack_require__(77);\n\t\n\t var noop = function () {};\n\t\n\t var actionTypes = [\n\t 'treemapZoomToNode',\n\t 'treemapRender',\n\t 'treemapMove'\n\t ];\n\t\n\t for (var i = 0; i < actionTypes.length; i++) {\n\t echarts.registerAction({type: actionTypes[i], update: 'updateView'}, noop);\n\t }\n\t\n\t echarts.registerAction(\n\t {type: 'treemapRootToNode', update: 'updateView'},\n\t function (payload, ecModel) {\n\t\n\t ecModel.eachComponent(\n\t {mainType: 'series', subType: 'treemap', query: payload},\n\t handleRootToNode\n\t );\n\t\n\t function handleRootToNode(model, index) {\n\t var targetInfo = helper.retrieveTargetInfo(payload, model);\n\t\n\t if (targetInfo) {\n\t var originViewRoot = model.getViewRoot();\n\t if (originViewRoot) {\n\t payload.direction = helper.aboveViewRoot(originViewRoot, targetInfo.node)\n\t ? 'rollUp' : 'drillDown';\n\t }\n\t model.resetViewRoot(targetInfo.node);\n\t }\n\t }\n\t }\n\t );\n\t\n\n\n/***/ },\n/* 611 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var numberUtil = __webpack_require__(5);\n\t var layout = __webpack_require__(16);\n\t var helper = __webpack_require__(77);\n\t var BoundingRect = __webpack_require__(17);\n\t var helper = __webpack_require__(77);\n\t\n\t var mathMax = Math.max;\n\t var mathMin = Math.min;\n\t var parsePercent = numberUtil.parsePercent;\n\t var retrieveValue = zrUtil.retrieve;\n\t var each = zrUtil.each;\n\t\n\t /**\n\t * @public\n\t */\n\t function update(ecModel, api, payload) {\n\t // Layout result in each node:\n\t // {x, y, width, height, area, borderWidth}\n\t var condition = {mainType: 'series', subType: 'treemap', query: payload};\n\t ecModel.eachComponent(condition, function (seriesModel) {\n\t\n\t var ecWidth = api.getWidth();\n\t var ecHeight = api.getHeight();\n\t var seriesOption = seriesModel.option;\n\t\n\t var size = seriesOption.size || []; // Compatible with ec2.\n\t var containerWidth = parsePercent(\n\t retrieveValue(seriesOption.width, size[0]),\n\t ecWidth\n\t );\n\t var containerHeight = parsePercent(\n\t retrieveValue(seriesOption.height, size[1]),\n\t ecHeight\n\t );\n\t\n\t var layoutInfo = layout.getLayoutRect(\n\t seriesModel.getBoxLayoutParams(),\n\t {\n\t width: api.getWidth(),\n\t height: api.getHeight()\n\t }\n\t );\n\t\n\t // Fetch payload info.\n\t var payloadType = payload && payload.type;\n\t var targetInfo = helper.retrieveTargetInfo(payload, seriesModel);\n\t var rootRect = (payloadType === 'treemapRender' || payloadType === 'treemapMove')\n\t ? payload.rootRect : null;\n\t var viewRoot = seriesModel.getViewRoot();\n\t var viewAbovePath = helper.getPathToRoot(viewRoot);\n\t\n\t if (payloadType !== 'treemapMove') {\n\t var rootSize = payloadType === 'treemapZoomToNode'\n\t ? estimateRootSize(\n\t seriesModel, targetInfo, viewRoot, containerWidth, containerHeight\n\t )\n\t : rootRect\n\t ? [rootRect.width, rootRect.height]\n\t : [containerWidth, containerHeight];\n\t\n\t var sort = seriesOption.sort;\n\t if (sort && sort !== 'asc' && sort !== 'desc') {\n\t sort = 'desc';\n\t }\n\t var options = {\n\t squareRatio: seriesOption.squareRatio,\n\t sort: sort,\n\t leafDepth: seriesOption.leafDepth\n\t };\n\t\n\t // layout should be cleared because using updateView but not update.\n\t viewRoot.hostTree.clearLayouts();\n\t\n\t // TODO\n\t // optimize: if out of view clip, do not layout.\n\t // But take care that if do not render node out of view clip,\n\t // how to calculate start po\n\t\n\t var viewRootLayout = {\n\t x: 0, y: 0,\n\t width: rootSize[0], height: rootSize[1],\n\t area: rootSize[0] * rootSize[1]\n\t };\n\t viewRoot.setLayout(viewRootLayout);\n\t\n\t squarify(viewRoot, options, false, 0);\n\t // Supplement layout.\n\t var viewRootLayout = viewRoot.getLayout();\n\t each(viewAbovePath, function (node, index) {\n\t var childValue = (viewAbovePath[index + 1] || viewRoot).getValue();\n\t node.setLayout(zrUtil.extend(\n\t {dataExtent: [childValue, childValue], borderWidth: 0},\n\t viewRootLayout\n\t ));\n\t });\n\t }\n\t\n\t var treeRoot = seriesModel.getData().tree.root;\n\t\n\t treeRoot.setLayout(\n\t calculateRootPosition(layoutInfo, rootRect, targetInfo),\n\t true\n\t );\n\t\n\t seriesModel.setLayoutInfo(layoutInfo);\n\t\n\t // FIXME\n\t // 现在没有clip功能,暂时取ec高宽。\n\t prunning(\n\t treeRoot,\n\t // Transform to base element coordinate system.\n\t new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight),\n\t viewAbovePath,\n\t viewRoot,\n\t 0\n\t );\n\t });\n\t }\n\t\n\t /**\n\t * Layout treemap with squarify algorithm.\n\t * @see https://graphics.ethz.ch/teaching/scivis_common/Literature/squarifiedTreeMaps.pdf\n\t * @see https://github.com/mbostock/d3/blob/master/src/layout/treemap.js\n\t *\n\t * @protected\n\t * @param {module:echarts/data/Tree~TreeNode} node\n\t * @param {Object} options\n\t * @param {string} options.sort 'asc' or 'desc'\n\t * @param {number} options.squareRatio\n\t * @param {boolean} hideChildren\n\t * @param {number} depth\n\t */\n\t function squarify(node, options, hideChildren, depth) {\n\t var width;\n\t var height;\n\t\n\t if (node.isRemoved()) {\n\t return;\n\t }\n\t\n\t var thisLayout = node.getLayout();\n\t width = thisLayout.width;\n\t height = thisLayout.height;\n\t\n\t // Considering border and gap\n\t var itemStyleModel = node.getModel('itemStyle.normal');\n\t var borderWidth = itemStyleModel.get('borderWidth');\n\t var halfGapWidth = itemStyleModel.get('gapWidth') / 2;\n\t var layoutOffset = borderWidth - halfGapWidth;\n\t var nodeModel = node.getModel();\n\t\n\t node.setLayout({borderWidth: borderWidth}, true);\n\t\n\t width = mathMax(width - 2 * layoutOffset, 0);\n\t height = mathMax(height - 2 * layoutOffset, 0);\n\t\n\t var totalArea = width * height;\n\t var viewChildren = initChildren(\n\t node, nodeModel, totalArea, options, hideChildren, depth\n\t );\n\t\n\t if (!viewChildren.length) {\n\t return;\n\t }\n\t\n\t var rect = {x: layoutOffset, y: layoutOffset, width: width, height: height};\n\t var rowFixedLength = mathMin(width, height);\n\t var best = Infinity; // the best row score so far\n\t var row = [];\n\t row.area = 0;\n\t\n\t for (var i = 0, len = viewChildren.length; i < len;) {\n\t var child = viewChildren[i];\n\t\n\t row.push(child);\n\t row.area += child.getLayout().area;\n\t var score = worst(row, rowFixedLength, options.squareRatio);\n\t\n\t // continue with this orientation\n\t if (score <= best) {\n\t i++;\n\t best = score;\n\t }\n\t // abort, and try a different orientation\n\t else {\n\t row.area -= row.pop().getLayout().area;\n\t position(row, rowFixedLength, rect, halfGapWidth, false);\n\t rowFixedLength = mathMin(rect.width, rect.height);\n\t row.length = row.area = 0;\n\t best = Infinity;\n\t }\n\t }\n\t\n\t if (row.length) {\n\t position(row, rowFixedLength, rect, halfGapWidth, true);\n\t }\n\t\n\t if (!hideChildren) {\n\t var childrenVisibleMin = nodeModel.get('childrenVisibleMin');\n\t if (childrenVisibleMin != null && totalArea < childrenVisibleMin) {\n\t hideChildren = true;\n\t }\n\t }\n\t\n\t for (var i = 0, len = viewChildren.length; i < len; i++) {\n\t squarify(viewChildren[i], options, hideChildren, depth + 1);\n\t }\n\t }\n\t\n\t /**\n\t * Set area to each child, and calculate data extent for visual coding.\n\t */\n\t function initChildren(node, nodeModel, totalArea, options, hideChildren, depth) {\n\t var viewChildren = node.children || [];\n\t var orderBy = options.sort;\n\t orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null);\n\t\n\t var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth;\n\t\n\t // leafDepth has higher priority.\n\t if (hideChildren && !overLeafDepth) {\n\t return (node.viewChildren = []);\n\t }\n\t\n\t // Sort children, order by desc.\n\t viewChildren = zrUtil.filter(viewChildren, function (child) {\n\t return !child.isRemoved();\n\t });\n\t\n\t sort(viewChildren, orderBy);\n\t\n\t var info = statistic(nodeModel, viewChildren, orderBy);\n\t\n\t if (info.sum === 0) {\n\t return (node.viewChildren = []);\n\t }\n\t\n\t info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren);\n\t\n\t if (info.sum === 0) {\n\t return (node.viewChildren = []);\n\t }\n\t\n\t // Set area to each child.\n\t for (var i = 0, len = viewChildren.length; i < len; i++) {\n\t var area = viewChildren[i].getValue() / info.sum * totalArea;\n\t // Do not use setLayout({...}, true), because it is needed to clear last layout.\n\t viewChildren[i].setLayout({area: area});\n\t }\n\t\n\t if (overLeafDepth) {\n\t viewChildren.length && node.setLayout({isLeafRoot: true}, true);\n\t viewChildren.length = 0;\n\t }\n\t\n\t node.viewChildren = viewChildren;\n\t node.setLayout({dataExtent: info.dataExtent}, true);\n\t\n\t return viewChildren;\n\t }\n\t\n\t /**\n\t * Consider 'visibleMin'. Modify viewChildren and get new sum.\n\t */\n\t function filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) {\n\t\n\t // visibleMin is not supported yet when no option.sort.\n\t if (!orderBy) {\n\t return sum;\n\t }\n\t\n\t var visibleMin = nodeModel.get('visibleMin');\n\t var len = orderedChildren.length;\n\t var deletePoint = len;\n\t\n\t // Always travel from little value to big value.\n\t for (var i = len - 1; i >= 0; i--) {\n\t var value = orderedChildren[\n\t orderBy === 'asc' ? len - i - 1 : i\n\t ].getValue();\n\t\n\t if (value / sum * totalArea < visibleMin) {\n\t deletePoint = i;\n\t sum -= value;\n\t }\n\t }\n\t\n\t orderBy === 'asc'\n\t ? orderedChildren.splice(0, len - deletePoint)\n\t : orderedChildren.splice(deletePoint, len - deletePoint);\n\t\n\t return sum;\n\t }\n\t\n\t /**\n\t * Sort\n\t */\n\t function sort(viewChildren, orderBy) {\n\t if (orderBy) {\n\t viewChildren.sort(function (a, b) {\n\t return orderBy === 'asc'\n\t ? a.getValue() - b.getValue() : b.getValue() - a.getValue();\n\t });\n\t }\n\t return viewChildren;\n\t }\n\t\n\t /**\n\t * Statistic\n\t */\n\t function statistic(nodeModel, children, orderBy) {\n\t // Calculate sum.\n\t var sum = 0;\n\t for (var i = 0, len = children.length; i < len; i++) {\n\t sum += children[i].getValue();\n\t }\n\t\n\t // Statistic data extent for latter visual coding.\n\t // Notice: data extent should be calculate based on raw children\n\t // but not filtered view children, otherwise visual mapping will not\n\t // be stable when zoom (where children is filtered by visibleMin).\n\t\n\t var dimension = nodeModel.get('visualDimension');\n\t var dataExtent;\n\t\n\t // The same as area dimension.\n\t if (!children || !children.length) {\n\t dataExtent = [NaN, NaN];\n\t }\n\t else if (dimension === 'value' && orderBy) {\n\t dataExtent = [\n\t children[children.length - 1].getValue(),\n\t children[0].getValue()\n\t ];\n\t orderBy === 'asc' && dataExtent.reverse();\n\t }\n\t // Other dimension.\n\t else {\n\t var dataExtent = [Infinity, -Infinity];\n\t each(children, function (child) {\n\t var value = child.getValue(dimension);\n\t value < dataExtent[0] && (dataExtent[0] = value);\n\t value > dataExtent[1] && (dataExtent[1] = value);\n\t });\n\t }\n\t\n\t return {sum: sum, dataExtent: dataExtent};\n\t }\n\t\n\t /**\n\t * Computes the score for the specified row,\n\t * as the worst aspect ratio.\n\t */\n\t function worst(row, rowFixedLength, ratio) {\n\t var areaMax = 0;\n\t var areaMin = Infinity;\n\t\n\t for (var i = 0, area, len = row.length; i < len; i++) {\n\t area = row[i].getLayout().area;\n\t if (area) {\n\t area < areaMin && (areaMin = area);\n\t area > areaMax && (areaMax = area);\n\t }\n\t }\n\t\n\t var squareArea = row.area * row.area;\n\t var f = rowFixedLength * rowFixedLength * ratio;\n\t\n\t return squareArea\n\t ? mathMax(\n\t (f * areaMax) / squareArea,\n\t squareArea / (f * areaMin)\n\t )\n\t : Infinity;\n\t }\n\t\n\t /**\n\t * Positions the specified row of nodes. Modifies `rect`.\n\t */\n\t function position(row, rowFixedLength, rect, halfGapWidth, flush) {\n\t // When rowFixedLength === rect.width,\n\t // it is horizontal subdivision,\n\t // rowFixedLength is the width of the subdivision,\n\t // rowOtherLength is the height of the subdivision,\n\t // and nodes will be positioned from left to right.\n\t\n\t // wh[idx0WhenH] means: when horizontal,\n\t // wh[idx0WhenH] => wh[0] => 'width'.\n\t // xy[idx1WhenH] => xy[1] => 'y'.\n\t var idx0WhenH = rowFixedLength === rect.width ? 0 : 1;\n\t var idx1WhenH = 1 - idx0WhenH;\n\t var xy = ['x', 'y'];\n\t var wh = ['width', 'height'];\n\t\n\t var last = rect[xy[idx0WhenH]];\n\t var rowOtherLength = rowFixedLength\n\t ? row.area / rowFixedLength : 0;\n\t\n\t if (flush || rowOtherLength > rect[wh[idx1WhenH]]) {\n\t rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow\n\t }\n\t for (var i = 0, rowLen = row.length; i < rowLen; i++) {\n\t var node = row[i];\n\t var nodeLayout = {};\n\t var step = rowOtherLength\n\t ? node.getLayout().area / rowOtherLength : 0;\n\t\n\t var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax(rowOtherLength - 2 * halfGapWidth, 0);\n\t\n\t // We use Math.max/min to avoid negative width/height when considering gap width.\n\t var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last;\n\t var modWH = (i === rowLen - 1 || remain < step) ? remain : step;\n\t var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax(modWH - 2 * halfGapWidth, 0);\n\t\n\t nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin(halfGapWidth, wh1 / 2);\n\t nodeLayout[xy[idx0WhenH]] = last + mathMin(halfGapWidth, wh0 / 2);\n\t\n\t last += modWH;\n\t node.setLayout(nodeLayout, true);\n\t }\n\t\n\t rect[xy[idx1WhenH]] += rowOtherLength;\n\t rect[wh[idx1WhenH]] -= rowOtherLength;\n\t }\n\t\n\t // Return [containerWidth, containerHeight] as defualt.\n\t function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) {\n\t // If targetInfo.node exists, we zoom to the node,\n\t // so estimate whold width and heigth by target node.\n\t var currNode = (targetInfo || {}).node;\n\t var defaultSize = [containerWidth, containerHeight];\n\t\n\t if (!currNode || currNode === viewRoot) {\n\t return defaultSize;\n\t }\n\t\n\t var parent;\n\t var viewArea = containerWidth * containerHeight;\n\t var area = viewArea * seriesModel.option.zoomToNodeRatio;\n\t\n\t while (parent = currNode.parentNode) { // jshint ignore:line\n\t var sum = 0;\n\t var siblings = parent.children;\n\t\n\t for (var i = 0, len = siblings.length; i < len; i++) {\n\t sum += siblings[i].getValue();\n\t }\n\t var currNodeValue = currNode.getValue();\n\t if (currNodeValue === 0) {\n\t return defaultSize;\n\t }\n\t area *= sum / currNodeValue;\n\t\n\t var borderWidth = parent.getModel('itemStyle.normal').get('borderWidth');\n\t\n\t if (isFinite(borderWidth)) {\n\t // Considering border, suppose aspect ratio is 1.\n\t area += 4 * borderWidth * borderWidth + 4 * borderWidth * Math.pow(area, 0.5);\n\t }\n\t\n\t area > numberUtil.MAX_SAFE_INTEGER && (area = numberUtil.MAX_SAFE_INTEGER);\n\t\n\t currNode = parent;\n\t }\n\t\n\t area < viewArea && (area = viewArea);\n\t var scale = Math.pow(area / viewArea, 0.5);\n\t\n\t return [containerWidth * scale, containerHeight * scale];\n\t }\n\t\n\t // Root postion base on coord of containerGroup\n\t function calculateRootPosition(layoutInfo, rootRect, targetInfo) {\n\t if (rootRect) {\n\t return {x: rootRect.x, y: rootRect.y};\n\t }\n\t\n\t var defaultPosition = {x: 0, y: 0};\n\t if (!targetInfo) {\n\t return defaultPosition;\n\t }\n\t\n\t // If targetInfo is fetched by 'retrieveTargetInfo',\n\t // old tree and new tree are the same tree,\n\t // so the node still exists and we can visit it.\n\t\n\t var targetNode = targetInfo.node;\n\t var layout = targetNode.getLayout();\n\t\n\t if (!layout) {\n\t return defaultPosition;\n\t }\n\t\n\t // Transform coord from local to container.\n\t var targetCenter = [layout.width / 2, layout.height / 2];\n\t var node = targetNode;\n\t while (node) {\n\t var nodeLayout = node.getLayout();\n\t targetCenter[0] += nodeLayout.x;\n\t targetCenter[1] += nodeLayout.y;\n\t node = node.parentNode;\n\t }\n\t\n\t return {\n\t x: layoutInfo.width / 2 - targetCenter[0],\n\t y: layoutInfo.height / 2 - targetCenter[1]\n\t };\n\t }\n\t\n\t // Mark nodes visible for prunning when visual coding and rendering.\n\t // Prunning depends on layout and root position, so we have to do it after layout.\n\t function prunning(node, clipRect, viewAbovePath, viewRoot, depth) {\n\t var nodeLayout = node.getLayout();\n\t var nodeInViewAbovePath = viewAbovePath[depth];\n\t var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node;\n\t\n\t if (\n\t (nodeInViewAbovePath && !isAboveViewRoot)\n\t || (depth === viewAbovePath.length && node !== viewRoot)\n\t ) {\n\t return;\n\t }\n\t\n\t node.setLayout({\n\t // isInView means: viewRoot sub tree + viewAbovePath\n\t isInView: true,\n\t // invisible only means: outside view clip so that the node can not\n\t // see but still layout for animation preparation but not render.\n\t invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout),\n\t isAboveViewRoot: isAboveViewRoot\n\t }, true);\n\t\n\t // Transform to child coordinate.\n\t var childClipRect = new BoundingRect(\n\t clipRect.x - nodeLayout.x,\n\t clipRect.y - nodeLayout.y,\n\t clipRect.width,\n\t clipRect.height\n\t );\n\t\n\t each(node.viewChildren || [], function (child) {\n\t prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1);\n\t });\n\t }\n\t\n\t module.exports = update;\n\n\n/***/ },\n/* 612 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var VisualMapping = __webpack_require__(69);\n\t var zrColor = __webpack_require__(51);\n\t var zrUtil = __webpack_require__(1);\n\t var isArray = zrUtil.isArray;\n\t\n\t var ITEM_STYLE_NORMAL = 'itemStyle.normal';\n\t\n\t module.exports = function (ecModel, api, payload) {\n\t\n\t var condition = {mainType: 'series', subType: 'treemap', query: payload};\n\t ecModel.eachComponent(condition, function (seriesModel) {\n\t\n\t var tree = seriesModel.getData().tree;\n\t var root = tree.root;\n\t var seriesItemStyleModel = seriesModel.getModel(ITEM_STYLE_NORMAL);\n\t\n\t if (root.isRemoved()) {\n\t return;\n\t }\n\t\n\t var levelItemStyles = zrUtil.map(tree.levelModels, function (levelModel) {\n\t return levelModel ? levelModel.get(ITEM_STYLE_NORMAL) : null;\n\t });\n\t\n\t travelTree(\n\t root, // Visual should calculate from tree root but not view root.\n\t {},\n\t levelItemStyles,\n\t seriesItemStyleModel,\n\t seriesModel.getViewRoot().getAncestors(),\n\t seriesModel\n\t );\n\t });\n\t };\n\t\n\t function travelTree(\n\t node, designatedVisual, levelItemStyles, seriesItemStyleModel,\n\t viewRootAncestors, seriesModel\n\t ) {\n\t var nodeModel = node.getModel();\n\t var nodeLayout = node.getLayout();\n\t\n\t // Optimize\n\t if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) {\n\t return;\n\t }\n\t\n\t var nodeItemStyleModel = node.getModel(ITEM_STYLE_NORMAL);\n\t var levelItemStyle = levelItemStyles[node.depth];\n\t var visuals = buildVisuals(\n\t nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel\n\t );\n\t\n\t // calculate border color\n\t var borderColor = nodeItemStyleModel.get('borderColor');\n\t var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation');\n\t var thisNodeColor;\n\t if (borderColorSaturation != null) {\n\t // For performance, do not always execute 'calculateColor'.\n\t thisNodeColor = calculateColor(visuals, node);\n\t borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor);\n\t }\n\t node.setVisual('borderColor', borderColor);\n\t\n\t var viewChildren = node.viewChildren;\n\t if (!viewChildren || !viewChildren.length) {\n\t thisNodeColor = calculateColor(visuals, node);\n\t // Apply visual to this node.\n\t node.setVisual('color', thisNodeColor);\n\t }\n\t else {\n\t var mapping = buildVisualMapping(\n\t node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren\n\t );\n\t\n\t // Designate visual to children.\n\t zrUtil.each(viewChildren, function (child, index) {\n\t // If higher than viewRoot, only ancestors of viewRoot is needed to visit.\n\t if (child.depth >= viewRootAncestors.length\n\t || child === viewRootAncestors[child.depth]\n\t ) {\n\t var childVisual = mapVisual(\n\t nodeModel, visuals, child, index, mapping, seriesModel\n\t );\n\t travelTree(\n\t child, childVisual, levelItemStyles, seriesItemStyleModel,\n\t viewRootAncestors, seriesModel\n\t );\n\t }\n\t });\n\t }\n\t }\n\t\n\t function buildVisuals(\n\t nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel\n\t ) {\n\t var visuals = zrUtil.extend({}, designatedVisual);\n\t\n\t zrUtil.each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) {\n\t // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel\n\t var val = nodeItemStyleModel.get(visualName, true); // Ignore parent\n\t val == null && levelItemStyle && (val = levelItemStyle[visualName]);\n\t val == null && (val = designatedVisual[visualName]);\n\t val == null && (val = seriesItemStyleModel.get(visualName));\n\t\n\t val != null && (visuals[visualName] = val);\n\t });\n\t\n\t return visuals;\n\t }\n\t\n\t function calculateColor(visuals) {\n\t var color = getValueVisualDefine(visuals, 'color');\n\t\n\t if (color) {\n\t var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha');\n\t var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation');\n\t if (colorSaturation) {\n\t color = zrColor.modifyHSL(color, null, null, colorSaturation);\n\t }\n\t if (colorAlpha) {\n\t color = zrColor.modifyAlpha(color, colorAlpha);\n\t }\n\t\n\t return color;\n\t }\n\t }\n\t\n\t function calculateBorderColor(borderColorSaturation, thisNodeColor) {\n\t return thisNodeColor != null\n\t ? zrColor.modifyHSL(thisNodeColor, null, null, borderColorSaturation)\n\t : null;\n\t }\n\t\n\t function getValueVisualDefine(visuals, name) {\n\t var value = visuals[name];\n\t if (value != null && value !== 'none') {\n\t return value;\n\t }\n\t }\n\t\n\t function buildVisualMapping(\n\t node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren\n\t ) {\n\t if (!viewChildren || !viewChildren.length) {\n\t return;\n\t }\n\t\n\t var rangeVisual = getRangeVisual(nodeModel, 'color')\n\t || (\n\t visuals.color != null\n\t && visuals.color !== 'none'\n\t && (\n\t getRangeVisual(nodeModel, 'colorAlpha')\n\t || getRangeVisual(nodeModel, 'colorSaturation')\n\t )\n\t );\n\t\n\t if (!rangeVisual) {\n\t return;\n\t }\n\t\n\t var visualMin = nodeModel.get('visualMin');\n\t var visualMax = nodeModel.get('visualMax');\n\t var dataExtent = nodeLayout.dataExtent.slice();\n\t visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin);\n\t visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax);\n\t\n\t var colorMappingBy = nodeModel.get('colorMappingBy');\n\t var opt = {\n\t type: rangeVisual.name,\n\t dataExtent: dataExtent,\n\t visual: rangeVisual.range\n\t };\n\t if (opt.type === 'color'\n\t && (colorMappingBy === 'index' || colorMappingBy === 'id')\n\t ) {\n\t opt.mappingMethod = 'category';\n\t opt.loop = true;\n\t // categories is ordinal, so do not set opt.categories.\n\t }\n\t else {\n\t opt.mappingMethod = 'linear';\n\t }\n\t\n\t var mapping = new VisualMapping(opt);\n\t mapping.__drColorMappingBy = colorMappingBy;\n\t\n\t return mapping;\n\t }\n\t\n\t // Notice: If we dont have the attribute 'colorRange', but only use\n\t // attribute 'color' to represent both concepts of 'colorRange' and 'color',\n\t // (It means 'colorRange' when 'color' is Array, means 'color' when not array),\n\t // this problem will be encountered:\n\t // If a level-1 node dont have children, and its siblings has children,\n\t // and colorRange is set on level-1, then the node can not be colored.\n\t // So we separate 'colorRange' and 'color' to different attributes.\n\t function getRangeVisual(nodeModel, name) {\n\t // 'colorRange', 'colorARange', 'colorSRange'.\n\t // If not exsits on this node, fetch from levels and series.\n\t var range = nodeModel.get(name);\n\t return (isArray(range) && range.length) ? {name: name, range: range} : null;\n\t }\n\t\n\t function mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) {\n\t var childVisuals = zrUtil.extend({}, visuals);\n\t\n\t if (mapping) {\n\t var mappingType = mapping.type;\n\t var colorMappingBy = mappingType === 'color' && mapping.__drColorMappingBy;\n\t var value =\n\t colorMappingBy === 'index'\n\t ? index\n\t : colorMappingBy === 'id'\n\t ? seriesModel.mapIdToIndex(child.getId())\n\t : child.getValue(nodeModel.get('visualDimension'));\n\t\n\t childVisuals[mappingType] = mapping.mapValueToVisual(value);\n\t }\n\t\n\t return childVisuals;\n\t }\n\t\n\n\n/***/ },\n/* 613 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t __webpack_require__(159);\n\t\n\t __webpack_require__(615);\n\n\n/***/ },\n/* 614 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// TODO boundaryGap\n\t\n\t\n\t __webpack_require__(236);\n\t\n\t __webpack_require__(616);\n\n\n/***/ },\n/* 615 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var Model = __webpack_require__(21);\n\t\n\t var elementList = ['axisLine', 'axisLabel', 'axisTick', 'splitLine', 'splitArea'];\n\t\n\t function getAxisLineShape(polar, r0, r, angle) {\n\t var start = polar.coordToPoint([r0, angle]);\n\t var end = polar.coordToPoint([r, angle]);\n\t\n\t return {\n\t x1: start[0],\n\t y1: start[1],\n\t x2: end[0],\n\t y2: end[1]\n\t };\n\t }\n\t __webpack_require__(3).extendComponentView({\n\t\n\t type: 'angleAxis',\n\t\n\t render: function (angleAxisModel, ecModel) {\n\t this.group.removeAll();\n\t if (!angleAxisModel.get('show')) {\n\t return;\n\t }\n\t\n\t var polarModel = ecModel.getComponent('polar', angleAxisModel.get('polarIndex'));\n\t var angleAxis = angleAxisModel.axis;\n\t var polar = polarModel.coordinateSystem;\n\t var radiusExtent = polar.getRadiusAxis().getExtent();\n\t var ticksAngles = angleAxis.getTicksCoords();\n\t\n\t if (angleAxis.type !== 'category') {\n\t // Remove the last tick which will overlap the first tick\n\t ticksAngles.pop();\n\t }\n\t\n\t zrUtil.each(elementList, function (name) {\n\t if (angleAxisModel.get(name +'.show')) {\n\t this['_' + name](angleAxisModel, polar, ticksAngles, radiusExtent);\n\t }\n\t }, this);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _axisLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) {\n\t var lineStyleModel = angleAxisModel.getModel('axisLine.lineStyle');\n\t\n\t var circle = new graphic.Circle({\n\t shape: {\n\t cx: polar.cx,\n\t cy: polar.cy,\n\t r: radiusExtent[1]\n\t },\n\t style: lineStyleModel.getLineStyle(),\n\t z2: 1,\n\t silent: true\n\t });\n\t circle.style.fill = null;\n\t\n\t this.group.add(circle);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _axisTick: function (angleAxisModel, polar, ticksAngles, radiusExtent) {\n\t var tickModel = angleAxisModel.getModel('axisTick');\n\t\n\t var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length');\n\t\n\t var lines = zrUtil.map(ticksAngles, function (tickAngle) {\n\t return new graphic.Line({\n\t shape: getAxisLineShape(polar, radiusExtent[1], radiusExtent[1] + tickLen, tickAngle)\n\t });\n\t });\n\t this.group.add(graphic.mergePath(\n\t lines, {\n\t style: zrUtil.defaults(\n\t tickModel.getModel('lineStyle').getLineStyle(),\n\t {\n\t stroke: angleAxisModel.get('axisLine.lineStyle.color')\n\t }\n\t )\n\t }\n\t ));\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _axisLabel: function (angleAxisModel, polar, ticksAngles, radiusExtent) {\n\t var axis = angleAxisModel.axis;\n\t\n\t var categoryData = angleAxisModel.get('data');\n\t\n\t var labelModel = angleAxisModel.getModel('axisLabel');\n\t var axisTextStyleModel = labelModel.getModel('textStyle');\n\t\n\t var labels = angleAxisModel.getFormattedLabels();\n\t\n\t var labelMargin = labelModel.get('margin');\n\t var labelsAngles = axis.getLabelsCoords();\n\t\n\t // Use length of ticksAngles because it may remove the last tick to avoid overlapping\n\t for (var i = 0; i < ticksAngles.length; i++) {\n\t var r = radiusExtent[1];\n\t var p = polar.coordToPoint([r + labelMargin, labelsAngles[i]]);\n\t var cx = polar.cx;\n\t var cy = polar.cy;\n\t\n\t var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3\n\t ? 'center' : (p[0] > cx ? 'left' : 'right');\n\t var labelTextBaseline = Math.abs(p[1] - cy) / r < 0.3\n\t ? 'middle' : (p[1] > cy ? 'top' : 'bottom');\n\t\n\t var textStyleModel = axisTextStyleModel;\n\t if (categoryData && categoryData[i] && categoryData[i].textStyle) {\n\t textStyleModel = new Model(\n\t categoryData[i].textStyle, axisTextStyleModel\n\t );\n\t }\n\t this.group.add(new graphic.Text({\n\t style: {\n\t x: p[0],\n\t y: p[1],\n\t fill: textStyleModel.getTextColor() || angleAxisModel.get('axisLine.lineStyle.color'),\n\t text: labels[i],\n\t textAlign: labelTextAlign,\n\t textVerticalAlign: labelTextBaseline,\n\t textFont: textStyleModel.getFont()\n\t },\n\t silent: true\n\t }));\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _splitLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) {\n\t var splitLineModel = angleAxisModel.getModel('splitLine');\n\t var lineStyleModel = splitLineModel.getModel('lineStyle');\n\t var lineColors = lineStyleModel.get('color');\n\t var lineCount = 0;\n\t\n\t lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n\t\n\t var splitLines = [];\n\t\n\t for (var i = 0; i < ticksAngles.length; i++) {\n\t var colorIndex = (lineCount++) % lineColors.length;\n\t splitLines[colorIndex] = splitLines[colorIndex] || [];\n\t splitLines[colorIndex].push(new graphic.Line({\n\t shape: getAxisLineShape(polar, radiusExtent[0], radiusExtent[1], ticksAngles[i])\n\t }));\n\t }\n\t\n\t // Simple optimization\n\t // Batching the lines if color are the same\n\t for (var i = 0; i < splitLines.length; i++) {\n\t this.group.add(graphic.mergePath(splitLines[i], {\n\t style: zrUtil.defaults({\n\t stroke: lineColors[i % lineColors.length]\n\t }, lineStyleModel.getLineStyle()),\n\t silent: true,\n\t z: angleAxisModel.get('z')\n\t }));\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _splitArea: function (angleAxisModel, polar, ticksAngles, radiusExtent) {\n\t\n\t var splitAreaModel = angleAxisModel.getModel('splitArea');\n\t var areaStyleModel = splitAreaModel.getModel('areaStyle');\n\t var areaColors = areaStyleModel.get('color');\n\t var lineCount = 0;\n\t\n\t areaColors = areaColors instanceof Array ? areaColors : [areaColors];\n\t\n\t var splitAreas = [];\n\t\n\t var RADIAN = Math.PI / 180;\n\t var prevAngle = -ticksAngles[0] * RADIAN;\n\t var r0 = Math.min(radiusExtent[0], radiusExtent[1]);\n\t var r1 = Math.max(radiusExtent[0], radiusExtent[1]);\n\t\n\t var clockwise = angleAxisModel.get('clockwise');\n\t\n\t for (var i = 1; i < ticksAngles.length; i++) {\n\t var colorIndex = (lineCount++) % areaColors.length;\n\t splitAreas[colorIndex] = splitAreas[colorIndex] || [];\n\t splitAreas[colorIndex].push(new graphic.Sector({\n\t shape: {\n\t cx: polar.cx,\n\t cy: polar.cy,\n\t r0: r0,\n\t r: r1,\n\t startAngle: prevAngle,\n\t endAngle: -ticksAngles[i] * RADIAN,\n\t clockwise: clockwise\n\t },\n\t silent: true\n\t }));\n\t prevAngle = -ticksAngles[i] * RADIAN;\n\t }\n\t\n\t // Simple optimization\n\t // Batching the lines if color are the same\n\t for (var i = 0; i < splitAreas.length; i++) {\n\t this.group.add(graphic.mergePath(splitAreas[i], {\n\t style: zrUtil.defaults({\n\t fill: areaColors[i % areaColors.length]\n\t }, areaStyleModel.getAreaStyle()),\n\t silent: true\n\t }));\n\t }\n\t }\n\t });\n\n\n/***/ },\n/* 616 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var AxisBuilder = __webpack_require__(85);\n\t var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick;\n\t var getInterval = AxisBuilder.getInterval;\n\t\n\t var axisBuilderAttrs = [\n\t 'axisLine', 'axisLabel', 'axisTick', 'axisName'\n\t ];\n\t var selfBuilderAttrs = [\n\t 'splitArea', 'splitLine'\n\t ];\n\t\n\t // function getAlignWithLabel(model, axisModel) {\n\t // var alignWithLabel = model.get('alignWithLabel');\n\t // if (alignWithLabel === 'auto') {\n\t // alignWithLabel = axisModel.get('axisTick.alignWithLabel');\n\t // }\n\t // return alignWithLabel;\n\t // }\n\t\n\t var AxisView = __webpack_require__(3).extendComponentView({\n\t\n\t type: 'axis',\n\t\n\t render: function (axisModel, ecModel) {\n\t\n\t this.group.removeAll();\n\t\n\t var oldAxisGroup = this._axisGroup;\n\t this._axisGroup = new graphic.Group();\n\t\n\t this.group.add(this._axisGroup);\n\t\n\t if (!axisModel.get('show')) {\n\t return;\n\t }\n\t\n\t var gridModel = axisModel.findGridModel();\n\t\n\t var layout = layoutAxis(gridModel, axisModel);\n\t\n\t var axisBuilder = new AxisBuilder(axisModel, layout);\n\t\n\t zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);\n\t\n\t this._axisGroup.add(axisBuilder.getGroup());\n\t\n\t zrUtil.each(selfBuilderAttrs, function (name) {\n\t if (axisModel.get(name + '.show')) {\n\t this['_' + name](axisModel, gridModel, layout.labelInterval);\n\t }\n\t }, this);\n\t\n\t graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel);\n\t },\n\t\n\t /**\n\t * @param {module:echarts/coord/cartesian/AxisModel} axisModel\n\t * @param {module:echarts/coord/cartesian/GridModel} gridModel\n\t * @param {number|Function} labelInterval\n\t * @private\n\t */\n\t _splitLine: function (axisModel, gridModel, labelInterval) {\n\t var axis = axisModel.axis;\n\t\n\t var splitLineModel = axisModel.getModel('splitLine');\n\t var lineStyleModel = splitLineModel.getModel('lineStyle');\n\t var lineColors = lineStyleModel.get('color');\n\t\n\t var lineInterval = getInterval(splitLineModel, labelInterval);\n\t\n\t lineColors = zrUtil.isArray(lineColors) ? lineColors : [lineColors];\n\t\n\t var gridRect = gridModel.coordinateSystem.getRect();\n\t var isHorizontal = axis.isHorizontal();\n\t\n\t var lineCount = 0;\n\t\n\t var ticksCoords = axis.getTicksCoords(\n\t // splitLineModel.get('alignWithLabel')\n\t );\n\t var ticks = axis.scale.getTicks();\n\t\n\t var p1 = [];\n\t var p2 = [];\n\t // Simple optimization\n\t // Batching the lines if color are the same\n\t var lineStyle = lineStyleModel.getLineStyle();\n\t for (var i = 0; i < ticksCoords.length; i++) {\n\t if (ifIgnoreOnTick(axis, i, lineInterval)) {\n\t continue;\n\t }\n\t\n\t var tickCoord = axis.toGlobalCoord(ticksCoords[i]);\n\t\n\t if (isHorizontal) {\n\t p1[0] = tickCoord;\n\t p1[1] = gridRect.y;\n\t p2[0] = tickCoord;\n\t p2[1] = gridRect.y + gridRect.height;\n\t }\n\t else {\n\t p1[0] = gridRect.x;\n\t p1[1] = tickCoord;\n\t p2[0] = gridRect.x + gridRect.width;\n\t p2[1] = tickCoord;\n\t }\n\t\n\t var colorIndex = (lineCount++) % lineColors.length;\n\t this._axisGroup.add(new graphic.Line(graphic.subPixelOptimizeLine({\n\t anid: 'line_' + ticks[i],\n\t\n\t shape: {\n\t x1: p1[0],\n\t y1: p1[1],\n\t x2: p2[0],\n\t y2: p2[1]\n\t },\n\t style: zrUtil.defaults({\n\t stroke: lineColors[colorIndex]\n\t }, lineStyle),\n\t silent: true\n\t })));\n\t }\n\t },\n\t\n\t /**\n\t * @param {module:echarts/coord/cartesian/AxisModel} axisModel\n\t * @param {module:echarts/coord/cartesian/GridModel} gridModel\n\t * @param {number|Function} labelInterval\n\t * @private\n\t */\n\t _splitArea: function (axisModel, gridModel, labelInterval) {\n\t var axis = axisModel.axis;\n\t\n\t var splitAreaModel = axisModel.getModel('splitArea');\n\t var areaStyleModel = splitAreaModel.getModel('areaStyle');\n\t var areaColors = areaStyleModel.get('color');\n\t\n\t var gridRect = gridModel.coordinateSystem.getRect();\n\t\n\t var ticksCoords = axis.getTicksCoords(\n\t // splitAreaModel.get('alignWithLabel')\n\t );\n\t var ticks = axis.scale.getTicks();\n\t\n\t var prevX = axis.toGlobalCoord(ticksCoords[0]);\n\t var prevY = axis.toGlobalCoord(ticksCoords[0]);\n\t\n\t var count = 0;\n\t\n\t var areaInterval = getInterval(splitAreaModel, labelInterval);\n\t\n\t var areaStyle = areaStyleModel.getAreaStyle();\n\t areaColors = zrUtil.isArray(areaColors) ? areaColors : [areaColors];\n\t\n\t for (var i = 1; i < ticksCoords.length; i++) {\n\t if (ifIgnoreOnTick(axis, i, areaInterval)) {\n\t continue;\n\t }\n\t\n\t var tickCoord = axis.toGlobalCoord(ticksCoords[i]);\n\t\n\t var x;\n\t var y;\n\t var width;\n\t var height;\n\t if (axis.isHorizontal()) {\n\t x = prevX;\n\t y = gridRect.y;\n\t width = tickCoord - x;\n\t height = gridRect.height;\n\t }\n\t else {\n\t x = gridRect.x;\n\t y = prevY;\n\t width = gridRect.width;\n\t height = tickCoord - y;\n\t }\n\t\n\t var colorIndex = (count++) % areaColors.length;\n\t this._axisGroup.add(new graphic.Rect({\n\t anid: 'area_' + ticks[i],\n\t\n\t shape: {\n\t x: x,\n\t y: y,\n\t width: width,\n\t height: height\n\t },\n\t style: zrUtil.defaults({\n\t fill: areaColors[colorIndex]\n\t }, areaStyle),\n\t silent: true\n\t }));\n\t\n\t prevX = x + width;\n\t prevY = y + height;\n\t }\n\t }\n\t });\n\t\n\t AxisView.extend({\n\t type: 'xAxis'\n\t });\n\t AxisView.extend({\n\t type: 'yAxis'\n\t });\n\t\n\t /**\n\t * @inner\n\t */\n\t function layoutAxis(gridModel, axisModel) {\n\t var grid = gridModel.coordinateSystem;\n\t var axis = axisModel.axis;\n\t var layout = {};\n\t\n\t var rawAxisPosition = axis.position;\n\t var axisPosition = axis.onZero ? 'onZero' : rawAxisPosition;\n\t var axisDim = axis.dim;\n\t\n\t // [left, right, top, bottom]\n\t var rect = grid.getRect();\n\t var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];\n\t\n\t var axisOffset = axisModel.get('offset') || 0;\n\t\n\t var posMap = {\n\t x: { top: rectBound[2] - axisOffset, bottom: rectBound[3] + axisOffset },\n\t y: { left: rectBound[0] - axisOffset, right: rectBound[1] + axisOffset }\n\t };\n\t\n\t posMap.x.onZero = Math.max(Math.min(getZero('y'), posMap.x.bottom), posMap.x.top);\n\t posMap.y.onZero = Math.max(Math.min(getZero('x'), posMap.y.right), posMap.y.left);\n\t\n\t function getZero(dim, val) {\n\t var theAxis = grid.getAxis(dim);\n\t return theAxis.toGlobalCoord(theAxis.dataToCoord(0));\n\t }\n\t\n\t // Axis position\n\t layout.position = [\n\t axisDim === 'y' ? posMap.y[axisPosition] : rectBound[0],\n\t axisDim === 'x' ? posMap.x[axisPosition] : rectBound[3]\n\t ];\n\t\n\t // Axis rotation\n\t layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1);\n\t\n\t // Tick and label direction, x y is axisDim\n\t var dirMap = {top: -1, bottom: 1, left: -1, right: 1};\n\t\n\t layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition];\n\t if (axis.onZero) {\n\t layout.labelOffset = posMap[axisDim][rawAxisPosition] - posMap[axisDim].onZero;\n\t }\n\t\n\t if (axisModel.getModel('axisTick').get('inside')) {\n\t layout.tickDirection = -layout.tickDirection;\n\t }\n\t if (axisModel.getModel('axisLabel').get('inside')) {\n\t layout.labelDirection = -layout.labelDirection;\n\t }\n\t\n\t // Special label rotation\n\t var labelRotation = axisModel.getModel('axisLabel').get('rotate');\n\t layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation;\n\t\n\t // label interval when auto mode.\n\t layout.labelInterval = axis.getLabelInterval();\n\t\n\t // Over splitLine and splitArea\n\t layout.z2 = 1;\n\t\n\t return layout;\n\t }\n\n\n/***/ },\n/* 617 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var AxisBuilder = __webpack_require__(85);\n\t var BrushController = __webpack_require__(152);\n\t var graphic = __webpack_require__(4);\n\t\n\t var elementList = ['axisLine', 'axisLabel', 'axisTick', 'axisName'];\n\t\n\t var AxisView = __webpack_require__(3).extendComponentView({\n\t\n\t type: 'parallelAxis',\n\t\n\t /**\n\t * @override\n\t */\n\t init: function (ecModel, api) {\n\t AxisView.superApply(this, 'init', arguments);\n\t\n\t /**\n\t * @type {module:echarts/component/helper/BrushController}\n\t */\n\t (this._brushController = new BrushController(api.getZr()))\n\t .on('brush', zrUtil.bind(this._onBrush, this));\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t render: function (axisModel, ecModel, api, payload) {\n\t if (fromAxisAreaSelect(axisModel, ecModel, payload)) {\n\t return;\n\t }\n\t\n\t this.axisModel = axisModel;\n\t this.api = api;\n\t\n\t this.group.removeAll();\n\t\n\t var oldAxisGroup = this._axisGroup;\n\t this._axisGroup = new graphic.Group();\n\t this.group.add(this._axisGroup);\n\t\n\t if (!axisModel.get('show')) {\n\t return;\n\t }\n\t\n\t var coordSys = ecModel.getComponent(\n\t 'parallel', axisModel.get('parallelIndex')\n\t ).coordinateSystem;\n\t\n\t var areaSelectStyle = axisModel.getAreaSelectStyle();\n\t var areaWidth = areaSelectStyle.width;\n\t\n\t var dim = axisModel.axis.dim;\n\t var axisLayout = coordSys.getAxisLayout(dim);\n\t\n\t // Fetch from axisModel by default.\n\t var axisLabelShow;\n\t var axisIndex = zrUtil.indexOf(coordSys.dimensions, dim);\n\t\n\t var axisExpandWindow = axisLayout.axisExpandWindow;\n\t if (axisExpandWindow\n\t && (axisIndex <= axisExpandWindow[0] || axisIndex >= axisExpandWindow[1])\n\t ) {\n\t axisLabelShow = false;\n\t }\n\t\n\t var builderOpt = zrUtil.extend(\n\t {\n\t axisLabelShow: axisLabelShow,\n\t strokeContainThreshold: areaWidth\n\t },\n\t axisLayout\n\t );\n\t\n\t var axisBuilder = new AxisBuilder(axisModel, builderOpt);\n\t\n\t zrUtil.each(elementList, axisBuilder.add, axisBuilder);\n\t\n\t this._axisGroup.add(axisBuilder.getGroup());\n\t\n\t this._refreshBrushController(builderOpt, areaSelectStyle, axisModel, areaWidth);\n\t\n\t graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel);\n\t },\n\t\n\t _refreshBrushController: function (builderOpt, areaSelectStyle, axisModel, areaWidth) {\n\t // After filtering, axis may change, select area needs to be update.\n\t var axis = axisModel.axis;\n\t var coverInfoList = zrUtil.map(axisModel.activeIntervals, function (interval) {\n\t return {\n\t brushType: 'lineX',\n\t panelId: 'pl',\n\t range: [\n\t axis.dataToCoord(interval[0], true),\n\t axis.dataToCoord(interval[1], true)\n\t ]\n\t };\n\t });\n\t\n\t var extent = axis.getExtent();\n\t var extentLen = extent[1] - extent[0];\n\t var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value.\n\t\n\t // width/height might be negative, which will be\n\t // normalized in BoundingRect.\n\t var rect = graphic.BoundingRect.create({\n\t x: extent[0],\n\t y: -areaWidth / 2,\n\t width: extentLen,\n\t height: areaWidth\n\t });\n\t rect.x -= extra;\n\t rect.width += 2 * extra;\n\t\n\t this._brushController\n\t .mount({\n\t enableGlobalPan: true,\n\t rotation: builderOpt.rotation,\n\t position: builderOpt.position\n\t })\n\t .setPanels([{\n\t panelId: 'pl',\n\t rect: rect\n\t }])\n\t .enableBrush({\n\t brushType: 'lineX',\n\t brushStyle: areaSelectStyle,\n\t removeOnClick: true\n\t })\n\t .updateCovers(coverInfoList);\n\t },\n\t\n\t _onBrush: function (coverInfoList, opt) {\n\t // Do not cache these object, because the mey be changed.\n\t var axisModel = this.axisModel;\n\t var axis = axisModel.axis;\n\t\n\t var intervals = zrUtil.map(coverInfoList, function (coverInfo) {\n\t return [\n\t axis.coordToData(coverInfo.range[0], true),\n\t axis.coordToData(coverInfo.range[1], true)\n\t ];\n\t });\n\t\n\t // If realtime is true, action is not dispatched on drag end, because\n\t // the drag end emits the same params with the last drag move event,\n\t // and may have some delay when using touch pad.\n\t if (!axisModel.option.realtime === opt.isEnd || opt.removeOnClick) { // jshint ignore:line\n\t this.api.dispatchAction({\n\t type: 'axisAreaSelect',\n\t parallelAxisId: axisModel.id,\n\t intervals: intervals\n\t });\n\t }\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t dispose: function () {\n\t this._brushController.dispose();\n\t }\n\t });\n\t\n\t function fromAxisAreaSelect(axisModel, ecModel, payload) {\n\t return payload\n\t && payload.type === 'axisAreaSelect'\n\t && ecModel.findComponents(\n\t {mainType: 'parallelAxis', query: payload}\n\t )[0] === axisModel;\n\t }\n\t\n\t module.exports = AxisView;\n\n\n/***/ },\n/* 618 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var AxisBuilder = __webpack_require__(85);\n\t\n\t var axisBuilderAttrs = [\n\t 'axisLine', 'axisLabel', 'axisTick', 'axisName'\n\t ];\n\t var selfBuilderAttrs = [\n\t 'splitLine', 'splitArea'\n\t ];\n\t\n\t __webpack_require__(3).extendComponentView({\n\t\n\t type: 'radiusAxis',\n\t\n\t render: function (radiusAxisModel, ecModel) {\n\t this.group.removeAll();\n\t if (!radiusAxisModel.get('show')) {\n\t return;\n\t }\n\t var polarModel = ecModel.getComponent('polar', radiusAxisModel.get('polarIndex'));\n\t var angleAxis = polarModel.coordinateSystem.getAngleAxis();\n\t var radiusAxis = radiusAxisModel.axis;\n\t var polar = polarModel.coordinateSystem;\n\t var ticksCoords = radiusAxis.getTicksCoords();\n\t var axisAngle = angleAxis.getExtent()[0];\n\t var radiusExtent = radiusAxis.getExtent();\n\t\n\t var layout = layoutAxis(polar, radiusAxisModel, axisAngle);\n\t var axisBuilder = new AxisBuilder(radiusAxisModel, layout);\n\t zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);\n\t this.group.add(axisBuilder.getGroup());\n\t\n\t zrUtil.each(selfBuilderAttrs, function (name) {\n\t if (radiusAxisModel.get(name +'.show')) {\n\t this['_' + name](radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords);\n\t }\n\t }, this);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _splitLine: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {\n\t var splitLineModel = radiusAxisModel.getModel('splitLine');\n\t var lineStyleModel = splitLineModel.getModel('lineStyle');\n\t var lineColors = lineStyleModel.get('color');\n\t var lineCount = 0;\n\t\n\t lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n\t\n\t var splitLines = [];\n\t\n\t for (var i = 0; i < ticksCoords.length; i++) {\n\t var colorIndex = (lineCount++) % lineColors.length;\n\t splitLines[colorIndex] = splitLines[colorIndex] || [];\n\t splitLines[colorIndex].push(new graphic.Circle({\n\t shape: {\n\t cx: polar.cx,\n\t cy: polar.cy,\n\t r: ticksCoords[i]\n\t },\n\t silent: true\n\t }));\n\t }\n\t\n\t // Simple optimization\n\t // Batching the lines if color are the same\n\t for (var i = 0; i < splitLines.length; i++) {\n\t this.group.add(graphic.mergePath(splitLines[i], {\n\t style: zrUtil.defaults({\n\t stroke: lineColors[i % lineColors.length],\n\t fill: null\n\t }, lineStyleModel.getLineStyle()),\n\t silent: true\n\t }));\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _splitArea: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {\n\t\n\t var splitAreaModel = radiusAxisModel.getModel('splitArea');\n\t var areaStyleModel = splitAreaModel.getModel('areaStyle');\n\t var areaColors = areaStyleModel.get('color');\n\t var lineCount = 0;\n\t\n\t areaColors = areaColors instanceof Array ? areaColors : [areaColors];\n\t\n\t var splitAreas = [];\n\t\n\t var prevRadius = ticksCoords[0];\n\t for (var i = 1; i < ticksCoords.length; i++) {\n\t var colorIndex = (lineCount++) % areaColors.length;\n\t splitAreas[colorIndex] = splitAreas[colorIndex] || [];\n\t splitAreas[colorIndex].push(new graphic.Sector({\n\t shape: {\n\t cx: polar.cx,\n\t cy: polar.cy,\n\t r0: prevRadius,\n\t r: ticksCoords[i],\n\t startAngle: 0,\n\t endAngle: Math.PI * 2\n\t },\n\t silent: true\n\t }));\n\t prevRadius = ticksCoords[i];\n\t }\n\t\n\t // Simple optimization\n\t // Batching the lines if color are the same\n\t for (var i = 0; i < splitAreas.length; i++) {\n\t this.group.add(graphic.mergePath(splitAreas[i], {\n\t style: zrUtil.defaults({\n\t fill: areaColors[i % areaColors.length]\n\t }, areaStyleModel.getAreaStyle()),\n\t silent: true\n\t }));\n\t }\n\t }\n\t });\n\t\n\t /**\n\t * @inner\n\t */\n\t function layoutAxis(polar, radiusAxisModel, axisAngle) {\n\t return {\n\t position: [polar.cx, polar.cy],\n\t rotation: axisAngle / 180 * Math.PI,\n\t labelDirection: -1,\n\t tickDirection: -1,\n\t nameDirection: 1,\n\t labelRotation: radiusAxisModel.getModel('axisLabel').get('rotate'),\n\t // Over splitLine and splitArea\n\t z2: 1\n\t };\n\t }\n\n\n/***/ },\n/* 619 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var AxisBuilder = __webpack_require__(85);\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var getInterval = AxisBuilder.getInterval;\n\t var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick;\n\t\n\t var axisBuilderAttrs = [\n\t 'axisLine', 'axisLabel', 'axisTick', 'axisName'\n\t ];\n\t\n\t var selfBuilderAttr = 'splitLine';\n\t\n\t var AxisView = __webpack_require__(3).extendComponentView({\n\t\n\t type: 'singleAxis',\n\t\n\t render: function (axisModel, ecModel) {\n\t\n\t var group = this.group;\n\t\n\t group.removeAll();\n\t\n\t var layout = axisLayout(axisModel);\n\t\n\t var axisBuilder = new AxisBuilder(axisModel, layout);\n\t\n\t zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);\n\t\n\t group.add(axisBuilder.getGroup());\n\t\n\t if (axisModel.get(selfBuilderAttr + '.show')) {\n\t this['_' + selfBuilderAttr](axisModel, layout.labelInterval);\n\t }\n\t },\n\t\n\t _splitLine: function(axisModel, labelInterval) {\n\t var axis = axisModel.axis;\n\t var splitLineModel = axisModel.getModel('splitLine');\n\t var lineStyleModel = splitLineModel.getModel('lineStyle');\n\t var lineWidth = lineStyleModel.get('width');\n\t var lineColors = lineStyleModel.get('color');\n\t var lineInterval = getInterval(splitLineModel, labelInterval);\n\t\n\t lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n\t\n\t var gridRect = axisModel.coordinateSystem.getRect();\n\t var isHorizontal = axis.isHorizontal();\n\t\n\t var splitLines = [];\n\t var lineCount = 0;\n\t\n\t var ticksCoords = axis.getTicksCoords();\n\t\n\t var p1 = [];\n\t var p2 = [];\n\t\n\t for (var i = 0; i < ticksCoords.length; ++i) {\n\t if (ifIgnoreOnTick(axis, i, lineInterval)) {\n\t continue;\n\t }\n\t var tickCoord = axis.toGlobalCoord(ticksCoords[i]);\n\t if (isHorizontal) {\n\t p1[0] = tickCoord;\n\t p1[1] = gridRect.y;\n\t p2[0] = tickCoord;\n\t p2[1] = gridRect.y + gridRect.height;\n\t }\n\t else {\n\t p1[0] = gridRect.x;\n\t p1[1] = tickCoord;\n\t p2[0] = gridRect.x + gridRect.width;\n\t p2[1] = tickCoord;\n\t }\n\t var colorIndex = (lineCount++) % lineColors.length;\n\t splitLines[colorIndex] = splitLines[colorIndex] || [];\n\t splitLines[colorIndex].push(new graphic.Line(\n\t graphic.subPixelOptimizeLine({\n\t shape: {\n\t x1: p1[0],\n\t y1: p1[1],\n\t x2: p2[0],\n\t y2: p2[1]\n\t },\n\t style: {\n\t lineWidth: lineWidth\n\t },\n\t silent: true\n\t })));\n\t }\n\t\n\t for (var i = 0; i < splitLines.length; ++i) {\n\t this.group.add(graphic.mergePath(splitLines[i], {\n\t style: {\n\t stroke: lineColors[i % lineColors.length],\n\t lineDash: lineStyleModel.getLineDash(lineWidth),\n\t lineWidth: lineWidth\n\t },\n\t silent: true\n\t }));\n\t }\n\t }\n\t });\n\t\n\t function axisLayout(axisModel) {\n\t\n\t var single = axisModel.coordinateSystem;\n\t var axis = axisModel.axis;\n\t var layout = {};\n\t\n\t var axisPosition = axis.position;\n\t var orient = axis.orient;\n\t\n\t var rect = single.getRect();\n\t var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];\n\t\n\t var positionMap = {\n\t horizontal: {top: rectBound[2], bottom: rectBound[3]},\n\t vertical: {left: rectBound[0], right: rectBound[1]}\n\t };\n\t\n\t layout.position = [\n\t orient === 'vertical'\n\t ? positionMap.vertical[axisPosition]\n\t : rectBound[0],\n\t orient === 'horizontal'\n\t ? positionMap.horizontal[axisPosition]\n\t : rectBound[3]\n\t ];\n\t\n\t var r = {horizontal: 0, vertical: 1};\n\t layout.rotation = Math.PI / 2 * r[orient];\n\t\n\t var directionMap = {top: -1, bottom: 1, right: 1, left: -1};\n\t\n\t layout.labelDirection = layout.tickDirection\n\t = layout.nameDirection\n\t = directionMap[axisPosition];\n\t\n\t if (axisModel.getModel('axisTick').get('inside')) {\n\t layout.tickDirection = -layout.tickDirection;\n\t }\n\t\n\t if (axisModel.getModel('axisLabel').get('inside')) {\n\t layout.labelDirection = -layout.labelDirection;\n\t }\n\t\n\t var labelRotation = axisModel.getModel('axisLabel').get('rotate');\n\t layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation;\n\t\n\t layout.labelInterval = axis.getLabelInterval();\n\t\n\t layout.z2 = 1;\n\t\n\t return layout;\n\t }\n\t\n\t module.exports = AxisView;\n\t\n\n\n/***/ },\n/* 620 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t\n\t /**\n\t * @payload\n\t * @property {string} parallelAxisId\n\t * @property {Array.>} intervals\n\t */\n\t var actionInfo = {\n\t type: 'axisAreaSelect',\n\t event: 'axisAreaSelected',\n\t update: 'updateVisual'\n\t };\n\t echarts.registerAction(actionInfo, function (payload, ecModel) {\n\t ecModel.eachComponent(\n\t {mainType: 'parallelAxis', query: payload},\n\t function (parallelAxisModel) {\n\t parallelAxisModel.axis.model.setActiveIntervals(payload.intervals);\n\t }\n\t );\n\t });\n\t\n\t /**\n\t * @payload\n\t */\n\t echarts.registerAction('parallelAxisExpand', function (payload, ecModel) {\n\t ecModel.eachComponent(\n\t {mainType: 'parallel', query: payload},\n\t function (parallelModel) {\n\t parallelModel.setAxisExpand(payload);\n\t }\n\t );\n\t\n\t });\n\n\n/***/ },\n/* 621 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Brush component entry\n\t */\n\t\n\t\n\t __webpack_require__(3).registerPreprocessor(\n\t __webpack_require__(625)\n\t );\n\t\n\t __webpack_require__(627);\n\t __webpack_require__(622);\n\t __webpack_require__(623);\n\t __webpack_require__(624);\n\t\n\t __webpack_require__(674);\n\t\n\n\n/***/ },\n/* 622 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Brush model\n\t */\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var zrUtil = __webpack_require__(1);\n\t var visualSolution = __webpack_require__(113);\n\t var Model = __webpack_require__(21);\n\t\n\t var DEFAULT_OUT_OF_BRUSH_COLOR = ['#ddd'];\n\t\n\t var BrushModel = echarts.extendComponentModel({\n\t\n\t type: 'brush',\n\t\n\t dependencies: ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series'],\n\t\n\t /**\n\t * @protected\n\t */\n\t defaultOption: {\n\t // inBrush: null,\n\t // outOfBrush: null,\n\t toolbox: null, // Default value see preprocessor.\n\t brushLink: null, // Series indices array, broadcast using dataIndex.\n\t // or 'all', which means all series. 'none' or null means no series.\n\t seriesIndex: 'all', // seriesIndex array, specify series controlled by this brush component.\n\t geoIndex: null, //\n\t xAxisIndex: null,\n\t yAxisIndex: null,\n\t\n\t brushType: 'rect', // Default brushType, see BrushController.\n\t brushMode: 'single', // Default brushMode, 'single' or 'multiple'\n\t transformable: true, // Default transformable.\n\t brushStyle: { // Default brushStyle\n\t borderWidth: 1,\n\t color: 'rgba(120,140,180,0.3)',\n\t borderColor: 'rgba(120,140,180,0.8)',\n\t width: null // do not use bursh width in line brush, but fetch from grid.\n\t },\n\t\n\t throttleType: 'fixRate',// Throttle in brushSelected event. 'fixRate' or 'debounce'.\n\t // If null, no throttle. Valid only in the first brush component\n\t throttleDelay: 0, // Unit: ms, 0 means every event will be triggered.\n\t\n\t // FIXME\n\t // 试验效果\n\t removeOnClick: true\n\t },\n\t\n\t /**\n\t * @readOnly\n\t * @type {Array.}\n\t */\n\t areas: [],\n\t\n\t /**\n\t * Current activated brush type.\n\t * If null, brush is inactived.\n\t * see module:echarts/component/helper/BrushController\n\t * @readOnly\n\t * @type {string}\n\t */\n\t brushType: null,\n\t\n\t /**\n\t * Current brush opt.\n\t * see module:echarts/component/helper/BrushController\n\t * @readOnly\n\t * @type {Object}\n\t */\n\t brushOption: {},\n\t\n\t /**\n\t * @readOnly\n\t * @type {Array.}\n\t */\n\t coordInfoList: [],\n\t\n\t optionUpdated: function (newOption, isInit) {\n\t var thisOption = this.option;\n\t\n\t !isInit && visualSolution.replaceVisualOption(\n\t thisOption, newOption, ['inBrush', 'outOfBrush']\n\t );\n\t\n\t thisOption.inBrush = thisOption.inBrush || {};\n\t // Always give default visual, consider setOption at the second time.\n\t thisOption.outOfBrush = thisOption.outOfBrush || {color: DEFAULT_OUT_OF_BRUSH_COLOR};\n\t },\n\t\n\t /**\n\t * If ranges is null/undefined, range state remain.\n\t *\n\t * @param {Array.} [ranges]\n\t */\n\t setAreas: function (areas) {\n\t if (__DEV__) {\n\t zrUtil.assert(zrUtil.isArray(areas));\n\t zrUtil.each(areas, function (area) {\n\t zrUtil.assert(area.brushType, 'Illegal areas');\n\t });\n\t }\n\t\n\t // If ranges is null/undefined, range state remain.\n\t // This helps user to dispatchAction({type: 'brush'}) with no areas\n\t // set but just want to get the current brush select info from a `brush` event.\n\t if (!areas) {\n\t return;\n\t }\n\t\n\t this.areas = zrUtil.map(areas, function (area) {\n\t return this._mergeBrushOption(area);\n\t }, this);\n\t },\n\t\n\t /**\n\t * see module:echarts/component/helper/BrushController\n\t * @param {Object} brushOption\n\t */\n\t setBrushOption: function (brushOption) {\n\t this.brushOption = this._mergeBrushOption(brushOption);\n\t this.brushType = this.brushOption.brushType;\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _mergeBrushOption: function (brushOption) {\n\t var option = this.option;\n\t return zrUtil.merge(\n\t {\n\t brushType: option.brushType,\n\t brushMode: option.brushMode,\n\t transformable: option.transformable,\n\t brushStyle: new Model(option.brushStyle).getItemStyle(),\n\t removeOnClick: option.removeOnClick\n\t },\n\t brushOption,\n\t true\n\t );\n\t }\n\t\n\t });\n\t\n\t module.exports = BrushModel;\n\t\n\n\n/***/ },\n/* 623 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var BrushController = __webpack_require__(152);\n\t var echarts = __webpack_require__(3);\n\t var brushHelper = __webpack_require__(153);\n\t\n\t module.exports = echarts.extendComponentView({\n\t\n\t type: 'brush',\n\t\n\t init: function (ecModel, api) {\n\t\n\t /**\n\t * @readOnly\n\t * @type {module:echarts/model/Global}\n\t */\n\t this.ecModel = ecModel;\n\t\n\t /**\n\t * @readOnly\n\t * @type {module:echarts/ExtensionAPI}\n\t */\n\t this.api = api;\n\t\n\t /**\n\t * @readOnly\n\t * @type {module:echarts/component/brush/BrushModel}\n\t */\n\t this.model;\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/component/helper/BrushController}\n\t */\n\t (this._brushController = new BrushController(api.getZr()))\n\t .on('brush', zrUtil.bind(this._onBrush, this))\n\t .mount();\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t render: function (brushModel) {\n\t this.model = brushModel;\n\t return updateController.apply(this, arguments);\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t updateView: updateController,\n\t\n\t /**\n\t * @override\n\t */\n\t updateLayout: updateController,\n\t\n\t /**\n\t * @override\n\t */\n\t updateVisual: updateController,\n\t\n\t /**\n\t * @override\n\t */\n\t dispose: function () {\n\t this._brushController.dispose();\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _onBrush: function (areas, opt) {\n\t var modelId = this.model.id;\n\t\n\t brushHelper.parseOutputRanges(areas, this.model.coordInfoList, this.ecModel);\n\t\n\t // Action is not dispatched on drag end, because the drag end\n\t // emits the same params with the last drag move event, and\n\t // may have some delay when using touch pad, which makes\n\t // animation not smooth (when using debounce).\n\t (!opt.isEnd || opt.removeOnClick) && this.api.dispatchAction({\n\t type: 'brush',\n\t brushId: modelId,\n\t areas: zrUtil.clone(areas),\n\t $from: modelId\n\t });\n\t }\n\t\n\t });\n\t\n\t function updateController(brushModel, ecModel, api, payload) {\n\t // Do not update controller when drawing.\n\t (!payload || payload.$from !== brushModel.id) && this._brushController\n\t .setPanels(brushHelper.makePanelOpts(brushModel.coordInfoList))\n\t .enableBrush(brushModel.brushOption)\n\t .updateCovers(brushModel.areas.slice());\n\t }\n\t\n\n\n/***/ },\n/* 624 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Brush action\n\t */\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t\n\t /**\n\t * payload: {\n\t * brushIndex: number, or,\n\t * brushId: string, or,\n\t * brushName: string,\n\t * globalRanges: Array\n\t * }\n\t */\n\t echarts.registerAction(\n\t {type: 'brush', event: 'brush', update: 'updateView'},\n\t function (payload, ecModel) {\n\t ecModel.eachComponent({mainType: 'brush', query: payload}, function (brushModel) {\n\t brushModel.setAreas(payload.areas);\n\t });\n\t }\n\t );\n\t\n\t /**\n\t * payload: {\n\t * brushComponents: [\n\t * {\n\t * brushId,\n\t * brushIndex,\n\t * brushName,\n\t * series: [\n\t * {\n\t * seriesId,\n\t * seriesIndex,\n\t * seriesName,\n\t * rawIndices: [21, 34, ...]\n\t * },\n\t * ...\n\t * ]\n\t * },\n\t * ...\n\t * ]\n\t * }\n\t */\n\t echarts.registerAction(\n\t {type: 'brushSelect', event: 'brushSelected', update: 'none'},\n\t function () {}\n\t );\n\n\n/***/ },\n/* 625 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file brush preprocessor\n\t */\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear'];\n\t\n\t module.exports = function (option, isNew) {\n\t var brushComponents = option && option.brush;\n\t if (!zrUtil.isArray(brushComponents)) {\n\t brushComponents = brushComponents ? [brushComponents] : [];\n\t }\n\t\n\t if (!brushComponents.length) {\n\t return;\n\t }\n\t\n\t var brushComponentSpecifiedBtns = [];\n\t\n\t zrUtil.each(brushComponents, function (brushOpt) {\n\t var tbs = brushOpt.hasOwnProperty('toolbox')\n\t ? brushOpt.toolbox : [];\n\t\n\t if (tbs instanceof Array) {\n\t brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs);\n\t }\n\t });\n\t\n\t var toolbox = option && option.toolbox;\n\t\n\t if (zrUtil.isArray(toolbox)) {\n\t toolbox = toolbox[0];\n\t }\n\t if (!toolbox) {\n\t toolbox = {feature: {}};\n\t option.toolbox = [toolbox];\n\t }\n\t\n\t var toolboxFeature = (toolbox.feature || (toolbox.feature = {}));\n\t var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {});\n\t var brushTypes = toolboxBrush.type || (toolboxBrush.type = []);\n\t\n\t brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns);\n\t\n\t removeDuplicate(brushTypes);\n\t\n\t if (isNew && !brushTypes.length) {\n\t brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS);\n\t }\n\t };\n\t\n\t function removeDuplicate(arr) {\n\t var map = {};\n\t zrUtil.each(arr, function (val) {\n\t map[val] = 1;\n\t });\n\t arr.length = 0;\n\t zrUtil.each(map, function (flag, val) {\n\t arr.push(val);\n\t });\n\t }\n\t\n\n\n/***/ },\n/* 626 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var polygonContain = __webpack_require__(257).contain;\n\t var BoundingRect = __webpack_require__(17);\n\t\n\t // Key of the first level is brushType: `line`, `rect`, `polygon`.\n\t // Key of the second level is chart element type: `point`, `rect`.\n\t // See moudule:echarts/component/helper/BrushController\n\t // function param:\n\t // {Object} itemLayout fetch from data.getItemLayout(dataIndex)\n\t // {Object} selectors {point: selector, rect: selector, ...}\n\t // {Object} area {range: [[], [], ..], boudingRect}\n\t // function return:\n\t // {boolean} Whether in the given brush.\n\t var selector = {\n\t lineX: getLineSelectors(0),\n\t lineY: getLineSelectors(1),\n\t rect: {\n\t point: function (itemLayout, selectors, area) {\n\t return area.boundingRect.contain(itemLayout[0], itemLayout[1]);\n\t },\n\t rect: function (itemLayout, selectors, area) {\n\t return area.boundingRect.intersect(itemLayout);\n\t }\n\t },\n\t polygon: {\n\t point: function (itemLayout, selectors, area) {\n\t return area.boundingRect.contain(itemLayout[0], itemLayout[1])\n\t && polygonContain(area.range, itemLayout[0], itemLayout[1]);\n\t },\n\t rect: function (itemLayout, selectors, area) {\n\t // FIXME\n\t // 随意写的,没有考察过效率。\n\t var points = area.range;\n\t\n\t if (points.length <= 1) {\n\t return false;\n\t }\n\t\n\t var x = itemLayout.x;\n\t var y = itemLayout.y;\n\t var width = itemLayout.width;\n\t var height = itemLayout.height;\n\t var p = points[0];\n\t\n\t if (polygonContain(points, x, y)\n\t || polygonContain(points, x + width, y)\n\t || polygonContain(points, x, y + height)\n\t || polygonContain(points, x + width, y + height)\n\t || BoundingRect.create(itemLayout).contain(p[0], p[1])\n\t || lineIntersectPolygon(x, y, x + width, y, points)\n\t || lineIntersectPolygon(x, y, x, y + height, points)\n\t || lineIntersectPolygon(x + width, y, x + width, y + height, points)\n\t || lineIntersectPolygon(x, y + height, x + width, y + height, points)\n\t ) {\n\t return true;\n\t }\n\t }\n\t }\n\t };\n\t\n\t function getLineSelectors(xyIndex) {\n\t var xy = ['x', 'y'];\n\t var wh = ['width', 'height'];\n\t\n\t return {\n\t point: function (itemLayout, selectors, area) {\n\t var range = area.range;\n\t var p = itemLayout[xyIndex];\n\t return inLineRange(p, range);\n\t },\n\t rect: function (itemLayout, selectors, area) {\n\t var range = area.range;\n\t return inLineRange(itemLayout[xy[xyIndex]], range)\n\t || inLineRange(itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]], range);\n\t }\n\t };\n\t }\n\t\n\t function inLineRange(p, range) {\n\t return range[0] <= p && p <= range[1];\n\t }\n\t\n\t // FIXME\n\t // 随意写的,没考察过效率。\n\t function lineIntersectPolygon(lx, ly, l2x, l2y, points) {\n\t for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) {\n\t var p = points[i];\n\t if (lineIntersect(lx, ly, l2x, l2y, p[0], p[1], p2[0], p2[1])) {\n\t return true;\n\t }\n\t p2 = p;\n\t }\n\t }\n\t\n\t // Code from with some fix.\n\t // See \n\t function lineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {\n\t var delta = determinant(a2x - a1x, b1x - b2x, a2y - a1y, b1y - b2y);\n\t if (nearZero(delta)) { // parallel\n\t return false;\n\t }\n\t var namenda = determinant(b1x - a1x, b1x - b2x, b1y - a1y, b1y - b2y) / delta;\n\t if (namenda < 0 || namenda > 1) {\n\t return false;\n\t }\n\t var miu = determinant(a2x - a1x, b1x - a1x, a2y - a1y, b1y - a1y) / delta;\n\t if (miu < 0 || miu > 1) {\n\t return false;\n\t }\n\t return true;\n\t }\n\t\n\t function nearZero(val) {\n\t return val <= (1e-6) && val >= -(1e-6);\n\t }\n\t\n\t function determinant(v1, v2, v3, v4) {\n\t return v1 * v4 - v2 * v3;\n\t }\n\t\n\t module.exports = selector;\n\t\n\n\n/***/ },\n/* 627 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Brush visual coding.\n\t */\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var visualSolution = __webpack_require__(113);\n\t var zrUtil = __webpack_require__(1);\n\t var BoundingRect = __webpack_require__(17);\n\t var selector = __webpack_require__(626);\n\t var throttle = __webpack_require__(112);\n\t var brushHelper = __webpack_require__(153);\n\t\n\t var STATE_LIST = ['inBrush', 'outOfBrush'];\n\t var DISPATCH_METHOD = '__ecBrushSelect';\n\t var DISPATCH_FLAG = '__ecInBrushSelectEvent';\n\t var PRIORITY_BRUSH = echarts.PRIORITY.VISUAL.BRUSH;\n\t\n\t /**\n\t * Layout for visual, the priority higher than other layout, and before brush visual.\n\t */\n\t echarts.registerLayout(PRIORITY_BRUSH, function (ecModel, api, payload) {\n\t ecModel.eachComponent({mainType: 'brush'}, function (brushModel) {\n\t\n\t payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(\n\t payload.key === 'brush' ? payload.brushOption : {brushType: false}\n\t );\n\t\n\t brushModel.coordInfoList = brushHelper.makeCoordInfoList(brushModel.option, ecModel);\n\t\n\t brushHelper.parseInputRanges(brushModel, ecModel);\n\t });\n\t });\n\t\n\t /**\n\t * Register the visual encoding if this modules required.\n\t */\n\t echarts.registerVisual(PRIORITY_BRUSH, function (ecModel, api, payload) {\n\t\n\t var brushSelected = [];\n\t var throttleType;\n\t var throttleDelay;\n\t\n\t ecModel.eachComponent({mainType: 'brush'}, function (brushModel, brushIndex) {\n\t\n\t var thisBrushSelected = {\n\t brushId: brushModel.id,\n\t brushIndex: brushIndex,\n\t brushName: brushModel.name,\n\t areas: zrUtil.clone(brushModel.areas),\n\t selected: []\n\t };\n\t // Every brush component exists in event params, convenient\n\t // for user to find by index.\n\t brushSelected.push(thisBrushSelected);\n\t\n\t var brushOption = brushModel.option;\n\t var brushLink = brushOption.brushLink;\n\t var linkedSeriesMap = [];\n\t var selectedDataIndexForLink = [];\n\t var rangeInfoBySeries = [];\n\t var hasBrushExists = 0;\n\t\n\t if (!brushIndex) { // Only the first throttle setting works.\n\t throttleType = brushOption.throttleType;\n\t throttleDelay = brushOption.throttleDelay;\n\t }\n\t\n\t // Add boundingRect and selectors to range.\n\t var areas = zrUtil.map(brushModel.areas, function (area) {\n\t return bindSelector(\n\t zrUtil.defaults(\n\t {boundingRect: boundingRectBuilders[area.brushType](area)},\n\t area\n\t )\n\t );\n\t });\n\t\n\t var visualMappings = visualSolution.createVisualMappings(\n\t brushModel.option, STATE_LIST, function (mappingOption) {\n\t mappingOption.mappingMethod = 'fixed';\n\t }\n\t );\n\t\n\t zrUtil.isArray(brushLink) && zrUtil.each(brushLink, function (seriesIndex) {\n\t linkedSeriesMap[seriesIndex] = 1;\n\t });\n\t\n\t function linkOthers(seriesIndex) {\n\t return brushLink === 'all' || linkedSeriesMap[seriesIndex];\n\t }\n\t\n\t // If no supported brush or no brush on the series,\n\t // all visuals should be in original state.\n\t function brushed(rangeInfoList) {\n\t return !!rangeInfoList.length;\n\t }\n\t\n\t /**\n\t * Logic for each series: (If the logic has to be modified one day, do it carefully!)\n\t *\n\t * ( brushed ┬ && ┬hasBrushExist ┬ && linkOthers ) => StepA: ┬record, ┬ StepB: ┬visualByRecord.\n\t * !brushed┘ ├hasBrushExist ┤ └nothing,┘ ├visualByRecord.\n\t * └!hasBrushExist┘ └nothing.\n\t * ( !brushed && ┬hasBrushExist ┬ && linkOthers ) => StepA: nothing, StepB: ┬visualByRecord.\n\t * └!hasBrushExist┘ └nothing.\n\t * ( brushed ┬ && !linkOthers ) => StepA: nothing, StepB: ┬visualByCheck.\n\t * !brushed┘ └nothing.\n\t * ( !brushed && !linkOthers ) => StepA: nothing, StepB: nothing.\n\t */\n\t\n\t // Step A\n\t ecModel.eachSeries(function (seriesModel, seriesIndex) {\n\t var rangeInfoList = rangeInfoBySeries[seriesIndex] = [];\n\t\n\t seriesModel.subType === 'parallel'\n\t ? stepAParallel(seriesModel, seriesIndex, rangeInfoList)\n\t : stepAOthers(seriesModel, seriesIndex, rangeInfoList);\n\t });\n\t\n\t function stepAParallel(seriesModel, seriesIndex) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t hasBrushExists |= coordSys.hasAxisbrushed();\n\t\n\t linkOthers(seriesIndex) && coordSys.eachActiveState(\n\t seriesModel.getData(),\n\t function (activeState, dataIndex) {\n\t activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1);\n\t }\n\t );\n\t }\n\t\n\t function stepAOthers(seriesModel, seriesIndex, rangeInfoList) {\n\t var selectorsByBrushType = getSelectorsByBrushType(seriesModel);\n\t if (!selectorsByBrushType || brushModelNotControll(brushModel, seriesIndex)) {\n\t return;\n\t }\n\t\n\t zrUtil.each(areas, function (area) {\n\t selectorsByBrushType[area.brushType]\n\t && brushHelper.controlSeries(area, brushModel, seriesModel)\n\t && rangeInfoList.push(area);\n\t hasBrushExists |= brushed(rangeInfoList);\n\t });\n\t\n\t if (linkOthers(seriesIndex) && brushed(rangeInfoList)) {\n\t var data = seriesModel.getData();\n\t data.each(function (dataIndex) {\n\t if (checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex)) {\n\t selectedDataIndexForLink[dataIndex] = 1;\n\t }\n\t });\n\t }\n\t }\n\t\n\t // Step B\n\t ecModel.eachSeries(function (seriesModel, seriesIndex) {\n\t var seriesBrushSelected = {\n\t seriesId: seriesModel.id,\n\t seriesIndex: seriesIndex,\n\t seriesName: seriesModel.name,\n\t dataIndex: []\n\t };\n\t // Every series exists in event params, convenient\n\t // for user to find series by seriesIndex.\n\t thisBrushSelected.selected.push(seriesBrushSelected);\n\t\n\t var selectorsByBrushType = getSelectorsByBrushType(seriesModel);\n\t var rangeInfoList = rangeInfoBySeries[seriesIndex];\n\t\n\t var data = seriesModel.getData();\n\t var getValueState = linkOthers(seriesIndex)\n\t ? function (dataIndex) {\n\t return selectedDataIndexForLink[dataIndex]\n\t ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush')\n\t : 'outOfBrush';\n\t }\n\t : function (dataIndex) {\n\t return checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex)\n\t ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush')\n\t : 'outOfBrush';\n\t };\n\t\n\t // If no supported brush or no brush, all visuals are in original state.\n\t (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList))\n\t && visualSolution.applyVisual(\n\t STATE_LIST, visualMappings, data, getValueState\n\t );\n\t });\n\t\n\t });\n\t\n\t dispatchAction(api, throttleType, throttleDelay, brushSelected, payload);\n\t });\n\t\n\t function dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) {\n\t // This event will not be triggered when `setOpion`, otherwise dead lock may\n\t // triggered when do `setOption` in event listener, which we do not find\n\t // satisfactory way to solve yet. Some considered resolutions:\n\t // (a) Diff with prevoius selected data ant only trigger event when changed.\n\t // But store previous data and diff precisely (i.e., not only by dataIndex, but\n\t // also detect value changes in selected data) might bring complexity or fragility.\n\t // (b) Use spectial param like `silent` to suppress event triggering.\n\t // But such kind of volatile param may be weird in `setOption`.\n\t if (!payload) {\n\t return;\n\t }\n\t\n\t var zr = api.getZr();\n\t if (zr[DISPATCH_FLAG]) {\n\t return;\n\t }\n\t\n\t if (!zr[DISPATCH_METHOD]) {\n\t zr[DISPATCH_METHOD] = doDispatch;\n\t }\n\t\n\t var fn = throttle.createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType);\n\t\n\t fn(api, brushSelected);\n\t }\n\t\n\t function doDispatch(api, brushSelected) {\n\t if (!api.isDisposed()) {\n\t var zr = api.getZr();\n\t zr[DISPATCH_FLAG] = true;\n\t api.dispatchAction({\n\t type: 'brushSelect',\n\t batch: brushSelected\n\t });\n\t zr[DISPATCH_FLAG] = false;\n\t }\n\t }\n\t\n\t function checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex) {\n\t var itemLayout = data.getItemLayout(dataIndex);\n\t for (var i = 0, len = rangeInfoList.length; i < len; i++) {\n\t var area = rangeInfoList[i];\n\t if (selectorsByBrushType[area.brushType](\n\t itemLayout, area.selectors, area\n\t )) {\n\t return true;\n\t }\n\t }\n\t }\n\t\n\t function getSelectorsByBrushType(seriesModel) {\n\t var brushSelector = seriesModel.brushSelector;\n\t if (zrUtil.isString(brushSelector)) {\n\t var sels = [];\n\t zrUtil.each(selector, function (selectorsByElementType, brushType) {\n\t sels[brushType] = selectorsByElementType[brushSelector];\n\t });\n\t return sels;\n\t }\n\t else if (zrUtil.isFunction(brushSelector)) {\n\t var bSelector = {};\n\t zrUtil.each(selector, function (sel, brushType) {\n\t bSelector[brushType] = brushSelector;\n\t });\n\t return bSelector;\n\t }\n\t return brushSelector;\n\t }\n\t\n\t function brushModelNotControll(brushModel, seriesIndex) {\n\t var seriesIndices = brushModel.option.seriesIndex;\n\t return seriesIndices != null\n\t && seriesIndices !== 'all'\n\t && (\n\t zrUtil.isArray(seriesIndices)\n\t ? zrUtil.indexOf(seriesIndices, seriesIndex) < 0\n\t : seriesIndex !== seriesIndices\n\t );\n\t }\n\t\n\t function bindSelector(area) {\n\t var selectors = area.selectors = {};\n\t zrUtil.each(selector[area.brushType], function (selFn, elType) {\n\t // Do not use function binding or curry for performance.\n\t selectors[elType] = function (itemLayout) {\n\t return selFn(itemLayout, selectors, area);\n\t };\n\t });\n\t return area;\n\t }\n\t\n\t var boundingRectBuilders = {\n\t\n\t lineX: zrUtil.noop,\n\t\n\t lineY: zrUtil.noop,\n\t\n\t rect: function (area) {\n\t return getBoundingRectFromMinMax(area.range);\n\t },\n\t\n\t polygon: function (area) {\n\t var minMax;\n\t var range = area.range;\n\t\n\t for (var i = 0, len = range.length; i < len; i++) {\n\t minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]];\n\t var rg = range[i];\n\t rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]);\n\t rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]);\n\t rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]);\n\t rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]);\n\t }\n\t\n\t return minMax && getBoundingRectFromMinMax(minMax);\n\t }\n\t };\n\t\n\t function getBoundingRectFromMinMax(minMax) {\n\t return new BoundingRect(\n\t minMax[0][0],\n\t minMax[1][0],\n\t minMax[0][1] - minMax[0][0],\n\t minMax[1][1] - minMax[1][0]\n\t );\n\t }\n\t\n\n\n/***/ },\n/* 628 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * DataZoom component entry\n\t */\n\t\n\t\n\t __webpack_require__(221);\n\t\n\t __webpack_require__(86);\n\t __webpack_require__(87);\n\t\n\t __webpack_require__(635);\n\t __webpack_require__(636);\n\t\n\t __webpack_require__(631);\n\t __webpack_require__(632);\n\t\n\t __webpack_require__(218);\n\t __webpack_require__(217);\n\t\n\n\n/***/ },\n/* 629 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * DataZoom component entry\n\t */\n\t\n\t\n\t __webpack_require__(221);\n\t\n\t __webpack_require__(86);\n\t __webpack_require__(87);\n\t\n\t __webpack_require__(633);\n\t __webpack_require__(634);\n\t\n\t __webpack_require__(218);\n\t __webpack_require__(217);\n\t\n\n\n/***/ },\n/* 630 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Axis operator\n\t */\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var numberUtil = __webpack_require__(5);\n\t var each = zrUtil.each;\n\t var asc = numberUtil.asc;\n\t\n\t /**\n\t * Operate single axis.\n\t * One axis can only operated by one axis operator.\n\t * Different dataZoomModels may be defined to operate the same axis.\n\t * (i.e. 'inside' data zoom and 'slider' data zoom components)\n\t * So dataZoomModels share one axisProxy in that case.\n\t *\n\t * @class\n\t */\n\t var AxisProxy = function (dimName, axisIndex, dataZoomModel, ecModel) {\n\t\n\t /**\n\t * @private\n\t * @type {string}\n\t */\n\t this._dimName = dimName;\n\t\n\t /**\n\t * @private\n\t */\n\t this._axisIndex = axisIndex;\n\t\n\t /**\n\t * @private\n\t * @type {Array.}\n\t */\n\t this._valueWindow;\n\t\n\t /**\n\t * @private\n\t * @type {Array.}\n\t */\n\t this._percentWindow;\n\t\n\t /**\n\t * @private\n\t * @type {Array.}\n\t */\n\t this._dataExtent;\n\t\n\t /**\n\t * @readOnly\n\t * @type {module: echarts/model/Global}\n\t */\n\t this.ecModel = ecModel;\n\t\n\t /**\n\t * @private\n\t * @type {module: echarts/component/dataZoom/DataZoomModel}\n\t */\n\t this._dataZoomModel = dataZoomModel;\n\t };\n\t\n\t AxisProxy.prototype = {\n\t\n\t constructor: AxisProxy,\n\t\n\t /**\n\t * Whether the axisProxy is hosted by dataZoomModel.\n\t *\n\t * @public\n\t * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel\n\t * @return {boolean}\n\t */\n\t hostedBy: function (dataZoomModel) {\n\t return this._dataZoomModel === dataZoomModel;\n\t },\n\t\n\t /**\n\t * @return {Array.}\n\t */\n\t getDataExtent: function () {\n\t return this._dataExtent.slice();\n\t },\n\t\n\t /**\n\t * @return {Array.}\n\t */\n\t getDataValueWindow: function () {\n\t return this._valueWindow.slice();\n\t },\n\t\n\t /**\n\t * @return {Array.}\n\t */\n\t getDataPercentWindow: function () {\n\t return this._percentWindow.slice();\n\t },\n\t\n\t /**\n\t * @public\n\t * @param {number} axisIndex\n\t * @return {Array} seriesModels\n\t */\n\t getTargetSeriesModels: function () {\n\t var seriesModels = [];\n\t var ecModel = this.ecModel;\n\t\n\t ecModel.eachSeries(function (seriesModel) {\n\t var coordSysName = seriesModel.get('coordinateSystem');\n\t if (coordSysName === 'cartesian2d' || coordSysName === 'polar') {\n\t var dimName = this._dimName;\n\t var axisModel = ecModel.queryComponents({\n\t mainType: dimName + 'Axis',\n\t index: seriesModel.get(dimName + 'AxisIndex'),\n\t id: seriesModel.get(dimName + 'AxisId')\n\t })[0];\n\t if (this._axisIndex === (axisModel && axisModel.componentIndex)) {\n\t seriesModels.push(seriesModel);\n\t }\n\t }\n\t }, this);\n\t\n\t return seriesModels;\n\t },\n\t\n\t getAxisModel: function () {\n\t return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex);\n\t },\n\t\n\t getOtherAxisModel: function () {\n\t var axisDim = this._dimName;\n\t var ecModel = this.ecModel;\n\t var axisModel = this.getAxisModel();\n\t var isCartesian = axisDim === 'x' || axisDim === 'y';\n\t var otherAxisDim;\n\t var coordSysIndexName;\n\t if (isCartesian) {\n\t coordSysIndexName = 'gridIndex';\n\t otherAxisDim = axisDim === 'x' ? 'y' : 'x';\n\t }\n\t else {\n\t coordSysIndexName = 'polarIndex';\n\t otherAxisDim = axisDim === 'angle' ? 'radius' : 'angle';\n\t }\n\t var foundOtherAxisModel;\n\t ecModel.eachComponent(otherAxisDim + 'Axis', function (otherAxisModel) {\n\t if ((otherAxisModel.get(coordSysIndexName) || 0)\n\t === (axisModel.get(coordSysIndexName) || 0)\n\t ) {\n\t foundOtherAxisModel = otherAxisModel;\n\t }\n\t });\n\t return foundOtherAxisModel;\n\t },\n\t\n\t /**\n\t * Only calculate by given range and dataExtent, do not change anything.\n\t *\n\t * @param {Object} opt\n\t * @param {number} [opt.start]\n\t * @param {number} [opt.end]\n\t * @param {number} [opt.startValue]\n\t * @param {number} [opt.endValue]\n\t * @param {Array.} dataExtent\n\t */\n\t calculateDataWindow: function (opt, dataExtent) {\n\t var axisModel = this.getAxisModel();\n\t var scale = axisModel.axis.scale;\n\t var percentExtent = [0, 100];\n\t var percentWindow = [\n\t opt.start,\n\t opt.end\n\t ];\n\t var valueWindow = [];\n\t\n\t // In percent range is used and axis min/max/scale is set,\n\t // window should be based on min/max/0, but should not be\n\t // based on the extent of filtered data.\n\t dataExtent = dataExtent.slice();\n\t fixExtendByAxis(dataExtent, axisModel, scale);\n\t\n\t each(['startValue', 'endValue'], function (prop) {\n\t valueWindow.push(\n\t opt[prop] != null\n\t ? scale.parse(opt[prop])\n\t : null\n\t );\n\t });\n\t\n\t // Normalize bound.\n\t each([0, 1], function (idx) {\n\t var boundValue = valueWindow[idx];\n\t var boundPercent = percentWindow[idx];\n\t\n\t // start/end has higher priority over startValue/endValue,\n\t // because start/end can be consistent among different type\n\t // of axis but startValue/endValue not.\n\t\n\t if (boundPercent != null || boundValue == null) {\n\t if (boundPercent == null) {\n\t boundPercent = percentExtent[idx];\n\t }\n\t // Use scale.parse to math round for category or time axis.\n\t boundValue = scale.parse(numberUtil.linearMap(\n\t boundPercent, percentExtent, dataExtent, true\n\t ));\n\t }\n\t else { // boundPercent == null && boundValue != null\n\t boundPercent = numberUtil.linearMap(\n\t boundValue, dataExtent, percentExtent, true\n\t );\n\t }\n\t // valueWindow[idx] = round(boundValue);\n\t // percentWindow[idx] = round(boundPercent);\n\t valueWindow[idx] = boundValue;\n\t percentWindow[idx] = boundPercent;\n\t });\n\t\n\t return {\n\t valueWindow: asc(valueWindow),\n\t percentWindow: asc(percentWindow)\n\t };\n\t },\n\t\n\t /**\n\t * Notice: reset should not be called before series.restoreData() called,\n\t * so it is recommanded to be called in \"process stage\" but not \"model init\n\t * stage\".\n\t *\n\t * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel\n\t */\n\t reset: function (dataZoomModel) {\n\t if (dataZoomModel !== this._dataZoomModel) {\n\t return;\n\t }\n\t\n\t // Culculate data window and data extent, and record them.\n\t var dataExtent = this._dataExtent = calculateDataExtent(\n\t this._dimName, this.getTargetSeriesModels()\n\t );\n\t var dataWindow = this.calculateDataWindow(dataZoomModel.option, dataExtent);\n\t this._valueWindow = dataWindow.valueWindow;\n\t this._percentWindow = dataWindow.percentWindow;\n\t\n\t // Update axis setting then.\n\t setAxisModel(this);\n\t },\n\t\n\t /**\n\t * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel\n\t */\n\t restore: function (dataZoomModel) {\n\t if (dataZoomModel !== this._dataZoomModel) {\n\t return;\n\t }\n\t\n\t this._valueWindow = this._percentWindow = null;\n\t setAxisModel(this, true);\n\t },\n\t\n\t /**\n\t * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel\n\t */\n\t filterData: function (dataZoomModel) {\n\t if (dataZoomModel !== this._dataZoomModel) {\n\t return;\n\t }\n\t\n\t var axisDim = this._dimName;\n\t var seriesModels = this.getTargetSeriesModels();\n\t var filterMode = dataZoomModel.get('filterMode');\n\t var valueWindow = this._valueWindow;\n\t\n\t // FIXME\n\t // Toolbox may has dataZoom injected. And if there are stacked bar chart\n\t // with NaN data, NaN will be filtered and stack will be wrong.\n\t // So we need to force the mode to be set empty.\n\t // In fect, it is not a big deal that do not support filterMode-'filter'\n\t // when using toolbox#dataZoom, utill tooltip#dataZoom support \"single axis\n\t // selection\" some day, which might need \"adapt to data extent on the\n\t // otherAxis\", which is disabled by filterMode-'empty'.\n\t var otherAxisModel = this.getOtherAxisModel();\n\t if (dataZoomModel.get('$fromToolbox')\n\t && otherAxisModel\n\t && otherAxisModel.get('type') === 'category'\n\t ) {\n\t filterMode = 'empty';\n\t }\n\t\n\t // Process series data\n\t each(seriesModels, function (seriesModel) {\n\t var seriesData = seriesModel.getData();\n\t\n\t seriesData && each(seriesModel.coordDimToDataDim(axisDim), function (dim) {\n\t if (filterMode === 'empty') {\n\t seriesModel.setData(\n\t seriesData.map(dim, function (value) {\n\t return !isInWindow(value) ? NaN : value;\n\t })\n\t );\n\t }\n\t else {\n\t seriesData.filterSelf(dim, isInWindow);\n\t }\n\t });\n\t });\n\t\n\t function isInWindow(value) {\n\t return value >= valueWindow[0] && value <= valueWindow[1];\n\t }\n\t }\n\t };\n\t\n\t function calculateDataExtent(axisDim, seriesModels) {\n\t var dataExtent = [Infinity, -Infinity];\n\t\n\t each(seriesModels, function (seriesModel) {\n\t var seriesData = seriesModel.getData();\n\t if (seriesData) {\n\t each(seriesModel.coordDimToDataDim(axisDim), function (dim) {\n\t var seriesExtent = seriesData.getDataExtent(dim);\n\t seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]);\n\t seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]);\n\t });\n\t }\n\t }, this);\n\t\n\t return dataExtent;\n\t }\n\t\n\t function fixExtendByAxis(dataExtent, axisModel, scale) {\n\t each(['min', 'max'], function (minMax, index) {\n\t var axisMax = axisModel.get(minMax, true);\n\t // Consider 'dataMin', 'dataMax'\n\t if (axisMax != null && (axisMax + '').toLowerCase() !== 'data' + minMax) {\n\t dataExtent[index] = scale.parse(axisMax);\n\t }\n\t });\n\t\n\t if (!axisModel.get('scale', true)) {\n\t dataExtent[0] > 0 && (dataExtent[0] = 0);\n\t dataExtent[1] < 0 && (dataExtent[1] = 0);\n\t }\n\t\n\t return dataExtent;\n\t }\n\t\n\t function setAxisModel(axisProxy, isRestore) {\n\t var axisModel = axisProxy.getAxisModel();\n\t\n\t var percentWindow = axisProxy._percentWindow;\n\t var valueWindow = axisProxy._valueWindow;\n\t\n\t if (!percentWindow) {\n\t return;\n\t }\n\t\n\t var isFull = isRestore || (percentWindow[0] === 0 && percentWindow[1] === 100);\n\t // [0, 500]: arbitrary value, guess axis extent.\n\t var precision = !isRestore && numberUtil.getPixelPrecision(valueWindow, [0, 500]);\n\t // toFixed() digits argument must be between 0 and 20\n\t var invalidPrecision = !isRestore && !(precision < 20 && precision >= 0);\n\t\n\t var useOrigin = isRestore || isFull || invalidPrecision;\n\t\n\t axisModel.setRange && axisModel.setRange(\n\t useOrigin ? null : +valueWindow[0].toFixed(precision),\n\t useOrigin ? null : +valueWindow[1].toFixed(precision)\n\t );\n\t }\n\t\n\t module.exports = AxisProxy;\n\t\n\n\n/***/ },\n/* 631 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Data zoom model\n\t */\n\t\n\t\n\t module.exports = __webpack_require__(86).extend({\n\t\n\t type: 'dataZoom.inside',\n\t\n\t /**\n\t * @protected\n\t */\n\t defaultOption: {\n\t disabled: false, // Whether disable this inside zoom.\n\t zoomLock: false // Whether disable zoom but only pan.\n\t }\n\t });\n\n\n/***/ },\n/* 632 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var DataZoomView = __webpack_require__(87);\n\t var zrUtil = __webpack_require__(1);\n\t var sliderMove = __webpack_require__(155);\n\t var roams = __webpack_require__(637);\n\t var bind = zrUtil.bind;\n\t\n\t var InsideZoomView = DataZoomView.extend({\n\t\n\t type: 'dataZoom.inside',\n\t\n\t /**\n\t * @override\n\t */\n\t init: function (ecModel, api) {\n\t /**\n\t * 'throttle' is used in this.dispatchAction, so we save range\n\t * to avoid missing some 'pan' info.\n\t * @private\n\t * @type {Array.}\n\t */\n\t this._range;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t render: function (dataZoomModel, ecModel, api, payload) {\n\t InsideZoomView.superApply(this, 'render', arguments);\n\t\n\t // Notice: origin this._range should be maintained, and should not be re-fetched\n\t // from dataZoomModel when payload.type is 'dataZoom', otherwise 'pan' or 'zoom'\n\t // info will be missed because of 'throttle' of this.dispatchAction.\n\t if (roams.shouldRecordRange(payload, dataZoomModel.id)) {\n\t this._range = dataZoomModel.getPercentRange();\n\t }\n\t\n\t var targetInfo = this.getTargetInfo();\n\t\n\t // Reset controllers.\n\t zrUtil.each(['cartesians', 'polars'], function (coordSysName) {\n\t\n\t var coordInfoList = targetInfo[coordSysName];\n\t var allCoordIds = zrUtil.map(coordInfoList, function (coordInfo) {\n\t return roams.generateCoordId(coordInfo.model);\n\t });\n\t\n\t zrUtil.each(coordInfoList, function (coordInfo) {\n\t var coordModel = coordInfo.model;\n\t var coordinateSystem = coordModel.coordinateSystem;\n\t\n\t roams.register(\n\t api,\n\t {\n\t coordId: roams.generateCoordId(coordModel),\n\t allCoordIds: allCoordIds,\n\t coordinateSystem: coordinateSystem,\n\t containsPoint: bind(operations[coordSysName].containsPoint, this, coordinateSystem),\n\t dataZoomId: dataZoomModel.id,\n\t throttleRate: dataZoomModel.get('throttle', true),\n\t panGetRange: bind(this._onPan, this, coordInfo, coordSysName),\n\t zoomGetRange: bind(this._onZoom, this, coordInfo, coordSysName)\n\t }\n\t );\n\t }, this);\n\t\n\t }, this);\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t dispose: function () {\n\t roams.unregister(this.api, this.dataZoomModel.id);\n\t InsideZoomView.superApply(this, 'dispose', arguments);\n\t this._range = null;\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _onPan: function (coordInfo, coordSysName, controller, dx, dy, oldX, oldY, newX, newY) {\n\t if (this.dataZoomModel.option.disabled) {\n\t return this._range;\n\t }\n\t\n\t var range = this._range.slice();\n\t\n\t // Calculate transform by the first axis.\n\t var axisModel = coordInfo.axisModels[0];\n\t if (!axisModel) {\n\t return;\n\t }\n\t\n\t var directionInfo = operations[coordSysName].getDirectionInfo(\n\t [oldX, oldY], [newX, newY], axisModel, controller, coordInfo\n\t );\n\t\n\t var percentDelta = directionInfo.signal\n\t * (range[1] - range[0])\n\t * directionInfo.pixel / directionInfo.pixelLength;\n\t\n\t sliderMove(percentDelta, range, [0, 100], 'rigid');\n\t\n\t return (this._range = range);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _onZoom: function (coordInfo, coordSysName, controller, scale, mouseX, mouseY) {\n\t var option = this.dataZoomModel.option;\n\t\n\t if (option.disabled || option.zoomLock) {\n\t return this._range;\n\t }\n\t\n\t var range = this._range.slice();\n\t\n\t // Calculate transform by the first axis.\n\t var axisModel = coordInfo.axisModels[0];\n\t if (!axisModel) {\n\t return;\n\t }\n\t\n\t var directionInfo = operations[coordSysName].getDirectionInfo(\n\t null, [mouseX, mouseY], axisModel, controller, coordInfo\n\t );\n\t\n\t var percentPoint = (directionInfo.pixel - directionInfo.pixelStart) /\n\t directionInfo.pixelLength * (range[1] - range[0]) + range[0];\n\t\n\t scale = Math.max(1 / scale, 0);\n\t range[0] = (range[0] - percentPoint) * scale + percentPoint;\n\t range[1] = (range[1] - percentPoint) * scale + percentPoint;\n\t return (this._range = fixRange(range));\n\t }\n\t\n\t });\n\t\n\t var operations = {\n\t\n\t cartesians: {\n\t\n\t getDirectionInfo: function (oldPoint, newPoint, axisModel, controller, coordInfo) {\n\t var axis = axisModel.axis;\n\t var ret = {};\n\t var rect = coordInfo.model.coordinateSystem.getRect();\n\t oldPoint = oldPoint || [0, 0];\n\t\n\t if (axis.dim === 'x') {\n\t ret.pixel = newPoint[0] - oldPoint[0];\n\t ret.pixelLength = rect.width;\n\t ret.pixelStart = rect.x;\n\t ret.signal = axis.inverse ? 1 : -1;\n\t }\n\t else { // axis.dim === 'y'\n\t ret.pixel = newPoint[1] - oldPoint[1];\n\t ret.pixelLength = rect.height;\n\t ret.pixelStart = rect.y;\n\t ret.signal = axis.inverse ? -1 : 1;\n\t }\n\t\n\t return ret;\n\t },\n\t\n\t containsPoint: function (coordinateSystem, x, y) {\n\t return coordinateSystem.getRect().contain(x, y);\n\t }\n\t },\n\t\n\t polars: {\n\t\n\t getDirectionInfo: function (oldPoint, newPoint, axisModel, controller, coordInfo) {\n\t var axis = axisModel.axis;\n\t var ret = {};\n\t var polar = coordInfo.model.coordinateSystem;\n\t var radiusExtent = polar.getRadiusAxis().getExtent();\n\t var angleExtent = polar.getAngleAxis().getExtent();\n\t\n\t oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0];\n\t newPoint = polar.pointToCoord(newPoint);\n\t\n\t if (axisModel.mainType === 'radiusAxis') {\n\t ret.pixel = newPoint[0] - oldPoint[0];\n\t // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]);\n\t // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]);\n\t ret.pixelLength = radiusExtent[1] - radiusExtent[0];\n\t ret.pixelStart = radiusExtent[0];\n\t ret.signal = axis.inverse ? 1 : -1;\n\t }\n\t else { // 'angleAxis'\n\t ret.pixel = newPoint[1] - oldPoint[1];\n\t // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]);\n\t // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]);\n\t ret.pixelLength = angleExtent[1] - angleExtent[0];\n\t ret.pixelStart = angleExtent[0];\n\t ret.signal = axis.inverse ? -1 : 1;\n\t }\n\t\n\t return ret;\n\t },\n\t\n\t containsPoint: function (coordinateSystem, x, y) {\n\t var radius = coordinateSystem.getRadiusAxis().getExtent()[1];\n\t var cx = coordinateSystem.cx;\n\t var cy = coordinateSystem.cy;\n\t\n\t return Math.pow(x - cx, 2) + Math.pow(y - cy, 2) <= Math.pow(radius, 2);\n\t }\n\t }\n\t };\n\t\n\t function fixRange(range) {\n\t // Clamp, using !(<= or >=) to handle NaN.\n\t // jshint ignore:start\n\t var bound = [0, 100];\n\t !(range[0] <= bound[1]) && (range[0] = bound[1]);\n\t !(range[1] <= bound[1]) && (range[1] = bound[1]);\n\t !(range[0] >= bound[0]) && (range[0] = bound[0]);\n\t !(range[1] >= bound[0]) && (range[1] = bound[0]);\n\t // jshint ignore:end\n\t\n\t return range;\n\t }\n\t\n\t module.exports = InsideZoomView;\n\n\n/***/ },\n/* 633 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Data zoom model\n\t */\n\t\n\t\n\t var DataZoomModel = __webpack_require__(86);\n\t\n\t module.exports = DataZoomModel.extend({\n\t\n\t type: 'dataZoom.select'\n\t\n\t });\n\t\n\n\n/***/ },\n/* 634 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t module.exports = __webpack_require__(87).extend({\n\t\n\t type: 'dataZoom.select'\n\t\n\t });\n\t\n\n\n/***/ },\n/* 635 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Data zoom model\n\t */\n\t\n\t\n\t var DataZoomModel = __webpack_require__(86);\n\t\n\t var SliderZoomModel = DataZoomModel.extend({\n\t\n\t type: 'dataZoom.slider',\n\t\n\t layoutMode: 'box',\n\t\n\t /**\n\t * @protected\n\t */\n\t defaultOption: {\n\t show: true,\n\t\n\t // ph => placeholder. Using placehoder here because\n\t // deault value can only be drived in view stage.\n\t right: 'ph', // Default align to grid rect.\n\t top: 'ph', // Default align to grid rect.\n\t width: 'ph', // Default align to grid rect.\n\t height: 'ph', // Default align to grid rect.\n\t left: null, // Default align to grid rect.\n\t bottom: null, // Default align to grid rect.\n\t\n\t backgroundColor: 'rgba(47,69,84,0)', // Background of slider zoom component.\n\t // dataBackgroundColor: '#ddd', // Background coor of data shadow and border of box,\n\t // highest priority, remain for compatibility of\n\t // previous version, but not recommended any more.\n\t dataBackground: {\n\t lineStyle: {\n\t color: '#2f4554',\n\t width: 0.5,\n\t opacity: 0.3\n\t },\n\t areaStyle: {\n\t color: 'rgba(47,69,84,0.3)',\n\t opacity: 0.3\n\t }\n\t },\n\t borderColor: '#ddd', // border color of the box. For compatibility,\n\t // if dataBackgroundColor is set, borderColor\n\t // is ignored.\n\t\n\t fillerColor: 'rgba(167,183,204,0.4)', // Color of selected area.\n\t // handleColor: 'rgba(89,170,216,0.95)', // Color of handle.\n\t // handleIcon: 'path://M4.9,17.8c0-1.4,4.5-10.5,5.5-12.4c0-0.1,0.6-1.1,0.9-1.1c0.4,0,0.9,1,0.9,1.1c1.1,2.2,5.4,11,5.4,12.4v17.8c0,1.5-0.6,2.1-1.3,2.1H6.1c-0.7,0-1.3-0.6-1.3-2.1V17.8z',\n\t 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',\n\t // Percent of the slider height\n\t handleSize: '100%',\n\t\n\t handleStyle: {\n\t color: '#a7b7cc'\n\t },\n\t\n\t labelPrecision: null,\n\t labelFormatter: null,\n\t showDetail: true,\n\t showDataShadow: 'auto', // Default auto decision.\n\t realtime: true,\n\t zoomLock: false, // Whether disable zoom.\n\t textStyle: {\n\t color: '#333'\n\t }\n\t }\n\t\n\t });\n\t\n\t module.exports = SliderZoomModel;\n\t\n\n\n/***/ },\n/* 636 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var throttle = __webpack_require__(112);\n\t var DataZoomView = __webpack_require__(87);\n\t var Rect = graphic.Rect;\n\t var numberUtil = __webpack_require__(5);\n\t var linearMap = numberUtil.linearMap;\n\t var layout = __webpack_require__(16);\n\t var sliderMove = __webpack_require__(155);\n\t var asc = numberUtil.asc;\n\t var bind = zrUtil.bind;\n\t // var mathMax = Math.max;\n\t var each = zrUtil.each;\n\t\n\t // Constants\n\t var DEFAULT_LOCATION_EDGE_GAP = 7;\n\t var DEFAULT_FRAME_BORDER_WIDTH = 1;\n\t var DEFAULT_FILLER_SIZE = 30;\n\t var HORIZONTAL = 'horizontal';\n\t var VERTICAL = 'vertical';\n\t var LABEL_GAP = 5;\n\t var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter'];\n\t\n\t var SliderZoomView = DataZoomView.extend({\n\t\n\t type: 'dataZoom.slider',\n\t\n\t init: function (ecModel, api) {\n\t\n\t /**\n\t * @private\n\t * @type {Object}\n\t */\n\t this._displayables = {};\n\t\n\t /**\n\t * @private\n\t * @type {string}\n\t */\n\t this._orient;\n\t\n\t /**\n\t * [0, 100]\n\t * @private\n\t */\n\t this._range;\n\t\n\t /**\n\t * [coord of the first handle, coord of the second handle]\n\t * @private\n\t */\n\t this._handleEnds;\n\t\n\t /**\n\t * [length, thick]\n\t * @private\n\t * @type {Array.}\n\t */\n\t this._size;\n\t\n\t /**\n\t * @private\n\t * @type {number}\n\t */\n\t this._handleWidth;\n\t\n\t /**\n\t * @private\n\t * @type {number}\n\t */\n\t this._handleHeight;\n\t\n\t /**\n\t * @private\n\t */\n\t this._location;\n\t\n\t /**\n\t * @private\n\t */\n\t this._dragging;\n\t\n\t /**\n\t * @private\n\t */\n\t this._dataShadowInfo;\n\t\n\t this.api = api;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t render: function (dataZoomModel, ecModel, api, payload) {\n\t SliderZoomView.superApply(this, 'render', arguments);\n\t\n\t throttle.createOrUpdate(\n\t this,\n\t '_dispatchZoomAction',\n\t this.dataZoomModel.get('throttle'),\n\t 'fixRate'\n\t );\n\t\n\t this._orient = dataZoomModel.get('orient');\n\t\n\t if (this.dataZoomModel.get('show') === false) {\n\t this.group.removeAll();\n\t return;\n\t }\n\t\n\t // Notice: this._resetInterval() should not be executed when payload.type\n\t // is 'dataZoom', origin this._range should be maintained, otherwise 'pan'\n\t // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction,\n\t if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) {\n\t this._buildView();\n\t }\n\t\n\t this._updateView();\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t remove: function () {\n\t SliderZoomView.superApply(this, 'remove', arguments);\n\t throttle.clear(this, '_dispatchZoomAction');\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t dispose: function () {\n\t SliderZoomView.superApply(this, 'dispose', arguments);\n\t throttle.clear(this, '_dispatchZoomAction');\n\t },\n\t\n\t _buildView: function () {\n\t var thisGroup = this.group;\n\t\n\t thisGroup.removeAll();\n\t\n\t this._resetLocation();\n\t this._resetInterval();\n\t\n\t var barGroup = this._displayables.barGroup = new graphic.Group();\n\t\n\t this._renderBackground();\n\t\n\t this._renderHandle();\n\t\n\t this._renderDataShadow();\n\t\n\t thisGroup.add(barGroup);\n\t\n\t this._positionGroup();\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _resetLocation: function () {\n\t var dataZoomModel = this.dataZoomModel;\n\t var api = this.api;\n\t\n\t // If some of x/y/width/height are not specified,\n\t // auto-adapt according to target grid.\n\t var coordRect = this._findCoordRect();\n\t var ecSize = {width: api.getWidth(), height: api.getHeight()};\n\t // Default align by coordinate system rect.\n\t var positionInfo = this._orient === HORIZONTAL\n\t ? {\n\t // Why using 'right', because right should be used in vertical,\n\t // and it is better to be consistent for dealing with position param merge.\n\t right: ecSize.width - coordRect.x - coordRect.width,\n\t top: (ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP),\n\t width: coordRect.width,\n\t height: DEFAULT_FILLER_SIZE\n\t }\n\t : { // vertical\n\t right: DEFAULT_LOCATION_EDGE_GAP,\n\t top: coordRect.y,\n\t width: DEFAULT_FILLER_SIZE,\n\t height: coordRect.height\n\t };\n\t\n\t // Do not write back to option and replace value 'ph', because\n\t // the 'ph' value should be recalculated when resize.\n\t var layoutParams = layout.getLayoutParams(dataZoomModel.option);\n\t\n\t // Replace the placeholder value.\n\t zrUtil.each(['right', 'top', 'width', 'height'], function (name) {\n\t if (layoutParams[name] === 'ph') {\n\t layoutParams[name] = positionInfo[name];\n\t }\n\t });\n\t\n\t var layoutRect = layout.getLayoutRect(\n\t layoutParams,\n\t ecSize,\n\t dataZoomModel.padding\n\t );\n\t\n\t this._location = {x: layoutRect.x, y: layoutRect.y};\n\t this._size = [layoutRect.width, layoutRect.height];\n\t this._orient === VERTICAL && this._size.reverse();\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _positionGroup: function () {\n\t var thisGroup = this.group;\n\t var location = this._location;\n\t var orient = this._orient;\n\t\n\t // Just use the first axis to determine mapping.\n\t var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel();\n\t var inverse = targetAxisModel && targetAxisModel.get('inverse');\n\t\n\t var barGroup = this._displayables.barGroup;\n\t var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse;\n\t\n\t // Transform barGroup.\n\t barGroup.attr(\n\t (orient === HORIZONTAL && !inverse)\n\t ? {scale: otherAxisInverse ? [1, 1] : [1, -1]}\n\t : (orient === HORIZONTAL && inverse)\n\t ? {scale: otherAxisInverse ? [-1, 1] : [-1, -1]}\n\t : (orient === VERTICAL && !inverse)\n\t ? {scale: otherAxisInverse ? [1, -1] : [1, 1], rotation: Math.PI / 2}\n\t // Dont use Math.PI, considering shadow direction.\n\t : {scale: otherAxisInverse ? [-1, -1] : [-1, 1], rotation: Math.PI / 2}\n\t );\n\t\n\t // Position barGroup\n\t var rect = thisGroup.getBoundingRect([barGroup]);\n\t thisGroup.attr('position', [location.x - rect.x, location.y - rect.y]);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _getViewExtent: function () {\n\t return [0, this._size[0]];\n\t },\n\t\n\t _renderBackground : function () {\n\t var dataZoomModel = this.dataZoomModel;\n\t var size = this._size;\n\t\n\t this._displayables.barGroup.add(new Rect({\n\t silent: true,\n\t shape: {\n\t x: 0, y: 0, width: size[0], height: size[1]\n\t },\n\t style: {\n\t fill: dataZoomModel.get('backgroundColor')\n\t },\n\t z2: -40\n\t }));\n\t },\n\t\n\t _renderDataShadow: function () {\n\t var info = this._dataShadowInfo = this._prepareDataShadowInfo();\n\t\n\t if (!info) {\n\t return;\n\t }\n\t\n\t var size = this._size;\n\t var seriesModel = info.series;\n\t var data = seriesModel.getRawData();\n\t var otherDim = seriesModel.getShadowDim\n\t ? seriesModel.getShadowDim() // @see candlestick\n\t : info.otherDim;\n\t\n\t var otherDataExtent = data.getDataExtent(otherDim);\n\t // Nice extent.\n\t var otherOffset = (otherDataExtent[1] - otherDataExtent[0]) * 0.3;\n\t otherDataExtent = [\n\t otherDataExtent[0] - otherOffset,\n\t otherDataExtent[1] + otherOffset\n\t ];\n\t var otherShadowExtent = [0, size[1]];\n\t\n\t var thisShadowExtent = [0, size[0]];\n\t\n\t var areaPoints = [[size[0], 0], [0, 0]];\n\t var linePoints = [];\n\t var step = thisShadowExtent[1] / (data.count() - 1);\n\t var thisCoord = 0;\n\t\n\t // Optimize for large data shadow\n\t var stride = Math.round(data.count() / size[0]);\n\t var lastIsEmpty;\n\t data.each([otherDim], function (value, index) {\n\t if (stride > 0 && (index % stride)) {\n\t thisCoord += step;\n\t return;\n\t }\n\t\n\t // FIXME\n\t // Should consider axis.min/axis.max when drawing dataShadow.\n\t\n\t // FIXME\n\t // 应该使用统一的空判断?还是在list里进行空判断?\n\t var isEmpty = value == null || isNaN(value) || value === '';\n\t // See #4235.\n\t var otherCoord = isEmpty\n\t ? 0 : linearMap(value, otherDataExtent, otherShadowExtent, true);\n\t\n\t // Attempt to draw data shadow precisely when there are empty value.\n\t if (isEmpty && !lastIsEmpty && index) {\n\t areaPoints.push([areaPoints[areaPoints.length - 1][0], 0]);\n\t linePoints.push([linePoints[linePoints.length - 1][0], 0]);\n\t }\n\t else if (!isEmpty && lastIsEmpty) {\n\t areaPoints.push([thisCoord, 0]);\n\t linePoints.push([thisCoord, 0]);\n\t }\n\t\n\t areaPoints.push([thisCoord, otherCoord]);\n\t linePoints.push([thisCoord, otherCoord]);\n\t\n\t thisCoord += step;\n\t lastIsEmpty = isEmpty;\n\t });\n\t\n\t var dataZoomModel = this.dataZoomModel;\n\t // var dataBackgroundModel = dataZoomModel.getModel('dataBackground');\n\t this._displayables.barGroup.add(new graphic.Polygon({\n\t shape: {points: areaPoints},\n\t style: zrUtil.defaults(\n\t {fill: dataZoomModel.get('dataBackgroundColor')},\n\t dataZoomModel.getModel('dataBackground.areaStyle').getAreaStyle()\n\t ),\n\t silent: true,\n\t z2: -20\n\t }));\n\t this._displayables.barGroup.add(new graphic.Polyline({\n\t shape: {points: linePoints},\n\t style: dataZoomModel.getModel('dataBackground.lineStyle').getLineStyle(),\n\t silent: true,\n\t z2: -19\n\t }));\n\t },\n\t\n\t _prepareDataShadowInfo: function () {\n\t var dataZoomModel = this.dataZoomModel;\n\t var showDataShadow = dataZoomModel.get('showDataShadow');\n\t\n\t if (showDataShadow === false) {\n\t return;\n\t }\n\t\n\t // Find a representative series.\n\t var result;\n\t var ecModel = this.ecModel;\n\t\n\t dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) {\n\t var seriesModels = dataZoomModel\n\t .getAxisProxy(dimNames.name, axisIndex)\n\t .getTargetSeriesModels();\n\t\n\t zrUtil.each(seriesModels, function (seriesModel) {\n\t if (result) {\n\t return;\n\t }\n\t\n\t if (showDataShadow !== true && zrUtil.indexOf(\n\t SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')\n\t ) < 0\n\t ) {\n\t return;\n\t }\n\t\n\t var otherDim = getOtherDim(dimNames.name);\n\t\n\t var thisAxis = ecModel.getComponent(dimNames.axis, axisIndex).axis;\n\t\n\t result = {\n\t thisAxis: thisAxis,\n\t series: seriesModel,\n\t thisDim: dimNames.name,\n\t otherDim: otherDim,\n\t otherAxisInverse: seriesModel\n\t .coordinateSystem.getOtherAxis(thisAxis).inverse\n\t };\n\t\n\t }, this);\n\t\n\t }, this);\n\t\n\t return result;\n\t },\n\t\n\t _renderHandle: function () {\n\t var displaybles = this._displayables;\n\t var handles = displaybles.handles = [];\n\t var handleLabels = displaybles.handleLabels = [];\n\t var barGroup = this._displayables.barGroup;\n\t var size = this._size;\n\t var dataZoomModel = this.dataZoomModel;\n\t\n\t barGroup.add(displaybles.filler = new Rect({\n\t draggable: true,\n\t cursor: 'move',\n\t drift: bind(this._onDragMove, this, 'all'),\n\t ondragstart: bind(this._showDataInfo, this, true),\n\t ondragend: bind(this._onDragEnd, this),\n\t onmouseover: bind(this._showDataInfo, this, true),\n\t onmouseout: bind(this._showDataInfo, this, false),\n\t style: {\n\t fill: dataZoomModel.get('fillerColor'),\n\t textPosition : 'inside'\n\t }\n\t }));\n\t\n\t // Frame border.\n\t barGroup.add(new Rect(graphic.subPixelOptimizeRect({\n\t silent: true,\n\t shape: {\n\t x: 0,\n\t y: 0,\n\t width: size[0],\n\t height: size[1]\n\t },\n\t style: {\n\t stroke: dataZoomModel.get('dataBackgroundColor')\n\t || dataZoomModel.get('borderColor'),\n\t lineWidth: DEFAULT_FRAME_BORDER_WIDTH,\n\t fill: 'rgba(0,0,0,0)'\n\t }\n\t })));\n\t\n\t var iconStr = dataZoomModel.get('handleIcon');\n\t each([0, 1], function (handleIndex) {\n\t var path = graphic.makePath(iconStr, {\n\t style: {\n\t strokeNoScale: true\n\t },\n\t rectHover: true,\n\t cursor: this._orient === 'vertical' ? 'ns-resize' : 'ew-resize',\n\t draggable: true,\n\t drift: bind(this._onDragMove, this, handleIndex),\n\t ondragend: bind(this._onDragEnd, this),\n\t onmouseover: bind(this._showDataInfo, this, true),\n\t onmouseout: bind(this._showDataInfo, this, false)\n\t }, {\n\t x: -0.5,\n\t y: 0,\n\t width: 1,\n\t height: 1\n\t }, 'center');\n\t\n\t var bRect = path.getBoundingRect();\n\t this._handleHeight = numberUtil.parsePercent(dataZoomModel.get('handleSize'), this._size[1]);\n\t this._handleWidth = bRect.width / bRect.height * this._handleHeight;\n\t\n\t path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle());\n\t var handleColor = dataZoomModel.get('handleColor');\n\t // Compatitable with previous version\n\t if (handleColor != null) {\n\t path.style.fill = handleColor;\n\t }\n\t\n\t barGroup.add(handles[handleIndex] = path);\n\t\n\t var textStyleModel = dataZoomModel.textStyleModel;\n\t\n\t this.group.add(\n\t handleLabels[handleIndex] = new graphic.Text({\n\t silent: true,\n\t invisible: true,\n\t style: {\n\t x: 0, y: 0, text: '',\n\t textVerticalAlign: 'middle',\n\t textAlign: 'center',\n\t fill: textStyleModel.getTextColor(),\n\t textFont: textStyleModel.getFont()\n\t },\n\t z2: 10\n\t }));\n\t\n\t }, this);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _resetInterval: function () {\n\t var range = this._range = this.dataZoomModel.getPercentRange();\n\t var viewExtent = this._getViewExtent();\n\t\n\t this._handleEnds = [\n\t linearMap(range[0], [0, 100], viewExtent, true),\n\t linearMap(range[1], [0, 100], viewExtent, true)\n\t ];\n\t },\n\t\n\t /**\n\t * @private\n\t * @param {(number|string)} handleIndex 0 or 1 or 'all'\n\t * @param {number} dx\n\t * @param {number} dy\n\t */\n\t _updateInterval: function (handleIndex, delta) {\n\t var handleEnds = this._handleEnds;\n\t var viewExtend = this._getViewExtent();\n\t\n\t sliderMove(\n\t delta,\n\t handleEnds,\n\t viewExtend,\n\t (handleIndex === 'all' || this.dataZoomModel.get('zoomLock'))\n\t ? 'rigid' : 'cross',\n\t handleIndex\n\t );\n\t\n\t this._range = asc([\n\t linearMap(handleEnds[0], viewExtend, [0, 100], true),\n\t linearMap(handleEnds[1], viewExtend, [0, 100], true)\n\t ]);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _updateView: function (nonRealtime) {\n\t var displaybles = this._displayables;\n\t var handleEnds = this._handleEnds;\n\t var handleInterval = asc(handleEnds.slice());\n\t var size = this._size;\n\t\n\t each([0, 1], function (handleIndex) {\n\t // Handles\n\t var handle = displaybles.handles[handleIndex];\n\t var handleHeight = this._handleHeight;\n\t handle.attr({\n\t scale: [handleHeight, handleHeight],\n\t position: [handleEnds[handleIndex], size[1] / 2 - handleHeight / 2]\n\t });\n\t }, this);\n\t\n\t // Filler\n\t displaybles.filler.setShape({\n\t x: handleInterval[0],\n\t y: 0,\n\t width: handleInterval[1] - handleInterval[0],\n\t height: size[1]\n\t });\n\t\n\t this._updateDataInfo(nonRealtime);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _updateDataInfo: function (nonRealtime) {\n\t var dataZoomModel = this.dataZoomModel;\n\t var displaybles = this._displayables;\n\t var handleLabels = displaybles.handleLabels;\n\t var orient = this._orient;\n\t var labelTexts = ['', ''];\n\t\n\t // FIXME\n\t // date型,支持formatter,autoformatter(ec2 date.getAutoFormatter)\n\t if (dataZoomModel.get('showDetail')) {\n\t var axisProxy = dataZoomModel.findRepresentativeAxisProxy();\n\t\n\t if (axisProxy) {\n\t var axis = axisProxy.getAxisModel().axis;\n\t var range = this._range;\n\t\n\t var dataInterval = nonRealtime\n\t // See #4434, data and axis are not processed and reset yet in non-realtime mode.\n\t ? axisProxy.calculateDataWindow(\n\t {start: range[0], end: range[1]},\n\t axisProxy.getDataExtent()\n\t ).valueWindow\n\t : axisProxy.getDataValueWindow();\n\t\n\t labelTexts = [\n\t this._formatLabel(dataInterval[0], axis),\n\t this._formatLabel(dataInterval[1], axis)\n\t ];\n\t }\n\t }\n\t\n\t var orderedHandleEnds = asc(this._handleEnds.slice());\n\t\n\t setLabel.call(this, 0);\n\t setLabel.call(this, 1);\n\t\n\t function setLabel(handleIndex) {\n\t // Label\n\t // Text should not transform by barGroup.\n\t // Ignore handlers transform\n\t var barTransform = graphic.getTransform(\n\t displaybles.handles[handleIndex].parent, this.group\n\t );\n\t var direction = graphic.transformDirection(\n\t handleIndex === 0 ? 'right' : 'left', barTransform\n\t );\n\t var offset = this._handleWidth / 2 + LABEL_GAP;\n\t var textPoint = graphic.applyTransform(\n\t [\n\t orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset),\n\t this._size[1] / 2\n\t ],\n\t barTransform\n\t );\n\t handleLabels[handleIndex].setStyle({\n\t x: textPoint[0],\n\t y: textPoint[1],\n\t textVerticalAlign: orient === HORIZONTAL ? 'middle' : direction,\n\t textAlign: orient === HORIZONTAL ? direction : 'center',\n\t text: labelTexts[handleIndex]\n\t });\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _formatLabel: function (value, axis) {\n\t var dataZoomModel = this.dataZoomModel;\n\t var labelFormatter = dataZoomModel.get('labelFormatter');\n\t\n\t var labelPrecision = dataZoomModel.get('labelPrecision');\n\t if (labelPrecision == null || labelPrecision === 'auto') {\n\t labelPrecision = axis.getPixelPrecision();\n\t }\n\t\n\t var valueStr = (value == null && isNaN(value))\n\t ? ''\n\t // FIXME Glue code\n\t : (axis.type === 'category' || axis.type === 'time')\n\t ? axis.scale.getLabel(Math.round(value))\n\t // param of toFixed should less then 20.\n\t : value.toFixed(Math.min(labelPrecision, 20));\n\t\n\t return zrUtil.isFunction(labelFormatter)\n\t ? labelFormatter(value, valueStr)\n\t : zrUtil.isString(labelFormatter)\n\t ? labelFormatter.replace('{value}', valueStr)\n\t : valueStr;\n\t },\n\t\n\t /**\n\t * @private\n\t * @param {boolean} showOrHide true: show, false: hide\n\t */\n\t _showDataInfo: function (showOrHide) {\n\t // Always show when drgging.\n\t showOrHide = this._dragging || showOrHide;\n\t\n\t var handleLabels = this._displayables.handleLabels;\n\t handleLabels[0].attr('invisible', !showOrHide);\n\t handleLabels[1].attr('invisible', !showOrHide);\n\t },\n\t\n\t _onDragMove: function (handleIndex, dx, dy) {\n\t this._dragging = true;\n\t\n\t // Transform dx, dy to bar coordination.\n\t var vertex = this._applyBarTransform([dx, dy], true);\n\t\n\t this._updateInterval(handleIndex, vertex[0]);\n\t\n\t var realtime = this.dataZoomModel.get('realtime');\n\t\n\t this._updateView(!realtime);\n\t\n\t if (realtime) {\n\t realtime && this._dispatchZoomAction();\n\t }\n\t },\n\t\n\t _onDragEnd: function () {\n\t this._dragging = false;\n\t this._showDataInfo(false);\n\t this._dispatchZoomAction();\n\t },\n\t\n\t /**\n\t * This action will be throttled.\n\t * @private\n\t */\n\t _dispatchZoomAction: function () {\n\t var range = this._range;\n\t\n\t this.api.dispatchAction({\n\t type: 'dataZoom',\n\t from: this.uid,\n\t dataZoomId: this.dataZoomModel.id,\n\t start: range[0],\n\t end: range[1]\n\t });\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _applyBarTransform: function (vertex, inverse) {\n\t var barTransform = this._displayables.barGroup.getLocalTransform();\n\t return graphic.applyTransform(vertex, barTransform, inverse);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _findCoordRect: function () {\n\t // Find the grid coresponding to the first axis referred by dataZoom.\n\t var targetInfo = this.getTargetInfo();\n\t\n\t // FIXME\n\t // 判断是catesian还是polar\n\t var rect;\n\t if (targetInfo.cartesians.length) {\n\t rect = targetInfo.cartesians[0].model.coordinateSystem.getRect();\n\t }\n\t else { // Polar\n\t // FIXME\n\t // 暂时随便写的\n\t var width = this.api.getWidth();\n\t var height = this.api.getHeight();\n\t rect = {\n\t x: width * 0.2,\n\t y: height * 0.2,\n\t width: width * 0.6,\n\t height: height * 0.6\n\t };\n\t }\n\t\n\t return rect;\n\t }\n\t\n\t });\n\t\n\t function getOtherDim(thisDim) {\n\t // FIXME\n\t // 这个逻辑和getOtherAxis里一致,但是写在这里是否不好\n\t return thisDim === 'x' ? 'y' : 'x';\n\t }\n\t\n\t module.exports = SliderZoomView;\n\t\n\n\n/***/ },\n/* 637 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Roam controller manager.\n\t */\n\t\n\t\n\t // Only create one roam controller for each coordinate system.\n\t // one roam controller might be refered by two inside data zoom\n\t // components (for example, one for x and one for y). When user\n\t // pan or zoom, only dispatch one action for those data zoom\n\t // components.\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var RoamController = __webpack_require__(106);\n\t var throttle = __webpack_require__(112);\n\t var curry = zrUtil.curry;\n\t\n\t var ATTR = '\\0_ec_dataZoom_roams';\n\t\n\t var roams = {\n\t\n\t /**\n\t * @public\n\t * @param {module:echarts/ExtensionAPI} api\n\t * @param {Object} dataZoomInfo\n\t * @param {string} dataZoomInfo.coordId\n\t * @param {Function} dataZoomInfo.containsPoint\n\t * @param {Array.} dataZoomInfo.allCoordIds\n\t * @param {string} dataZoomInfo.dataZoomId\n\t * @param {number} dataZoomInfo.throttleRate\n\t * @param {Function} dataZoomInfo.panGetRange\n\t * @param {Function} dataZoomInfo.zoomGetRange\n\t */\n\t register: function (api, dataZoomInfo) {\n\t var store = giveStore(api);\n\t var theDataZoomId = dataZoomInfo.dataZoomId;\n\t var theCoordId = dataZoomInfo.coordId;\n\t\n\t // Do clean when a dataZoom changes its target coordnate system.\n\t // Avoid memory leak, dispose all not-used-registered.\n\t zrUtil.each(store, function (record, coordId) {\n\t var dataZoomInfos = record.dataZoomInfos;\n\t if (dataZoomInfos[theDataZoomId]\n\t && zrUtil.indexOf(dataZoomInfo.allCoordIds, theCoordId) < 0\n\t ) {\n\t delete dataZoomInfos[theDataZoomId];\n\t record.count--;\n\t }\n\t });\n\t\n\t cleanStore(store);\n\t\n\t var record = store[theCoordId];\n\t // Create if needed.\n\t if (!record) {\n\t record = store[theCoordId] = {\n\t coordId: theCoordId,\n\t dataZoomInfos: {},\n\t count: 0\n\t };\n\t record.controller = createController(api, dataZoomInfo, record);\n\t record.dispatchAction = zrUtil.curry(dispatchAction, api);\n\t }\n\t\n\t // Consider resize, area should be always updated.\n\t record.controller.setContainsPoint(dataZoomInfo.containsPoint);\n\t\n\t // Update throttle.\n\t throttle.createOrUpdate(\n\t record,\n\t 'dispatchAction',\n\t dataZoomInfo.throttleRate,\n\t 'fixRate'\n\t );\n\t\n\t // Update reference of dataZoom.\n\t !(record.dataZoomInfos[theDataZoomId]) && record.count++;\n\t record.dataZoomInfos[theDataZoomId] = dataZoomInfo;\n\t },\n\t\n\t /**\n\t * @public\n\t * @param {module:echarts/ExtensionAPI} api\n\t * @param {string} dataZoomId\n\t */\n\t unregister: function (api, dataZoomId) {\n\t var store = giveStore(api);\n\t\n\t zrUtil.each(store, function (record) {\n\t record.controller.dispose();\n\t var dataZoomInfos = record.dataZoomInfos;\n\t if (dataZoomInfos[dataZoomId]) {\n\t delete dataZoomInfos[dataZoomId];\n\t record.count--;\n\t }\n\t });\n\t\n\t cleanStore(store);\n\t },\n\t\n\t /**\n\t * @public\n\t */\n\t shouldRecordRange: function (payload, dataZoomId) {\n\t if (payload && payload.type === 'dataZoom' && payload.batch) {\n\t for (var i = 0, len = payload.batch.length; i < len; i++) {\n\t if (payload.batch[i].dataZoomId === dataZoomId) {\n\t return false;\n\t }\n\t }\n\t }\n\t return true;\n\t },\n\t\n\t /**\n\t * @public\n\t */\n\t generateCoordId: function (coordModel) {\n\t return coordModel.type + '\\0_' + coordModel.id;\n\t }\n\t };\n\t\n\t /**\n\t * Key: coordId, value: {dataZoomInfos: [], count, controller}\n\t * @type {Array.}\n\t */\n\t function giveStore(api) {\n\t // Mount store on zrender instance, so that we do not\n\t // need to worry about dispose.\n\t var zr = api.getZr();\n\t return zr[ATTR] || (zr[ATTR] = {});\n\t }\n\t\n\t function createController(api, dataZoomInfo, newRecord) {\n\t var controller = new RoamController(api.getZr());\n\t controller.enable();\n\t controller.on('pan', curry(onPan, newRecord));\n\t controller.on('zoom', curry(onZoom, newRecord));\n\t\n\t return controller;\n\t }\n\t\n\t function cleanStore(store) {\n\t zrUtil.each(store, function (record, coordId) {\n\t if (!record.count) {\n\t record.controller.dispose();\n\t delete store[coordId];\n\t }\n\t });\n\t }\n\t\n\t function onPan(record, dx, dy, oldX, oldY, newX, newY) {\n\t wrapAndDispatch(record, function (info) {\n\t return info.panGetRange(record.controller, dx, dy, oldX, oldY, newX, newY);\n\t });\n\t }\n\t\n\t function onZoom(record, scale, mouseX, mouseY) {\n\t wrapAndDispatch(record, function (info) {\n\t return info.zoomGetRange(record.controller, scale, mouseX, mouseY);\n\t });\n\t }\n\t\n\t function wrapAndDispatch(record, getRange) {\n\t var batch = [];\n\t\n\t zrUtil.each(record.dataZoomInfos, function (info) {\n\t var range = getRange(info);\n\t range && batch.push({\n\t dataZoomId: info.dataZoomId,\n\t start: range[0],\n\t end: range[1]\n\t });\n\t });\n\t\n\t record.dispatchAction(batch);\n\t }\n\t\n\t /**\n\t * This action will be throttled.\n\t */\n\t function dispatchAction(api, batch) {\n\t api.dispatchAction({\n\t type: 'dataZoom',\n\t batch: batch\n\t });\n\t }\n\t\n\t module.exports = roams;\n\t\n\n\n/***/ },\n/* 638 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(697);\n\t\n\t __webpack_require__(108);\n\t\n\t __webpack_require__(639);\n\t\n\t __webpack_require__(209);\n\t\n\t var echarts = __webpack_require__(3);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t function makeAction(method, actionInfo) {\n\t actionInfo.update = 'updateView';\n\t echarts.registerAction(actionInfo, function (payload, ecModel) {\n\t var selected = {};\n\t\n\t ecModel.eachComponent(\n\t { mainType: 'geo', query: payload},\n\t function (geoModel) {\n\t geoModel[method](payload.name);\n\t var geo = geoModel.coordinateSystem;\n\t zrUtil.each(geo.regions, function (region) {\n\t selected[region.name] = geoModel.isSelected(region.name) || false;\n\t });\n\t }\n\t );\n\t\n\t return {\n\t selected: selected,\n\t name: payload.name\n\t }\n\t });\n\t }\n\t\n\t makeAction('toggleSelected', {\n\t type: 'geoToggleSelect',\n\t event: 'geoselectchanged'\n\t });\n\t makeAction('select', {\n\t type: 'geoSelect',\n\t event: 'geoselected'\n\t });\n\t makeAction('unSelect', {\n\t type: 'geoUnSelect',\n\t event: 'geounselected'\n\t });\n\n\n/***/ },\n/* 639 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var MapDraw = __webpack_require__(222);\n\t\n\t module.exports = __webpack_require__(3).extendComponentView({\n\t\n\t type: 'geo',\n\t\n\t init: function (ecModel, api) {\n\t var mapDraw = new MapDraw(api, true);\n\t this._mapDraw = mapDraw;\n\t\n\t this.group.add(mapDraw.group);\n\t },\n\t\n\t render: function (geoModel, ecModel, api, payload) {\n\t // Not render if it is an toggleSelect action from self\n\t if (payload && payload.type === 'geoToggleSelect'\n\t && payload.from === this.uid\n\t ) {\n\t return;\n\t }\n\t\n\t var mapDraw = this._mapDraw;\n\t if (geoModel.get('show')) {\n\t mapDraw.draw(geoModel, ecModel, api, this, payload);\n\t }\n\t else {\n\t this._mapDraw.group.removeAll();\n\t }\n\t\n\t this.group.silent = geoModel.get('silent');\n\t },\n\t\n\t dispose: function () {\n\t this._mapDraw && this._mapDraw.remove();\n\t }\n\t\n\t });\n\n\n/***/ },\n/* 640 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var zrUtil = __webpack_require__(1);\n\t var modelUtil = __webpack_require__(14);\n\t var graphicUtil = __webpack_require__(4);\n\t var formatUtil = __webpack_require__(18);\n\t var layoutUtil = __webpack_require__(16);\n\t\n\t // Preprocessor\n\t echarts.registerPreprocessor(function (option) {\n\t var graphicOption = option && option.graphic;\n\t\n\t // Convert\n\t // {graphic: [{left: 10, type: 'circle'}, ...]}\n\t // or\n\t // {graphic: {left: 10, type: 'circle'}}\n\t // to\n\t // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]}\n\t if (zrUtil.isArray(graphicOption)) {\n\t if (!graphicOption[0] || !graphicOption[0].elements) {\n\t option.graphic = [{elements: graphicOption}];\n\t }\n\t else {\n\t // Only one graphic instance can be instantiated. (We dont\n\t // want that too many views created in echarts._viewMap)\n\t option.graphic = [option.graphic[0]];\n\t }\n\t }\n\t else if (graphicOption && !graphicOption.elements) {\n\t option.graphic = [{elements: [graphicOption]}];\n\t }\n\t });\n\t\n\t // Model\n\t var GraphicModel = echarts.extendComponentModel({\n\t\n\t type: 'graphic',\n\t\n\t defaultOption: {\n\t // Extra properties for each elements:\n\t //\n\t // left/right/top/bottom: (like 12, '22%', 'center', default undefined)\n\t // If left/rigth is set, shape.x/shape.cx/position is not used.\n\t // If top/bottom is set, shape.y/shape.cy/position is not used.\n\t // This mechanism is useful when you want position a group/element\n\t // against the right side or center of this container.\n\t //\n\t // width/height: (can only pixel value, default 0)\n\t // Only be used to specify contianer(group) size, if needed. And\n\t // can not be percentage value (like '33%'). See the reason in the\n\t // layout algorithm below.\n\t //\n\t // bounding: (enum: 'all' (default) | 'raw')\n\t // Specify how to calculate boundingRect when locating.\n\t // 'all': Get uioned and transformed boundingRect\n\t // from both itself and its descendants.\n\t // This mode simplies confine a group of elements in the bounding\n\t // of their ancester container (e.g., using 'right: 0').\n\t // 'raw': Only use not transformed boundingRect of itself.\n\t // This mode likes css behavior, useful when you want a\n\t // element can overflow its container. (Consider a rotated\n\t // circle needs to be located in a corner.)\n\t\n\t // Note: elements is always behind its ancestors in elements array.\n\t elements: [],\n\t parentId: null\n\t },\n\t\n\t /**\n\t * Save for performance (only update needed graphics).\n\t * The order is the same as those in option. (ancesters -> descendants)\n\t * @private\n\t * @type {Array.}\n\t */\n\t _elOptionsToUpdate: null,\n\t\n\t /**\n\t * @override\n\t */\n\t mergeOption: function (option) {\n\t // Prevent default merge to elements\n\t var elements = this.option.elements;\n\t this.option.elements = null;\n\t\n\t GraphicModel.superApply(this, 'mergeOption', arguments);\n\t\n\t this.option.elements = elements;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t optionUpdated: function (newOption, isInit) {\n\t var thisOption = this.option;\n\t var newList = (isInit ? thisOption : newOption).elements;\n\t var existList = thisOption.elements = isInit ? [] : thisOption.elements;\n\t\n\t var flattenedList = [];\n\t this._flatten(newList, flattenedList);\n\t\n\t var mappingResult = modelUtil.mappingToExists(existList, flattenedList);\n\t modelUtil.makeIdAndName(mappingResult);\n\t\n\t // Clear elOptionsToUpdate\n\t var elOptionsToUpdate = this._elOptionsToUpdate = [];\n\t\n\t zrUtil.each(mappingResult, function (resultItem, index) {\n\t var existElOption = resultItem.exist;\n\t var newElOption = resultItem.option;\n\t\n\t if (__DEV__) {\n\t zrUtil.assert(\n\t zrUtil.isObject(newElOption) || existElOption,\n\t 'Empty graphic option definition'\n\t );\n\t }\n\t\n\t if (!newElOption) {\n\t return;\n\t }\n\t\n\t // Set id and parent id after id assigned.\n\t newElOption.id = resultItem.keyInfo.id;\n\t var newElParentId = newElOption.parentId;\n\t var newElParentOption = newElOption.parentOption;\n\t var existElParentId = existElOption && existElOption.parentId;\n\t !newElOption.type && existElOption && (newElOption.type = existElOption.type);\n\t newElOption.parentId = newElParentId // parent id specified\n\t ? newElParentId\n\t : newElParentOption\n\t ? newElParentOption.id\n\t : existElParentId // parent not specified\n\t ? existElParentId\n\t : null;\n\t newElOption.parentOption = null; // Clear\n\t elOptionsToUpdate.push(newElOption);\n\t\n\t // Update existing options, for `getOption` feature.\n\t var newElOptCopy = zrUtil.extend({}, newElOption); // Avoid modified.\n\t var $action = newElOption.$action;\n\t if (!$action || $action === 'merge') {\n\t if (existElOption) {\n\t\n\t if (__DEV__) {\n\t var newType = newElOption.type;\n\t zrUtil.assert(\n\t !newType || existElOption.type === newType,\n\t 'Please set $action: \"replace\" to change `type`'\n\t );\n\t }\n\t\n\t // We can ensure that newElOptCopy and existElOption are not\n\t // the same object, so merge will not change newElOptCopy.\n\t zrUtil.merge(existElOption, newElOptCopy, true);\n\t // Rigid body, use ignoreSize.\n\t layoutUtil.mergeLayoutParam(existElOption, newElOptCopy, {ignoreSize: true});\n\t // Will be used in render.\n\t layoutUtil.copyLayoutParams(newElOption, existElOption);\n\t }\n\t else {\n\t existList[index] = newElOptCopy;\n\t }\n\t }\n\t else if ($action === 'replace') {\n\t existList[index] = newElOptCopy;\n\t }\n\t else if ($action === 'remove') {\n\t // null will be cleaned later.\n\t existElOption && (existList[index] = null);\n\t }\n\t\n\t if (existList[index]) {\n\t existList[index].hv = newElOption.hv = [\n\t isSetLoc(newElOption, ['left', 'right']), // Rigid body, dont care `width`.\n\t isSetLoc(newElOption, ['top', 'bottom']) // Rigid body, Dont care `height`.\n\t ];\n\t // Given defualt group size, otherwise may layout error.\n\t if (existList[index].type === 'group') {\n\t existList[index].width == null && (existList[index].width = newElOption.width = 0);\n\t existList[index].height == null && (existList[index].height = newElOption.height = 0);\n\t }\n\t }\n\t\n\t }, this);\n\t\n\t // Clean\n\t for (var i = existList.length - 1; i >= 0; i--) {\n\t if (existList[i] == null) {\n\t existList.splice(i, 1);\n\t }\n\t else {\n\t // $action should be volatile, otherwise option gotten from\n\t // `getOption` will contain unexpected $action.\n\t delete existList[i].$action;\n\t }\n\t }\n\t },\n\t\n\t /**\n\t * Convert\n\t * [{\n\t * type: 'group',\n\t * id: 'xx',\n\t * children: [{type: 'circle'}, {type: 'polygon'}]\n\t * }]\n\t * to\n\t * [\n\t * {type: 'group', id: 'xx'},\n\t * {type: 'circle', parentId: 'xx'},\n\t * {type: 'polygon', parentId: 'xx'}\n\t * ]\n\t * @private\n\t */\n\t _flatten: function (optionList, result, parentOption) {\n\t zrUtil.each(optionList, function (option) {\n\t if (option) {\n\t if (parentOption) {\n\t option.parentOption = parentOption;\n\t }\n\t\n\t result.push(option);\n\t\n\t var children = option.children;\n\t if (option.type === 'group' && children) {\n\t this._flatten(children, result, option);\n\t }\n\t // For JSON output, and do not affect group creation.\n\t delete option.children;\n\t }\n\t }, this);\n\t },\n\t\n\t // FIXME\n\t // Pass to view using payload? setOption has a payload?\n\t useElOptionsToUpdate: function () {\n\t var els = this._elOptionsToUpdate;\n\t // Clear to avoid render duplicately when zooming.\n\t this._elOptionsToUpdate = null;\n\t return els;\n\t }\n\t });\n\t\n\t // View\n\t echarts.extendComponentView({\n\t\n\t type: 'graphic',\n\t\n\t /**\n\t * @override\n\t */\n\t init: function (ecModel, api) {\n\t /**\n\t * @type {Object}\n\t */\n\t this._elMap = {};\n\t /**\n\t * @type {module:echarts/graphic/GraphicModel}\n\t */\n\t this._lastGraphicModel;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t render: function (graphicModel, ecModel, api) {\n\t\n\t // Having leveraged use case and algorithm complexity, a very simple\n\t // layout mechanism is used:\n\t // The size(width/height) can be determined by itself or its parent (not\n\t // implemented yet), but can not by its children. (Top-down travel)\n\t // The location(x/y) can be determined by the bounding rect of itself\n\t // (can including its descendants or not) and the size of its parent.\n\t // (Bottom-up travel)\n\t\n\t // When chart.clear() or chart.setOption({...}, true) with the same id,\n\t // view will be reused.\n\t if (graphicModel !== this._lastGraphicModel) {\n\t this._clear();\n\t }\n\t this._lastGraphicModel = graphicModel;\n\t\n\t this._updateElements(graphicModel, api);\n\t this._relocate(graphicModel, api);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _updateElements: function (graphicModel, api) {\n\t var elOptionsToUpdate = graphicModel.useElOptionsToUpdate();\n\t\n\t if (!elOptionsToUpdate) {\n\t return;\n\t }\n\t\n\t var elMap = this._elMap;\n\t var rootGroup = this.group;\n\t\n\t // Top-down tranverse to assign graphic settings to each elements.\n\t zrUtil.each(elOptionsToUpdate, function (elOption) {\n\t var $action = elOption.$action;\n\t var id = elOption.id;\n\t var existEl = elMap[id];\n\t var parentId = elOption.parentId;\n\t var targetElParent = parentId != null ? elMap[parentId] : rootGroup;\n\t\n\t // In top/bottom mode, textVertical should not be used. But\n\t // textBaseline should not be 'alphabetic', which is not precise.\n\t if (elOption.hv && elOption.hv[1] && elOption.type === 'text') {\n\t elOption.style = zrUtil.defaults({textBaseline: 'middle'}, elOption.style);\n\t elOption.style.textVerticalAlign = null;\n\t }\n\t\n\t // Remove unnecessary props to avoid potential problem.\n\t var elOptionCleaned = getCleanedElOption(elOption);\n\t\n\t // For simple, do not support parent change, otherwise reorder is needed.\n\t if (__DEV__) {\n\t existEl && zrUtil.assert(\n\t targetElParent === existEl.parent,\n\t 'Changing parent is not supported.'\n\t );\n\t }\n\t\n\t if (!$action || $action === 'merge') {\n\t existEl\n\t ? existEl.attr(elOptionCleaned)\n\t : createEl(id, targetElParent, elOptionCleaned, elMap);\n\t }\n\t else if ($action === 'replace') {\n\t removeEl(existEl, elMap);\n\t createEl(id, targetElParent, elOptionCleaned, elMap);\n\t }\n\t else if ($action === 'remove') {\n\t removeEl(existEl, elMap);\n\t }\n\t\n\t if (elMap[id]) {\n\t elMap[id].__ecGraphicWidth = elOption.width;\n\t elMap[id].__ecGraphicHeight = elOption.height;\n\t }\n\t });\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _relocate: function (graphicModel, api) {\n\t var elOptions = graphicModel.option.elements;\n\t var rootGroup = this.group;\n\t var elMap = this._elMap;\n\t\n\t // Bottom-up tranvese all elements (consider when ec resize) to locate elements.\n\t for (var i = elOptions.length - 1; i >= 0; i--) {\n\t var elOption = elOptions[i];\n\t var el = elMap[elOption.id];\n\t\n\t if (!el) {\n\t continue;\n\t }\n\t\n\t var parentEl = el.parent;\n\t var containerInfo = parentEl === rootGroup\n\t ? {\n\t width: api.getWidth(),\n\t height: api.getHeight()\n\t }\n\t : { // Like 'position:absolut' in css, default 0.\n\t width: parentEl.__ecGraphicWidth || 0,\n\t height: parentEl.__ecGraphicHeight || 0\n\t };\n\t\n\t layoutUtil.positionElement(\n\t el, elOption, containerInfo, null,\n\t {hv: elOption.hv, boundingMode: elOption.bounding}\n\t );\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _clear: function () {\n\t var elMap = this._elMap;\n\t zrUtil.each(elMap, function (el) {\n\t removeEl(el, elMap);\n\t });\n\t this._elMap = {};\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t dispose: function () {\n\t this._clear();\n\t }\n\t });\n\t\n\t function createEl(id, targetElParent, elOption, elMap) {\n\t var graphicType = elOption.type;\n\t\n\t if (__DEV__) {\n\t zrUtil.assert(graphicType, 'graphic type MUST be set');\n\t }\n\t\n\t var Clz = graphicUtil[graphicType.charAt(0).toUpperCase() + graphicType.slice(1)];\n\t\n\t if (__DEV__) {\n\t zrUtil.assert(Clz, 'graphic type can not be found');\n\t }\n\t\n\t var el = new Clz(elOption);\n\t targetElParent.add(el);\n\t elMap[id] = el;\n\t el.__ecGraphicId = id;\n\t }\n\t\n\t function removeEl(existEl, elMap) {\n\t var existElParent = existEl && existEl.parent;\n\t if (existElParent) {\n\t existEl.type === 'group' && existEl.traverse(function (el) {\n\t removeEl(el, elMap);\n\t });\n\t delete elMap[existEl.__ecGraphicId];\n\t existElParent.remove(existEl);\n\t }\n\t }\n\t\n\t // Remove unnecessary props to avoid potential problem.\n\t function getCleanedElOption(elOption) {\n\t elOption = zrUtil.extend({}, elOption);\n\t zrUtil.each(\n\t ['id', 'parentId', '$action', 'hv', 'bounding'].concat(layoutUtil.LOCATION_PARAMS),\n\t function (name) {\n\t delete elOption[name];\n\t }\n\t );\n\t return elOption;\n\t }\n\t\n\t function isSetLoc(obj, props) {\n\t var isSet;\n\t zrUtil.each(props, function (prop) {\n\t obj[prop] != null && obj[prop] !== 'auto' && (isSet = true);\n\t });\n\t return isSet;\n\t }\n\n\n/***/ },\n/* 641 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Legend component entry file8\n\t */\n\t\n\t\n\t __webpack_require__(642);\n\t __webpack_require__(644);\n\t __webpack_require__(643);\n\t\n\t var echarts = __webpack_require__(3);\n\t // Series Filter\n\t echarts.registerProcessor(__webpack_require__(645));\n\n\n/***/ },\n/* 642 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var Model = __webpack_require__(21);\n\t\n\t var LegendModel = __webpack_require__(3).extendComponentModel({\n\t\n\t type: 'legend',\n\t\n\t dependencies: ['series'],\n\t\n\t layoutMode: {\n\t type: 'box',\n\t ignoreSize: true\n\t },\n\t\n\t init: function (option, parentModel, ecModel) {\n\t this.mergeDefaultAndTheme(option, ecModel);\n\t\n\t option.selected = option.selected || {};\n\t },\n\t\n\t mergeOption: function (option) {\n\t LegendModel.superCall(this, 'mergeOption', option);\n\t },\n\t\n\t optionUpdated: function () {\n\t this._updateData(this.ecModel);\n\t\n\t var legendData = this._data;\n\t\n\t // If selectedMode is single, try to select one\n\t if (legendData[0] && this.get('selectedMode') === 'single') {\n\t var hasSelected = false;\n\t // If has any selected in option.selected\n\t for (var i = 0; i < legendData.length; i++) {\n\t var name = legendData[i].get('name');\n\t if (this.isSelected(name)) {\n\t // Force to unselect others\n\t this.select(name);\n\t hasSelected = true;\n\t break;\n\t }\n\t }\n\t // Try select the first if selectedMode is single\n\t !hasSelected && this.select(legendData[0].get('name'));\n\t }\n\t },\n\t\n\t _updateData: function (ecModel) {\n\t var legendData = zrUtil.map(this.get('data') || [], function (dataItem) {\n\t // Can be string or number\n\t if (typeof dataItem === 'string' || typeof dataItem === 'number') {\n\t dataItem = {\n\t name: dataItem\n\t };\n\t }\n\t return new Model(dataItem, this, this.ecModel);\n\t }, this);\n\t this._data = legendData;\n\t\n\t var availableNames = zrUtil.map(ecModel.getSeries(), function (series) {\n\t return series.name;\n\t });\n\t ecModel.eachSeries(function (seriesModel) {\n\t if (seriesModel.legendDataProvider) {\n\t var data = seriesModel.legendDataProvider();\n\t availableNames = availableNames.concat(data.mapArray(data.getName));\n\t }\n\t });\n\t /**\n\t * @type {Array.}\n\t * @private\n\t */\n\t this._availableNames = availableNames;\n\t },\n\t\n\t /**\n\t * @return {Array.}\n\t */\n\t getData: function () {\n\t return this._data;\n\t },\n\t\n\t /**\n\t * @param {string} name\n\t */\n\t select: function (name) {\n\t var selected = this.option.selected;\n\t var selectedMode = this.get('selectedMode');\n\t if (selectedMode === 'single') {\n\t var data = this._data;\n\t zrUtil.each(data, function (dataItem) {\n\t selected[dataItem.get('name')] = false;\n\t });\n\t }\n\t selected[name] = true;\n\t },\n\t\n\t /**\n\t * @param {string} name\n\t */\n\t unSelect: function (name) {\n\t if (this.get('selectedMode') !== 'single') {\n\t this.option.selected[name] = false;\n\t }\n\t },\n\t\n\t /**\n\t * @param {string} name\n\t */\n\t toggleSelected: function (name) {\n\t var selected = this.option.selected;\n\t // Default is true\n\t if (!selected.hasOwnProperty(name)) {\n\t selected[name] = true;\n\t }\n\t this[selected[name] ? 'unSelect' : 'select'](name);\n\t },\n\t\n\t /**\n\t * @param {string} name\n\t */\n\t isSelected: function (name) {\n\t var selected = this.option.selected;\n\t return !(selected.hasOwnProperty(name) && !selected[name])\n\t && zrUtil.indexOf(this._availableNames, name) >= 0;\n\t },\n\t\n\t defaultOption: {\n\t // 一级层叠\n\t zlevel: 0,\n\t // 二级层叠\n\t z: 4,\n\t show: true,\n\t\n\t // 布局方式,默认为水平布局,可选为:\n\t // 'horizontal' | 'vertical'\n\t orient: 'horizontal',\n\t\n\t left: 'center',\n\t // right: 'center',\n\t\n\t top: 'top',\n\t // bottom: 'top',\n\t\n\t // 水平对齐\n\t // 'auto' | 'left' | 'right'\n\t // 默认为 'auto', 根据 x 的位置判断是左对齐还是右对齐\n\t align: 'auto',\n\t\n\t backgroundColor: 'rgba(0,0,0,0)',\n\t // 图例边框颜色\n\t borderColor: '#ccc',\n\t // 图例边框线宽,单位px,默认为0(无边框)\n\t borderWidth: 0,\n\t // 图例内边距,单位px,默认各方向内边距为5,\n\t // 接受数组分别设定上右下左边距,同css\n\t padding: 5,\n\t // 各个item之间的间隔,单位px,默认为10,\n\t // 横向布局时为水平间隔,纵向布局时为纵向间隔\n\t itemGap: 10,\n\t // 图例图形宽度\n\t itemWidth: 25,\n\t // 图例图形高度\n\t itemHeight: 14,\n\t\n\t // 图例关闭时候的颜色\n\t inactiveColor: '#ccc',\n\t\n\t textStyle: {\n\t // 图例文字颜色\n\t color: '#333'\n\t },\n\t // formatter: '',\n\t // 选择模式,默认开启图例开关\n\t selectedMode: true,\n\t // 配置默认选中状态,可配合LEGEND.SELECTED事件做动态数据载入\n\t // selected: null,\n\t // 图例内容(详见legend.data,数组中每一项代表一个item\n\t // data: [],\n\t\n\t // Tooltip 相关配置\n\t tooltip: {\n\t show: false\n\t }\n\t }\n\t });\n\t\n\t module.exports = LegendModel;\n\n\n/***/ },\n/* 643 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var symbolCreator = __webpack_require__(49);\n\t var graphic = __webpack_require__(4);\n\t var listComponentHelper = __webpack_require__(224);\n\t\n\t var curry = zrUtil.curry;\n\t\n\t function dispatchSelectAction(name, api) {\n\t api.dispatchAction({\n\t type: 'legendToggleSelect',\n\t name: name\n\t });\n\t }\n\t\n\t function dispatchHighlightAction(seriesModel, dataName, api) {\n\t // If element hover will move to a hoverLayer.\n\t var el = api.getZr().storage.getDisplayList()[0];\n\t if (!(el && el.useHoverLayer)) {\n\t seriesModel.get('legendHoverLink') && api.dispatchAction({\n\t type: 'highlight',\n\t seriesName: seriesModel.name,\n\t name: dataName\n\t });\n\t }\n\t }\n\t\n\t function dispatchDownplayAction(seriesModel, dataName, api) {\n\t // If element hover will move to a hoverLayer.\n\t var el = api.getZr().storage.getDisplayList()[0];\n\t if (!(el && el.useHoverLayer)) {\n\t seriesModel.get('legendHoverLink') && api.dispatchAction({\n\t type: 'downplay',\n\t seriesName: seriesModel.name,\n\t name: dataName\n\t });\n\t }\n\t }\n\t\n\t module.exports = __webpack_require__(3).extendComponentView({\n\t\n\t type: 'legend',\n\t\n\t init: function () {\n\t this._symbolTypeStore = {};\n\t },\n\t\n\t render: function (legendModel, ecModel, api) {\n\t var group = this.group;\n\t group.removeAll();\n\t\n\t if (!legendModel.get('show')) {\n\t return;\n\t }\n\t\n\t var selectMode = legendModel.get('selectedMode');\n\t var itemAlign = legendModel.get('align');\n\t\n\t if (itemAlign === 'auto') {\n\t itemAlign = (legendModel.get('left') === 'right'\n\t && legendModel.get('orient') === 'vertical')\n\t ? 'right' : 'left';\n\t }\n\t\n\t var legendDrawedMap = {};\n\t\n\t zrUtil.each(legendModel.getData(), function (itemModel) {\n\t var name = itemModel.get('name');\n\t\n\t // Use empty string or \\n as a newline string\n\t if (name === '' || name === '\\n') {\n\t group.add(new graphic.Group({\n\t newline: true\n\t }));\n\t return;\n\t }\n\t\n\t var seriesModel = ecModel.getSeriesByName(name)[0];\n\t\n\t if (legendDrawedMap[name]) {\n\t // Have been drawed\n\t return;\n\t }\n\t\n\t // Series legend\n\t if (seriesModel) {\n\t var data = seriesModel.getData();\n\t var color = data.getVisual('color');\n\t\n\t // If color is a callback function\n\t if (typeof color === 'function') {\n\t // Use the first data\n\t color = color(seriesModel.getDataParams(0));\n\t }\n\t\n\t // Using rect symbol defaultly\n\t var legendSymbolType = data.getVisual('legendSymbol') || 'roundRect';\n\t var symbolType = data.getVisual('symbol');\n\t\n\t var itemGroup = this._createItem(\n\t name, itemModel, legendModel,\n\t legendSymbolType, symbolType,\n\t itemAlign, color,\n\t selectMode\n\t );\n\t\n\t itemGroup.on('click', curry(dispatchSelectAction, name, api))\n\t .on('mouseover', curry(dispatchHighlightAction, seriesModel, null, api))\n\t .on('mouseout', curry(dispatchDownplayAction, seriesModel, null, api));\n\t\n\t legendDrawedMap[name] = true;\n\t }\n\t else {\n\t // Data legend of pie, funnel\n\t ecModel.eachRawSeries(function (seriesModel) {\n\t // In case multiple series has same data name\n\t if (legendDrawedMap[name]) {\n\t return;\n\t }\n\t if (seriesModel.legendDataProvider) {\n\t var data = seriesModel.legendDataProvider();\n\t var idx = data.indexOfName(name);\n\t if (idx < 0) {\n\t return;\n\t }\n\t\n\t var color = data.getItemVisual(idx, 'color');\n\t\n\t var legendSymbolType = 'roundRect';\n\t\n\t var itemGroup = this._createItem(\n\t name, itemModel, legendModel,\n\t legendSymbolType, null,\n\t itemAlign, color,\n\t selectMode\n\t );\n\t\n\t itemGroup.on('click', curry(dispatchSelectAction, name, api))\n\t // FIXME Should not specify the series name\n\t .on('mouseover', curry(dispatchHighlightAction, seriesModel, name, api))\n\t .on('mouseout', curry(dispatchDownplayAction, seriesModel, name, api));\n\t\n\t legendDrawedMap[name] = true;\n\t }\n\t }, this);\n\t }\n\t\n\t if (__DEV__) {\n\t if (!legendDrawedMap[name]) {\n\t console.warn(name + ' series not exists. Legend data should be same with series name or data name.');\n\t }\n\t }\n\t }, this);\n\t\n\t listComponentHelper.layout(group, legendModel, api);\n\t // Render background after group is layout\n\t // FIXME\n\t listComponentHelper.addBackground(group, legendModel);\n\t },\n\t\n\t _createItem: function (\n\t name, itemModel, legendModel,\n\t legendSymbolType, symbolType,\n\t itemAlign, color, selectMode\n\t ) {\n\t var itemWidth = legendModel.get('itemWidth');\n\t var itemHeight = legendModel.get('itemHeight');\n\t var inactiveColor = legendModel.get('inactiveColor');\n\t\n\t var isSelected = legendModel.isSelected(name);\n\t var itemGroup = new graphic.Group();\n\t\n\t var textStyleModel = itemModel.getModel('textStyle');\n\t\n\t var itemIcon = itemModel.get('icon');\n\t\n\t var tooltipModel = itemModel.getModel('tooltip');\n\t var legendGlobalTooltipModel = tooltipModel.parentModel;\n\t\n\t // Use user given icon first\n\t legendSymbolType = itemIcon || legendSymbolType;\n\t itemGroup.add(symbolCreator.createSymbol(\n\t legendSymbolType, 0, 0, itemWidth, itemHeight, isSelected ? color : inactiveColor\n\t ));\n\t\n\t // Compose symbols\n\t // PENDING\n\t if (!itemIcon && symbolType\n\t // At least show one symbol, can't be all none\n\t && ((symbolType !== legendSymbolType) || symbolType == 'none')\n\t ) {\n\t var size = itemHeight * 0.8;\n\t if (symbolType === 'none') {\n\t symbolType = 'circle';\n\t }\n\t // Put symbol in the center\n\t itemGroup.add(symbolCreator.createSymbol(\n\t symbolType, (itemWidth - size) / 2, (itemHeight - size) / 2, size, size,\n\t isSelected ? color : inactiveColor\n\t ));\n\t }\n\t\n\t // Text\n\t var textX = itemAlign === 'left' ? itemWidth + 5 : -5;\n\t var textAlign = itemAlign;\n\t\n\t var formatter = legendModel.get('formatter');\n\t var content = name;\n\t if (typeof formatter === 'string' && formatter) {\n\t content = formatter.replace('{name}', name != null ? name : '');\n\t }\n\t else if (typeof formatter === 'function') {\n\t content = formatter(name);\n\t }\n\t\n\t var text = new graphic.Text({\n\t style: {\n\t text: content,\n\t x: textX,\n\t y: itemHeight / 2,\n\t fill: isSelected ? textStyleModel.getTextColor() : inactiveColor,\n\t textFont: textStyleModel.getFont(),\n\t textAlign: textAlign,\n\t textVerticalAlign: 'middle'\n\t }\n\t });\n\t itemGroup.add(text);\n\t\n\t // Add a invisible rect to increase the area of mouse hover\n\t var hitRect = new graphic.Rect({\n\t shape: itemGroup.getBoundingRect(),\n\t invisible: true,\n\t tooltip: tooltipModel.get('show') ? zrUtil.extend({\n\t content: name,\n\t // Defaul formatter\n\t formatter: legendGlobalTooltipModel.get('formatter', true) || function () {\n\t return name;\n\t },\n\t formatterParams: {\n\t componentType: 'legend',\n\t legendIndex: legendModel.componentIndex,\n\t name: name,\n\t $vars: ['name']\n\t }\n\t }, tooltipModel.option) : null\n\t });\n\t itemGroup.add(hitRect);\n\t\n\t itemGroup.eachChild(function (child) {\n\t child.silent = true;\n\t });\n\t\n\t hitRect.silent = !selectMode;\n\t\n\t\n\t\n\t this.group.add(itemGroup);\n\t\n\t graphic.setHoverStyle(itemGroup);\n\t\n\t return itemGroup;\n\t }\n\t });\n\n\n/***/ },\n/* 644 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Legend action\n\t */\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t function legendSelectActionHandler(methodName, payload, ecModel) {\n\t var selectedMap = {};\n\t var isToggleSelect = methodName === 'toggleSelected';\n\t var isSelected;\n\t // Update all legend components\n\t ecModel.eachComponent('legend', function (legendModel) {\n\t if (isToggleSelect && isSelected != null) {\n\t // Force other legend has same selected status\n\t // Or the first is toggled to true and other are toggled to false\n\t // In the case one legend has some item unSelected in option. And if other legend\n\t // doesn't has the item, they will assume it is selected.\n\t legendModel[isSelected ? 'select' : 'unSelect'](payload.name);\n\t }\n\t else {\n\t legendModel[methodName](payload.name);\n\t isSelected = legendModel.isSelected(payload.name);\n\t }\n\t var legendData = legendModel.getData();\n\t zrUtil.each(legendData, function (model) {\n\t var name = model.get('name');\n\t // Wrap element\n\t if (name === '\\n' || name === '') {\n\t return;\n\t }\n\t var isItemSelected = legendModel.isSelected(name);\n\t if (name in selectedMap) {\n\t // Unselected if any legend is unselected\n\t selectedMap[name] = selectedMap[name] && isItemSelected;\n\t }\n\t else {\n\t selectedMap[name] = isItemSelected;\n\t }\n\t });\n\t });\n\t // Return the event explicitly\n\t return {\n\t name: payload.name,\n\t selected: selectedMap\n\t };\n\t }\n\t /**\n\t * @event legendToggleSelect\n\t * @type {Object}\n\t * @property {string} type 'legendToggleSelect'\n\t * @property {string} [from]\n\t * @property {string} name Series name or data item name\n\t */\n\t echarts.registerAction(\n\t 'legendToggleSelect', 'legendselectchanged',\n\t zrUtil.curry(legendSelectActionHandler, 'toggleSelected')\n\t );\n\t\n\t /**\n\t * @event legendSelect\n\t * @type {Object}\n\t * @property {string} type 'legendSelect'\n\t * @property {string} name Series name or data item name\n\t */\n\t echarts.registerAction(\n\t 'legendSelect', 'legendselected',\n\t zrUtil.curry(legendSelectActionHandler, 'select')\n\t );\n\t\n\t /**\n\t * @event legendUnSelect\n\t * @type {Object}\n\t * @property {string} type 'legendUnSelect'\n\t * @property {string} name Series name or data item name\n\t */\n\t echarts.registerAction(\n\t 'legendUnSelect', 'legendunselected',\n\t zrUtil.curry(legendSelectActionHandler, 'unSelect')\n\t );\n\n\n/***/ },\n/* 645 */\n/***/ function(module, exports) {\n\n\t\n\t module.exports = function (ecModel) {\n\t var legendModels = ecModel.findComponents({\n\t mainType: 'legend'\n\t });\n\t if (legendModels && legendModels.length) {\n\t ecModel.filterSeries(function (series) {\n\t // If in any legend component the status is not selected.\n\t // Because in legend series is assumed selected when it is not in the legend data.\n\t for (var i = 0; i < legendModels.length; i++) {\n\t if (!legendModels[i].isSelected(series.name)) {\n\t return false;\n\t }\n\t }\n\t return true;\n\t });\n\t }\n\t };\n\n\n/***/ },\n/* 646 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(649);\n\t __webpack_require__(650);\n\t\n\t __webpack_require__(3).registerPreprocessor(function (opt) {\n\t // Make sure markArea component is enabled\n\t opt.markArea = opt.markArea || {};\n\t });\n\n\n/***/ },\n/* 647 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(651);\n\t __webpack_require__(652);\n\t\n\t __webpack_require__(3).registerPreprocessor(function (opt) {\n\t // Make sure markLine component is enabled\n\t opt.markLine = opt.markLine || {};\n\t });\n\n\n/***/ },\n/* 648 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// HINT Markpoint can't be used too much\n\t\n\t\n\t __webpack_require__(653);\n\t __webpack_require__(654);\n\t\n\t __webpack_require__(3).registerPreprocessor(function (opt) {\n\t // Make sure markPoint component is enabled\n\t opt.markPoint = opt.markPoint || {};\n\t });\n\n\n/***/ },\n/* 649 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t module.exports = __webpack_require__(156).extend({\n\t\n\t type: 'markArea',\n\t\n\t defaultOption: {\n\t zlevel: 0,\n\t // PENDING\n\t z: 1,\n\t tooltip: {\n\t trigger: 'item'\n\t },\n\t // markArea should fixed on the coordinate system\n\t animation: false,\n\t label: {\n\t normal: {\n\t show: true,\n\t position: 'top'\n\t },\n\t emphasis: {\n\t show: true,\n\t position: 'top'\n\t }\n\t },\n\t itemStyle: {\n\t normal: {\n\t // color and borderColor default to use color from series\n\t // color: 'auto'\n\t // borderColor: 'auto'\n\t borderWidth: 0\n\t }\n\t }\n\t }\n\t });\n\n\n/***/ },\n/* 650 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// TODO Better on polar\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var List = __webpack_require__(20);\n\t var numberUtil = __webpack_require__(5);\n\t var graphic = __webpack_require__(4);\n\t var colorUtil = __webpack_require__(51);\n\t\n\t var markerHelper = __webpack_require__(158);\n\t\n\t var markAreaTransform = function (seriesModel, coordSys, maModel, item) {\n\t var lt = markerHelper.dataTransform(seriesModel, item[0]);\n\t var rb = markerHelper.dataTransform(seriesModel, item[1]);\n\t var retrieve = zrUtil.retrieve;\n\t\n\t // FIXME make sure lt is less than rb\n\t var ltCoord = lt.coord;\n\t var rbCoord = rb.coord;\n\t ltCoord[0] = retrieve(ltCoord[0], -Infinity);\n\t ltCoord[1] = retrieve(ltCoord[1], -Infinity);\n\t\n\t rbCoord[0] = retrieve(rbCoord[0], Infinity);\n\t rbCoord[1] = retrieve(rbCoord[1], Infinity);\n\t\n\t // Merge option into one\n\t var result = zrUtil.mergeAll([{}, lt, rb]);\n\t\n\t result.coord = [\n\t lt.coord, rb.coord\n\t ];\n\t result.x0 = lt.x;\n\t result.y0 = lt.y;\n\t result.x1 = rb.x;\n\t result.y1 = rb.y;\n\t return result;\n\t };\n\t\n\t function isInifinity(val) {\n\t return !isNaN(val) && !isFinite(val);\n\t }\n\t\n\t // If a markArea has one dim\n\t function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {\n\t var otherDimIndex = 1 - dimIndex;\n\t return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex]);\n\t }\n\t\n\t function markAreaFilter(coordSys, item) {\n\t var fromCoord = item.coord[0];\n\t var toCoord = item.coord[1];\n\t if (coordSys.type === 'cartesian2d') {\n\t // In case\n\t // {\n\t // markArea: {\n\t // data: [{ yAxis: 2 }]\n\t // }\n\t // }\n\t if (\n\t fromCoord && toCoord &&\n\t (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys)\n\t || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))\n\t ) {\n\t return true;\n\t }\n\t }\n\t return markerHelper.dataFilter(coordSys, {\n\t coord: fromCoord,\n\t x: item.x0,\n\t y: item.y0\n\t })\n\t || markerHelper.dataFilter(coordSys, {\n\t coord: toCoord,\n\t x: item.x1,\n\t y: item.y1\n\t });\n\t }\n\t\n\t // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0']\n\t function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var itemModel = data.getItemModel(idx);\n\t\n\t var point;\n\t var xPx = numberUtil.parsePercent(itemModel.get(dims[0]), api.getWidth());\n\t var yPx = numberUtil.parsePercent(itemModel.get(dims[1]), api.getHeight());\n\t if (!isNaN(xPx) && !isNaN(yPx)) {\n\t point = [xPx, yPx];\n\t }\n\t else {\n\t // Chart like bar may have there own marker positioning logic\n\t if (seriesModel.getMarkerPosition) {\n\t // Use the getMarkerPoisition\n\t point = seriesModel.getMarkerPosition(\n\t data.getValues(dims, idx)\n\t );\n\t }\n\t else {\n\t var x = data.get(dims[0], idx);\n\t var y = data.get(dims[1], idx);\n\t point = coordSys.dataToPoint([x, y], true);\n\t }\n\t if (coordSys.type === 'cartesian2d') {\n\t var xAxis = coordSys.getAxis('x');\n\t var yAxis = coordSys.getAxis('y');\n\t var x = data.get(dims[0], idx);\n\t var y = data.get(dims[1], idx);\n\t if (isInifinity(x)) {\n\t point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]);\n\t }\n\t else if (isInifinity(y)) {\n\t point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]);\n\t }\n\t }\n\t\n\t // Use x, y if has any\n\t if (!isNaN(xPx)) {\n\t point[0] = xPx;\n\t }\n\t if (!isNaN(yPx)) {\n\t point[1] = yPx;\n\t }\n\t }\n\t\n\t return point;\n\t }\n\t\n\t var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']];\n\t\n\t __webpack_require__(157).extend({\n\t\n\t type: 'markArea',\n\t\n\t updateLayout: function (markAreaModel, ecModel, api) {\n\t ecModel.eachSeries(function (seriesModel) {\n\t var maModel = seriesModel.markAreaModel;\n\t if (maModel) {\n\t var areaData = maModel.getData();\n\t areaData.each(function (idx) {\n\t var points = zrUtil.map(dimPermutations, function (dim) {\n\t return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);\n\t });\n\t // Layout\n\t areaData.setItemLayout(idx, points);\n\t var el = areaData.getItemGraphicEl(idx);\n\t el.setShape('points', points);\n\t });\n\t }\n\t }, this);\n\t },\n\t\n\t renderSeries: function (seriesModel, maModel, ecModel, api) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var seriesName = seriesModel.name;\n\t var seriesData = seriesModel.getData();\n\t\n\t var areaGroupMap = this.markerGroupMap;\n\t var polygonGroup = areaGroupMap[seriesName];\n\t if (!polygonGroup) {\n\t polygonGroup = areaGroupMap[seriesName] = {\n\t group: new graphic.Group()\n\t };\n\t }\n\t this.group.add(polygonGroup.group);\n\t polygonGroup.__keep = true;\n\t\n\t var areaData = createList(coordSys, seriesModel, maModel);\n\t\n\t // Line data for tooltip and formatter\n\t maModel.setData(areaData);\n\t\n\t // Update visual and layout of line\n\t areaData.each(function (idx) {\n\t // Layout\n\t areaData.setItemLayout(idx, zrUtil.map(dimPermutations, function (dim) {\n\t return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);\n\t }));\n\t\n\t // Visual\n\t areaData.setItemVisual(idx, {\n\t color: seriesData.getVisual('color')\n\t });\n\t });\n\t\n\t\n\t areaData.diff(polygonGroup.__data)\n\t .add(function (idx) {\n\t var polygon = new graphic.Polygon({\n\t shape: {\n\t points: areaData.getItemLayout(idx)\n\t }\n\t });\n\t areaData.setItemGraphicEl(idx, polygon);\n\t polygonGroup.group.add(polygon);\n\t })\n\t .update(function (newIdx, oldIdx) {\n\t var polygon = polygonGroup.__data.getItemGraphicEl(oldIdx);\n\t graphic.updateProps(polygon, {\n\t shape: {\n\t points: areaData.getItemLayout(newIdx)\n\t }\n\t }, maModel, newIdx);\n\t polygonGroup.group.add(polygon);\n\t areaData.setItemGraphicEl(newIdx, polygon);\n\t })\n\t .remove(function (idx) {\n\t var polygon = polygonGroup.__data.getItemGraphicEl(idx);\n\t polygonGroup.group.remove(polygon);\n\t })\n\t .execute();\n\t\n\t areaData.eachItemGraphicEl(function (polygon, idx) {\n\t var itemModel = areaData.getItemModel(idx);\n\t var labelModel = itemModel.getModel('label.normal');\n\t var labelHoverModel = itemModel.getModel('label.emphasis');\n\t var color = areaData.getItemVisual(idx, 'color');\n\t polygon.useStyle(\n\t zrUtil.defaults(\n\t itemModel.getModel('itemStyle.normal').getItemStyle(),\n\t {\n\t fill: colorUtil.modifyAlpha(color, 0.4),\n\t stroke: color\n\t }\n\t )\n\t );\n\t\n\t polygon.hoverStyle = itemModel.getModel('itemStyle.normal').getItemStyle();\n\t\n\t var defaultValue = areaData.getName(idx) || '';\n\t var textColor = color || polygon.style.fill;\n\t graphic.setText(polygon.style, labelModel, textColor);\n\t polygon.style.text = zrUtil.retrieve(\n\t maModel.getFormattedLabel(idx, 'normal'),\n\t defaultValue\n\t );\n\t\n\t graphic.setText(polygon.hoverStyle, labelHoverModel, textColor);\n\t polygon.hoverStyle.text = zrUtil.retrieve(\n\t maModel.getFormattedLabel(idx, 'emphasis'),\n\t defaultValue\n\t );\n\t\n\t graphic.setHoverStyle(polygon, {});\n\t\n\t polygon.dataModel = maModel;\n\t });\n\t\n\t polygonGroup.__data = areaData;\n\t\n\t polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent');\n\t }\n\t });\n\t\n\t /**\n\t * @inner\n\t * @param {module:echarts/coord/*} coordSys\n\t * @param {module:echarts/model/Series} seriesModel\n\t * @param {module:echarts/model/Model} mpModel\n\t */\n\t function createList(coordSys, seriesModel, maModel) {\n\t\n\t var coordDimsInfos;\n\t var areaData;\n\t var dims = ['x0', 'y0', 'x1', 'y1'];\n\t if (coordSys) {\n\t coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {\n\t var info = seriesModel.getData().getDimensionInfo(\n\t seriesModel.coordDimToDataDim(coordDim)[0]\n\t ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n\t info.name = coordDim;\n\t return info;\n\t });\n\t areaData = new List(zrUtil.map(dims, function (dim, idx) {\n\t return {\n\t name: dim,\n\t type: coordDimsInfos[idx % 2].type\n\t };\n\t }), maModel);\n\t }\n\t else {\n\t coordDimsInfos =[{\n\t name: 'value',\n\t type: 'float'\n\t }];\n\t areaData = new List(coordDimsInfos, maModel);\n\t }\n\t\n\t var optData = zrUtil.map(maModel.get('data'), zrUtil.curry(\n\t markAreaTransform, seriesModel, coordSys, maModel\n\t ));\n\t if (coordSys) {\n\t optData = zrUtil.filter(\n\t optData, zrUtil.curry(markAreaFilter, coordSys)\n\t );\n\t }\n\t\n\t var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) {\n\t return item.coord[Math.floor(dimIndex / 2)][dimIndex % 2];\n\t } : function (item) {\n\t return item.value;\n\t };\n\t areaData.initData(optData, null, dimValueGetter);\n\t areaData.hasItemOption = true;\n\t return areaData;\n\t }\n\n\n/***/ },\n/* 651 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t module.exports = __webpack_require__(156).extend({\n\t\n\t type: 'markLine',\n\t\n\t defaultOption: {\n\t zlevel: 0,\n\t z: 5,\n\t\n\t symbol: ['circle', 'arrow'],\n\t symbolSize: [8, 16],\n\t\n\t //symbolRotate: 0,\n\t\n\t precision: 2,\n\t tooltip: {\n\t trigger: 'item'\n\t },\n\t label: {\n\t normal: {\n\t show: true,\n\t position: 'end'\n\t },\n\t emphasis: {\n\t show: true\n\t }\n\t },\n\t lineStyle: {\n\t normal: {\n\t type: 'dashed'\n\t },\n\t emphasis: {\n\t width: 3\n\t }\n\t },\n\t animationEasing: 'linear'\n\t }\n\t });\n\n\n/***/ },\n/* 652 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var List = __webpack_require__(20);\n\t var numberUtil = __webpack_require__(5);\n\t\n\t var markerHelper = __webpack_require__(158);\n\t\n\t var LineDraw = __webpack_require__(150);\n\t\n\t var markLineTransform = function (seriesModel, coordSys, mlModel, item) {\n\t var data = seriesModel.getData();\n\t // Special type markLine like 'min', 'max', 'average'\n\t var mlType = item.type;\n\t\n\t if (!zrUtil.isArray(item)\n\t && (\n\t mlType === 'min' || mlType === 'max' || mlType === 'average'\n\t // In case\n\t // data: [{\n\t // yAxis: 10\n\t // }]\n\t || (item.xAxis != null || item.yAxis != null)\n\t )\n\t ) {\n\t var valueAxis;\n\t var valueDataDim;\n\t var value;\n\t\n\t if (item.yAxis != null || item.xAxis != null) {\n\t valueDataDim = item.yAxis != null ? 'y' : 'x';\n\t valueAxis = coordSys.getAxis(valueDataDim);\n\t\n\t value = zrUtil.retrieve(item.yAxis, item.xAxis);\n\t }\n\t else {\n\t var axisInfo = markerHelper.getAxisInfo(item, data, coordSys, seriesModel);\n\t valueDataDim = axisInfo.valueDataDim;\n\t valueAxis = axisInfo.valueAxis;\n\t value = markerHelper.numCalculate(data, valueDataDim, mlType);\n\t }\n\t var valueIndex = valueDataDim === 'x' ? 0 : 1;\n\t var baseIndex = 1 - valueIndex;\n\t\n\t var mlFrom = zrUtil.clone(item);\n\t var mlTo = {};\n\t\n\t mlFrom.type = null;\n\t\n\t mlFrom.coord = [];\n\t mlTo.coord = [];\n\t mlFrom.coord[baseIndex] = -Infinity;\n\t mlTo.coord[baseIndex] = Infinity;\n\t\n\t var precision = mlModel.get('precision');\n\t if (precision >= 0 && typeof value === 'number') {\n\t value = +value.toFixed(precision);\n\t }\n\t\n\t mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value;\n\t\n\t item = [mlFrom, mlTo, { // Extra option for tooltip and label\n\t type: mlType,\n\t valueIndex: item.valueIndex,\n\t // Force to use the value of calculated value.\n\t value: value\n\t }];\n\t }\n\t\n\t item = [\n\t markerHelper.dataTransform(seriesModel, item[0]),\n\t markerHelper.dataTransform(seriesModel, item[1]),\n\t zrUtil.extend({}, item[2])\n\t ];\n\t\n\t // Avoid line data type is extended by from(to) data type\n\t item[2].type = item[2].type || '';\n\t\n\t // Merge from option and to option into line option\n\t zrUtil.merge(item[2], item[0]);\n\t zrUtil.merge(item[2], item[1]);\n\t\n\t return item;\n\t };\n\t\n\t function isInifinity(val) {\n\t return !isNaN(val) && !isFinite(val);\n\t }\n\t\n\t // If a markLine has one dim\n\t function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {\n\t var otherDimIndex = 1 - dimIndex;\n\t var dimName = coordSys.dimensions[dimIndex];\n\t return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex])\n\t && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]);\n\t }\n\t\n\t function markLineFilter(coordSys, item) {\n\t if (coordSys.type === 'cartesian2d') {\n\t var fromCoord = item[0].coord;\n\t var toCoord = item[1].coord;\n\t // In case\n\t // {\n\t // markLine: {\n\t // data: [{ yAxis: 2 }]\n\t // }\n\t // }\n\t if (\n\t fromCoord && toCoord &&\n\t (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys)\n\t || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))\n\t ) {\n\t return true;\n\t }\n\t }\n\t return markerHelper.dataFilter(coordSys, item[0])\n\t && markerHelper.dataFilter(coordSys, item[1]);\n\t }\n\t\n\t function updateSingleMarkerEndLayout(\n\t data, idx, isFrom, seriesModel, api\n\t ) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var itemModel = data.getItemModel(idx);\n\t\n\t var point;\n\t var xPx = numberUtil.parsePercent(itemModel.get('x'), api.getWidth());\n\t var yPx = numberUtil.parsePercent(itemModel.get('y'), api.getHeight());\n\t if (!isNaN(xPx) && !isNaN(yPx)) {\n\t point = [xPx, yPx];\n\t }\n\t else {\n\t // Chart like bar may have there own marker positioning logic\n\t if (seriesModel.getMarkerPosition) {\n\t // Use the getMarkerPoisition\n\t point = seriesModel.getMarkerPosition(\n\t data.getValues(data.dimensions, idx)\n\t );\n\t }\n\t else {\n\t var dims = coordSys.dimensions;\n\t var x = data.get(dims[0], idx);\n\t var y = data.get(dims[1], idx);\n\t point = coordSys.dataToPoint([x, y]);\n\t }\n\t // Expand line to the edge of grid if value on one axis is Inifnity\n\t // In case\n\t // markLine: {\n\t // data: [{\n\t // yAxis: 2\n\t // // or\n\t // type: 'average'\n\t // }]\n\t // }\n\t if (coordSys.type === 'cartesian2d') {\n\t var xAxis = coordSys.getAxis('x');\n\t var yAxis = coordSys.getAxis('y');\n\t var dims = coordSys.dimensions;\n\t if (isInifinity(data.get(dims[0], idx))) {\n\t point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]);\n\t }\n\t else if (isInifinity(data.get(dims[1], idx))) {\n\t point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]);\n\t }\n\t }\n\t\n\t // Use x, y if has any\n\t if (!isNaN(xPx)) {\n\t point[0] = xPx;\n\t }\n\t if (!isNaN(yPx)) {\n\t point[1] = yPx;\n\t }\n\t }\n\t\n\t data.setItemLayout(idx, point);\n\t }\n\t\n\t __webpack_require__(157).extend({\n\t\n\t type: 'markLine',\n\t\n\t updateLayout: function (markLineModel, ecModel, api) {\n\t ecModel.eachSeries(function (seriesModel) {\n\t var mlModel = seriesModel.markLineModel;\n\t if (mlModel) {\n\t var mlData = mlModel.getData();\n\t var fromData = mlModel.__from;\n\t var toData = mlModel.__to;\n\t // Update visual and layout of from symbol and to symbol\n\t fromData.each(function (idx) {\n\t updateSingleMarkerEndLayout(fromData, idx, true, seriesModel, api);\n\t updateSingleMarkerEndLayout(toData, idx, false, seriesModel, api);\n\t });\n\t // Update layout of line\n\t mlData.each(function (idx) {\n\t mlData.setItemLayout(idx, [\n\t fromData.getItemLayout(idx),\n\t toData.getItemLayout(idx)\n\t ]);\n\t });\n\t\n\t this.markerGroupMap[seriesModel.name].updateLayout();\n\t\n\t }\n\t }, this);\n\t },\n\t\n\t renderSeries: function (seriesModel, mlModel, ecModel, api) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var seriesName = seriesModel.name;\n\t var seriesData = seriesModel.getData();\n\t\n\t var lineDrawMap = this.markerGroupMap;\n\t var lineDraw = lineDrawMap[seriesName];\n\t if (!lineDraw) {\n\t lineDraw = lineDrawMap[seriesName] = new LineDraw();\n\t }\n\t this.group.add(lineDraw.group);\n\t\n\t var mlData = createList(coordSys, seriesModel, mlModel);\n\t\n\t var fromData = mlData.from;\n\t var toData = mlData.to;\n\t var lineData = mlData.line;\n\t\n\t mlModel.__from = fromData;\n\t mlModel.__to = toData;\n\t // Line data for tooltip and formatter\n\t mlModel.setData(lineData);\n\t\n\t var symbolType = mlModel.get('symbol');\n\t var symbolSize = mlModel.get('symbolSize');\n\t if (!zrUtil.isArray(symbolType)) {\n\t symbolType = [symbolType, symbolType];\n\t }\n\t if (typeof symbolSize === 'number') {\n\t symbolSize = [symbolSize, symbolSize];\n\t }\n\t\n\t // Update visual and layout of from symbol and to symbol\n\t mlData.from.each(function (idx) {\n\t updateDataVisualAndLayout(fromData, idx, true);\n\t updateDataVisualAndLayout(toData, idx, false);\n\t });\n\t\n\t // Update visual and layout of line\n\t lineData.each(function (idx) {\n\t var lineColor = lineData.getItemModel(idx).get('lineStyle.normal.color');\n\t lineData.setItemVisual(idx, {\n\t color: lineColor || fromData.getItemVisual(idx, 'color')\n\t });\n\t lineData.setItemLayout(idx, [\n\t fromData.getItemLayout(idx),\n\t toData.getItemLayout(idx)\n\t ]);\n\t\n\t lineData.setItemVisual(idx, {\n\t 'fromSymbolSize': fromData.getItemVisual(idx, 'symbolSize'),\n\t 'fromSymbol': fromData.getItemVisual(idx, 'symbol'),\n\t 'toSymbolSize': toData.getItemVisual(idx, 'symbolSize'),\n\t 'toSymbol': toData.getItemVisual(idx, 'symbol')\n\t });\n\t });\n\t\n\t lineDraw.updateData(lineData);\n\t\n\t // Set host model for tooltip\n\t // FIXME\n\t mlData.line.eachItemGraphicEl(function (el, idx) {\n\t el.traverse(function (child) {\n\t child.dataModel = mlModel;\n\t });\n\t });\n\t\n\t function updateDataVisualAndLayout(data, idx, isFrom) {\n\t var itemModel = data.getItemModel(idx);\n\t\n\t updateSingleMarkerEndLayout(\n\t data, idx, isFrom, seriesModel, api\n\t );\n\t\n\t data.setItemVisual(idx, {\n\t symbolSize: itemModel.get('symbolSize') || symbolSize[isFrom ? 0 : 1],\n\t symbol: itemModel.get('symbol', true) || symbolType[isFrom ? 0 : 1],\n\t color: itemModel.get('itemStyle.normal.color') || seriesData.getVisual('color')\n\t });\n\t }\n\t\n\t lineDraw.__keep = true;\n\t\n\t lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent');\n\t }\n\t });\n\t\n\t /**\n\t * @inner\n\t * @param {module:echarts/coord/*} coordSys\n\t * @param {module:echarts/model/Series} seriesModel\n\t * @param {module:echarts/model/Model} mpModel\n\t */\n\t function createList(coordSys, seriesModel, mlModel) {\n\t\n\t var coordDimsInfos;\n\t if (coordSys) {\n\t coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {\n\t var info = seriesModel.getData().getDimensionInfo(\n\t seriesModel.coordDimToDataDim(coordDim)[0]\n\t ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n\t info.name = coordDim;\n\t return info;\n\t });\n\t }\n\t else {\n\t coordDimsInfos =[{\n\t name: 'value',\n\t type: 'float'\n\t }];\n\t }\n\t\n\t var fromData = new List(coordDimsInfos, mlModel);\n\t var toData = new List(coordDimsInfos, mlModel);\n\t // No dimensions\n\t var lineData = new List([], mlModel);\n\t\n\t var optData = zrUtil.map(mlModel.get('data'), zrUtil.curry(\n\t markLineTransform, seriesModel, coordSys, mlModel\n\t ));\n\t if (coordSys) {\n\t optData = zrUtil.filter(\n\t optData, zrUtil.curry(markLineFilter, coordSys)\n\t );\n\t }\n\t var dimValueGetter = coordSys ? markerHelper.dimValueGetter : function (item) {\n\t return item.value;\n\t };\n\t fromData.initData(\n\t zrUtil.map(optData, function (item) { return item[0]; }),\n\t null, dimValueGetter\n\t );\n\t toData.initData(\n\t zrUtil.map(optData, function (item) { return item[1]; }),\n\t null, dimValueGetter\n\t );\n\t lineData.initData(\n\t zrUtil.map(optData, function (item) { return item[2]; })\n\t );\n\t lineData.hasItemOption = true;\n\t return {\n\t from: fromData,\n\t to: toData,\n\t line: lineData\n\t };\n\t }\n\n\n/***/ },\n/* 653 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t module.exports = __webpack_require__(156).extend({\n\t\n\t type: 'markPoint',\n\t\n\t defaultOption: {\n\t zlevel: 0,\n\t z: 5,\n\t symbol: 'pin',\n\t symbolSize: 50,\n\t //symbolRotate: 0,\n\t //symbolOffset: [0, 0]\n\t tooltip: {\n\t trigger: 'item'\n\t },\n\t label: {\n\t normal: {\n\t show: true,\n\t position: 'inside'\n\t },\n\t emphasis: {\n\t show: true\n\t }\n\t },\n\t itemStyle: {\n\t normal: {\n\t borderWidth: 2\n\t }\n\t }\n\t }\n\t });\n\n\n/***/ },\n/* 654 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var SymbolDraw = __webpack_require__(84);\n\t var zrUtil = __webpack_require__(1);\n\t var numberUtil = __webpack_require__(5);\n\t\n\t var List = __webpack_require__(20);\n\t\n\t var markerHelper = __webpack_require__(158);\n\t\n\t function updateMarkerLayout(mpData, seriesModel, api) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t mpData.each(function (idx) {\n\t var itemModel = mpData.getItemModel(idx);\n\t var point;\n\t var xPx = numberUtil.parsePercent(itemModel.get('x'), api.getWidth());\n\t var yPx = numberUtil.parsePercent(itemModel.get('y'), api.getHeight());\n\t if (!isNaN(xPx) && !isNaN(yPx)) {\n\t point = [xPx, yPx];\n\t }\n\t // Chart like bar may have there own marker positioning logic\n\t else if (seriesModel.getMarkerPosition) {\n\t // Use the getMarkerPoisition\n\t point = seriesModel.getMarkerPosition(\n\t mpData.getValues(mpData.dimensions, idx)\n\t );\n\t }\n\t else if (coordSys) {\n\t var x = mpData.get(coordSys.dimensions[0], idx);\n\t var y = mpData.get(coordSys.dimensions[1], idx);\n\t point = coordSys.dataToPoint([x, y]);\n\t\n\t }\n\t\n\t // Use x, y if has any\n\t if (!isNaN(xPx)) {\n\t point[0] = xPx;\n\t }\n\t if (!isNaN(yPx)) {\n\t point[1] = yPx;\n\t }\n\t\n\t mpData.setItemLayout(idx, point);\n\t });\n\t }\n\t\n\t __webpack_require__(157).extend({\n\t\n\t type: 'markPoint',\n\t\n\t updateLayout: function (markPointModel, ecModel, api) {\n\t ecModel.eachSeries(function (seriesModel) {\n\t var mpModel = seriesModel.markPointModel;\n\t if (mpModel) {\n\t updateMarkerLayout(mpModel.getData(), seriesModel, api);\n\t this.markerGroupMap[seriesModel.name].updateLayout(mpModel);\n\t }\n\t }, this);\n\t },\n\t\n\t renderSeries: function (seriesModel, mpModel, ecModel, api) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var seriesName = seriesModel.name;\n\t var seriesData = seriesModel.getData();\n\t\n\t var symbolDrawMap = this.markerGroupMap;\n\t var symbolDraw = symbolDrawMap[seriesName];\n\t if (!symbolDraw) {\n\t symbolDraw = symbolDrawMap[seriesName] = new SymbolDraw();\n\t }\n\t\n\t var mpData = createList(coordSys, seriesModel, mpModel);\n\t\n\t // FIXME\n\t mpModel.setData(mpData);\n\t\n\t updateMarkerLayout(mpModel.getData(), seriesModel, api);\n\t\n\t mpData.each(function (idx) {\n\t var itemModel = mpData.getItemModel(idx);\n\t var symbolSize = itemModel.getShallow('symbolSize');\n\t if (typeof symbolSize === 'function') {\n\t // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据?\n\t symbolSize = symbolSize(\n\t mpModel.getRawValue(idx), mpModel.getDataParams(idx)\n\t );\n\t }\n\t mpData.setItemVisual(idx, {\n\t symbolSize: symbolSize,\n\t color: itemModel.get('itemStyle.normal.color')\n\t || seriesData.getVisual('color'),\n\t symbol: itemModel.getShallow('symbol')\n\t });\n\t });\n\t\n\t // TODO Text are wrong\n\t symbolDraw.updateData(mpData);\n\t this.group.add(symbolDraw.group);\n\t\n\t // Set host model for tooltip\n\t // FIXME\n\t mpData.eachItemGraphicEl(function (el) {\n\t el.traverse(function (child) {\n\t child.dataModel = mpModel;\n\t });\n\t });\n\t\n\t symbolDraw.__keep = true;\n\t\n\t symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent');\n\t }\n\t });\n\t\n\t /**\n\t * @inner\n\t * @param {module:echarts/coord/*} [coordSys]\n\t * @param {module:echarts/model/Series} seriesModel\n\t * @param {module:echarts/model/Model} mpModel\n\t */\n\t function createList(coordSys, seriesModel, mpModel) {\n\t var coordDimsInfos;\n\t if (coordSys) {\n\t coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {\n\t var info = seriesModel.getData().getDimensionInfo(\n\t seriesModel.coordDimToDataDim(coordDim)[0]\n\t ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n\t info.name = coordDim;\n\t return info;\n\t });\n\t }\n\t else {\n\t coordDimsInfos =[{\n\t name: 'value',\n\t type: 'float'\n\t }];\n\t }\n\t\n\t var mpData = new List(coordDimsInfos, mpModel);\n\t var dataOpt = zrUtil.map(mpModel.get('data'), zrUtil.curry(\n\t markerHelper.dataTransform, seriesModel\n\t ));\n\t if (coordSys) {\n\t dataOpt = zrUtil.filter(\n\t dataOpt, zrUtil.curry(markerHelper.dataFilter, coordSys)\n\t );\n\t }\n\t\n\t mpData.initData(dataOpt, null,\n\t coordSys ? markerHelper.dimValueGetter : function (item) {\n\t return item.value;\n\t }\n\t );\n\t return mpData;\n\t }\n\t\n\n\n/***/ },\n/* 655 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(239);\n\t __webpack_require__(620);\n\t __webpack_require__(617);\n\t\n\n\n/***/ },\n/* 656 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t __webpack_require__(159);\n\t __webpack_require__(613);\n\t __webpack_require__(659);\n\t\n\t // Polar view\n\t __webpack_require__(3).extendComponentView({\n\t type: 'polar'\n\t });\n\n\n/***/ },\n/* 657 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(713);\n\t __webpack_require__(714);\n\t\n\t __webpack_require__(658);\n\n\n/***/ },\n/* 658 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var AxisBuilder = __webpack_require__(85);\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t\n\t var axisBuilderAttrs = [\n\t 'axisLine', 'axisLabel', 'axisTick', 'axisName'\n\t ];\n\t\n\t module.exports = __webpack_require__(3).extendComponentView({\n\t\n\t type: 'radar',\n\t\n\t render: function (radarModel, ecModel, api) {\n\t var group = this.group;\n\t group.removeAll();\n\t\n\t this._buildAxes(radarModel);\n\t this._buildSplitLineAndArea(radarModel);\n\t },\n\t\n\t _buildAxes: function (radarModel) {\n\t var radar = radarModel.coordinateSystem;\n\t var indicatorAxes = radar.getIndicatorAxes();\n\t var axisBuilders = zrUtil.map(indicatorAxes, function (indicatorAxis) {\n\t var axisBuilder = new AxisBuilder(indicatorAxis.model, {\n\t position: [radar.cx, radar.cy],\n\t rotation: indicatorAxis.angle,\n\t labelDirection: -1,\n\t tickDirection: -1,\n\t nameDirection: 1\n\t });\n\t return axisBuilder;\n\t });\n\t\n\t zrUtil.each(axisBuilders, function (axisBuilder) {\n\t zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder);\n\t this.group.add(axisBuilder.getGroup());\n\t }, this);\n\t },\n\t\n\t _buildSplitLineAndArea: function (radarModel) {\n\t var radar = radarModel.coordinateSystem;\n\t var splitNumber = radarModel.get('splitNumber');\n\t var indicatorAxes = radar.getIndicatorAxes();\n\t if (!indicatorAxes.length) {\n\t return;\n\t }\n\t var shape = radarModel.get('shape');\n\t var splitLineModel = radarModel.getModel('splitLine');\n\t var splitAreaModel = radarModel.getModel('splitArea');\n\t var lineStyleModel = splitLineModel.getModel('lineStyle');\n\t var areaStyleModel = splitAreaModel.getModel('areaStyle');\n\t\n\t var showSplitLine = splitLineModel.get('show');\n\t var showSplitArea = splitAreaModel.get('show');\n\t var splitLineColors = lineStyleModel.get('color');\n\t var splitAreaColors = areaStyleModel.get('color');\n\t\n\t splitLineColors = zrUtil.isArray(splitLineColors) ? splitLineColors : [splitLineColors];\n\t splitAreaColors = zrUtil.isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors];\n\t\n\t var splitLines = [];\n\t var splitAreas = [];\n\t\n\t function getColorIndex(areaOrLine, areaOrLineColorList, idx) {\n\t var colorIndex = idx % areaOrLineColorList.length;\n\t areaOrLine[colorIndex] = areaOrLine[colorIndex] || [];\n\t return colorIndex;\n\t }\n\t\n\t if (shape === 'circle') {\n\t var ticksRadius = indicatorAxes[0].getTicksCoords();\n\t var cx = radar.cx;\n\t var cy = radar.cy;\n\t for (var i = 0; i < ticksRadius.length; i++) {\n\t if (showSplitLine) {\n\t var colorIndex = getColorIndex(splitLines, splitLineColors, i);\n\t splitLines[colorIndex].push(new graphic.Circle({\n\t shape: {\n\t cx: cx,\n\t cy: cy,\n\t r: ticksRadius[i]\n\t }\n\t }));\n\t }\n\t if (showSplitArea && i < ticksRadius.length - 1) {\n\t var colorIndex = getColorIndex(splitAreas, splitAreaColors, i);\n\t splitAreas[colorIndex].push(new graphic.Ring({\n\t shape: {\n\t cx: cx,\n\t cy: cy,\n\t r0: ticksRadius[i],\n\t r: ticksRadius[i + 1]\n\t }\n\t }));\n\t }\n\t }\n\t }\n\t // Polyyon\n\t else {\n\t var axesTicksPoints = zrUtil.map(indicatorAxes, function (indicatorAxis, idx) {\n\t var ticksCoords = indicatorAxis.getTicksCoords();\n\t return zrUtil.map(ticksCoords, function (tickCoord) {\n\t return radar.coordToPoint(tickCoord, idx);\n\t });\n\t });\n\t\n\t var prevPoints = [];\n\t for (var i = 0; i <= splitNumber; i++) {\n\t var points = [];\n\t for (var j = 0; j < indicatorAxes.length; j++) {\n\t points.push(axesTicksPoints[j][i]);\n\t }\n\t // Close\n\t if (points[0]) {\n\t points.push(points[0].slice());\n\t }\n\t else {\n\t if (__DEV__) {\n\t console.error('Can\\'t draw value axis ' + i);\n\t }\n\t }\n\t if (showSplitLine) {\n\t var colorIndex = getColorIndex(splitLines, splitLineColors, i);\n\t splitLines[colorIndex].push(new graphic.Polyline({\n\t shape: {\n\t points: points\n\t }\n\t }));\n\t }\n\t if (showSplitArea && prevPoints) {\n\t var colorIndex = getColorIndex(splitAreas, splitAreaColors, i - 1);\n\t splitAreas[colorIndex].push(new graphic.Polygon({\n\t shape: {\n\t points: points.concat(prevPoints)\n\t }\n\t }));\n\t }\n\t prevPoints = points.slice().reverse();\n\t }\n\t }\n\t\n\t var lineStyle = lineStyleModel.getLineStyle();\n\t var areaStyle = areaStyleModel.getAreaStyle();\n\t // Add splitArea before splitLine\n\t zrUtil.each(splitAreas, function (splitAreas, idx) {\n\t this.group.add(graphic.mergePath(\n\t splitAreas, {\n\t style: zrUtil.defaults({\n\t stroke: 'none',\n\t fill: splitAreaColors[idx % splitAreaColors.length]\n\t }, areaStyle),\n\t silent: true\n\t }\n\t ));\n\t }, this);\n\t\n\t zrUtil.each(splitLines, function (splitLines, idx) {\n\t this.group.add(graphic.mergePath(\n\t splitLines, {\n\t style: zrUtil.defaults({\n\t fill: 'none',\n\t stroke: splitLineColors[idx % splitLineColors.length]\n\t }, lineStyle),\n\t silent: true\n\t }\n\t ));\n\t }, this);\n\t\n\t }\n\t });\n\n\n/***/ },\n/* 659 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(159);\n\t\n\t __webpack_require__(618);\n\n\n/***/ },\n/* 660 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(718);\n\t __webpack_require__(619);\n\t __webpack_require__(715);\n\t\n\t var echarts = __webpack_require__(3);\n\t\n\t echarts.extendComponentView({\n\t type: 'single'\n\t });\n\t\n\n\n/***/ },\n/* 661 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * DataZoom component entry\n\t */\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t\n\t echarts.registerPreprocessor(__webpack_require__(667));\n\t\n\t __webpack_require__(669);\n\t __webpack_require__(668);\n\t __webpack_require__(662);\n\t __webpack_require__(663);\n\t\n\n\n/***/ },\n/* 662 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Silder timeline model\n\t */\n\t\n\t\n\t var TimelineModel = __webpack_require__(665);\n\t var zrUtil = __webpack_require__(1);\n\t var modelUtil = __webpack_require__(14);\n\t\n\t var SliderTimelineModel = TimelineModel.extend({\n\t\n\t type: 'timeline.slider',\n\t\n\t /**\n\t * @protected\n\t */\n\t defaultOption: {\n\t\n\t backgroundColor: 'rgba(0,0,0,0)', // 时间轴背景颜色\n\t borderColor: '#ccc', // 时间轴边框颜色\n\t borderWidth: 0, // 时间轴边框线宽,单位px,默认为0(无边框)\n\t\n\t orient: 'horizontal', // 'vertical'\n\t inverse: false,\n\t\n\t tooltip: { // boolean or Object\n\t trigger: 'item' // data item may also have tootip attr.\n\t },\n\t\n\t symbol: 'emptyCircle',\n\t symbolSize: 10,\n\t\n\t lineStyle: {\n\t show: true,\n\t width: 2,\n\t color: '#304654'\n\t },\n\t label: { // 文本标签\n\t position: 'auto', // auto left right top bottom\n\t // When using number, label position is not\n\t // restricted by viewRect.\n\t // positive: right/bottom, negative: left/top\n\t normal: {\n\t show: true,\n\t interval: 'auto',\n\t rotate: 0,\n\t // formatter: null,\n\t textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE\n\t color: '#304654'\n\t }\n\t },\n\t emphasis: {\n\t show: true,\n\t textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE\n\t color: '#c23531'\n\t }\n\t }\n\t },\n\t itemStyle: {\n\t normal: {\n\t color: '#304654',\n\t borderWidth: 1\n\t },\n\t emphasis: {\n\t color: '#c23531'\n\t }\n\t },\n\t\n\t checkpointStyle: {\n\t symbol: 'circle',\n\t symbolSize: 13,\n\t color: '#c23531',\n\t borderWidth: 5,\n\t borderColor: 'rgba(194,53,49, 0.5)',\n\t animation: true,\n\t animationDuration: 300,\n\t animationEasing: 'quinticInOut'\n\t },\n\t\n\t controlStyle: {\n\t show: true,\n\t showPlayBtn: true,\n\t showPrevBtn: true,\n\t showNextBtn: true,\n\t itemSize: 22,\n\t itemGap: 12,\n\t position: 'left', // 'left' 'right' 'top' 'bottom'\n\t 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', // jshint ignore:line\n\t 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', // jshint ignore:line\n\t 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', // jshint ignore:line\n\t 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', // jshint ignore:line\n\t normal: {\n\t color: '#304654',\n\t borderColor: '#304654',\n\t borderWidth: 1\n\t },\n\t emphasis: {\n\t color: '#c23531',\n\t borderColor: '#c23531',\n\t borderWidth: 2\n\t }\n\t },\n\t data: []\n\t }\n\t\n\t });\n\t\n\t zrUtil.mixin(SliderTimelineModel, modelUtil.dataFormatMixin);\n\t\n\t module.exports = SliderTimelineModel;\n\n\n/***/ },\n/* 663 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Silder timeline view\n\t */\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var layout = __webpack_require__(16);\n\t var TimelineView = __webpack_require__(666);\n\t var TimelineAxis = __webpack_require__(664);\n\t var symbolUtil = __webpack_require__(49);\n\t var axisHelper = __webpack_require__(42);\n\t var BoundingRect = __webpack_require__(17);\n\t var matrix = __webpack_require__(50);\n\t var numberUtil = __webpack_require__(5);\n\t var formatUtil = __webpack_require__(18);\n\t var encodeHTML = formatUtil.encodeHTML;\n\t\n\t var bind = zrUtil.bind;\n\t var each = zrUtil.each;\n\t\n\t var PI = Math.PI;\n\t\n\t module.exports = TimelineView.extend({\n\t\n\t type: 'timeline.slider',\n\t\n\t init: function (ecModel, api) {\n\t\n\t this.api = api;\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/component/timeline/TimelineAxis}\n\t */\n\t this._axis;\n\t\n\t /**\n\t * @private\n\t * @type {module:zrender/core/BoundingRect}\n\t */\n\t this._viewRect;\n\t\n\t /**\n\t * @type {number}\n\t */\n\t this._timer;\n\t\n\t /**\n\t * @type {module:zrende/Element}\n\t */\n\t this._currentPointer;\n\t\n\t /**\n\t * @type {module:zrender/container/Group}\n\t */\n\t this._mainGroup;\n\t\n\t /**\n\t * @type {module:zrender/container/Group}\n\t */\n\t this._labelGroup;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t render: function (timelineModel, ecModel, api, payload) {\n\t this.model = timelineModel;\n\t this.api = api;\n\t this.ecModel = ecModel;\n\t\n\t this.group.removeAll();\n\t\n\t if (timelineModel.get('show', true)) {\n\t\n\t var layoutInfo = this._layout(timelineModel, api);\n\t var mainGroup = this._createGroup('mainGroup');\n\t var labelGroup = this._createGroup('labelGroup');\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/component/timeline/TimelineAxis}\n\t */\n\t var axis = this._axis = this._createAxis(layoutInfo, timelineModel);\n\t\n\t timelineModel.formatTooltip = function (dataIndex) {\n\t return encodeHTML(axis.scale.getLabel(dataIndex));\n\t };\n\t\n\t each(\n\t ['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'],\n\t function (name) {\n\t this['_render' + name](layoutInfo, mainGroup, axis, timelineModel);\n\t },\n\t this\n\t );\n\t\n\t this._renderAxisLabel(layoutInfo, labelGroup, axis, timelineModel);\n\t this._position(layoutInfo, timelineModel);\n\t }\n\t\n\t this._doPlayStop();\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t remove: function () {\n\t this._clearTimer();\n\t this.group.removeAll();\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t dispose: function () {\n\t this._clearTimer();\n\t },\n\t\n\t _layout: function (timelineModel, api) {\n\t var labelPosOpt = timelineModel.get('label.normal.position');\n\t var orient = timelineModel.get('orient');\n\t var viewRect = getViewRect(timelineModel, api);\n\t // Auto label offset.\n\t if (labelPosOpt == null || labelPosOpt === 'auto') {\n\t labelPosOpt = orient === 'horizontal'\n\t ? ((viewRect.y + viewRect.height / 2) < api.getHeight() / 2 ? '-' : '+')\n\t : ((viewRect.x + viewRect.width / 2) < api.getWidth() / 2 ? '+' : '-');\n\t }\n\t else if (isNaN(labelPosOpt)) {\n\t labelPosOpt = ({\n\t horizontal: {top: '-', bottom: '+'},\n\t vertical: {left: '-', right: '+'}\n\t })[orient][labelPosOpt];\n\t }\n\t\n\t // FIXME\n\t // 暂没有实现用户传入\n\t // var labelAlign = timelineModel.get('label.normal.textStyle.align');\n\t // var labelBaseline = timelineModel.get('label.normal.textStyle.baseline');\n\t var labelAlignMap = {\n\t horizontal: 'center',\n\t vertical: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'left' : 'right'\n\t };\n\t\n\t var labelBaselineMap = {\n\t horizontal: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'top' : 'bottom',\n\t vertical: 'middle'\n\t };\n\t var rotationMap = {\n\t horizontal: 0,\n\t vertical: PI / 2\n\t };\n\t\n\t // Position\n\t var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width;\n\t\n\t var controlModel = timelineModel.getModel('controlStyle');\n\t var showControl = controlModel.get('show');\n\t var controlSize = showControl ? controlModel.get('itemSize') : 0;\n\t var controlGap = showControl ? controlModel.get('itemGap') : 0;\n\t var sizePlusGap = controlSize + controlGap;\n\t\n\t // Special label rotate.\n\t var labelRotation = timelineModel.get('label.normal.rotate') || 0;\n\t labelRotation = labelRotation * PI / 180; // To radian.\n\t\n\t var playPosition;\n\t var prevBtnPosition;\n\t var nextBtnPosition;\n\t var axisExtent;\n\t var controlPosition = controlModel.get('position', true);\n\t var showControl = controlModel.get('show', true);\n\t var showPlayBtn = showControl && controlModel.get('showPlayBtn', true);\n\t var showPrevBtn = showControl && controlModel.get('showPrevBtn', true);\n\t var showNextBtn = showControl && controlModel.get('showNextBtn', true);\n\t var xLeft = 0;\n\t var xRight = mainLength;\n\t\n\t // position[0] means left, position[1] means middle.\n\t if (controlPosition === 'left' || controlPosition === 'bottom') {\n\t showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap);\n\t showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap);\n\t showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);\n\t }\n\t else { // 'top' 'right'\n\t showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);\n\t showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap);\n\t showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);\n\t }\n\t axisExtent = [xLeft, xRight];\n\t\n\t if (timelineModel.get('inverse')) {\n\t axisExtent.reverse();\n\t }\n\t\n\t return {\n\t viewRect: viewRect,\n\t mainLength: mainLength,\n\t orient: orient,\n\t\n\t rotation: rotationMap[orient],\n\t labelRotation: labelRotation,\n\t labelPosOpt: labelPosOpt,\n\t labelAlign: labelAlignMap[orient],\n\t labelBaseline: labelBaselineMap[orient],\n\t\n\t // Based on mainGroup.\n\t playPosition: playPosition,\n\t prevBtnPosition: prevBtnPosition,\n\t nextBtnPosition: nextBtnPosition,\n\t axisExtent: axisExtent,\n\t\n\t controlSize: controlSize,\n\t controlGap: controlGap\n\t };\n\t },\n\t\n\t _position: function (layoutInfo, timelineModel) {\n\t // Position is be called finally, because bounding rect is needed for\n\t // adapt content to fill viewRect (auto adapt offset).\n\t\n\t // Timeline may be not all in the viewRect when 'offset' is specified\n\t // as a number, because it is more appropriate that label aligns at\n\t // 'offset' but not the other edge defined by viewRect.\n\t\n\t var mainGroup = this._mainGroup;\n\t var labelGroup = this._labelGroup;\n\t\n\t var viewRect = layoutInfo.viewRect;\n\t if (layoutInfo.orient === 'vertical') {\n\t // transfrom to horizontal, inverse rotate by left-top point.\n\t var m = matrix.create();\n\t var rotateOriginX = viewRect.x;\n\t var rotateOriginY = viewRect.y + viewRect.height;\n\t matrix.translate(m, m, [-rotateOriginX, -rotateOriginY]);\n\t matrix.rotate(m, m, -PI / 2);\n\t matrix.translate(m, m, [rotateOriginX, rotateOriginY]);\n\t viewRect = viewRect.clone();\n\t viewRect.applyTransform(m);\n\t }\n\t\n\t var viewBound = getBound(viewRect);\n\t var mainBound = getBound(mainGroup.getBoundingRect());\n\t var labelBound = getBound(labelGroup.getBoundingRect());\n\t\n\t var mainPosition = mainGroup.position;\n\t var labelsPosition = labelGroup.position;\n\t\n\t labelsPosition[0] = mainPosition[0] = viewBound[0][0];\n\t\n\t var labelPosOpt = layoutInfo.labelPosOpt;\n\t\n\t if (isNaN(labelPosOpt)) { // '+' or '-'\n\t var mainBoundIdx = labelPosOpt === '+' ? 0 : 1;\n\t toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);\n\t toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx);\n\t }\n\t else {\n\t var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1;\n\t toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);\n\t labelsPosition[1] = mainPosition[1] + labelPosOpt;\n\t }\n\t\n\t mainGroup.attr('position', mainPosition);\n\t labelGroup.attr('position', labelsPosition);\n\t mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation;\n\t\n\t setOrigin(mainGroup);\n\t setOrigin(labelGroup);\n\t\n\t function setOrigin(targetGroup) {\n\t var pos = targetGroup.position;\n\t targetGroup.origin = [\n\t viewBound[0][0] - pos[0],\n\t viewBound[1][0] - pos[1]\n\t ];\n\t }\n\t\n\t function getBound(rect) {\n\t // [[xmin, xmax], [ymin, ymax]]\n\t return [\n\t [rect.x, rect.x + rect.width],\n\t [rect.y, rect.y + rect.height]\n\t ];\n\t }\n\t\n\t function toBound(fromPos, from, to, dimIdx, boundIdx) {\n\t fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx];\n\t }\n\t },\n\t\n\t _createAxis: function (layoutInfo, timelineModel) {\n\t var data = timelineModel.getData();\n\t var axisType = timelineModel.get('axisType');\n\t\n\t var scale = axisHelper.createScaleByModel(timelineModel, axisType);\n\t var dataExtent = data.getDataExtent('value');\n\t scale.setExtent(dataExtent[0], dataExtent[1]);\n\t this._customizeScale(scale, data);\n\t scale.niceTicks();\n\t\n\t var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType);\n\t axis.model = timelineModel;\n\t\n\t return axis;\n\t },\n\t\n\t _customizeScale: function (scale, data) {\n\t\n\t scale.getTicks = function () {\n\t return data.mapArray(['value'], function (value) {\n\t return value;\n\t });\n\t };\n\t\n\t scale.getTicksLabels = function () {\n\t return zrUtil.map(this.getTicks(), scale.getLabel, scale);\n\t };\n\t },\n\t\n\t _createGroup: function (name) {\n\t var newGroup = this['_' + name] = new graphic.Group();\n\t this.group.add(newGroup);\n\t return newGroup;\n\t },\n\t\n\t _renderAxisLine: function (layoutInfo, group, axis, timelineModel) {\n\t var axisExtent = axis.getExtent();\n\t\n\t if (!timelineModel.get('lineStyle.show')) {\n\t return;\n\t }\n\t\n\t group.add(new graphic.Line({\n\t shape: {\n\t x1: axisExtent[0], y1: 0,\n\t x2: axisExtent[1], y2: 0\n\t },\n\t style: zrUtil.extend(\n\t {lineCap: 'round'},\n\t timelineModel.getModel('lineStyle').getLineStyle()\n\t ),\n\t silent: true,\n\t z2: 1\n\t }));\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _renderAxisTick: function (layoutInfo, group, axis, timelineModel) {\n\t var data = timelineModel.getData();\n\t var ticks = axis.scale.getTicks();\n\t\n\t each(ticks, function (value, dataIndex) {\n\t\n\t var tickCoord = axis.dataToCoord(value);\n\t var itemModel = data.getItemModel(dataIndex);\n\t var itemStyleModel = itemModel.getModel('itemStyle.normal');\n\t var hoverStyleModel = itemModel.getModel('itemStyle.emphasis');\n\t var symbolOpt = {\n\t position: [tickCoord, 0],\n\t onclick: bind(this._changeTimeline, this, dataIndex)\n\t };\n\t var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt);\n\t graphic.setHoverStyle(el, hoverStyleModel.getItemStyle());\n\t\n\t if (itemModel.get('tooltip')) {\n\t el.dataIndex = dataIndex;\n\t el.dataModel = timelineModel;\n\t }\n\t else {\n\t el.dataIndex = el.dataModel = null;\n\t }\n\t\n\t }, this);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _renderAxisLabel: function (layoutInfo, group, axis, timelineModel) {\n\t var labelModel = timelineModel.getModel('label.normal');\n\t\n\t if (!labelModel.get('show')) {\n\t return;\n\t }\n\t\n\t var data = timelineModel.getData();\n\t var ticks = axis.scale.getTicks();\n\t var labels = axisHelper.getFormattedLabels(\n\t axis, labelModel.get('formatter')\n\t );\n\t var labelInterval = axis.getLabelInterval();\n\t\n\t each(ticks, function (tick, dataIndex) {\n\t if (axis.isLabelIgnored(dataIndex, labelInterval)) {\n\t return;\n\t }\n\t\n\t var itemModel = data.getItemModel(dataIndex);\n\t var itemTextStyleModel = itemModel.getModel('label.normal.textStyle');\n\t var hoverTextStyleModel = itemModel.getModel('label.emphasis.textStyle');\n\t var tickCoord = axis.dataToCoord(tick);\n\t var textEl = new graphic.Text({\n\t style: {\n\t text: labels[dataIndex],\n\t textAlign: layoutInfo.labelAlign,\n\t textVerticalAlign: layoutInfo.labelBaseline,\n\t textFont: itemTextStyleModel.getFont(),\n\t fill: itemTextStyleModel.getTextColor()\n\t },\n\t position: [tickCoord, 0],\n\t rotation: layoutInfo.labelRotation - layoutInfo.rotation,\n\t onclick: bind(this._changeTimeline, this, dataIndex),\n\t silent: false\n\t });\n\t\n\t group.add(textEl);\n\t graphic.setHoverStyle(textEl, hoverTextStyleModel.getItemStyle());\n\t\n\t }, this);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _renderControl: function (layoutInfo, group, axis, timelineModel) {\n\t var controlSize = layoutInfo.controlSize;\n\t var rotation = layoutInfo.rotation;\n\t\n\t var itemStyle = timelineModel.getModel('controlStyle.normal').getItemStyle();\n\t var hoverStyle = timelineModel.getModel('controlStyle.emphasis').getItemStyle();\n\t var rect = [0, -controlSize / 2, controlSize, controlSize];\n\t var playState = timelineModel.getPlayState();\n\t var inverse = timelineModel.get('inverse', true);\n\t\n\t makeBtn(\n\t layoutInfo.nextBtnPosition,\n\t 'controlStyle.nextIcon',\n\t bind(this._changeTimeline, this, inverse ? '-' : '+')\n\t );\n\t makeBtn(\n\t layoutInfo.prevBtnPosition,\n\t 'controlStyle.prevIcon',\n\t bind(this._changeTimeline, this, inverse ? '+' : '-')\n\t );\n\t makeBtn(\n\t layoutInfo.playPosition,\n\t 'controlStyle.' + (playState ? 'stopIcon' : 'playIcon'),\n\t bind(this._handlePlayClick, this, !playState),\n\t true\n\t );\n\t\n\t function makeBtn(position, iconPath, onclick, willRotate) {\n\t if (!position) {\n\t return;\n\t }\n\t var opt = {\n\t position: position,\n\t origin: [controlSize / 2, 0],\n\t rotation: willRotate ? -rotation : 0,\n\t rectHover: true,\n\t style: itemStyle,\n\t onclick: onclick\n\t };\n\t var btn = makeIcon(timelineModel, iconPath, rect, opt);\n\t group.add(btn);\n\t graphic.setHoverStyle(btn, hoverStyle);\n\t }\n\t },\n\t\n\t _renderCurrentPointer: function (layoutInfo, group, axis, timelineModel) {\n\t var data = timelineModel.getData();\n\t var currentIndex = timelineModel.getCurrentIndex();\n\t var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle');\n\t var me = this;\n\t\n\t var callback = {\n\t onCreate: function (pointer) {\n\t pointer.draggable = true;\n\t pointer.drift = bind(me._handlePointerDrag, me);\n\t pointer.ondragend = bind(me._handlePointerDragend, me);\n\t pointerMoveTo(pointer, currentIndex, axis, timelineModel, true);\n\t },\n\t onUpdate: function (pointer) {\n\t pointerMoveTo(pointer, currentIndex, axis, timelineModel);\n\t }\n\t };\n\t\n\t // Reuse when exists, for animation and drag.\n\t this._currentPointer = giveSymbol(\n\t pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback\n\t );\n\t },\n\t\n\t _handlePlayClick: function (nextState) {\n\t this._clearTimer();\n\t this.api.dispatchAction({\n\t type: 'timelinePlayChange',\n\t playState: nextState,\n\t from: this.uid\n\t });\n\t },\n\t\n\t _handlePointerDrag: function (dx, dy, e) {\n\t this._clearTimer();\n\t this._pointerChangeTimeline([e.offsetX, e.offsetY]);\n\t },\n\t\n\t _handlePointerDragend: function (e) {\n\t this._pointerChangeTimeline([e.offsetX, e.offsetY], true);\n\t },\n\t\n\t _pointerChangeTimeline: function (mousePos, trigger) {\n\t var toCoord = this._toAxisCoord(mousePos)[0];\n\t\n\t var axis = this._axis;\n\t var axisExtent = numberUtil.asc(axis.getExtent().slice());\n\t\n\t toCoord > axisExtent[1] && (toCoord = axisExtent[1]);\n\t toCoord < axisExtent[0] && (toCoord = axisExtent[0]);\n\t\n\t this._currentPointer.position[0] = toCoord;\n\t this._currentPointer.dirty();\n\t\n\t var targetDataIndex = this._findNearestTick(toCoord);\n\t var timelineModel = this.model;\n\t\n\t if (trigger || (\n\t targetDataIndex !== timelineModel.getCurrentIndex()\n\t && timelineModel.get('realtime')\n\t )) {\n\t this._changeTimeline(targetDataIndex);\n\t }\n\t },\n\t\n\t _doPlayStop: function () {\n\t this._clearTimer();\n\t\n\t if (this.model.getPlayState()) {\n\t this._timer = setTimeout(\n\t bind(handleFrame, this),\n\t this.model.get('playInterval')\n\t );\n\t }\n\t\n\t function handleFrame() {\n\t // Do not cache\n\t var timelineModel = this.model;\n\t this._changeTimeline(\n\t timelineModel.getCurrentIndex()\n\t + (timelineModel.get('rewind', true) ? -1 : 1)\n\t );\n\t }\n\t },\n\t\n\t _toAxisCoord: function (vertex) {\n\t var trans = this._mainGroup.getLocalTransform();\n\t return graphic.applyTransform(vertex, trans, true);\n\t },\n\t\n\t _findNearestTick: function (axisCoord) {\n\t var data = this.model.getData();\n\t var dist = Infinity;\n\t var targetDataIndex;\n\t var axis = this._axis;\n\t\n\t data.each(['value'], function (value, dataIndex) {\n\t var coord = axis.dataToCoord(value);\n\t var d = Math.abs(coord - axisCoord);\n\t if (d < dist) {\n\t dist = d;\n\t targetDataIndex = dataIndex;\n\t }\n\t });\n\t\n\t return targetDataIndex;\n\t },\n\t\n\t _clearTimer: function () {\n\t if (this._timer) {\n\t clearTimeout(this._timer);\n\t this._timer = null;\n\t }\n\t },\n\t\n\t _changeTimeline: function (nextIndex) {\n\t var currentIndex = this.model.getCurrentIndex();\n\t\n\t if (nextIndex === '+') {\n\t nextIndex = currentIndex + 1;\n\t }\n\t else if (nextIndex === '-') {\n\t nextIndex = currentIndex - 1;\n\t }\n\t\n\t this.api.dispatchAction({\n\t type: 'timelineChange',\n\t currentIndex: nextIndex,\n\t from: this.uid\n\t });\n\t }\n\t\n\t });\n\t\n\t function getViewRect(model, api) {\n\t return layout.getLayoutRect(\n\t model.getBoxLayoutParams(),\n\t {\n\t width: api.getWidth(),\n\t height: api.getHeight()\n\t },\n\t model.get('padding')\n\t );\n\t }\n\t\n\t function makeIcon(timelineModel, objPath, rect, opts) {\n\t var icon = graphic.makePath(\n\t timelineModel.get(objPath).replace(/^path:\\/\\//, ''),\n\t zrUtil.clone(opts || {}),\n\t new BoundingRect(rect[0], rect[1], rect[2], rect[3]),\n\t 'center'\n\t );\n\t\n\t return icon;\n\t }\n\t\n\t /**\n\t * Create symbol or update symbol\n\t * opt: basic position and event handlers\n\t */\n\t function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) {\n\t var color = itemStyleModel.get('color');\n\t\n\t if (!symbol) {\n\t var symbolType = hostModel.get('symbol');\n\t symbol = symbolUtil.createSymbol(symbolType, -1, -1, 2, 2, color);\n\t symbol.setStyle('strokeNoScale', true);\n\t group.add(symbol);\n\t callback && callback.onCreate(symbol);\n\t }\n\t else {\n\t symbol.setColor(color);\n\t group.add(symbol); // Group may be new, also need to add.\n\t callback && callback.onUpdate(symbol);\n\t }\n\t\n\t // Style\n\t var itemStyle = itemStyleModel.getItemStyle(['color', 'symbol', 'symbolSize']);\n\t symbol.setStyle(itemStyle);\n\t\n\t // Transform and events.\n\t opt = zrUtil.merge({\n\t rectHover: true,\n\t z2: 100\n\t }, opt, true);\n\t\n\t var symbolSize = hostModel.get('symbolSize');\n\t symbolSize = symbolSize instanceof Array\n\t ? symbolSize.slice()\n\t : [+symbolSize, +symbolSize];\n\t symbolSize[0] /= 2;\n\t symbolSize[1] /= 2;\n\t opt.scale = symbolSize;\n\t\n\t var symbolOffset = hostModel.get('symbolOffset');\n\t if (symbolOffset) {\n\t var pos = opt.position = opt.position || [0, 0];\n\t pos[0] += numberUtil.parsePercent(symbolOffset[0], symbolSize[0]);\n\t pos[1] += numberUtil.parsePercent(symbolOffset[1], symbolSize[1]);\n\t }\n\t\n\t var symbolRotate = hostModel.get('symbolRotate');\n\t opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0;\n\t\n\t symbol.attr(opt);\n\t\n\t // FIXME\n\t // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed,\n\t // getBoundingRect will return wrong result.\n\t // (This is supposed to be resolved in zrender, but it is a little difficult to\n\t // leverage performance and auto updateTransform)\n\t // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol.\n\t symbol.updateTransform();\n\t\n\t return symbol;\n\t }\n\t\n\t function pointerMoveTo(pointer, dataIndex, axis, timelineModel, noAnimation) {\n\t if (pointer.dragging) {\n\t return;\n\t }\n\t\n\t var pointerModel = timelineModel.getModel('checkpointStyle');\n\t var toCoord = axis.dataToCoord(timelineModel.getData().get(['value'], dataIndex));\n\t\n\t if (noAnimation || !pointerModel.get('animation', true)) {\n\t pointer.attr({position: [toCoord, 0]});\n\t }\n\t else {\n\t pointer.stopAnimation(true);\n\t pointer.animateTo(\n\t {position: [toCoord, 0]},\n\t pointerModel.get('animationDuration', true),\n\t pointerModel.get('animationEasing', true)\n\t );\n\t }\n\t }\n\t\n\n\n/***/ },\n/* 664 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var Axis = __webpack_require__(68);\n\t var axisHelper = __webpack_require__(42);\n\t\n\t /**\n\t * Extend axis 2d\n\t * @constructor module:echarts/coord/cartesian/Axis2D\n\t * @extends {module:echarts/coord/cartesian/Axis}\n\t * @param {string} dim\n\t * @param {*} scale\n\t * @param {Array.} coordExtent\n\t * @param {string} axisType\n\t * @param {string} position\n\t */\n\t var TimelineAxis = function (dim, scale, coordExtent, axisType) {\n\t\n\t Axis.call(this, dim, scale, coordExtent);\n\t\n\t /**\n\t * Axis type\n\t * - 'category'\n\t * - 'value'\n\t * - 'time'\n\t * - 'log'\n\t * @type {string}\n\t */\n\t this.type = axisType || 'value';\n\t\n\t /**\n\t * @private\n\t * @type {number}\n\t */\n\t this._autoLabelInterval;\n\t\n\t /**\n\t * Axis model\n\t * @param {module:echarts/component/TimelineModel}\n\t */\n\t this.model = null;\n\t };\n\t\n\t TimelineAxis.prototype = {\n\t\n\t constructor: TimelineAxis,\n\t\n\t /**\n\t * @public\n\t * @return {number}\n\t */\n\t getLabelInterval: function () {\n\t var timelineModel = this.model;\n\t var labelModel = timelineModel.getModel('label.normal');\n\t var labelInterval = labelModel.get('interval');\n\t\n\t if (labelInterval != null && labelInterval != 'auto') {\n\t return labelInterval;\n\t }\n\t\n\t var labelInterval = this._autoLabelInterval;\n\t\n\t if (!labelInterval) {\n\t labelInterval = this._autoLabelInterval = axisHelper.getAxisLabelInterval(\n\t zrUtil.map(this.scale.getTicks(), this.dataToCoord, this),\n\t axisHelper.getFormattedLabels(this, labelModel.get('formatter')),\n\t labelModel.getModel('textStyle').getFont(),\n\t timelineModel.get('orient') === 'horizontal'\n\t );\n\t }\n\t\n\t return labelInterval;\n\t },\n\t\n\t /**\n\t * If label is ignored.\n\t * Automatically used when axis is category and label can not be all shown\n\t * @public\n\t * @param {number} idx\n\t * @return {boolean}\n\t */\n\t isLabelIgnored: function (idx) {\n\t if (this.type === 'category') {\n\t var labelInterval = this.getLabelInterval();\n\t return ((typeof labelInterval === 'function')\n\t && !labelInterval(idx, this.scale.getLabel(idx)))\n\t || idx % (labelInterval + 1);\n\t }\n\t }\n\t\n\t };\n\t\n\t zrUtil.inherits(TimelineAxis, Axis);\n\t\n\t module.exports = TimelineAxis;\n\n\n/***/ },\n/* 665 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Timeline model\n\t */\n\t\n\t\n\t var ComponentModel = __webpack_require__(23);\n\t var List = __webpack_require__(20);\n\t var zrUtil = __webpack_require__(1);\n\t var modelUtil = __webpack_require__(14);\n\t\n\t var TimelineModel = ComponentModel.extend({\n\t\n\t type: 'timeline',\n\t\n\t layoutMode: 'box',\n\t\n\t /**\n\t * @protected\n\t */\n\t defaultOption: {\n\t\n\t zlevel: 0, // 一级层叠\n\t z: 4, // 二级层叠\n\t show: true,\n\t\n\t axisType: 'time', // 模式是时间类型,支持 value, category\n\t\n\t realtime: true,\n\t\n\t left: '20%',\n\t top: null,\n\t right: '20%',\n\t bottom: 0,\n\t width: null,\n\t height: 40,\n\t padding: 5,\n\t\n\t controlPosition: 'left', // 'left' 'right' 'top' 'bottom' 'none'\n\t autoPlay: false,\n\t rewind: false, // 反向播放\n\t loop: true,\n\t playInterval: 2000, // 播放时间间隔,单位ms\n\t\n\t currentIndex: 0,\n\t\n\t itemStyle: {\n\t normal: {},\n\t emphasis: {}\n\t },\n\t label: {\n\t normal: {\n\t textStyle: {\n\t color: '#000'\n\t }\n\t },\n\t emphasis: {}\n\t },\n\t\n\t data: []\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t init: function (option, parentModel, ecModel) {\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/data/List}\n\t */\n\t this._data;\n\t\n\t /**\n\t * @private\n\t * @type {Array.}\n\t */\n\t this._names;\n\t\n\t this.mergeDefaultAndTheme(option, ecModel);\n\t this._initData();\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t mergeOption: function (option) {\n\t TimelineModel.superApply(this, 'mergeOption', arguments);\n\t this._initData();\n\t },\n\t\n\t /**\n\t * @param {number} [currentIndex]\n\t */\n\t setCurrentIndex: function (currentIndex) {\n\t if (currentIndex == null) {\n\t currentIndex = this.option.currentIndex;\n\t }\n\t var count = this._data.count();\n\t\n\t if (this.option.loop) {\n\t currentIndex = (currentIndex % count + count) % count;\n\t }\n\t else {\n\t currentIndex >= count && (currentIndex = count - 1);\n\t currentIndex < 0 && (currentIndex = 0);\n\t }\n\t\n\t this.option.currentIndex = currentIndex;\n\t },\n\t\n\t /**\n\t * @return {number} currentIndex\n\t */\n\t getCurrentIndex: function () {\n\t return this.option.currentIndex;\n\t },\n\t\n\t /**\n\t * @return {boolean}\n\t */\n\t isIndexMax: function () {\n\t return this.getCurrentIndex() >= this._data.count() - 1;\n\t },\n\t\n\t /**\n\t * @param {boolean} state true: play, false: stop\n\t */\n\t setPlayState: function (state) {\n\t this.option.autoPlay = !!state;\n\t },\n\t\n\t /**\n\t * @return {boolean} true: play, false: stop\n\t */\n\t getPlayState: function () {\n\t return !!this.option.autoPlay;\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _initData: function () {\n\t var thisOption = this.option;\n\t var dataArr = thisOption.data || [];\n\t var axisType = thisOption.axisType;\n\t var names = this._names = [];\n\t\n\t if (axisType === 'category') {\n\t var idxArr = [];\n\t zrUtil.each(dataArr, function (item, index) {\n\t var value = modelUtil.getDataItemValue(item);\n\t var newItem;\n\t\n\t if (zrUtil.isObject(item)) {\n\t newItem = zrUtil.clone(item);\n\t newItem.value = index;\n\t }\n\t else {\n\t newItem = index;\n\t }\n\t\n\t idxArr.push(newItem);\n\t\n\t if (!zrUtil.isString(value) && (value == null || isNaN(value))) {\n\t value = '';\n\t }\n\t\n\t names.push(value + '');\n\t });\n\t dataArr = idxArr;\n\t }\n\t\n\t var dimType = ({category: 'ordinal', time: 'time'})[axisType] || 'number';\n\t\n\t var data = this._data = new List([{name: 'value', type: dimType}], this);\n\t\n\t data.initData(dataArr, names);\n\t },\n\t\n\t getData: function () {\n\t return this._data;\n\t },\n\t\n\t /**\n\t * @public\n\t * @return {Array.} categoreis\n\t */\n\t getCategories: function () {\n\t if (this.get('axisType') === 'category') {\n\t return this._names.slice();\n\t }\n\t }\n\t\n\t });\n\t\n\t module.exports = TimelineModel;\n\n\n/***/ },\n/* 666 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Timeline view\n\t */\n\t\n\t\n\t // var zrUtil = require('zrender/lib/core/util');\n\t // var graphic = require('../../util/graphic');\n\t var ComponentView = __webpack_require__(163);\n\t\n\t module.exports = ComponentView.extend({\n\t\n\t type: 'timeline'\n\t });\n\t\n\n\n/***/ },\n/* 667 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Timeline preprocessor\n\t */\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t module.exports = function (option) {\n\t var timelineOpt = option && option.timeline;\n\t\n\t if (!zrUtil.isArray(timelineOpt)) {\n\t timelineOpt = timelineOpt ? [timelineOpt] : [];\n\t }\n\t\n\t zrUtil.each(timelineOpt, function (opt) {\n\t if (!opt) {\n\t return;\n\t }\n\t\n\t compatibleEC2(opt);\n\t });\n\t };\n\t\n\t function compatibleEC2(opt) {\n\t var type = opt.type;\n\t\n\t var ec2Types = {'number': 'value', 'time': 'time'};\n\t\n\t // Compatible with ec2\n\t if (ec2Types[type]) {\n\t opt.axisType = ec2Types[type];\n\t delete opt.type;\n\t }\n\t\n\t transferItem(opt);\n\t\n\t if (has(opt, 'controlPosition')) {\n\t var controlStyle = opt.controlStyle || (opt.controlStyle = {});\n\t if (!has(controlStyle, 'position')) {\n\t controlStyle.position = opt.controlPosition;\n\t }\n\t if (controlStyle.position === 'none' && !has(controlStyle, 'show')) {\n\t controlStyle.show = false;\n\t delete controlStyle.position;\n\t }\n\t delete opt.controlPosition;\n\t }\n\t\n\t zrUtil.each(opt.data || [], function (dataItem) {\n\t if (zrUtil.isObject(dataItem) && !zrUtil.isArray(dataItem)) {\n\t if (!has(dataItem, 'value') && has(dataItem, 'name')) {\n\t // In ec2, using name as value.\n\t dataItem.value = dataItem.name;\n\t }\n\t transferItem(dataItem);\n\t }\n\t });\n\t }\n\t\n\t function transferItem(opt) {\n\t var itemStyle = opt.itemStyle || (opt.itemStyle = {});\n\t\n\t var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {});\n\t\n\t // Transfer label out\n\t var label = opt.label || (opt.label || {});\n\t var labelNormal = label.normal || (label.normal = {});\n\t var excludeLabelAttr = {normal: 1, emphasis: 1};\n\t\n\t zrUtil.each(label, function (value, name) {\n\t if (!excludeLabelAttr[name] && !has(labelNormal, name)) {\n\t labelNormal[name] = value;\n\t }\n\t });\n\t\n\t if (itemStyleEmphasis.label && !has(label, 'emphasis')) {\n\t label.emphasis = itemStyleEmphasis.label;\n\t delete itemStyleEmphasis.label;\n\t }\n\t }\n\t\n\t function has(obj, attr) {\n\t return obj.hasOwnProperty(attr);\n\t }\n\t\n\n\n/***/ },\n/* 668 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Timeilne action\n\t */\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t echarts.registerAction(\n\t\n\t {type: 'timelineChange', event: 'timelineChanged', update: 'prepareAndUpdate'},\n\t\n\t function (payload, ecModel) {\n\t\n\t var timelineModel = ecModel.getComponent('timeline');\n\t if (timelineModel && payload.currentIndex != null) {\n\t timelineModel.setCurrentIndex(payload.currentIndex);\n\t\n\t if (!timelineModel.get('loop', true) && timelineModel.isIndexMax()) {\n\t timelineModel.setPlayState(false);\n\t }\n\t }\n\t\n\t // Set normalized currentIndex to payload.\n\t ecModel.resetOption('timeline');\n\t\n\t return zrUtil.defaults({\n\t currentIndex: timelineModel.option.currentIndex\n\t }, payload);\n\t }\n\t );\n\t\n\t echarts.registerAction(\n\t\n\t {type: 'timelinePlayChange', event: 'timelinePlayChanged', update: 'update'},\n\t\n\t function (payload, ecModel) {\n\t var timelineModel = ecModel.getComponent('timeline');\n\t if (timelineModel && payload.playState != null) {\n\t timelineModel.setPlayState(payload.playState);\n\t }\n\t }\n\t );\n\t\n\n\n/***/ },\n/* 669 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(23).registerSubTypeDefaulter('timeline', function () {\n\t // Only slider now.\n\t return 'slider';\n\t });\n\t\n\n\n/***/ },\n/* 670 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var echarts = __webpack_require__(3);\n\t var graphic = __webpack_require__(4);\n\t var layout = __webpack_require__(16);\n\t\n\t // Model\n\t echarts.extendComponentModel({\n\t\n\t type: 'title',\n\t\n\t layoutMode: {type: 'box', ignoreSize: true},\n\t\n\t defaultOption: {\n\t // 一级层叠\n\t zlevel: 0,\n\t // 二级层叠\n\t z: 6,\n\t show: true,\n\t\n\t text: '',\n\t // 超链接跳转\n\t // link: null,\n\t // 仅支持self | blank\n\t target: 'blank',\n\t subtext: '',\n\t\n\t // 超链接跳转\n\t // sublink: null,\n\t // 仅支持self | blank\n\t subtarget: 'blank',\n\t\n\t // 'center' ¦ 'left' ¦ 'right'\n\t // ¦ {number}(x坐标,单位px)\n\t left: 0,\n\t // 'top' ¦ 'bottom' ¦ 'center'\n\t // ¦ {number}(y坐标,单位px)\n\t top: 0,\n\t\n\t // 水平对齐\n\t // 'auto' | 'left' | 'right' | 'center'\n\t // 默认根据 left 的位置判断是左对齐还是右对齐\n\t // textAlign: null\n\t //\n\t // 垂直对齐\n\t // 'auto' | 'top' | 'bottom' | 'middle'\n\t // 默认根据 top 位置判断是上对齐还是下对齐\n\t // textBaseline: null\n\t\n\t backgroundColor: 'rgba(0,0,0,0)',\n\t\n\t // 标题边框颜色\n\t borderColor: '#ccc',\n\t\n\t // 标题边框线宽,单位px,默认为0(无边框)\n\t borderWidth: 0,\n\t\n\t // 标题内边距,单位px,默认各方向内边距为5,\n\t // 接受数组分别设定上右下左边距,同css\n\t padding: 5,\n\t\n\t // 主副标题纵向间隔,单位px,默认为10,\n\t itemGap: 10,\n\t textStyle: {\n\t fontSize: 18,\n\t fontWeight: 'bolder',\n\t color: '#333'\n\t },\n\t subtextStyle: {\n\t color: '#aaa'\n\t }\n\t }\n\t });\n\t\n\t // View\n\t echarts.extendComponentView({\n\t\n\t type: 'title',\n\t\n\t render: function (titleModel, ecModel, api) {\n\t this.group.removeAll();\n\t\n\t if (!titleModel.get('show')) {\n\t return;\n\t }\n\t\n\t var group = this.group;\n\t\n\t var textStyleModel = titleModel.getModel('textStyle');\n\t var subtextStyleModel = titleModel.getModel('subtextStyle');\n\t\n\t var textAlign = titleModel.get('textAlign');\n\t var textBaseline = titleModel.get('textBaseline');\n\t\n\t var textEl = new graphic.Text({\n\t style: {\n\t text: titleModel.get('text'),\n\t textFont: textStyleModel.getFont(),\n\t fill: textStyleModel.getTextColor()\n\t },\n\t z2: 10\n\t });\n\t\n\t var textRect = textEl.getBoundingRect();\n\t\n\t var subText = titleModel.get('subtext');\n\t var subTextEl = new graphic.Text({\n\t style: {\n\t text: subText,\n\t textFont: subtextStyleModel.getFont(),\n\t fill: subtextStyleModel.getTextColor(),\n\t y: textRect.height + titleModel.get('itemGap'),\n\t textBaseline: 'top'\n\t },\n\t z2: 10\n\t });\n\t\n\t var link = titleModel.get('link');\n\t var sublink = titleModel.get('sublink');\n\t\n\t textEl.silent = !link;\n\t subTextEl.silent = !sublink;\n\t\n\t if (link) {\n\t textEl.on('click', function () {\n\t window.open(link, '_' + titleModel.get('target'));\n\t });\n\t }\n\t if (sublink) {\n\t subTextEl.on('click', function () {\n\t window.open(sublink, '_' + titleModel.get('subtarget'));\n\t });\n\t }\n\t\n\t group.add(textEl);\n\t subText && group.add(subTextEl);\n\t // If no subText, but add subTextEl, there will be an empty line.\n\t\n\t var groupRect = group.getBoundingRect();\n\t var layoutOption = titleModel.getBoxLayoutParams();\n\t layoutOption.width = groupRect.width;\n\t layoutOption.height = groupRect.height;\n\t var layoutRect = layout.getLayoutRect(\n\t layoutOption, {\n\t width: api.getWidth(),\n\t height: api.getHeight()\n\t }, titleModel.get('padding')\n\t );\n\t // Adjust text align based on position\n\t if (!textAlign) {\n\t // Align left if title is on the left. center and right is same\n\t textAlign = titleModel.get('left') || titleModel.get('right');\n\t if (textAlign === 'middle') {\n\t textAlign = 'center';\n\t }\n\t // Adjust layout by text align\n\t if (textAlign === 'right') {\n\t layoutRect.x += layoutRect.width;\n\t }\n\t else if (textAlign === 'center') {\n\t layoutRect.x += layoutRect.width / 2;\n\t }\n\t }\n\t if (!textBaseline) {\n\t textBaseline = titleModel.get('top') || titleModel.get('bottom');\n\t if (textBaseline === 'center') {\n\t textBaseline = 'middle';\n\t }\n\t if (textBaseline === 'bottom') {\n\t layoutRect.y += layoutRect.height;\n\t }\n\t else if (textBaseline === 'middle') {\n\t layoutRect.y += layoutRect.height / 2;\n\t }\n\t\n\t textBaseline = textBaseline || 'top';\n\t }\n\t\n\t group.attr('position', [layoutRect.x, layoutRect.y]);\n\t var alignStyle = {\n\t textAlign: textAlign,\n\t textVerticalAlign: textBaseline\n\t };\n\t textEl.setStyle(alignStyle);\n\t subTextEl.setStyle(alignStyle);\n\t\n\t // Render background\n\t // Get groupRect again because textAlign has been changed\n\t groupRect = group.getBoundingRect();\n\t var padding = layoutRect.margin;\n\t var style = titleModel.getItemStyle(['color', 'opacity']);\n\t style.fill = titleModel.get('backgroundColor');\n\t var rect = new graphic.Rect({\n\t shape: {\n\t x: groupRect.x - padding[3],\n\t y: groupRect.y - padding[0],\n\t width: groupRect.width + padding[1] + padding[3],\n\t height: groupRect.height + padding[0] + padding[2]\n\t },\n\t style: style,\n\t silent: true\n\t });\n\t graphic.subPixelOptimizeRect(rect);\n\t\n\t group.add(rect);\n\t }\n\t });\n\n\n/***/ },\n/* 671 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(672);\n\t __webpack_require__(673);\n\t\n\t __webpack_require__(679);\n\t __webpack_require__(677);\n\t __webpack_require__(675);\n\t __webpack_require__(676);\n\t __webpack_require__(678);\n\n\n/***/ },\n/* 672 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var featureManager = __webpack_require__(55);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t var ToolboxModel = __webpack_require__(3).extendComponentModel({\n\t\n\t type: 'toolbox',\n\t\n\t layoutMode: {\n\t type: 'box',\n\t ignoreSize: true\n\t },\n\t\n\t mergeDefaultAndTheme: function (option) {\n\t ToolboxModel.superApply(this, 'mergeDefaultAndTheme', arguments);\n\t\n\t zrUtil.each(this.option.feature, function (featureOpt, featureName) {\n\t var Feature = featureManager.get(featureName);\n\t Feature && zrUtil.merge(featureOpt, Feature.defaultOption);\n\t });\n\t },\n\t\n\t defaultOption: {\n\t\n\t show: true,\n\t\n\t z: 6,\n\t\n\t zlevel: 0,\n\t\n\t orient: 'horizontal',\n\t\n\t left: 'right',\n\t\n\t top: 'top',\n\t\n\t // right\n\t // bottom\n\t\n\t backgroundColor: 'transparent',\n\t\n\t borderColor: '#ccc',\n\t\n\t borderWidth: 0,\n\t\n\t padding: 5,\n\t\n\t itemSize: 15,\n\t\n\t itemGap: 8,\n\t\n\t showTitle: true,\n\t\n\t iconStyle: {\n\t normal: {\n\t borderColor: '#666',\n\t color: 'none'\n\t },\n\t emphasis: {\n\t borderColor: '#3E98C5'\n\t }\n\t }\n\t // textStyle: {},\n\t\n\t // feature\n\t }\n\t });\n\t\n\t module.exports = ToolboxModel;\n\n\n/***/ },\n/* 673 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {\n\t\n\t var featureManager = __webpack_require__(55);\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var Model = __webpack_require__(21);\n\t var DataDiffer = __webpack_require__(109);\n\t var listComponentHelper = __webpack_require__(224);\n\t var textContain = __webpack_require__(57);\n\t\n\t module.exports = __webpack_require__(3).extendComponentView({\n\t\n\t type: 'toolbox',\n\t\n\t render: function (toolboxModel, ecModel, api, payload) {\n\t var group = this.group;\n\t group.removeAll();\n\t\n\t if (!toolboxModel.get('show')) {\n\t return;\n\t }\n\t\n\t var itemSize = +toolboxModel.get('itemSize');\n\t var featureOpts = toolboxModel.get('feature') || {};\n\t var features = this._features || (this._features = {});\n\t\n\t var featureNames = [];\n\t zrUtil.each(featureOpts, function (opt, name) {\n\t featureNames.push(name);\n\t });\n\t\n\t (new DataDiffer(this._featureNames || [], featureNames))\n\t .add(process)\n\t .update(process)\n\t .remove(zrUtil.curry(process, null))\n\t .execute();\n\t\n\t // Keep for diff.\n\t this._featureNames = featureNames;\n\t\n\t function process(newIndex, oldIndex) {\n\t var featureName = featureNames[newIndex];\n\t var oldName = featureNames[oldIndex];\n\t var featureOpt = featureOpts[featureName];\n\t var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel);\n\t var feature;\n\t\n\t if (featureName && !oldName) { // Create\n\t if (isUserFeatureName(featureName)) {\n\t feature = {\n\t model: featureModel,\n\t onclick: featureModel.option.onclick,\n\t featureName: featureName\n\t };\n\t }\n\t else {\n\t var Feature = featureManager.get(featureName);\n\t if (!Feature) {\n\t return;\n\t }\n\t feature = new Feature(featureModel, ecModel, api);\n\t }\n\t features[featureName] = feature;\n\t }\n\t else {\n\t feature = features[oldName];\n\t // If feature does not exsit.\n\t if (!feature) {\n\t return;\n\t }\n\t feature.model = featureModel;\n\t feature.ecModel = ecModel;\n\t feature.api = api;\n\t }\n\t\n\t if (!featureName && oldName) {\n\t feature.dispose && feature.dispose(ecModel, api);\n\t return;\n\t }\n\t\n\t if (!featureModel.get('show') || feature.unusable) {\n\t feature.remove && feature.remove(ecModel, api);\n\t return;\n\t }\n\t\n\t createIconPaths(featureModel, feature, featureName);\n\t\n\t featureModel.setIconStatus = function (iconName, status) {\n\t var option = this.option;\n\t var iconPaths = this.iconPaths;\n\t option.iconStatus = option.iconStatus || {};\n\t option.iconStatus[iconName] = status;\n\t // FIXME\n\t iconPaths[iconName] && iconPaths[iconName].trigger(status);\n\t };\n\t\n\t if (feature.render) {\n\t feature.render(featureModel, ecModel, api, payload);\n\t }\n\t }\n\t\n\t function createIconPaths(featureModel, feature, featureName) {\n\t var iconStyleModel = featureModel.getModel('iconStyle');\n\t\n\t // If one feature has mutiple icon. they are orginaized as\n\t // {\n\t // icon: {\n\t // foo: '',\n\t // bar: ''\n\t // },\n\t // title: {\n\t // foo: '',\n\t // bar: ''\n\t // }\n\t // }\n\t var icons = feature.getIcons ? feature.getIcons() : featureModel.get('icon');\n\t var titles = featureModel.get('title') || {};\n\t if (typeof icons === 'string') {\n\t var icon = icons;\n\t var title = titles;\n\t icons = {};\n\t titles = {};\n\t icons[featureName] = icon;\n\t titles[featureName] = title;\n\t }\n\t var iconPaths = featureModel.iconPaths = {};\n\t zrUtil.each(icons, function (icon, iconName) {\n\t var normalStyle = iconStyleModel.getModel('normal').getItemStyle();\n\t var hoverStyle = iconStyleModel.getModel('emphasis').getItemStyle();\n\t\n\t var style = {\n\t x: -itemSize / 2,\n\t y: -itemSize / 2,\n\t width: itemSize,\n\t height: itemSize\n\t };\n\t var path = icon.indexOf('image://') === 0\n\t ? (\n\t style.image = icon.slice(8),\n\t new graphic.Image({style: style})\n\t )\n\t : graphic.makePath(\n\t icon.replace('path://', ''),\n\t {\n\t style: normalStyle,\n\t hoverStyle: hoverStyle,\n\t rectHover: true\n\t },\n\t style,\n\t 'center'\n\t );\n\t\n\t graphic.setHoverStyle(path);\n\t\n\t if (toolboxModel.get('showTitle')) {\n\t path.__title = titles[iconName];\n\t path.on('mouseover', function () {\n\t // Should not reuse above hoverStyle, which might be modified.\n\t var hoverStyle = iconStyleModel.getModel('emphasis').getItemStyle();\n\t path.setStyle({\n\t text: titles[iconName],\n\t textPosition: hoverStyle.textPosition || 'bottom',\n\t textFill: hoverStyle.fill || hoverStyle.stroke || '#000',\n\t textAlign: hoverStyle.textAlign || 'center'\n\t });\n\t })\n\t .on('mouseout', function () {\n\t path.setStyle({\n\t textFill: null\n\t });\n\t });\n\t }\n\t path.trigger(featureModel.get('iconStatus.' + iconName) || 'normal');\n\t\n\t group.add(path);\n\t path.on('click', zrUtil.bind(\n\t feature.onclick, feature, ecModel, api, iconName\n\t ));\n\t\n\t iconPaths[iconName] = path;\n\t });\n\t }\n\t\n\t listComponentHelper.layout(group, toolboxModel, api);\n\t // Render background after group is layout\n\t // FIXME\n\t listComponentHelper.addBackground(group, toolboxModel);\n\t\n\t // Adjust icon title positions to avoid them out of screen\n\t group.eachChild(function (icon) {\n\t var titleText = icon.__title;\n\t var hoverStyle = icon.hoverStyle;\n\t // May be background element\n\t if (hoverStyle && titleText) {\n\t var rect = textContain.getBoundingRect(\n\t titleText, hoverStyle.font\n\t );\n\t var offsetX = icon.position[0] + group.position[0];\n\t var offsetY = icon.position[1] + group.position[1] + itemSize;\n\t\n\t var needPutOnTop = false;\n\t if (offsetY + rect.height > api.getHeight()) {\n\t hoverStyle.textPosition = 'top';\n\t needPutOnTop = true;\n\t }\n\t var topOffset = needPutOnTop ? (-5 - rect.height) : (itemSize + 8);\n\t if (offsetX + rect.width / 2 > api.getWidth()) {\n\t hoverStyle.textPosition = ['100%', topOffset];\n\t hoverStyle.textAlign = 'right';\n\t }\n\t else if (offsetX - rect.width / 2 < 0) {\n\t hoverStyle.textPosition = [0, topOffset];\n\t hoverStyle.textAlign = 'left';\n\t }\n\t }\n\t });\n\t },\n\t\n\t updateView: function (toolboxModel, ecModel, api, payload) {\n\t zrUtil.each(this._features, function (feature) {\n\t feature.updateView && feature.updateView(feature.model, ecModel, api, payload);\n\t });\n\t },\n\t\n\t updateLayout: function (toolboxModel, ecModel, api, payload) {\n\t zrUtil.each(this._features, function (feature) {\n\t feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload);\n\t });\n\t },\n\t\n\t remove: function (ecModel, api) {\n\t zrUtil.each(this._features, function (feature) {\n\t feature.remove && feature.remove(ecModel, api);\n\t });\n\t this.group.removeAll();\n\t },\n\t\n\t dispose: function (ecModel, api) {\n\t zrUtil.each(this._features, function (feature) {\n\t feature.dispose && feature.dispose(ecModel, api);\n\t });\n\t }\n\t });\n\t\n\t function isUserFeatureName(featureName) {\n\t return featureName.indexOf('my') === 0;\n\t }\n\t\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(248)))\n\n/***/ },\n/* 674 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var featureManager = __webpack_require__(55);\n\t var zrUtil = __webpack_require__(1);\n\t\n\t function Brush(model, ecModel, api) {\n\t this.model = model;\n\t this.ecModel = ecModel;\n\t this.api = api;\n\t\n\t /**\n\t * @private\n\t * @type {string}\n\t */\n\t this._brushType;\n\t\n\t /**\n\t * @private\n\t * @type {string}\n\t */\n\t this._brushMode;\n\t }\n\t\n\t Brush.defaultOption = {\n\t show: true,\n\t type: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],\n\t icon: {\n\t 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', // jshint ignore:line\n\t 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', // jshint ignore:line\n\t 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', // jshint ignore:line\n\t 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', // jshint ignore:line\n\t 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', // jshint ignore:line\n\t 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' // jshint ignore:line\n\t },\n\t title: {\n\t rect: '矩形选择',\n\t polygon: '圈选',\n\t lineX: '横向选择',\n\t lineY: '纵向选择',\n\t keep: '保持选择',\n\t clear: '清除选择'\n\t }\n\t };\n\t\n\t var proto = Brush.prototype;\n\t\n\t proto.render =\n\t proto.updateView =\n\t proto.updateLayout = function (featureModel, ecModel, api) {\n\t var brushType;\n\t var brushMode;\n\t var isBrushed;\n\t\n\t ecModel.eachComponent({mainType: 'brush'}, function (brushModel) {\n\t brushType = brushModel.brushType;\n\t brushMode = brushModel.brushOption.brushMode || 'single';\n\t isBrushed |= brushModel.areas.length;\n\t });\n\t this._brushType = brushType;\n\t this._brushMode = brushMode;\n\t\n\t zrUtil.each(featureModel.get('type', true), function (type) {\n\t featureModel.setIconStatus(\n\t type,\n\t (\n\t type === 'keep'\n\t ? brushMode === 'multiple'\n\t : type === 'clear'\n\t ? isBrushed\n\t : type === brushType\n\t ) ? 'emphasis' : 'normal'\n\t );\n\t });\n\t };\n\t\n\t proto.getIcons = function () {\n\t var model = this.model;\n\t var availableIcons = model.get('icon', true);\n\t var icons = {};\n\t zrUtil.each(model.get('type', true), function (type) {\n\t if (availableIcons[type]) {\n\t icons[type] = availableIcons[type];\n\t }\n\t });\n\t return icons;\n\t };\n\t\n\t proto.onclick = function (ecModel, api, type) {\n\t var api = this.api;\n\t var brushType = this._brushType;\n\t var brushMode = this._brushMode;\n\t\n\t if (type === 'clear') {\n\t api.dispatchAction({\n\t type: 'brush',\n\t // Clear all areas of all brush components.\n\t areas: []\n\t });\n\t }\n\t else {\n\t api.dispatchAction({\n\t type: 'takeGlobalCursor',\n\t key: 'brush',\n\t brushOption: {\n\t brushType: type === 'keep'\n\t ? brushType\n\t : (brushType === type ? false : type),\n\t brushMode: type === 'keep'\n\t ? (brushMode === 'multiple' ? 'single' : 'multiple')\n\t : brushMode\n\t }\n\t });\n\t }\n\t };\n\t\n\t featureManager.register('brush', Brush);\n\t\n\t module.exports = Brush;\n\n\n/***/ },\n/* 675 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @module echarts/component/toolbox/feature/DataView\n\t */\n\t\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var eventTool = __webpack_require__(80);\n\t\n\t\n\t var BLOCK_SPLITER = new Array(60).join('-');\n\t var ITEM_SPLITER = '\\t';\n\t /**\n\t * Group series into two types\n\t * 1. on category axis, like line, bar\n\t * 2. others, like scatter, pie\n\t * @param {module:echarts/model/Global} ecModel\n\t * @return {Object}\n\t * @inner\n\t */\n\t function groupSeries(ecModel) {\n\t var seriesGroupByCategoryAxis = {};\n\t var otherSeries = [];\n\t var meta = [];\n\t ecModel.eachRawSeries(function (seriesModel) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t\n\t if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) {\n\t var baseAxis = coordSys.getBaseAxis();\n\t if (baseAxis.type === 'category') {\n\t var key = baseAxis.dim + '_' + baseAxis.index;\n\t if (!seriesGroupByCategoryAxis[key]) {\n\t seriesGroupByCategoryAxis[key] = {\n\t categoryAxis: baseAxis,\n\t valueAxis: coordSys.getOtherAxis(baseAxis),\n\t series: []\n\t };\n\t meta.push({\n\t axisDim: baseAxis.dim,\n\t axisIndex: baseAxis.index\n\t });\n\t }\n\t seriesGroupByCategoryAxis[key].series.push(seriesModel);\n\t }\n\t else {\n\t otherSeries.push(seriesModel);\n\t }\n\t }\n\t else {\n\t otherSeries.push(seriesModel);\n\t }\n\t });\n\t\n\t return {\n\t seriesGroupByCategoryAxis: seriesGroupByCategoryAxis,\n\t other: otherSeries,\n\t meta: meta\n\t };\n\t }\n\t\n\t /**\n\t * Assemble content of series on cateogory axis\n\t * @param {Array.} series\n\t * @return {string}\n\t * @inner\n\t */\n\t function assembleSeriesWithCategoryAxis(series) {\n\t var tables = [];\n\t zrUtil.each(series, function (group, key) {\n\t var categoryAxis = group.categoryAxis;\n\t var valueAxis = group.valueAxis;\n\t var valueAxisDim = valueAxis.dim;\n\t\n\t var headers = [' '].concat(zrUtil.map(group.series, function (series) {\n\t return series.name;\n\t }));\n\t var columns = [categoryAxis.model.getCategories()];\n\t zrUtil.each(group.series, function (series) {\n\t columns.push(series.getRawData().mapArray(valueAxisDim, function (val) {\n\t return val;\n\t }));\n\t });\n\t // Assemble table content\n\t var lines = [headers.join(ITEM_SPLITER)];\n\t for (var i = 0; i < columns[0].length; i++) {\n\t var items = [];\n\t for (var j = 0; j < columns.length; j++) {\n\t items.push(columns[j][i]);\n\t }\n\t lines.push(items.join(ITEM_SPLITER));\n\t }\n\t tables.push(lines.join('\\n'));\n\t });\n\t return tables.join('\\n\\n' + BLOCK_SPLITER + '\\n\\n');\n\t }\n\t\n\t /**\n\t * Assemble content of other series\n\t * @param {Array.} series\n\t * @return {string}\n\t * @inner\n\t */\n\t function assembleOtherSeries(series) {\n\t return zrUtil.map(series, function (series) {\n\t var data = series.getRawData();\n\t var lines = [series.name];\n\t var vals = [];\n\t data.each(data.dimensions, function () {\n\t var argLen = arguments.length;\n\t var dataIndex = arguments[argLen - 1];\n\t var name = data.getName(dataIndex);\n\t for (var i = 0; i < argLen - 1; i++) {\n\t vals[i] = arguments[i];\n\t }\n\t lines.push((name ? (name + ITEM_SPLITER) : '') + vals.join(ITEM_SPLITER));\n\t });\n\t return lines.join('\\n');\n\t }).join('\\n\\n' + BLOCK_SPLITER + '\\n\\n');\n\t }\n\t\n\t /**\n\t * @param {module:echarts/model/Global}\n\t * @return {string}\n\t * @inner\n\t */\n\t function getContentFromModel(ecModel) {\n\t\n\t var result = groupSeries(ecModel);\n\t\n\t return {\n\t value: zrUtil.filter([\n\t assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis),\n\t assembleOtherSeries(result.other)\n\t ], function (str) {\n\t return str.replace(/[\\n\\t\\s]/g, '');\n\t }).join('\\n\\n' + BLOCK_SPLITER + '\\n\\n'),\n\t\n\t meta: result.meta\n\t };\n\t }\n\t\n\t\n\t function trim(str) {\n\t return str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t }\n\t /**\n\t * If a block is tsv format\n\t */\n\t function isTSVFormat(block) {\n\t // Simple method to find out if a block is tsv format\n\t var firstLine = block.slice(0, block.indexOf('\\n'));\n\t if (firstLine.indexOf(ITEM_SPLITER) >= 0) {\n\t return true;\n\t }\n\t }\n\t\n\t var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g');\n\t /**\n\t * @param {string} tsv\n\t * @return {Array.}\n\t */\n\t function parseTSVContents(tsv) {\n\t var tsvLines = tsv.split(/\\n+/g);\n\t var headers = trim(tsvLines.shift()).split(itemSplitRegex);\n\t\n\t var categories = [];\n\t var series = zrUtil.map(headers, function (header) {\n\t return {\n\t name: header,\n\t data: []\n\t };\n\t });\n\t for (var i = 0; i < tsvLines.length; i++) {\n\t var items = trim(tsvLines[i]).split(itemSplitRegex);\n\t categories.push(items.shift());\n\t for (var j = 0; j < items.length; j++) {\n\t series[j] && (series[j].data[i] = items[j]);\n\t }\n\t }\n\t return {\n\t series: series,\n\t categories: categories\n\t };\n\t }\n\t\n\t /**\n\t * @param {string} str\n\t * @return {Array.}\n\t * @inner\n\t */\n\t function parseListContents(str) {\n\t var lines = str.split(/\\n+/g);\n\t var seriesName = trim(lines.shift());\n\t\n\t var data = [];\n\t for (var i = 0; i < lines.length; i++) {\n\t var items = trim(lines[i]).split(itemSplitRegex);\n\t var name = '';\n\t var value;\n\t var hasName = false;\n\t if (isNaN(items[0])) { // First item is name\n\t hasName = true;\n\t name = items[0];\n\t items = items.slice(1);\n\t data[i] = {\n\t name: name,\n\t value: []\n\t };\n\t value = data[i].value;\n\t }\n\t else {\n\t value = data[i] = [];\n\t }\n\t for (var j = 0; j < items.length; j++) {\n\t value.push(+items[j]);\n\t }\n\t if (value.length === 1) {\n\t hasName ? (data[i].value = value[0]) : (data[i] = value[0]);\n\t }\n\t }\n\t\n\t return {\n\t name: seriesName,\n\t data: data\n\t };\n\t }\n\t\n\t /**\n\t * @param {string} str\n\t * @param {Array.} blockMetaList\n\t * @return {Object}\n\t * @inner\n\t */\n\t function parseContents(str, blockMetaList) {\n\t var blocks = str.split(new RegExp('\\n*' + BLOCK_SPLITER + '\\n*', 'g'));\n\t var newOption = {\n\t series: []\n\t };\n\t zrUtil.each(blocks, function (block, idx) {\n\t if (isTSVFormat(block)) {\n\t var result = parseTSVContents(block);\n\t var blockMeta = blockMetaList[idx];\n\t var axisKey = blockMeta.axisDim + 'Axis';\n\t\n\t if (blockMeta) {\n\t newOption[axisKey] = newOption[axisKey] || [];\n\t newOption[axisKey][blockMeta.axisIndex] = {\n\t data: result.categories\n\t };\n\t newOption.series = newOption.series.concat(result.series);\n\t }\n\t }\n\t else {\n\t var result = parseListContents(block);\n\t newOption.series.push(result);\n\t }\n\t });\n\t return newOption;\n\t }\n\t\n\t /**\n\t * @alias {module:echarts/component/toolbox/feature/DataView}\n\t * @constructor\n\t * @param {module:echarts/model/Model} model\n\t */\n\t function DataView(model) {\n\t\n\t this._dom = null;\n\t\n\t this.model = model;\n\t }\n\t\n\t DataView.defaultOption = {\n\t show: true,\n\t readOnly: false,\n\t optionToContent: null,\n\t contentToOption: null,\n\t\n\t 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',\n\t title: '数据视图',\n\t lang: ['数据视图', '关闭', '刷新'],\n\t backgroundColor: '#fff',\n\t textColor: '#000',\n\t textareaColor: '#fff',\n\t textareaBorderColor: '#333',\n\t buttonColor: '#c23531',\n\t buttonTextColor: '#fff'\n\t };\n\t\n\t DataView.prototype.onclick = function (ecModel, api) {\n\t var container = api.getDom();\n\t var model = this.model;\n\t if (this._dom) {\n\t container.removeChild(this._dom);\n\t }\n\t var root = document.createElement('div');\n\t root.style.cssText = 'position:absolute;left:5px;top:5px;bottom:5px;right:5px;';\n\t root.style.backgroundColor = model.get('backgroundColor') || '#fff';\n\t\n\t // Create elements\n\t var header = document.createElement('h4');\n\t var lang = model.get('lang') || [];\n\t header.innerHTML = lang[0] || model.get('title');\n\t header.style.cssText = 'margin: 10px 20px;';\n\t header.style.color = model.get('textColor');\n\t\n\t var viewMain = document.createElement('div');\n\t var textarea = document.createElement('textarea');\n\t viewMain.style.cssText = 'display:block;width:100%;overflow:hidden;';\n\t\n\t var optionToContent = model.get('optionToContent');\n\t var contentToOption = model.get('contentToOption');\n\t var result = getContentFromModel(ecModel);\n\t if (typeof optionToContent === 'function') {\n\t var htmlOrDom = optionToContent(api.getOption());\n\t if (typeof htmlOrDom === 'string') {\n\t viewMain.innerHTML = htmlOrDom;\n\t }\n\t else if (zrUtil.isDom(htmlOrDom)) {\n\t viewMain.appendChild(htmlOrDom);\n\t }\n\t }\n\t else {\n\t // Use default textarea\n\t viewMain.appendChild(textarea);\n\t textarea.readOnly = model.get('readOnly');\n\t textarea.style.cssText = 'width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;';\n\t textarea.style.color = model.get('textColor');\n\t textarea.style.borderColor = model.get('textareaBorderColor');\n\t textarea.style.backgroundColor = model.get('textareaColor');\n\t textarea.value = result.value;\n\t }\n\t\n\t var blockMetaList = result.meta;\n\t\n\t var buttonContainer = document.createElement('div');\n\t buttonContainer.style.cssText = 'position:absolute;bottom:0;left:0;right:0;';\n\t\n\t var buttonStyle = 'float:right;margin-right:20px;border:none;'\n\t + 'cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px';\n\t var closeButton = document.createElement('div');\n\t var refreshButton = document.createElement('div');\n\t\n\t buttonStyle += ';background-color:' + model.get('buttonColor');\n\t buttonStyle += ';color:' + model.get('buttonTextColor');\n\t\n\t var self = this;\n\t\n\t function close() {\n\t container.removeChild(root);\n\t self._dom = null;\n\t }\n\t eventTool.addEventListener(closeButton, 'click', close);\n\t\n\t eventTool.addEventListener(refreshButton, 'click', function () {\n\t var newOption;\n\t try {\n\t if (typeof contentToOption === 'function') {\n\t newOption = contentToOption(viewMain, api.getOption());\n\t }\n\t else {\n\t newOption = parseContents(textarea.value, blockMetaList);\n\t }\n\t }\n\t catch (e) {\n\t close();\n\t throw new Error('Data view format error ' + e);\n\t }\n\t if (newOption) {\n\t api.dispatchAction({\n\t type: 'changeDataView',\n\t newOption: newOption\n\t });\n\t }\n\t\n\t close();\n\t });\n\t\n\t closeButton.innerHTML = lang[1];\n\t refreshButton.innerHTML = lang[2];\n\t refreshButton.style.cssText = buttonStyle;\n\t closeButton.style.cssText = buttonStyle;\n\t\n\t !model.get('readOnly') && buttonContainer.appendChild(refreshButton);\n\t buttonContainer.appendChild(closeButton);\n\t\n\t // http://stackoverflow.com/questions/6637341/use-tab-to-indent-in-textarea\n\t eventTool.addEventListener(textarea, 'keydown', function (e) {\n\t if ((e.keyCode || e.which) === 9) {\n\t // get caret position/selection\n\t var val = this.value;\n\t var start = this.selectionStart;\n\t var end = this.selectionEnd;\n\t\n\t // set textarea value to: text before caret + tab + text after caret\n\t this.value = val.substring(0, start) + ITEM_SPLITER + val.substring(end);\n\t\n\t // put caret at right position again\n\t this.selectionStart = this.selectionEnd = start + 1;\n\t\n\t // prevent the focus lose\n\t eventTool.stop(e);\n\t }\n\t });\n\t\n\t root.appendChild(header);\n\t root.appendChild(viewMain);\n\t root.appendChild(buttonContainer);\n\t\n\t viewMain.style.height = (container.clientHeight - 80) + 'px';\n\t\n\t container.appendChild(root);\n\t this._dom = root;\n\t };\n\t\n\t DataView.prototype.remove = function (ecModel, api) {\n\t this._dom && api.getDom().removeChild(this._dom);\n\t };\n\t\n\t DataView.prototype.dispose = function (ecModel, api) {\n\t this.remove(ecModel, api);\n\t };\n\t\n\t /**\n\t * @inner\n\t */\n\t function tryMergeDataOption(newData, originalData) {\n\t return zrUtil.map(newData, function (newVal, idx) {\n\t var original = originalData && originalData[idx];\n\t if (zrUtil.isObject(original) && !zrUtil.isArray(original)) {\n\t if (zrUtil.isObject(newVal) && !zrUtil.isArray(newVal)) {\n\t newVal = newVal.value;\n\t }\n\t // Original data has option\n\t return zrUtil.defaults({\n\t value: newVal\n\t }, original);\n\t }\n\t else {\n\t return newVal;\n\t }\n\t });\n\t }\n\t\n\t __webpack_require__(55).register('dataView', DataView);\n\t\n\t __webpack_require__(3).registerAction({\n\t type: 'changeDataView',\n\t event: 'dataViewChanged',\n\t update: 'prepareAndUpdate'\n\t }, function (payload, ecModel) {\n\t var newSeriesOptList = [];\n\t zrUtil.each(payload.newOption.series, function (seriesOpt) {\n\t var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0];\n\t if (!seriesModel) {\n\t // New created series\n\t // Geuss the series type\n\t newSeriesOptList.push(zrUtil.extend({\n\t // Default is scatter\n\t type: 'scatter'\n\t }, seriesOpt));\n\t }\n\t else {\n\t var originalData = seriesModel.get('data');\n\t newSeriesOptList.push({\n\t name: seriesOpt.name,\n\t data: tryMergeDataOption(seriesOpt.data, originalData)\n\t });\n\t }\n\t });\n\t\n\t ecModel.mergeOption(zrUtil.defaults({\n\t series: newSeriesOptList\n\t }, payload.newOption));\n\t });\n\t\n\t module.exports = DataView;\n\n\n/***/ },\n/* 676 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var BrushController = __webpack_require__(152);\n\t var brushHelper = __webpack_require__(153);\n\t var history = __webpack_require__(220);\n\t\n\t var each = zrUtil.each;\n\t\n\t // Use dataZoomSelect\n\t __webpack_require__(629);\n\t\n\t // Spectial component id start with \\0ec\\0, see echarts/model/Global.js~hasInnerId\n\t var DATA_ZOOM_ID_BASE = '\\0_ec_\\0toolbox-dataZoom_';\n\t\n\t function DataZoom(model, ecModel, api) {\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/component/helper/BrushController}\n\t */\n\t (this._brushController = new BrushController(api.getZr()))\n\t .on('brush', zrUtil.bind(this._onBrush, this))\n\t .mount();\n\t\n\t /**\n\t * @private\n\t * @type {boolean}\n\t */\n\t this._isZoomActive;\n\t }\n\t\n\t DataZoom.defaultOption = {\n\t show: true,\n\t // Icon group\n\t icon: {\n\t zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1',\n\t back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26'\n\t },\n\t title: {\n\t zoom: '区域缩放',\n\t back: '区域缩放还原'\n\t }\n\t };\n\t\n\t var proto = DataZoom.prototype;\n\t\n\t proto.render = function (featureModel, ecModel, api, payload) {\n\t this.model = featureModel;\n\t this.ecModel = ecModel;\n\t this.api = api;\n\t\n\t updateZoomBtnStatus(featureModel, ecModel, this, payload);\n\t updateBackBtnStatus(featureModel, ecModel);\n\t };\n\t\n\t proto.onclick = function (ecModel, api, type) {\n\t handlers[type].call(this);\n\t };\n\t\n\t proto.remove = function (ecModel, api) {\n\t this._brushController.unmount();\n\t };\n\t\n\t proto.dispose = function (ecModel, api) {\n\t this._brushController.dispose();\n\t };\n\t\n\t /**\n\t * @private\n\t */\n\t var handlers = {\n\t\n\t zoom: function () {\n\t var nextActive = !this._isZoomActive;\n\t\n\t this.api.dispatchAction({\n\t type: 'takeGlobalCursor',\n\t key: 'dataZoomSelect',\n\t dataZoomSelectActive: nextActive\n\t });\n\t },\n\t\n\t back: function () {\n\t this._dispatchZoomAction(history.pop(this.ecModel));\n\t }\n\t };\n\t\n\t /**\n\t * @private\n\t */\n\t proto._onBrush = function (areas, opt) {\n\t if (!opt.isEnd || !areas.length) {\n\t return;\n\t }\n\t var snapshot = {};\n\t var ecModel = this.ecModel;\n\t\n\t this._brushController.updateCovers([]); // remove cover\n\t\n\t var coordInfoList = brushHelper.makeCoordInfoList(\n\t retrieveAxisSetting(this.model.option), ecModel\n\t );\n\t var rangesCoordInfoList = [];\n\t brushHelper.parseOutputRanges(areas, coordInfoList, ecModel, rangesCoordInfoList);\n\t\n\t var area = areas[0]; // dataZoom can not multiple area.\n\t var coordInfo = rangesCoordInfoList[0];\n\t var coordRange = area.coordRange;\n\t var brushType = area.brushType;\n\t\n\t if (coordInfo && coordRange) {\n\t if (brushType === 'rect') {\n\t setBatch('xAxis', coordRange[0], coordInfo);\n\t setBatch('yAxis', coordRange[1], coordInfo);\n\t }\n\t else {\n\t var axisNames = {lineX: 'xAxis', lineY: 'yAxis'};\n\t setBatch(axisNames[brushType], coordRange, coordInfo);\n\t }\n\t }\n\t\n\t history.push(ecModel, snapshot);\n\t\n\t this._dispatchZoomAction(snapshot);\n\t\n\t function setBatch(axisName, minMax, coordInfo) {\n\t var dataZoomModel = findDataZoom(axisName, coordInfo[axisName], ecModel);\n\t if (dataZoomModel) {\n\t snapshot[dataZoomModel.id] = {\n\t dataZoomId: dataZoomModel.id,\n\t startValue: minMax[0],\n\t endValue: minMax[1]\n\t };\n\t }\n\t }\n\t\n\t function findDataZoom(axisName, axisModel, ecModel) {\n\t var dataZoomModel;\n\t ecModel.eachComponent(\n\t {mainType: 'dataZoom', subType: 'select'},\n\t function (dzModel, dataZoomIndex) {\n\t var axisIndex = dzModel.get(axisName + 'Index');\n\t if (axisIndex != null\n\t && ecModel.getComponent(axisName, axisIndex) === axisModel\n\t ) {\n\t dataZoomModel = dzModel;\n\t }\n\t }\n\t );\n\t return dataZoomModel;\n\t }\n\t };\n\t\n\t /**\n\t * @private\n\t */\n\t proto._dispatchZoomAction = function (snapshot) {\n\t var batch = [];\n\t\n\t // Convert from hash map to array.\n\t each(snapshot, function (batchItem, dataZoomId) {\n\t batch.push(zrUtil.clone(batchItem));\n\t });\n\t\n\t batch.length && this.api.dispatchAction({\n\t type: 'dataZoom',\n\t from: this.uid,\n\t batch: batch\n\t });\n\t };\n\t\n\t function retrieveAxisSetting(option) {\n\t var setting = {};\n\t // Compatible with previous setting: null => all axis, false => no axis.\n\t zrUtil.each(['xAxisIndex', 'yAxisIndex'], function (name) {\n\t setting[name] = option[name];\n\t setting[name] == null && (setting[name] = 'all');\n\t (setting[name] === false || setting[name] === 'none') && (setting[name] = []);\n\t });\n\t return setting;\n\t }\n\t\n\t function updateBackBtnStatus(featureModel, ecModel) {\n\t featureModel.setIconStatus(\n\t 'back',\n\t history.count(ecModel) > 1 ? 'emphasis' : 'normal'\n\t );\n\t }\n\t\n\t function updateZoomBtnStatus(featureModel, ecModel, view, payload) {\n\t var zoomActive = view._isZoomActive;\n\t\n\t if (payload && payload.type === 'takeGlobalCursor') {\n\t zoomActive = payload.key === 'dataZoomSelect'\n\t ? payload.dataZoomSelectActive : false;\n\t }\n\t\n\t view._isZoomActive = zoomActive;\n\t\n\t featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal');\n\t\n\t var coordInfoList = brushHelper.makeCoordInfoList(\n\t retrieveAxisSetting(featureModel.option), ecModel\n\t );\n\t var brushType = (coordInfoList.xAxisHas && !coordInfoList.yAxisHas)\n\t ? 'lineX'\n\t : (!coordInfoList.xAxisHas && coordInfoList.yAxisHas)\n\t ? 'lineY'\n\t : 'rect';\n\t\n\t view._brushController\n\t .setPanels(brushHelper.makePanelOpts(coordInfoList))\n\t .enableBrush(\n\t zoomActive\n\t ? {\n\t brushType: brushType,\n\t brushStyle: { // FIXME user customized?\n\t lineWidth: 0,\n\t // stroke: '#333',\n\t fill: 'rgba(0,0,0,0.2)'\n\t }\n\t }\n\t : false\n\t );\n\t }\n\t\n\t\n\t __webpack_require__(55).register('dataZoom', DataZoom);\n\t\n\t\n\t // Create special dataZoom option for select\n\t __webpack_require__(3).registerPreprocessor(function (option) {\n\t if (!option) {\n\t return;\n\t }\n\t\n\t var dataZoomOpts = option.dataZoom || (option.dataZoom = []);\n\t if (!zrUtil.isArray(dataZoomOpts)) {\n\t option.dataZoom = dataZoomOpts = [dataZoomOpts];\n\t }\n\t\n\t var toolboxOpt = option.toolbox;\n\t if (toolboxOpt) {\n\t // Assume there is only one toolbox\n\t if (zrUtil.isArray(toolboxOpt)) {\n\t toolboxOpt = toolboxOpt[0];\n\t }\n\t\n\t if (toolboxOpt && toolboxOpt.feature) {\n\t var dataZoomOpt = toolboxOpt.feature.dataZoom;\n\t addForAxis('xAxis', dataZoomOpt);\n\t addForAxis('yAxis', dataZoomOpt);\n\t }\n\t }\n\t\n\t function addForAxis(axisName, dataZoomOpt) {\n\t if (!dataZoomOpt) {\n\t return;\n\t }\n\t\n\t // Try not to modify model, because it is not merged yet.\n\t var axisIndicesName = axisName + 'Index';\n\t var givenAxisIndices = dataZoomOpt[axisIndicesName];\n\t if (givenAxisIndices != null\n\t && givenAxisIndices != 'all'\n\t && !zrUtil.isArray(givenAxisIndices)\n\t ) {\n\t givenAxisIndices = (givenAxisIndices === false || givenAxisIndices === 'none') ? [] : [givenAxisIndices];\n\t }\n\t\n\t forEachComponent(axisName, function (axisOpt, axisIndex) {\n\t if (givenAxisIndices != null\n\t && givenAxisIndices != 'all'\n\t && zrUtil.indexOf(givenAxisIndices, axisIndex) === -1\n\t ) {\n\t return;\n\t }\n\t var newOpt = {\n\t type: 'select',\n\t $fromToolbox: true,\n\t // Id for merge mapping.\n\t id: DATA_ZOOM_ID_BASE + axisName + axisIndex\n\t };\n\t // FIXME\n\t // Only support one axis now.\n\t newOpt[axisIndicesName] = axisIndex;\n\t dataZoomOpts.push(newOpt);\n\t });\n\t }\n\t\n\t function forEachComponent(mainType, cb) {\n\t var opts = option[mainType];\n\t if (!zrUtil.isArray(opts)) {\n\t opts = opts ? [opts] : [];\n\t }\n\t each(opts, cb);\n\t }\n\t });\n\t\n\t module.exports = DataZoom;\n\n\n/***/ },\n/* 677 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t function MagicType(model) {\n\t this.model = model;\n\t }\n\t\n\t MagicType.defaultOption = {\n\t show: true,\n\t type: [],\n\t // Icon group\n\t icon: {\n\t line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4',\n\t bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7',\n\t 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', // jshint ignore:line\n\t tiled: 'M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z'\n\t },\n\t title: {\n\t line: '切换为折线图',\n\t bar: '切换为柱状图',\n\t stack: '切换为堆叠',\n\t tiled: '切换为平铺'\n\t },\n\t option: {},\n\t seriesIndex: {}\n\t };\n\t\n\t var proto = MagicType.prototype;\n\t\n\t proto.getIcons = function () {\n\t var model = this.model;\n\t var availableIcons = model.get('icon');\n\t var icons = {};\n\t zrUtil.each(model.get('type'), function (type) {\n\t if (availableIcons[type]) {\n\t icons[type] = availableIcons[type];\n\t }\n\t });\n\t return icons;\n\t };\n\t\n\t var seriesOptGenreator = {\n\t 'line': function (seriesType, seriesId, seriesModel, model) {\n\t if (seriesType === 'bar') {\n\t return zrUtil.merge({\n\t id: seriesId,\n\t type: 'line',\n\t // Preserve data related option\n\t data: seriesModel.get('data'),\n\t stack: seriesModel.get('stack'),\n\t markPoint: seriesModel.get('markPoint'),\n\t markLine: seriesModel.get('markLine')\n\t }, model.get('option.line') || {}, true);\n\t }\n\t },\n\t 'bar': function (seriesType, seriesId, seriesModel, model) {\n\t if (seriesType === 'line') {\n\t return zrUtil.merge({\n\t id: seriesId,\n\t type: 'bar',\n\t // Preserve data related option\n\t data: seriesModel.get('data'),\n\t stack: seriesModel.get('stack'),\n\t markPoint: seriesModel.get('markPoint'),\n\t markLine: seriesModel.get('markLine')\n\t }, model.get('option.bar') || {}, true);\n\t }\n\t },\n\t 'stack': function (seriesType, seriesId, seriesModel, model) {\n\t if (seriesType === 'line' || seriesType === 'bar') {\n\t return zrUtil.merge({\n\t id: seriesId,\n\t stack: '__ec_magicType_stack__'\n\t }, model.get('option.stack') || {}, true);\n\t }\n\t },\n\t 'tiled': function (seriesType, seriesId, seriesModel, model) {\n\t if (seriesType === 'line' || seriesType === 'bar') {\n\t return zrUtil.merge({\n\t id: seriesId,\n\t stack: ''\n\t }, model.get('option.tiled') || {}, true);\n\t }\n\t }\n\t };\n\t\n\t var radioTypes = [\n\t ['line', 'bar'],\n\t ['stack', 'tiled']\n\t ];\n\t\n\t proto.onclick = function (ecModel, api, type) {\n\t var model = this.model;\n\t var seriesIndex = model.get('seriesIndex.' + type);\n\t // Not supported magicType\n\t if (!seriesOptGenreator[type]) {\n\t return;\n\t }\n\t var newOption = {\n\t series: []\n\t };\n\t var generateNewSeriesTypes = function (seriesModel) {\n\t var seriesType = seriesModel.subType;\n\t var seriesId = seriesModel.id;\n\t var newSeriesOpt = seriesOptGenreator[type](\n\t seriesType, seriesId, seriesModel, model\n\t );\n\t if (newSeriesOpt) {\n\t // PENDING If merge original option?\n\t zrUtil.defaults(newSeriesOpt, seriesModel.option);\n\t newOption.series.push(newSeriesOpt);\n\t }\n\t // Modify boundaryGap\n\t var coordSys = seriesModel.coordinateSystem;\n\t if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) {\n\t var categoryAxis = coordSys.getAxesByScale('ordinal')[0];\n\t if (categoryAxis) {\n\t var axisDim = categoryAxis.dim;\n\t var axisType = axisDim + 'Axis';\n\t var axisModel = ecModel.queryComponents({\n\t mainType: axisType,\n\t index: seriesModel.get(name + 'Index'),\n\t id: seriesModel.get(name + 'Id')\n\t })[0];\n\t var axisIndex = axisModel.componentIndex;\n\t\n\t newOption[axisType] = newOption[axisType] || [];\n\t for (var i = 0; i <= axisIndex; i++) {\n\t newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {};\n\t }\n\t newOption[axisType][axisIndex].boundaryGap = type === 'bar' ? true : false;\n\t }\n\t }\n\t };\n\t\n\t zrUtil.each(radioTypes, function (radio) {\n\t if (zrUtil.indexOf(radio, type) >= 0) {\n\t zrUtil.each(radio, function (item) {\n\t model.setIconStatus(item, 'normal');\n\t });\n\t }\n\t });\n\t\n\t model.setIconStatus(type, 'emphasis');\n\t\n\t ecModel.eachComponent(\n\t {\n\t mainType: 'series',\n\t query: seriesIndex == null ? null : {\n\t seriesIndex: seriesIndex\n\t }\n\t }, generateNewSeriesTypes\n\t );\n\t api.dispatchAction({\n\t type: 'changeMagicType',\n\t currentType: type,\n\t newOption: newOption\n\t });\n\t };\n\t\n\t var echarts = __webpack_require__(3);\n\t echarts.registerAction({\n\t type: 'changeMagicType',\n\t event: 'magicTypeChanged',\n\t update: 'prepareAndUpdate'\n\t }, function (payload, ecModel) {\n\t ecModel.mergeOption(payload.newOption);\n\t });\n\t\n\t __webpack_require__(55).register('magicType', MagicType);\n\t\n\t module.exports = MagicType;\n\n\n/***/ },\n/* 678 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\t var history = __webpack_require__(220);\n\t\n\t function Restore(model) {\n\t this.model = model;\n\t }\n\t\n\t Restore.defaultOption = {\n\t show: true,\n\t 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',\n\t title: '还原'\n\t };\n\t\n\t var proto = Restore.prototype;\n\t\n\t proto.onclick = function (ecModel, api, type) {\n\t history.clear(ecModel);\n\t\n\t api.dispatchAction({\n\t type: 'restore',\n\t from: this.uid\n\t });\n\t };\n\t\n\t\n\t __webpack_require__(55).register('restore', Restore);\n\t\n\t\n\t __webpack_require__(3).registerAction(\n\t {type: 'restore', event: 'restore', update: 'prepareAndUpdate'},\n\t function (payload, ecModel) {\n\t ecModel.resetOption('recreate');\n\t }\n\t );\n\t\n\t module.exports = Restore;\n\n\n/***/ },\n/* 679 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var env = __webpack_require__(28);\n\t\n\t function SaveAsImage (model) {\n\t this.model = model;\n\t }\n\t\n\t SaveAsImage.defaultOption = {\n\t show: true,\n\t 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',\n\t title: '保存为图片',\n\t type: 'png',\n\t // Default use option.backgroundColor\n\t // backgroundColor: '#fff',\n\t name: '',\n\t excludeComponents: ['toolbox'],\n\t pixelRatio: 1,\n\t lang: ['右键另存为图片']\n\t };\n\t\n\t SaveAsImage.prototype.unusable = !env.canvasSupported;\n\t\n\t var proto = SaveAsImage.prototype;\n\t\n\t proto.onclick = function (ecModel, api) {\n\t var model = this.model;\n\t var title = model.get('name') || ecModel.get('title.0.text') || 'echarts';\n\t var $a = document.createElement('a');\n\t var type = model.get('type', true) || 'png';\n\t $a.download = title + '.' + type;\n\t $a.target = '_blank';\n\t var url = api.getConnectedDataURL({\n\t type: type,\n\t backgroundColor: model.get('backgroundColor', true)\n\t || ecModel.get('backgroundColor') || '#fff',\n\t excludeComponents: model.get('excludeComponents'),\n\t pixelRatio: model.get('pixelRatio')\n\t });\n\t $a.href = url;\n\t // Chrome and Firefox\n\t if (typeof MouseEvent === 'function' && !env.browser.ie && !env.browser.edge) {\n\t var evt = new MouseEvent('click', {\n\t view: window,\n\t bubbles: true,\n\t cancelable: false\n\t });\n\t $a.dispatchEvent(evt);\n\t }\n\t // IE\n\t else {\n\t var lang = model.get('lang');\n\t var html = ''\n\t + ''\n\t + ' '\n\t + '';\n\t var tab = window.open();\n\t tab.document.write(html);\n\t }\n\t };\n\t\n\t __webpack_require__(55).register(\n\t 'saveAsImage', SaveAsImage\n\t );\n\t\n\t module.exports = SaveAsImage;\n\n\n/***/ },\n/* 680 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// FIXME Better way to pack data in graphic element\n\t\n\t\n\t __webpack_require__(682);\n\t\n\t __webpack_require__(683);\n\t\n\t // Show tip action\n\t /**\n\t * @action\n\t * @property {string} type\n\t * @property {number} seriesIndex\n\t * @property {number} dataIndex\n\t * @property {number} [x]\n\t * @property {number} [y]\n\t */\n\t __webpack_require__(3).registerAction(\n\t {\n\t type: 'showTip',\n\t event: 'showTip',\n\t update: 'none'\n\t },\n\t // noop\n\t function () {}\n\t );\n\t // Hide tip action\n\t __webpack_require__(3).registerAction(\n\t {\n\t type: 'hideTip',\n\t event: 'hideTip',\n\t update: 'none'\n\t },\n\t // noop\n\t function () {}\n\t );\n\n\n/***/ },\n/* 681 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @module echarts/component/tooltip/TooltipContent\n\t */\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var zrColor = __webpack_require__(51);\n\t var eventUtil = __webpack_require__(80);\n\t var formatUtil = __webpack_require__(18);\n\t var each = zrUtil.each;\n\t var toCamelCase = formatUtil.toCamelCase;\n\t var env = __webpack_require__(28);\n\t\n\t var vendors = ['', '-webkit-', '-moz-', '-o-'];\n\t\n\t var gCssText = 'position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;';\n\t\n\t /**\n\t * @param {number} duration\n\t * @return {string}\n\t * @inner\n\t */\n\t function assembleTransition(duration) {\n\t var transitionCurve = 'cubic-bezier(0.23, 1, 0.32, 1)';\n\t var transitionText = 'left ' + duration + 's ' + transitionCurve + ','\n\t + 'top ' + duration + 's ' + transitionCurve;\n\t return zrUtil.map(vendors, function (vendorPrefix) {\n\t return vendorPrefix + 'transition:' + transitionText;\n\t }).join(';');\n\t }\n\t\n\t /**\n\t * @param {Object} textStyle\n\t * @return {string}\n\t * @inner\n\t */\n\t function assembleFont(textStyleModel) {\n\t var cssText = [];\n\t\n\t var fontSize = textStyleModel.get('fontSize');\n\t var color = textStyleModel.getTextColor();\n\t\n\t color && cssText.push('color:' + color);\n\t\n\t cssText.push('font:' + textStyleModel.getFont());\n\t\n\t fontSize &&\n\t cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px');\n\t\n\t each(['decoration', 'align'], function (name) {\n\t var val = textStyleModel.get(name);\n\t val && cssText.push('text-' + name + ':' + val);\n\t });\n\t\n\t return cssText.join(';');\n\t }\n\t\n\t /**\n\t * @param {Object} tooltipModel\n\t * @return {string}\n\t * @inner\n\t */\n\t function assembleCssText(tooltipModel) {\n\t\n\t tooltipModel = tooltipModel;\n\t\n\t var cssText = [];\n\t\n\t var transitionDuration = tooltipModel.get('transitionDuration');\n\t var backgroundColor = tooltipModel.get('backgroundColor');\n\t var textStyleModel = tooltipModel.getModel('textStyle');\n\t var padding = tooltipModel.get('padding');\n\t\n\t // Animation transition\n\t transitionDuration &&\n\t cssText.push(assembleTransition(transitionDuration));\n\t\n\t if (backgroundColor) {\n\t if (env.canvasSupported) {\n\t cssText.push('background-Color:' + backgroundColor);\n\t }\n\t else {\n\t // for ie\n\t cssText.push(\n\t 'background-Color:#' + zrColor.toHex(backgroundColor)\n\t );\n\t cssText.push('filter:alpha(opacity=70)');\n\t }\n\t }\n\t\n\t // Border style\n\t each(['width', 'color', 'radius'], function (name) {\n\t var borderName = 'border-' + name;\n\t var camelCase = toCamelCase(borderName);\n\t var val = tooltipModel.get(camelCase);\n\t val != null &&\n\t cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px'));\n\t });\n\t\n\t // Text style\n\t cssText.push(assembleFont(textStyleModel));\n\t\n\t // Padding\n\t if (padding != null) {\n\t cssText.push('padding:' + formatUtil.normalizeCssArray(padding).join('px ') + 'px');\n\t }\n\t\n\t return cssText.join(';') + ';';\n\t }\n\t\n\t /**\n\t * @alias module:echarts/component/tooltip/TooltipContent\n\t * @constructor\n\t */\n\t function TooltipContent(container, api) {\n\t var el = document.createElement('div');\n\t var zr = api.getZr();\n\t\n\t this.el = el;\n\t\n\t this._x = api.getWidth() / 2;\n\t this._y = api.getHeight() / 2;\n\t\n\t container.appendChild(el);\n\t\n\t this._container = container;\n\t\n\t this._show = false;\n\t\n\t /**\n\t * @private\n\t */\n\t this._hideTimeout;\n\t\n\t var self = this;\n\t el.onmouseenter = function () {\n\t // clear the timeout in hideLater and keep showing tooltip\n\t if (self.enterable) {\n\t clearTimeout(self._hideTimeout);\n\t self._show = true;\n\t }\n\t self._inContent = true;\n\t };\n\t el.onmousemove = function (e) {\n\t e = e || window.event;\n\t if (!self.enterable) {\n\t // Try trigger zrender event to avoid mouse\n\t // in and out shape too frequently\n\t var handler = zr.handler;\n\t eventUtil.normalizeEvent(container, e, true);\n\t handler.dispatch('mousemove', e);\n\t }\n\t };\n\t el.onmouseleave = function () {\n\t if (self.enterable) {\n\t if (self._show) {\n\t self.hideLater(self._hideDelay);\n\t }\n\t }\n\t self._inContent = false;\n\t };\n\t }\n\t\n\t TooltipContent.prototype = {\n\t\n\t constructor: TooltipContent,\n\t\n\t enterable: true,\n\t\n\t /**\n\t * Update when tooltip is rendered\n\t */\n\t update: function () {\n\t var container = this._container;\n\t var stl = container.currentStyle\n\t || document.defaultView.getComputedStyle(container);\n\t var domStyle = container.style;\n\t if (domStyle.position !== 'absolute' && stl.position !== 'absolute') {\n\t domStyle.position = 'relative';\n\t }\n\t // Hide the tooltip\n\t // PENDING\n\t // this.hide();\n\t },\n\t\n\t show: function (tooltipModel) {\n\t clearTimeout(this._hideTimeout);\n\t var el = this.el;\n\t\n\t el.style.cssText = gCssText + assembleCssText(tooltipModel)\n\t // http://stackoverflow.com/questions/21125587/css3-transition-not-working-in-chrome-anymore\n\t + ';left:' + this._x + 'px;top:' + this._y + 'px;'\n\t + (tooltipModel.get('extraCssText') || '');\n\t\n\t el.style.display = el.innerHTML ? 'block' : 'none';\n\t\n\t this._show = true;\n\t },\n\t\n\t setContent: function (content) {\n\t var el = this.el;\n\t el.innerHTML = content;\n\t el.style.display = content ? 'block' : 'none';\n\t },\n\t\n\t moveTo: function (x, y) {\n\t var style = this.el.style;\n\t style.left = x + 'px';\n\t style.top = y + 'px';\n\t\n\t this._x = x;\n\t this._y = y;\n\t },\n\t\n\t hide: function () {\n\t this.el.style.display = 'none';\n\t this._show = false;\n\t },\n\t\n\t // showLater: function ()\n\t\n\t hideLater: function (time) {\n\t if (this._show && !(this._inContent && this.enterable)) {\n\t if (time) {\n\t this._hideDelay = time;\n\t // Set show false to avoid invoke hideLater mutiple times\n\t this._show = false;\n\t this._hideTimeout = setTimeout(zrUtil.bind(this.hide, this), time);\n\t }\n\t else {\n\t this.hide();\n\t }\n\t }\n\t },\n\t\n\t isShow: function () {\n\t return this._show;\n\t }\n\t };\n\t\n\t module.exports = TooltipContent;\n\n\n/***/ },\n/* 682 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t __webpack_require__(3).extendComponentModel({\n\t\n\t type: 'tooltip',\n\t\n\t defaultOption: {\n\t zlevel: 0,\n\t\n\t z: 8,\n\t\n\t show: true,\n\t\n\t // tooltip主体内容\n\t showContent: true,\n\t\n\t // 触发类型,默认数据触发,见下图,可选为:'item' ¦ 'axis'\n\t trigger: 'item',\n\t\n\t // 触发条件,支持 'click' | 'mousemove' | 'none'\n\t triggerOn: 'mousemove',\n\t\n\t // 是否永远显示 content\n\t alwaysShowContent: false,\n\t\n\t // 位置 {Array} | {Function}\n\t // position: null\n\t\n\t // 是否约束 content 在 viewRect 中。默认 false 是为了兼容以前版本。\n\t confine: false,\n\t\n\t // 内容格式器:{string}(Template) ¦ {Function}\n\t // formatter: null\n\t\n\t showDelay: 0,\n\t\n\t // 隐藏延迟,单位ms\n\t hideDelay: 100,\n\t\n\t // 动画变换时间,单位s\n\t transitionDuration: 0.4,\n\t\n\t enterable: false,\n\t\n\t // 提示背景颜色,默认为透明度为0.7的黑色\n\t backgroundColor: 'rgba(50,50,50,0.7)',\n\t\n\t // 提示边框颜色\n\t borderColor: '#333',\n\t\n\t // 提示边框圆角,单位px,默认为4\n\t borderRadius: 4,\n\t\n\t // 提示边框线宽,单位px,默认为0(无边框)\n\t borderWidth: 0,\n\t\n\t // 提示内边距,单位px,默认各方向内边距为5,\n\t // 接受数组分别设定上右下左边距,同css\n\t padding: 5,\n\t\n\t // Extra css text\n\t extraCssText: '',\n\t\n\t // 坐标轴指示器,坐标轴触发有效\n\t axisPointer: {\n\t // 默认为直线\n\t // 可选为:'line' | 'shadow' | 'cross'\n\t type: 'line',\n\t\n\t // type 为 line 的时候有效,指定 tooltip line 所在的轴,可选\n\t // 可选 'x' | 'y' | 'angle' | 'radius' | 'auto'\n\t // 默认 'auto',会选择类型为 cateogry 的轴,对于双数值轴,笛卡尔坐标系会默认选择 x 轴\n\t // 极坐标系会默认选择 angle 轴\n\t axis: 'auto',\n\t\n\t animation: true,\n\t animationDurationUpdate: 200,\n\t animationEasingUpdate: 'exponentialOut',\n\t\n\t // 直线指示器样式设置\n\t lineStyle: {\n\t color: '#555',\n\t width: 1,\n\t type: 'solid'\n\t },\n\t\n\t crossStyle: {\n\t color: '#555',\n\t width: 1,\n\t type: 'dashed',\n\t\n\t // TODO formatter\n\t textStyle: {}\n\t },\n\t\n\t // 阴影指示器样式设置\n\t shadowStyle: {\n\t color: 'rgba(150,150,150,0.3)'\n\t }\n\t },\n\t textStyle: {\n\t color: '#fff',\n\t fontSize: 14\n\t }\n\t }\n\t });\n\n\n/***/ },\n/* 683 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var TooltipContent = __webpack_require__(681);\n\t var graphic = __webpack_require__(4);\n\t var zrUtil = __webpack_require__(1);\n\t var formatUtil = __webpack_require__(18);\n\t var numberUtil = __webpack_require__(5);\n\t var modelUtil = __webpack_require__(14);\n\t var parsePercent = numberUtil.parsePercent;\n\t var env = __webpack_require__(28);\n\t var Model = __webpack_require__(21);\n\t\n\t function dataEqual(a, b) {\n\t if (!a || !b) {\n\t return false;\n\t }\n\t var round = numberUtil.round;\n\t return round(a[0]) === round(b[0])\n\t && round(a[1]) === round(b[1]);\n\t }\n\t /**\n\t * @inner\n\t */\n\t function makeLineShape(x1, y1, x2, y2) {\n\t return {\n\t x1: x1,\n\t y1: y1,\n\t x2: x2,\n\t y2: y2\n\t };\n\t }\n\t\n\t /**\n\t * @inner\n\t */\n\t function makeRectShape(x, y, width, height) {\n\t return {\n\t x: x,\n\t y: y,\n\t width: width,\n\t height: height\n\t };\n\t }\n\t\n\t /**\n\t * @inner\n\t */\n\t function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) {\n\t return {\n\t cx: cx,\n\t cy: cy,\n\t r0: r0,\n\t r: r,\n\t startAngle: startAngle,\n\t endAngle: endAngle,\n\t clockwise: true\n\t };\n\t }\n\t\n\t function refixTooltipPosition(x, y, el, viewWidth, viewHeight) {\n\t var width = el.clientWidth;\n\t var height = el.clientHeight;\n\t var gap = 20;\n\t\n\t if (x + width + gap > viewWidth) {\n\t x -= width + gap;\n\t }\n\t else {\n\t x += gap;\n\t }\n\t if (y + height + gap > viewHeight) {\n\t y -= height + gap;\n\t }\n\t else {\n\t y += gap;\n\t }\n\t return [x, y];\n\t }\n\t\n\t function confineTooltipPosition(x, y, el, viewWidth, viewHeight) {\n\t var width = el.clientWidth;\n\t var height = el.clientHeight;\n\t\n\t x = Math.min(x + width, viewWidth) - width;\n\t y = Math.min(y + height, viewHeight) - height;\n\t x = Math.max(x, 0);\n\t y = Math.max(y, 0);\n\t\n\t return [x, y];\n\t }\n\t\n\t function calcTooltipPosition(position, rect, dom) {\n\t var domWidth = dom.clientWidth;\n\t var domHeight = dom.clientHeight;\n\t var gap = 5;\n\t var x = 0;\n\t var y = 0;\n\t var rectWidth = rect.width;\n\t var rectHeight = rect.height;\n\t switch (position) {\n\t case 'inside':\n\t x = rect.x + rectWidth / 2 - domWidth / 2;\n\t y = rect.y + rectHeight / 2 - domHeight / 2;\n\t break;\n\t case 'top':\n\t x = rect.x + rectWidth / 2 - domWidth / 2;\n\t y = rect.y - domHeight - gap;\n\t break;\n\t case 'bottom':\n\t x = rect.x + rectWidth / 2 - domWidth / 2;\n\t y = rect.y + rectHeight + gap;\n\t break;\n\t case 'left':\n\t x = rect.x - domWidth - gap;\n\t y = rect.y + rectHeight / 2 - domHeight / 2;\n\t break;\n\t case 'right':\n\t x = rect.x + rectWidth + gap;\n\t y = rect.y + rectHeight / 2 - domHeight / 2;\n\t }\n\t return [x, y];\n\t }\n\t\n\t /**\n\t * @param {string|Function|Array.} positionExpr\n\t * @param {number} x Mouse x\n\t * @param {number} y Mouse y\n\t * @param {boolean} confine Whether confine tooltip content in view rect.\n\t * @param {module:echarts/component/tooltip/TooltipContent} content\n\t * @param {Object|} params\n\t * @param {module:zrender/Element} el target element\n\t * @param {module:echarts/ExtensionAPI} api\n\t * @return {Array.}\n\t */\n\t function updatePosition(positionExpr, x, y, confine, content, params, el, api) {\n\t var viewWidth = api.getWidth();\n\t var viewHeight = api.getHeight();\n\t\n\t var rect = el && el.getBoundingRect().clone();\n\t el && rect.applyTransform(el.transform);\n\t if (typeof positionExpr === 'function') {\n\t // Callback of position can be an array or a string specify the position\n\t positionExpr = positionExpr([x, y], params, content.el, rect);\n\t }\n\t\n\t if (zrUtil.isArray(positionExpr)) {\n\t x = parsePercent(positionExpr[0], viewWidth);\n\t y = parsePercent(positionExpr[1], viewHeight);\n\t }\n\t // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element\n\t else if (typeof positionExpr === 'string' && el) {\n\t var pos = calcTooltipPosition(\n\t positionExpr, rect, content.el\n\t );\n\t x = pos[0];\n\t y = pos[1];\n\t }\n\t else {\n\t var pos = refixTooltipPosition(\n\t x, y, content.el, viewWidth, viewHeight\n\t );\n\t x = pos[0];\n\t y = pos[1];\n\t }\n\t\n\t if (confine) {\n\t var pos = confineTooltipPosition(\n\t x, y, content.el, viewWidth, viewHeight\n\t );\n\t x = pos[0];\n\t y = pos[1];\n\t }\n\t\n\t content.moveTo(x, y);\n\t }\n\t\n\t function ifSeriesSupportAxisTrigger(seriesModel) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var trigger = seriesModel.get('tooltip.trigger', true);\n\t // Ignore series use item tooltip trigger and series coordinate system is not cartesian or\n\t return !(!coordSys\n\t || (coordSys.type !== 'cartesian2d' && coordSys.type !== 'polar' && coordSys.type !== 'singleAxis')\n\t || trigger === 'item');\n\t }\n\t\n\t __webpack_require__(3).extendComponentView({\n\t\n\t type: 'tooltip',\n\t\n\t _axisPointers: {},\n\t\n\t init: function (ecModel, api) {\n\t if (env.node) {\n\t return;\n\t }\n\t var tooltipContent = new TooltipContent(api.getDom(), api);\n\t this._tooltipContent = tooltipContent;\n\t\n\t api.on('showTip', this._manuallyShowTip, this);\n\t api.on('hideTip', this._manuallyHideTip, this);\n\t },\n\t\n\t render: function (tooltipModel, ecModel, api) {\n\t if (env.node) {\n\t return;\n\t }\n\t\n\t // Reset\n\t this.group.removeAll();\n\t\n\t /**\n\t * @type {Object}\n\t * @private\n\t */\n\t this._axisPointers = {};\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/component/tooltip/TooltipModel}\n\t */\n\t this._tooltipModel = tooltipModel;\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/model/Global}\n\t */\n\t this._ecModel = ecModel;\n\t\n\t /**\n\t * @private\n\t * @type {module:echarts/ExtensionAPI}\n\t */\n\t this._api = api;\n\t\n\t /**\n\t * @type {Object}\n\t * @private\n\t */\n\t this._lastHover = {\n\t // data\n\t // payloadBatch\n\t };\n\t\n\t var tooltipContent = this._tooltipContent;\n\t tooltipContent.update();\n\t tooltipContent.enterable = tooltipModel.get('enterable');\n\t this._alwaysShowContent = tooltipModel.get('alwaysShowContent');\n\t\n\t /**\n\t * @type {Object.}\n\t */\n\t this._seriesGroupByAxis = this._prepareAxisTriggerData(\n\t tooltipModel, ecModel\n\t );\n\t\n\t var crossText = this._crossText;\n\t if (crossText) {\n\t this.group.add(crossText);\n\t }\n\t\n\t var triggerOn = tooltipModel.get('triggerOn');\n\t\n\t // Try to keep the tooltip show when refreshing\n\t if (this._lastX != null\n\t && this._lastY != null\n\t // When user is willing to control tooltip totally using API,\n\t // self._manuallyShowTip({x, y}) might cause tooltip hide,\n\t // which is not expected.\n\t && triggerOn !== 'none'\n\t ) {\n\t var self = this;\n\t clearTimeout(this._refreshUpdateTimeout);\n\t this._refreshUpdateTimeout = setTimeout(function () {\n\t // Show tip next tick after other charts are rendered\n\t // In case highlight action has wrong result\n\t // FIXME\n\t self._manuallyShowTip({\n\t x: self._lastX,\n\t y: self._lastY\n\t });\n\t });\n\t }\n\t\n\t var zr = this._api.getZr();\n\t zr.off('click', this._tryShow);\n\t zr.off('mousemove', this._mousemove);\n\t zr.off('mouseout', this._hide);\n\t zr.off('globalout', this._hide);\n\t\n\t if (triggerOn === 'click') {\n\t zr.on('click', this._tryShow, this);\n\t }\n\t else if (triggerOn === 'mousemove') {\n\t zr.on('mousemove', this._mousemove, this);\n\t zr.on('mouseout', this._hide, this);\n\t zr.on('globalout', this._hide, this);\n\t }\n\t // else triggerOn is 'none', which enable user\n\t // to control tooltip totally using API.\n\t },\n\t\n\t _mousemove: function (e) {\n\t var showDelay = this._tooltipModel.get('showDelay');\n\t var self = this;\n\t clearTimeout(this._showTimeout);\n\t if (showDelay > 0) {\n\t this._showTimeout = setTimeout(function () {\n\t self._tryShow(e);\n\t }, showDelay);\n\t }\n\t else {\n\t this._tryShow(e);\n\t }\n\t },\n\t\n\t /**\n\t * Show tip manually by\n\t * dispatchAction({\n\t * type: 'showTip',\n\t * x: 10,\n\t * y: 10\n\t * });\n\t * Or\n\t * dispatchAction({\n\t * type: 'showTip',\n\t * seriesIndex: 0,\n\t * dataIndex or dataIndexInside or name\n\t * });\n\t *\n\t * TODO Batch\n\t */\n\t _manuallyShowTip: function (event) {\n\t // From self\n\t if (event.from === this.uid) {\n\t return;\n\t }\n\t\n\t var ecModel = this._ecModel;\n\t var seriesIndex = event.seriesIndex;\n\t var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n\t var api = this._api;\n\t\n\t var isTriggerAxis = this._tooltipModel.get('trigger') === 'axis';\n\t function seriesHaveDataOnIndex(_series) {\n\t var data = _series.getData();\n\t var dataIndex = modelUtil.queryDataIndex(data, event);\n\t // Have single dataIndex\n\t if (dataIndex != null && !zrUtil.isArray(dataIndex)\n\t && data.hasValue(dataIndex)\n\t ) {\n\t return true;\n\t }\n\t }\n\t\n\t if (event.x == null || event.y == null) {\n\t if (isTriggerAxis) {\n\t // Find another series.\n\t if (seriesModel && !seriesHaveDataOnIndex(seriesModel)) {\n\t seriesModel = null;\n\t }\n\t if (!seriesModel) {\n\t // Find the first series can use axis trigger And data is not null\n\t ecModel.eachSeries(function (_series) {\n\t if (ifSeriesSupportAxisTrigger(_series) && !seriesModel) {\n\t if (seriesHaveDataOnIndex(_series)) {\n\t seriesModel = _series;\n\t }\n\t }\n\t });\n\t }\n\t }\n\t else {\n\t // Use the first series by default.\n\t seriesModel = seriesModel || ecModel.getSeriesByIndex(0);\n\t }\n\t if (seriesModel) {\n\t var data = seriesModel.getData();\n\t var dataIndex = modelUtil.queryDataIndex(data, event);\n\t\n\t if (dataIndex == null || zrUtil.isArray(dataIndex)) {\n\t return;\n\t }\n\t\n\t var el = data.getItemGraphicEl(dataIndex);\n\t var cx;\n\t var cy;\n\t // Try to get the point in coordinate system\n\t var coordSys = seriesModel.coordinateSystem;\n\t if (seriesModel.getTooltipPosition) {\n\t var point = seriesModel.getTooltipPosition(dataIndex) || [];\n\t cx = point[0];\n\t cy = point[1];\n\t }\n\t else if (coordSys && coordSys.dataToPoint) {\n\t var point = coordSys.dataToPoint(\n\t data.getValues(\n\t zrUtil.map(coordSys.dimensions, function (dim) {\n\t return seriesModel.coordDimToDataDim(dim)[0];\n\t }), dataIndex, true\n\t )\n\t );\n\t cx = point && point[0];\n\t cy = point && point[1];\n\t }\n\t else if (el) {\n\t // Use graphic bounding rect\n\t var rect = el.getBoundingRect().clone();\n\t rect.applyTransform(el.transform);\n\t cx = rect.x + rect.width / 2;\n\t cy = rect.y + rect.height / 2;\n\t }\n\t\n\t if (cx != null && cy != null) {\n\t this._tryShow({\n\t offsetX: cx,\n\t offsetY: cy,\n\t position: event.position,\n\t target: el,\n\t event: {}\n\t });\n\t }\n\t }\n\t }\n\t else {\n\t var el = api.getZr().handler.findHover(event.x, event.y);\n\t this._tryShow({\n\t offsetX: event.x,\n\t offsetY: event.y,\n\t position: event.position,\n\t target: el,\n\t event: {}\n\t });\n\t }\n\t },\n\t\n\t _manuallyHideTip: function (e) {\n\t if (e.from === this.uid) {\n\t return;\n\t }\n\t\n\t this._hide();\n\t },\n\t\n\t _prepareAxisTriggerData: function (tooltipModel, ecModel) {\n\t // Prepare data for axis trigger\n\t var seriesGroupByAxis = {};\n\t ecModel.eachSeries(function (seriesModel) {\n\t if (ifSeriesSupportAxisTrigger(seriesModel)) {\n\t var coordSys = seriesModel.coordinateSystem;\n\t var baseAxis;\n\t var key;\n\t\n\t // Only cartesian2d, polar and single support axis trigger\n\t if (coordSys.type === 'cartesian2d') {\n\t // FIXME `axisPointer.axis` is not baseAxis\n\t baseAxis = coordSys.getBaseAxis();\n\t key = baseAxis.dim + baseAxis.index;\n\t }\n\t else if (coordSys.type === 'singleAxis') {\n\t baseAxis = coordSys.getAxis();\n\t key = baseAxis.dim + baseAxis.type;\n\t }\n\t else {\n\t baseAxis = coordSys.getBaseAxis();\n\t key = baseAxis.dim + coordSys.name;\n\t }\n\t\n\t seriesGroupByAxis[key] = seriesGroupByAxis[key] || {\n\t coordSys: [],\n\t series: []\n\t };\n\t seriesGroupByAxis[key].coordSys.push(coordSys);\n\t seriesGroupByAxis[key].series.push(seriesModel);\n\t }\n\t }, this);\n\t\n\t return seriesGroupByAxis;\n\t },\n\t\n\t /**\n\t * mousemove handler\n\t * @param {Object} e\n\t * @private\n\t */\n\t _tryShow: function (e) {\n\t var el = e.target;\n\t var tooltipModel = this._tooltipModel;\n\t var globalTrigger = tooltipModel.get('trigger');\n\t var ecModel = this._ecModel;\n\t var api = this._api;\n\t\n\t if (!tooltipModel) {\n\t return;\n\t }\n\t\n\t // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed\n\t this._lastX = e.offsetX;\n\t this._lastY = e.offsetY;\n\t\n\t // Always show item tooltip if mouse is on the element with dataIndex\n\t if (el && el.dataIndex != null) {\n\t // Use dataModel in element if possible\n\t // Used when mouseover on a element like markPoint or edge\n\t // In which case, the data is not main data in series.\n\t var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex);\n\t var dataIndex = el.dataIndex;\n\t var itemModel = dataModel.getData().getItemModel(dataIndex);\n\t // Series or single data may use item trigger when global is axis trigger\n\t if ((itemModel.get('tooltip.trigger') || globalTrigger) === 'axis') {\n\t this._showAxisTooltip(tooltipModel, ecModel, e);\n\t }\n\t else {\n\t // Reset ticket\n\t this._ticket = '';\n\t // If either single data or series use item trigger\n\t this._hideAxisPointer();\n\t // Reset last hover and dispatch downplay action\n\t this._resetLastHover();\n\t\n\t this._showItemTooltipContent(dataModel, dataIndex, el.dataType, e);\n\t }\n\t\n\t api.dispatchAction({\n\t type: 'showTip',\n\t from: this.uid,\n\t dataIndexInside: el.dataIndex,\n\t seriesIndex: el.seriesIndex\n\t });\n\t }\n\t // Tooltip provided directly. Like legend\n\t else if (el && el.tooltip) {\n\t var tooltipOpt = el.tooltip;\n\t if (typeof tooltipOpt === 'string') {\n\t var content = tooltipOpt;\n\t tooltipOpt = {\n\t content: content,\n\t // Fixed formatter\n\t formatter: content\n\t };\n\t }\n\t var subTooltipModel = new Model(tooltipOpt, tooltipModel);\n\t var defaultHtml = subTooltipModel.get('content');\n\t var asyncTicket = Math.random();\n\t this._showTooltipContent(\n\t // TODO params\n\t subTooltipModel, defaultHtml, subTooltipModel.get('formatterParams') || {},\n\t asyncTicket, e.offsetX, e.offsetY, e.position, el, api\n\t );\n\t }\n\t else {\n\t if (globalTrigger === 'item') {\n\t this._hide();\n\t }\n\t else {\n\t // Try show axis tooltip\n\t this._showAxisTooltip(tooltipModel, ecModel, e);\n\t }\n\t\n\t // Action of cross pointer\n\t // other pointer types will trigger action in _dispatchAndShowSeriesTooltipContent method\n\t if (tooltipModel.get('axisPointer.type') === 'cross') {\n\t api.dispatchAction({\n\t type: 'showTip',\n\t from: this.uid,\n\t x: e.offsetX,\n\t y: e.offsetY\n\t });\n\t }\n\t }\n\t },\n\t\n\t /**\n\t * Show tooltip on axis\n\t * @param {module:echarts/component/tooltip/TooltipModel} tooltipModel\n\t * @param {module:echarts/model/Global} ecModel\n\t * @param {Object} e\n\t * @private\n\t */\n\t _showAxisTooltip: function (tooltipModel, ecModel, e) {\n\t var axisPointerModel = tooltipModel.getModel('axisPointer');\n\t var axisPointerType = axisPointerModel.get('type');\n\t\n\t if (axisPointerType === 'cross') {\n\t var el = e.target;\n\t if (el && el.dataIndex != null) {\n\t var seriesModel = ecModel.getSeriesByIndex(el.seriesIndex);\n\t var dataIndex = el.dataIndex;\n\t this._showItemTooltipContent(seriesModel, dataIndex, el.dataType, e);\n\t }\n\t }\n\t\n\t this._showAxisPointer();\n\t var allNotShow = true;\n\t zrUtil.each(this._seriesGroupByAxis, function (seriesCoordSysSameAxis) {\n\t // Try show the axis pointer\n\t var allCoordSys = seriesCoordSysSameAxis.coordSys;\n\t var coordSys = allCoordSys[0];\n\t\n\t // If mouse position is not in the grid or polar\n\t var point = [e.offsetX, e.offsetY];\n\t\n\t if (!coordSys.containPoint(point)) {\n\t // Hide axis pointer\n\t this._hideAxisPointer(coordSys.name);\n\t return;\n\t }\n\t\n\t allNotShow = false;\n\t // Make sure point is discrete on cateogry axis\n\t var dimensions = coordSys.dimensions;\n\t var value = coordSys.pointToData(point, true);\n\t point = coordSys.dataToPoint(value);\n\t var baseAxis = coordSys.getBaseAxis();\n\t var axisType = axisPointerModel.get('axis');\n\t if (axisType === 'auto') {\n\t axisType = baseAxis.dim;\n\t }\n\t\n\t var contentNotChange = false;\n\t var lastHover = this._lastHover;\n\t if (axisPointerType === 'cross') {\n\t // If hover data not changed\n\t // Possible when two axes are all category\n\t if (dataEqual(lastHover.data, value)) {\n\t contentNotChange = true;\n\t }\n\t lastHover.data = value;\n\t }\n\t else {\n\t var valIndex = zrUtil.indexOf(dimensions, axisType);\n\t\n\t // If hover data not changed on the axis dimension\n\t if (lastHover.data === value[valIndex]) {\n\t contentNotChange = true;\n\t }\n\t lastHover.data = value[valIndex];\n\t }\n\t\n\t var enableAnimation = tooltipModel.get('animation');\n\t\n\t if (coordSys.type === 'cartesian2d' && !contentNotChange) {\n\t this._showCartesianPointer(\n\t axisPointerModel, coordSys, axisType, point, enableAnimation\n\t );\n\t }\n\t else if (coordSys.type === 'polar' && !contentNotChange) {\n\t this._showPolarPointer(\n\t axisPointerModel, coordSys, axisType, point, enableAnimation\n\t );\n\t }\n\t else if (coordSys.type === 'singleAxis' && !contentNotChange) {\n\t this._showSinglePointer(\n\t axisPointerModel, coordSys, axisType, point, enableAnimation\n\t );\n\t }\n\t\n\t if (axisPointerType !== 'cross') {\n\t this._dispatchAndShowSeriesTooltipContent(\n\t coordSys, seriesCoordSysSameAxis.series, point, value, contentNotChange, e.position\n\t );\n\t }\n\t }, this);\n\t\n\t if (!this._tooltipModel.get('show')) {\n\t this._hideAxisPointer();\n\t }\n\t\n\t if (allNotShow) {\n\t this._hide();\n\t }\n\t },\n\t\n\t /**\n\t * Show tooltip on axis of cartesian coordinate\n\t * @param {module:echarts/model/Model} axisPointerModel\n\t * @param {module:echarts/coord/cartesian/Cartesian2D} cartesians\n\t * @param {string} axisType\n\t * @param {Array.} point\n\t * @private\n\t */\n\t _showCartesianPointer: function (axisPointerModel, cartesian, axisType, point, enableAnimation) {\n\t var self = this;\n\t\n\t var axisPointerType = axisPointerModel.get('type');\n\t var baseAxis = cartesian.getBaseAxis();\n\t var moveAnimation = enableAnimation\n\t && axisPointerType !== 'cross'\n\t && baseAxis.type === 'category'\n\t && baseAxis.getBandWidth() > 20;\n\t\n\t if (axisPointerType === 'cross') {\n\t moveGridLine('x', point, cartesian.getAxis('y').getGlobalExtent());\n\t moveGridLine('y', point, cartesian.getAxis('x').getGlobalExtent());\n\t\n\t this._updateCrossText(cartesian, point, axisPointerModel);\n\t }\n\t else {\n\t var otherAxis = cartesian.getAxis(axisType === 'x' ? 'y' : 'x');\n\t var otherExtent = otherAxis.getGlobalExtent();\n\t\n\t if (cartesian.type === 'cartesian2d') {\n\t (axisPointerType === 'line' ? moveGridLine : moveGridShadow)(\n\t axisType, point, otherExtent\n\t );\n\t }\n\t }\n\t\n\t /**\n\t * @inner\n\t */\n\t function moveGridLine(axisType, point, otherExtent) {\n\t var targetShape = axisType === 'x'\n\t ? makeLineShape(point[0], otherExtent[0], point[0], otherExtent[1])\n\t : makeLineShape(otherExtent[0], point[1], otherExtent[1], point[1]);\n\t\n\t var pointerEl = self._getPointerElement(\n\t cartesian, axisPointerModel, axisType, targetShape\n\t );\n\t graphic.subPixelOptimizeLine({\n\t shape: targetShape,\n\t style: pointerEl.style\n\t });\n\t\n\t moveAnimation\n\t ? graphic.updateProps(pointerEl, {\n\t shape: targetShape\n\t }, axisPointerModel)\n\t : pointerEl.attr({\n\t shape: targetShape\n\t });\n\t }\n\t\n\t /**\n\t * @inner\n\t */\n\t function moveGridShadow(axisType, point, otherExtent) {\n\t var axis = cartesian.getAxis(axisType);\n\t var bandWidth = axis.getBandWidth();\n\t var span = otherExtent[1] - otherExtent[0];\n\t var targetShape = axisType === 'x'\n\t ? makeRectShape(point[0] - bandWidth / 2, otherExtent[0], bandWidth, span)\n\t : makeRectShape(otherExtent[0], point[1] - bandWidth / 2, span, bandWidth);\n\t\n\t var pointerEl = self._getPointerElement(\n\t cartesian, axisPointerModel, axisType, targetShape\n\t );\n\t moveAnimation\n\t ? graphic.updateProps(pointerEl, {\n\t shape: targetShape\n\t }, axisPointerModel)\n\t : pointerEl.attr({\n\t shape: targetShape\n\t });\n\t }\n\t },\n\t\n\t _showSinglePointer: function (axisPointerModel, single, axisType, point, enableAnimation) {\n\t var self = this;\n\t var axisPointerType = axisPointerModel.get('type');\n\t var moveAnimation =\n\t enableAnimation\n\t && axisPointerType !== 'cross'\n\t && single.getBaseAxis().type === 'category';\n\t var rect = single.getRect();\n\t var otherExtent = [rect.y, rect.y + rect.height];\n\t\n\t moveSingleLine(axisType, point, otherExtent);\n\t\n\t /**\n\t * @inner\n\t */\n\t function moveSingleLine(axisType, point, otherExtent) {\n\t var axis = single.getAxis();\n\t var orient = axis.orient;\n\t\n\t var targetShape = orient === 'horizontal'\n\t ? makeLineShape(point[0], otherExtent[0], point[0], otherExtent[1])\n\t : makeLineShape(otherExtent[0], point[1], otherExtent[1], point[1]);\n\t\n\t var pointerEl = self._getPointerElement(\n\t single, axisPointerModel, axisType, targetShape\n\t );\n\t moveAnimation\n\t ? graphic.updateProps(pointerEl, {\n\t shape: targetShape\n\t }, axisPointerModel)\n\t : pointerEl.attr({\n\t shape: targetShape\n\t });\n\t }\n\t\n\t },\n\t\n\t /**\n\t * Show tooltip on axis of polar coordinate\n\t * @param {module:echarts/model/Model} axisPointerModel\n\t * @param {Array.} polar\n\t * @param {string} axisType\n\t * @param {Array.} point\n\t */\n\t _showPolarPointer: function (axisPointerModel, polar, axisType, point, enableAnimation) {\n\t var self = this;\n\t\n\t var axisPointerType = axisPointerModel.get('type');\n\t\n\t var angleAxis = polar.getAngleAxis();\n\t var radiusAxis = polar.getRadiusAxis();\n\t\n\t var moveAnimation = enableAnimation\n\t && axisPointerType !== 'cross'\n\t && polar.getBaseAxis().type === 'category';\n\t\n\t if (axisPointerType === 'cross') {\n\t movePolarLine('angle', point, radiusAxis.getExtent());\n\t movePolarLine('radius', point, angleAxis.getExtent());\n\t\n\t this._updateCrossText(polar, point, axisPointerModel);\n\t }\n\t else {\n\t var otherAxis = polar.getAxis(axisType === 'radius' ? 'angle' : 'radius');\n\t var otherExtent = otherAxis.getExtent();\n\t\n\t (axisPointerType === 'line' ? movePolarLine : movePolarShadow)(\n\t axisType, point, otherExtent\n\t );\n\t }\n\t /**\n\t * @inner\n\t */\n\t function movePolarLine(axisType, point, otherExtent) {\n\t var mouseCoord = polar.pointToCoord(point);\n\t\n\t var targetShape;\n\t\n\t if (axisType === 'angle') {\n\t var p1 = polar.coordToPoint([otherExtent[0], mouseCoord[1]]);\n\t var p2 = polar.coordToPoint([otherExtent[1], mouseCoord[1]]);\n\t targetShape = makeLineShape(p1[0], p1[1], p2[0], p2[1]);\n\t }\n\t else {\n\t targetShape = {\n\t cx: polar.cx,\n\t cy: polar.cy,\n\t r: mouseCoord[0]\n\t };\n\t }\n\t\n\t var pointerEl = self._getPointerElement(\n\t polar, axisPointerModel, axisType, targetShape\n\t );\n\t\n\t moveAnimation\n\t ? graphic.updateProps(pointerEl, {\n\t shape: targetShape\n\t }, axisPointerModel)\n\t : pointerEl.attr({\n\t shape: targetShape\n\t });\n\t }\n\t\n\t /**\n\t * @inner\n\t */\n\t function movePolarShadow(axisType, point, otherExtent) {\n\t var axis = polar.getAxis(axisType);\n\t var bandWidth = axis.getBandWidth();\n\t\n\t var mouseCoord = polar.pointToCoord(point);\n\t\n\t var targetShape;\n\t\n\t var radian = Math.PI / 180;\n\t\n\t if (axisType === 'angle') {\n\t targetShape = makeSectorShape(\n\t polar.cx, polar.cy,\n\t otherExtent[0], otherExtent[1],\n\t // In ECharts y is negative if angle is positive\n\t (-mouseCoord[1] - bandWidth / 2) * radian,\n\t (-mouseCoord[1] + bandWidth / 2) * radian\n\t );\n\t }\n\t else {\n\t targetShape = makeSectorShape(\n\t polar.cx, polar.cy,\n\t mouseCoord[0] - bandWidth / 2,\n\t mouseCoord[0] + bandWidth / 2,\n\t 0, Math.PI * 2\n\t );\n\t }\n\t\n\t var pointerEl = self._getPointerElement(\n\t polar, axisPointerModel, axisType, targetShape\n\t );\n\t moveAnimation\n\t ? graphic.updateProps(pointerEl, {\n\t shape: targetShape\n\t }, axisPointerModel)\n\t : pointerEl.attr({\n\t shape: targetShape\n\t });\n\t }\n\t },\n\t\n\t _updateCrossText: function (coordSys, point, axisPointerModel) {\n\t var crossStyleModel = axisPointerModel.getModel('crossStyle');\n\t var textStyleModel = crossStyleModel.getModel('textStyle');\n\t\n\t var tooltipModel = this._tooltipModel;\n\t\n\t var text = this._crossText;\n\t if (!text) {\n\t text = this._crossText = new graphic.Text({\n\t style: {\n\t textAlign: 'left',\n\t textVerticalAlign: 'bottom'\n\t }\n\t });\n\t this.group.add(text);\n\t }\n\t\n\t var value = coordSys.pointToData(point);\n\t\n\t var dims = coordSys.dimensions;\n\t value = zrUtil.map(value, function (val, idx) {\n\t var axis = coordSys.getAxis(dims[idx]);\n\t if (axis.type === 'category' || axis.type === 'time') {\n\t val = axis.scale.getLabel(val);\n\t }\n\t else {\n\t val = formatUtil.addCommas(\n\t val.toFixed(axis.getPixelPrecision())\n\t );\n\t }\n\t return val;\n\t });\n\t\n\t text.setStyle({\n\t fill: textStyleModel.getTextColor() || crossStyleModel.get('color'),\n\t textFont: textStyleModel.getFont(),\n\t text: value.join(', '),\n\t x: point[0] + 5,\n\t y: point[1] - 5\n\t });\n\t text.z = tooltipModel.get('z');\n\t text.zlevel = tooltipModel.get('zlevel');\n\t },\n\t\n\t _getPointerElement: function (coordSys, pointerModel, axisType, initShape) {\n\t var tooltipModel = this._tooltipModel;\n\t var z = tooltipModel.get('z');\n\t var zlevel = tooltipModel.get('zlevel');\n\t var axisPointers = this._axisPointers;\n\t var coordSysName = coordSys.name;\n\t axisPointers[coordSysName] = axisPointers[coordSysName] || {};\n\t if (axisPointers[coordSysName][axisType]) {\n\t return axisPointers[coordSysName][axisType];\n\t }\n\t\n\t // Create if not exists\n\t var pointerType = pointerModel.get('type');\n\t var styleModel = pointerModel.getModel(pointerType + 'Style');\n\t var isShadow = pointerType === 'shadow';\n\t var style = styleModel[isShadow ? 'getAreaStyle' : 'getLineStyle']();\n\t\n\t var elementType = coordSys.type === 'polar'\n\t ? (isShadow ? 'Sector' : (axisType === 'radius' ? 'Circle' : 'Line'))\n\t : (isShadow ? 'Rect' : 'Line');\n\t\n\t isShadow ? (style.stroke = null) : (style.fill = null);\n\t\n\t var el = axisPointers[coordSysName][axisType] = new graphic[elementType]({\n\t style: style,\n\t z: z,\n\t zlevel: zlevel,\n\t silent: true,\n\t shape: initShape\n\t });\n\t\n\t this.group.add(el);\n\t return el;\n\t },\n\t\n\t /**\n\t * Dispatch actions and show tooltip on series\n\t * @param {Array.} seriesList\n\t * @param {Array.} point\n\t * @param {Array.} value\n\t * @param {boolean} contentNotChange\n\t * @param {Array.|string|Function} [positionExpr]\n\t */\n\t _dispatchAndShowSeriesTooltipContent: function (\n\t coordSys, seriesList, point, value, contentNotChange, positionExpr\n\t ) {\n\t\n\t var rootTooltipModel = this._tooltipModel;\n\t\n\t var baseAxis = coordSys.getBaseAxis();\n\t var baseDimIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1;\n\t\n\t var payloadBatch = zrUtil.map(seriesList, function (series) {\n\t return {\n\t seriesIndex: series.seriesIndex,\n\t dataIndexInside: series.getAxisTooltipDataIndex\n\t ? series.getAxisTooltipDataIndex(series.coordDimToDataDim(baseAxis.dim), value, baseAxis)\n\t : series.getData().indexOfNearest(\n\t series.coordDimToDataDim(baseAxis.dim)[0],\n\t value[baseDimIndex],\n\t // Add a threshold to avoid find the wrong dataIndex when data length is not same\n\t false, baseAxis.type === 'category' ? 0.5 : null\n\t )\n\t };\n\t });\n\t var sampleSeriesIndex;\n\t zrUtil.each(payloadBatch, function (payload, idx) {\n\t if (seriesList[idx].getData().hasValue(payload.dataIndexInside)) {\n\t sampleSeriesIndex = idx;\n\t }\n\t });\n\t // Fallback to 0.\n\t sampleSeriesIndex = sampleSeriesIndex || 0;\n\t\n\t var lastHover = this._lastHover;\n\t var api = this._api;\n\t // Dispatch downplay action\n\t if (lastHover.payloadBatch && !contentNotChange) {\n\t api.dispatchAction({\n\t type: 'downplay',\n\t batch: lastHover.payloadBatch\n\t });\n\t }\n\t // Dispatch highlight action\n\t if (!contentNotChange) {\n\t api.dispatchAction({\n\t type: 'highlight',\n\t batch: payloadBatch\n\t });\n\t lastHover.payloadBatch = payloadBatch;\n\t }\n\t // Dispatch showTip action\n\t api.dispatchAction({\n\t type: 'showTip',\n\t dataIndexInside: payloadBatch[sampleSeriesIndex].dataIndexInside,\n\t seriesIndex: payloadBatch[sampleSeriesIndex].seriesIndex,\n\t from: this.uid\n\t });\n\t\n\t if (baseAxis && rootTooltipModel.get('showContent') && rootTooltipModel.get('show')) {\n\t var paramsList = zrUtil.map(seriesList, function (series, index) {\n\t return series.getDataParams(payloadBatch[index].dataIndexInside);\n\t });\n\t\n\t if (!contentNotChange) {\n\t // Update html content\n\t var firstDataIndex = payloadBatch[sampleSeriesIndex].dataIndexInside;\n\t\n\t // Default tooltip content\n\t // FIXME\n\t // (1) shold be the first data which has name?\n\t // (2) themeRiver, firstDataIndex is array, and first line is unnecessary.\n\t var firstLine = baseAxis.type === 'time'\n\t ? baseAxis.scale.getLabel(value[baseDimIndex])\n\t : seriesList[sampleSeriesIndex].getData().getName(firstDataIndex);\n\t var defaultHtml = (firstLine ? firstLine + ' ' : '')\n\t + zrUtil.map(seriesList, function (series, index) {\n\t return series.formatTooltip(payloadBatch[index].dataIndexInside, true);\n\t }).join(' ');\n\t\n\t var asyncTicket = 'axis_' + coordSys.name + '_' + firstDataIndex;\n\t\n\t this._showTooltipContent(\n\t rootTooltipModel, defaultHtml, paramsList, asyncTicket,\n\t point[0], point[1], positionExpr, null, api\n\t );\n\t }\n\t else {\n\t updatePosition(\n\t positionExpr || rootTooltipModel.get('position'),\n\t point[0], point[1],\n\t rootTooltipModel.get('confine'),\n\t this._tooltipContent, paramsList, null, api\n\t );\n\t }\n\t }\n\t },\n\t\n\t /**\n\t * Show tooltip on item\n\t * @param {module:echarts/model/Series} seriesModel\n\t * @param {number} dataIndex\n\t * @param {string} dataType\n\t * @param {Object} e\n\t */\n\t _showItemTooltipContent: function (seriesModel, dataIndex, dataType, e) {\n\t // FIXME Graph data\n\t var api = this._api;\n\t var data = seriesModel.getData(dataType);\n\t var itemModel = data.getItemModel(dataIndex);\n\t\n\t var tooltipOpt = itemModel.get('tooltip', true);\n\t if (typeof tooltipOpt === 'string') {\n\t // In each data item tooltip can be simply write:\n\t // {\n\t // value: 10,\n\t // tooltip: 'Something you need to know'\n\t // }\n\t var tooltipContent = tooltipOpt;\n\t tooltipOpt = {\n\t formatter: tooltipContent\n\t };\n\t }\n\t var rootTooltipModel = this._tooltipModel;\n\t var seriesTooltipModel = seriesModel.getModel(\n\t 'tooltip', rootTooltipModel\n\t );\n\t var tooltipModel = new Model(tooltipOpt, seriesTooltipModel, seriesTooltipModel.ecModel);\n\t\n\t var params = seriesModel.getDataParams(dataIndex, dataType);\n\t var defaultHtml = seriesModel.formatTooltip(dataIndex, false, dataType);\n\t\n\t var asyncTicket = 'item_' + seriesModel.name + '_' + dataIndex;\n\t\n\t this._showTooltipContent(\n\t tooltipModel, defaultHtml, params, asyncTicket,\n\t e.offsetX, e.offsetY, e.position, e.target, api\n\t );\n\t },\n\t\n\t _showTooltipContent: function (\n\t tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, target, api\n\t ) {\n\t // Reset ticket\n\t this._ticket = '';\n\t\n\t if (tooltipModel.get('showContent') && tooltipModel.get('show')) {\n\t var tooltipContent = this._tooltipContent;\n\t var confine = tooltipModel.get('confine');\n\t\n\t var formatter = tooltipModel.get('formatter');\n\t positionExpr = positionExpr || tooltipModel.get('position');\n\t var html = defaultHtml;\n\t\n\t if (formatter) {\n\t if (typeof formatter === 'string') {\n\t html = formatUtil.formatTpl(formatter, params);\n\t }\n\t else if (typeof formatter === 'function') {\n\t var self = this;\n\t var ticket = asyncTicket;\n\t var callback = function (cbTicket, html) {\n\t if (cbTicket === self._ticket) {\n\t tooltipContent.setContent(html);\n\t\n\t updatePosition(\n\t positionExpr, x, y, confine,\n\t tooltipContent, params, target, api\n\t );\n\t }\n\t };\n\t self._ticket = ticket;\n\t html = formatter(params, ticket, callback);\n\t }\n\t }\n\t\n\t tooltipContent.show(tooltipModel);\n\t tooltipContent.setContent(html);\n\t\n\t updatePosition(\n\t positionExpr, x, y, confine,\n\t tooltipContent, params, target, api\n\t );\n\t }\n\t },\n\t\n\t /**\n\t * Show axis pointer\n\t * @param {string} [coordSysName]\n\t */\n\t _showAxisPointer: function (coordSysName) {\n\t if (coordSysName) {\n\t var axisPointers = this._axisPointers[coordSysName];\n\t axisPointers && zrUtil.each(axisPointers, function (el) {\n\t el.show();\n\t });\n\t }\n\t else {\n\t this.group.eachChild(function (child) {\n\t child.show();\n\t });\n\t this.group.show();\n\t }\n\t },\n\t\n\t _resetLastHover: function () {\n\t var lastHover = this._lastHover;\n\t if (lastHover.payloadBatch) {\n\t this._api.dispatchAction({\n\t type: 'downplay',\n\t batch: lastHover.payloadBatch\n\t });\n\t }\n\t // Reset lastHover\n\t this._lastHover = {};\n\t },\n\t /**\n\t * Hide axis pointer\n\t * @param {string} [coordSysName]\n\t */\n\t _hideAxisPointer: function (coordSysName) {\n\t if (coordSysName) {\n\t var axisPointers = this._axisPointers[coordSysName];\n\t axisPointers && zrUtil.each(axisPointers, function (el) {\n\t el.hide();\n\t });\n\t }\n\t else {\n\t if (this.group.children().length) {\n\t this.group.hide();\n\t }\n\t }\n\t },\n\t\n\t _hide: function () {\n\t clearTimeout(this._showTimeout);\n\t\n\t this._hideAxisPointer();\n\t this._resetLastHover();\n\t if (!this._alwaysShowContent) {\n\t this._tooltipContent.hideLater(this._tooltipModel.get('hideDelay'));\n\t }\n\t\n\t this._api.dispatchAction({\n\t type: 'hideTip',\n\t from: this.uid\n\t });\n\t\n\t this._lastX = this._lastY = null;\n\t },\n\t\n\t dispose: function (ecModel, api) {\n\t if (env.node) {\n\t return;\n\t }\n\t var zr = api.getZr();\n\t this._tooltipContent.hide();\n\t\n\t zr.off('click', this._tryShow);\n\t zr.off('mousemove', this._mousemove);\n\t zr.off('mouseout', this._hide);\n\t zr.off('globalout', this._hide);\n\t\n\t api.off('showTip', this._manuallyShowTip);\n\t api.off('hideTip', this._manuallyHideTip);\n\t }\n\t });\n\n\n/***/ },\n/* 684 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * visualMap component entry\n\t */\n\t\n\t\n\t __webpack_require__(685);\n\t __webpack_require__(686);\n\t\n\n\n/***/ },\n/* 685 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * DataZoom component entry\n\t */\n\t\n\t\n\t __webpack_require__(3).registerPreprocessor(\n\t __webpack_require__(229)\n\t );\n\t\n\t __webpack_require__(230);\n\t __webpack_require__(231);\n\t __webpack_require__(687);\n\t __webpack_require__(688);\n\t __webpack_require__(232);\n\t\n\n\n/***/ },\n/* 686 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * DataZoom component entry\n\t */\n\t\n\t\n\t __webpack_require__(3).registerPreprocessor(\n\t __webpack_require__(229)\n\t );\n\t\n\t __webpack_require__(230);\n\t __webpack_require__(231);\n\t __webpack_require__(689);\n\t __webpack_require__(690);\n\t __webpack_require__(232);\n\t\n\n\n/***/ },\n/* 687 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @file Data zoom model\n\t */\n\t\n\t\n\t var VisualMapModel = __webpack_require__(226);\n\t var zrUtil = __webpack_require__(1);\n\t var numberUtil = __webpack_require__(5);\n\t\n\t // Constant\n\t var DEFAULT_BAR_BOUND = [20, 140];\n\t\n\t var ContinuousModel = VisualMapModel.extend({\n\t\n\t type: 'visualMap.continuous',\n\t\n\t /**\n\t * @protected\n\t */\n\t defaultOption: {\n\t align: 'auto', // 'auto', 'left', 'right', 'top', 'bottom'\n\t calculable: false, // This prop effect default component type determine,\n\t // See echarts/component/visualMap/typeDefaulter.\n\t range: null, // selected range. In default case `range` is [min, max]\n\t // and can auto change along with modification of min max,\n\t // util use specifid a range.\n\t realtime: true, // Whether realtime update.\n\t itemHeight: null, // The length of the range control edge.\n\t itemWidth: null, // The length of the other side.\n\t hoverLink: true, // Enable hover highlight.\n\t hoverLinkDataSize: null,// The size of hovered data.\n\t hoverLinkOnHandle: true // Whether trigger hoverLink when hover handle.\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t optionUpdated: function (newOption, isInit) {\n\t ContinuousModel.superApply(this, 'optionUpdated', arguments);\n\t\n\t this.resetTargetSeries();\n\t this.resetExtent();\n\t\n\t this.resetVisual(function (mappingOption) {\n\t mappingOption.mappingMethod = 'linear';\n\t mappingOption.dataExtent = this.getExtent();\n\t });\n\t\n\t this._resetRange();\n\t },\n\t\n\t /**\n\t * @protected\n\t * @override\n\t */\n\t resetItemSize: function () {\n\t ContinuousModel.superApply(this, 'resetItemSize', arguments);\n\t\n\t var itemSize = this.itemSize;\n\t\n\t this._orient === 'horizontal' && itemSize.reverse();\n\t\n\t (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]);\n\t (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _resetRange: function () {\n\t var dataExtent = this.getExtent();\n\t var range = this.option.range;\n\t\n\t if (!range || range.auto) {\n\t // `range` should always be array (so we dont use other\n\t // value like 'auto') for user-friend. (consider getOption).\n\t dataExtent.auto = 1;\n\t this.option.range = dataExtent;\n\t }\n\t else if (zrUtil.isArray(range)) {\n\t if (range[0] > range[1]) {\n\t range.reverse();\n\t }\n\t range[0] = Math.max(range[0], dataExtent[0]);\n\t range[1] = Math.min(range[1], dataExtent[1]);\n\t }\n\t },\n\t\n\t /**\n\t * @protected\n\t * @override\n\t */\n\t completeVisualOption: function () {\n\t VisualMapModel.prototype.completeVisualOption.apply(this, arguments);\n\t\n\t zrUtil.each(this.stateList, function (state) {\n\t var symbolSize = this.option.controller[state].symbolSize;\n\t if (symbolSize && symbolSize[0] !== symbolSize[1]) {\n\t symbolSize[0] = 0; // For good looking.\n\t }\n\t }, this);\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t setSelected: function (selected) {\n\t this.option.range = selected.slice();\n\t this._resetRange();\n\t },\n\t\n\t /**\n\t * @public\n\t */\n\t getSelected: function () {\n\t var dataExtent = this.getExtent();\n\t\n\t var dataInterval = numberUtil.asc(\n\t (this.get('range') || []).slice()\n\t );\n\t\n\t // Clamp\n\t dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]);\n\t dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]);\n\t dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]);\n\t dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]);\n\t\n\t return dataInterval;\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t getValueState: function (value) {\n\t var range = this.option.range;\n\t var dataExtent = this.getExtent();\n\t\n\t // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'.\n\t // range[1] is processed likewise.\n\t return (\n\t (range[0] <= dataExtent[0] || range[0] <= value)\n\t && (range[1] >= dataExtent[1] || value <= range[1])\n\t ) ? 'inRange' : 'outOfRange';\n\t },\n\t\n\t /**\n\t * @params {Array.} range target value: range[0] <= value && value <= range[1]\n\t * @return {Array.} [{seriesId, dataIndices: >}, ...]\n\t */\n\t findTargetDataIndices: function (range) {\n\t var result = [];\n\t\n\t this.eachTargetSeries(function (seriesModel) {\n\t var dataIndices = [];\n\t var data = seriesModel.getData();\n\t\n\t data.each(this.getDataDimension(data), function (value, dataIndex) {\n\t range[0] <= value && value <= range[1] && dataIndices.push(dataIndex);\n\t }, true, this);\n\t\n\t result.push({seriesId: seriesModel.id, dataIndex: dataIndices});\n\t }, this);\n\t\n\t return result;\n\t },\n\t\n\t /**\n\t * @implement\n\t */\n\t getVisualMeta: function (getColorVisual) {\n\t var oVals = getColorStopValues(this, 'outOfRange', this.getExtent());\n\t var iVals = getColorStopValues(this, 'inRange', this.option.range.slice());\n\t var stops = [];\n\t\n\t function setStop(value, valueState) {\n\t stops.push({\n\t value: value,\n\t color: getColorVisual(value, valueState)\n\t });\n\t }\n\t\n\t // Format to: outOfRange -- inRange -- outOfRange.\n\t var iIdx = 0;\n\t var oIdx = 0;\n\t var iLen = iVals.length;\n\t var oLen = oVals.length;\n\t\n\t for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) {\n\t // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored.\n\t if (oVals[oIdx] < iVals[iIdx]) {\n\t setStop(oVals[oIdx], 'outOfRange');\n\t }\n\t }\n\t for (var first = 1; iIdx < iLen; iIdx++, first = 0) {\n\t // If range is full, value beyond min, max will be clamped.\n\t // make a singularity\n\t first && stops.length && setStop(iVals[iIdx], 'outOfRange');\n\t setStop(iVals[iIdx], 'inRange');\n\t }\n\t for (var first = 1; oIdx < oLen; oIdx++) {\n\t if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) {\n\t // make a singularity\n\t if (first) {\n\t stops.length && setStop(stops[stops.length - 1].value, 'outOfRange');\n\t first = 0;\n\t }\n\t setStop(oVals[oIdx], 'outOfRange');\n\t }\n\t }\n\t\n\t var stopsLen = stops.length;\n\t\n\t return {\n\t stops: stops,\n\t outerColors: [\n\t stopsLen ? stops[0].color : 'transparent',\n\t stopsLen ? stops[stopsLen - 1].color : 'transparent'\n\t ]\n\t };\n\t }\n\t\n\t });\n\t\n\t function getColorStopValues(visualMapModel, valueState, dataExtent) {\n\t if (dataExtent[0] === dataExtent[1]) {\n\t return dataExtent.slice();\n\t }\n\t\n\t // When using colorHue mapping, it is not linear color any more.\n\t // Moreover, canvas gradient seems not to be accurate linear.\n\t // FIXME\n\t // Should be arbitrary value 100? or based on pixel size?\n\t var count = 200;\n\t var step = (dataExtent[1] - dataExtent[0]) / count;\n\t\n\t var value = dataExtent[0];\n\t var stopValues = [];\n\t for (var i = 0; i <= count && value < dataExtent[1]; i++) {\n\t stopValues.push(value);\n\t value += step;\n\t }\n\t stopValues.push(dataExtent[1]);\n\t\n\t return stopValues;\n\t }\n\t\n\t module.exports = ContinuousModel;\n\t\n\n\n/***/ },\n/* 688 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var VisualMapView = __webpack_require__(227);\n\t var graphic = __webpack_require__(4);\n\t var zrUtil = __webpack_require__(1);\n\t var numberUtil = __webpack_require__(5);\n\t var sliderMove = __webpack_require__(155);\n\t var LinearGradient = __webpack_require__(262);\n\t var helper = __webpack_require__(228);\n\t var modelUtil = __webpack_require__(14);\n\t\n\t var linearMap = numberUtil.linearMap;\n\t var each = zrUtil.each;\n\t var mathMin = Math.min;\n\t var mathMax = Math.max;\n\t\n\t // Arbitrary value\n\t var HOVER_LINK_SIZE = 12;\n\t var HOVER_LINK_OUT = 6;\n\t\n\t // Notice:\n\t // Any \"interval\" should be by the order of [low, high].\n\t // \"handle0\" (handleIndex === 0) maps to\n\t // low data value: this._dataInterval[0] and has low coord.\n\t // \"handle1\" (handleIndex === 1) maps to\n\t // high data value: this._dataInterval[1] and has high coord.\n\t // The logic of transform is implemented in this._createBarGroup.\n\t\n\t var ContinuousView = VisualMapView.extend({\n\t\n\t type: 'visualMap.continuous',\n\t\n\t /**\n\t * @override\n\t */\n\t init: function () {\n\t\n\t ContinuousView.superApply(this, 'init', arguments);\n\t\n\t /**\n\t * @private\n\t */\n\t this._shapes = {};\n\t\n\t /**\n\t * @private\n\t */\n\t this._dataInterval = [];\n\t\n\t /**\n\t * @private\n\t */\n\t this._handleEnds = [];\n\t\n\t /**\n\t * @private\n\t */\n\t this._orient;\n\t\n\t /**\n\t * @private\n\t */\n\t this._useHandle;\n\t\n\t /**\n\t * @private\n\t */\n\t this._hoverLinkDataIndices = [];\n\t\n\t /**\n\t * @private\n\t */\n\t this._dragging;\n\t\n\t /**\n\t * @private\n\t */\n\t this._hovering;\n\t },\n\t\n\t /**\n\t * @protected\n\t * @override\n\t */\n\t doRender: function (visualMapModel, ecModel, api, payload) {\n\t if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) {\n\t this._buildView();\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _buildView: function () {\n\t this.group.removeAll();\n\t\n\t var visualMapModel = this.visualMapModel;\n\t var thisGroup = this.group;\n\t\n\t this._orient = visualMapModel.get('orient');\n\t this._useHandle = visualMapModel.get('calculable');\n\t\n\t this._resetInterval();\n\t\n\t this._renderBar(thisGroup);\n\t\n\t var dataRangeText = visualMapModel.get('text');\n\t this._renderEndsText(thisGroup, dataRangeText, 0);\n\t this._renderEndsText(thisGroup, dataRangeText, 1);\n\t\n\t // Do this for background size calculation.\n\t this._updateView(true);\n\t\n\t // After updating view, inner shapes is built completely,\n\t // and then background can be rendered.\n\t this.renderBackground(thisGroup);\n\t\n\t // Real update view\n\t this._updateView();\n\t\n\t this._enableHoverLinkToSeries();\n\t this._enableHoverLinkFromSeries();\n\t\n\t this.positionGroup(thisGroup);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _renderEndsText: function (group, dataRangeText, endsIndex) {\n\t if (!dataRangeText) {\n\t return;\n\t }\n\t\n\t // Compatible with ec2, text[0] map to high value, text[1] map low value.\n\t var text = dataRangeText[1 - endsIndex];\n\t text = text != null ? text + '' : '';\n\t\n\t var visualMapModel = this.visualMapModel;\n\t var textGap = visualMapModel.get('textGap');\n\t var itemSize = visualMapModel.itemSize;\n\t\n\t var barGroup = this._shapes.barGroup;\n\t var position = this._applyTransform(\n\t [\n\t itemSize[0] / 2,\n\t endsIndex === 0 ? -textGap : itemSize[1] + textGap\n\t ],\n\t barGroup\n\t );\n\t var align = this._applyTransform(\n\t endsIndex === 0 ? 'bottom' : 'top',\n\t barGroup\n\t );\n\t var orient = this._orient;\n\t var textStyleModel = this.visualMapModel.textStyleModel;\n\t\n\t this.group.add(new graphic.Text({\n\t style: {\n\t x: position[0],\n\t y: position[1],\n\t textVerticalAlign: orient === 'horizontal' ? 'middle' : align,\n\t textAlign: orient === 'horizontal' ? align : 'center',\n\t text: text,\n\t textFont: textStyleModel.getFont(),\n\t fill: textStyleModel.getTextColor()\n\t }\n\t }));\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _renderBar: function (targetGroup) {\n\t var visualMapModel = this.visualMapModel;\n\t var shapes = this._shapes;\n\t var itemSize = visualMapModel.itemSize;\n\t var orient = this._orient;\n\t var useHandle = this._useHandle;\n\t var itemAlign = helper.getItemAlign(visualMapModel, this.api, itemSize);\n\t var barGroup = shapes.barGroup = this._createBarGroup(itemAlign);\n\t\n\t // Bar\n\t barGroup.add(shapes.outOfRange = createPolygon());\n\t barGroup.add(shapes.inRange = createPolygon(\n\t null,\n\t useHandle ? 'move' : null,\n\t zrUtil.bind(this._dragHandle, this, 'all', false),\n\t zrUtil.bind(this._dragHandle, this, 'all', true)\n\t ));\n\t\n\t var textRect = visualMapModel.textStyleModel.getTextRect('国');\n\t var textSize = mathMax(textRect.width, textRect.height);\n\t\n\t // Handle\n\t if (useHandle) {\n\t shapes.handleThumbs = [];\n\t shapes.handleLabels = [];\n\t shapes.handleLabelPoints = [];\n\t\n\t this._createHandle(barGroup, 0, itemSize, textSize, orient, itemAlign);\n\t this._createHandle(barGroup, 1, itemSize, textSize, orient, itemAlign);\n\t }\n\t\n\t this._createIndicator(barGroup, itemSize, textSize, orient);\n\t\n\t targetGroup.add(barGroup);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _createHandle: function (barGroup, handleIndex, itemSize, textSize, orient) {\n\t var onDrift = zrUtil.bind(this._dragHandle, this, handleIndex, false);\n\t var onDragEnd = zrUtil.bind(this._dragHandle, this, handleIndex, true);\n\t var handleThumb = createPolygon(\n\t createHandlePoints(handleIndex, textSize),\n\t 'move',\n\t onDrift,\n\t onDragEnd\n\t );\n\t handleThumb.position[0] = itemSize[0];\n\t barGroup.add(handleThumb);\n\t\n\t // Text is always horizontal layout but should not be effected by\n\t // transform (orient/inverse). So label is built separately but not\n\t // use zrender/graphic/helper/RectText, and is located based on view\n\t // group (according to handleLabelPoint) but not barGroup.\n\t var textStyleModel = this.visualMapModel.textStyleModel;\n\t var handleLabel = new graphic.Text({\n\t draggable: true,\n\t drift: onDrift,\n\t ondragend: onDragEnd,\n\t style: {\n\t x: 0, y: 0, text: '',\n\t textFont: textStyleModel.getFont(),\n\t fill: textStyleModel.getTextColor()\n\t }\n\t });\n\t this.group.add(handleLabel);\n\t\n\t var handleLabelPoint = [\n\t orient === 'horizontal'\n\t ? textSize / 2\n\t : textSize * 1.5,\n\t orient === 'horizontal'\n\t ? (handleIndex === 0 ? -(textSize * 1.5) : (textSize * 1.5))\n\t : (handleIndex === 0 ? -textSize / 2 : textSize / 2)\n\t ];\n\t\n\t var shapes = this._shapes;\n\t shapes.handleThumbs[handleIndex] = handleThumb;\n\t shapes.handleLabelPoints[handleIndex] = handleLabelPoint;\n\t shapes.handleLabels[handleIndex] = handleLabel;\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _createIndicator: function (barGroup, itemSize, textSize, orient) {\n\t var indicator = createPolygon([[0, 0]], 'move');\n\t indicator.position[0] = itemSize[0];\n\t indicator.attr({invisible: true, silent: true});\n\t barGroup.add(indicator);\n\t\n\t var textStyleModel = this.visualMapModel.textStyleModel;\n\t var indicatorLabel = new graphic.Text({\n\t silent: true,\n\t invisible: true,\n\t style: {\n\t x: 0, y: 0, text: '',\n\t textFont: textStyleModel.getFont(),\n\t fill: textStyleModel.getTextColor()\n\t }\n\t });\n\t this.group.add(indicatorLabel);\n\t\n\t var indicatorLabelPoint = [\n\t orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT + 3,\n\t 0\n\t ];\n\t\n\t var shapes = this._shapes;\n\t shapes.indicator = indicator;\n\t shapes.indicatorLabel = indicatorLabel;\n\t shapes.indicatorLabelPoint = indicatorLabelPoint;\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _dragHandle: function (handleIndex, isEnd, dx, dy) {\n\t if (!this._useHandle) {\n\t return;\n\t }\n\t\n\t this._dragging = !isEnd;\n\t\n\t if (!isEnd) {\n\t // Transform dx, dy to bar coordination.\n\t var vertex = this._applyTransform([dx, dy], this._shapes.barGroup, true);\n\t this._updateInterval(handleIndex, vertex[1]);\n\t\n\t // Considering realtime, update view should be executed\n\t // before dispatch action.\n\t this._updateView();\n\t }\n\t\n\t // dragEnd do not dispatch action when realtime.\n\t if (isEnd === !this.visualMapModel.get('realtime')) { // jshint ignore:line\n\t this.api.dispatchAction({\n\t type: 'selectDataRange',\n\t from: this.uid,\n\t visualMapId: this.visualMapModel.id,\n\t selected: this._dataInterval.slice()\n\t });\n\t }\n\t\n\t if (isEnd) {\n\t !this._hovering && this._clearHoverLinkToSeries();\n\t }\n\t else if (useHoverLinkOnHandle(this.visualMapModel)) {\n\t this._doHoverLinkToSeries(this._handleEnds[handleIndex], false);\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _resetInterval: function () {\n\t var visualMapModel = this.visualMapModel;\n\t\n\t var dataInterval = this._dataInterval = visualMapModel.getSelected();\n\t var dataExtent = visualMapModel.getExtent();\n\t var sizeExtent = [0, visualMapModel.itemSize[1]];\n\t\n\t this._handleEnds = [\n\t linearMap(dataInterval[0], dataExtent, sizeExtent, true),\n\t linearMap(dataInterval[1], dataExtent, sizeExtent, true)\n\t ];\n\t },\n\t\n\t /**\n\t * @private\n\t * @param {(number|string)} handleIndex 0 or 1 or 'all'\n\t * @param {number} dx\n\t * @param {number} dy\n\t */\n\t _updateInterval: function (handleIndex, delta) {\n\t delta = delta || 0;\n\t var visualMapModel = this.visualMapModel;\n\t var handleEnds = this._handleEnds;\n\t\n\t sliderMove(\n\t delta,\n\t handleEnds,\n\t [0, visualMapModel.itemSize[1]],\n\t handleIndex === 'all' ? 'rigid' : 'push',\n\t handleIndex\n\t );\n\t var dataExtent = visualMapModel.getExtent();\n\t var sizeExtent = [0, visualMapModel.itemSize[1]];\n\t // Update data interval.\n\t this._dataInterval = [\n\t linearMap(handleEnds[0], sizeExtent, dataExtent, true),\n\t linearMap(handleEnds[1], sizeExtent, dataExtent, true)\n\t ];\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _updateView: function (forSketch) {\n\t var visualMapModel = this.visualMapModel;\n\t var dataExtent = visualMapModel.getExtent();\n\t var shapes = this._shapes;\n\t\n\t var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]];\n\t var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds;\n\t\n\t var visualInRange = this._createBarVisual(\n\t this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange'\n\t );\n\t var visualOutOfRange = this._createBarVisual(\n\t dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange'\n\t );\n\t\n\t shapes.inRange\n\t .setStyle({\n\t fill: visualInRange.barColor,\n\t opacity: visualInRange.opacity\n\t })\n\t .setShape('points', visualInRange.barPoints);\n\t shapes.outOfRange\n\t .setStyle({\n\t fill: visualOutOfRange.barColor,\n\t opacity: visualOutOfRange.opacity\n\t })\n\t .setShape('points', visualOutOfRange.barPoints);\n\t\n\t this._updateHandle(inRangeHandleEnds, visualInRange);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _createBarVisual: function (dataInterval, dataExtent, handleEnds, forceState) {\n\t var opts = {\n\t forceState: forceState,\n\t convertOpacityToAlpha: true\n\t };\n\t var colorStops = this._makeColorGradient(dataInterval, opts);\n\t\n\t var symbolSizes = [\n\t this.getControllerVisual(dataInterval[0], 'symbolSize', opts),\n\t this.getControllerVisual(dataInterval[1], 'symbolSize', opts)\n\t ];\n\t var barPoints = this._createBarPoints(handleEnds, symbolSizes);\n\t\n\t return {\n\t barColor: new LinearGradient(0, 0, 0, 1, colorStops),\n\t barPoints: barPoints,\n\t handlesColor: [\n\t colorStops[0].color,\n\t colorStops[colorStops.length - 1].color\n\t ]\n\t };\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _makeColorGradient: function (dataInterval, opts) {\n\t // Considering colorHue, which is not linear, so we have to sample\n\t // to calculate gradient color stops, but not only caculate head\n\t // and tail.\n\t var sampleNumber = 100; // Arbitrary value.\n\t var colorStops = [];\n\t var step = (dataInterval[1] - dataInterval[0]) / sampleNumber;\n\t\n\t colorStops.push({\n\t color: this.getControllerVisual(dataInterval[0], 'color', opts),\n\t offset: 0\n\t });\n\t\n\t for (var i = 1; i < sampleNumber; i++) {\n\t var currValue = dataInterval[0] + step * i;\n\t if (currValue > dataInterval[1]) {\n\t break;\n\t }\n\t colorStops.push({\n\t color: this.getControllerVisual(currValue, 'color', opts),\n\t offset: i / sampleNumber\n\t });\n\t }\n\t\n\t colorStops.push({\n\t color: this.getControllerVisual(dataInterval[1], 'color', opts),\n\t offset: 1\n\t });\n\t\n\t return colorStops;\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _createBarPoints: function (handleEnds, symbolSizes) {\n\t var itemSize = this.visualMapModel.itemSize;\n\t\n\t return [\n\t [itemSize[0] - symbolSizes[0], handleEnds[0]],\n\t [itemSize[0], handleEnds[0]],\n\t [itemSize[0], handleEnds[1]],\n\t [itemSize[0] - symbolSizes[1], handleEnds[1]]\n\t ];\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _createBarGroup: function (itemAlign) {\n\t var orient = this._orient;\n\t var inverse = this.visualMapModel.get('inverse');\n\t\n\t return new graphic.Group(\n\t (orient === 'horizontal' && !inverse)\n\t ? {scale: itemAlign === 'bottom' ? [1, 1] : [-1, 1], rotation: Math.PI / 2}\n\t : (orient === 'horizontal' && inverse)\n\t ? {scale: itemAlign === 'bottom' ? [-1, 1] : [1, 1], rotation: -Math.PI / 2}\n\t : (orient === 'vertical' && !inverse)\n\t ? {scale: itemAlign === 'left' ? [1, -1] : [-1, -1]}\n\t : {scale: itemAlign === 'left' ? [1, 1] : [-1, 1]}\n\t );\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _updateHandle: function (handleEnds, visualInRange) {\n\t if (!this._useHandle) {\n\t return;\n\t }\n\t\n\t var shapes = this._shapes;\n\t var visualMapModel = this.visualMapModel;\n\t var handleThumbs = shapes.handleThumbs;\n\t var handleLabels = shapes.handleLabels;\n\t\n\t each([0, 1], function (handleIndex) {\n\t var handleThumb = handleThumbs[handleIndex];\n\t handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]);\n\t handleThumb.position[1] = handleEnds[handleIndex];\n\t\n\t // Update handle label position.\n\t var textPoint = graphic.applyTransform(\n\t shapes.handleLabelPoints[handleIndex],\n\t graphic.getTransform(handleThumb, this.group)\n\t );\n\t handleLabels[handleIndex].setStyle({\n\t x: textPoint[0],\n\t y: textPoint[1],\n\t text: visualMapModel.formatValueText(this._dataInterval[handleIndex]),\n\t textVerticalAlign: 'middle',\n\t textAlign: this._applyTransform(\n\t this._orient === 'horizontal'\n\t ? (handleIndex === 0 ? 'bottom' : 'top')\n\t : 'left',\n\t shapes.barGroup\n\t )\n\t });\n\t }, this);\n\t },\n\t\n\t /**\n\t * @private\n\t * @param {number} cursorValue\n\t * @param {number} textValue\n\t * @param {string} [rangeSymbol]\n\t * @param {number} [halfHoverLinkSize]\n\t */\n\t _showIndicator: function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) {\n\t var visualMapModel = this.visualMapModel;\n\t var dataExtent = visualMapModel.getExtent();\n\t var itemSize = visualMapModel.itemSize;\n\t var sizeExtent = [0, itemSize[1]];\n\t var pos = linearMap(cursorValue, dataExtent, sizeExtent, true);\n\t\n\t var shapes = this._shapes;\n\t var indicator = shapes.indicator;\n\t if (!indicator) {\n\t return;\n\t }\n\t\n\t indicator.position[1] = pos;\n\t indicator.attr('invisible', false);\n\t indicator.setShape('points', createIndicatorPoints(\n\t !!rangeSymbol, halfHoverLinkSize, pos, itemSize[1]\n\t ));\n\t\n\t var opts = {convertOpacityToAlpha: true};\n\t var color = this.getControllerVisual(cursorValue, 'color', opts);\n\t indicator.setStyle('fill', color);\n\t\n\t // Update handle label position.\n\t var textPoint = graphic.applyTransform(\n\t shapes.indicatorLabelPoint,\n\t graphic.getTransform(indicator, this.group)\n\t );\n\t\n\t var indicatorLabel = shapes.indicatorLabel;\n\t indicatorLabel.attr('invisible', false);\n\t var align = this._applyTransform('left', shapes.barGroup);\n\t var orient = this._orient;\n\t indicatorLabel.setStyle({\n\t text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue),\n\t textVerticalAlign: orient === 'horizontal' ? align : 'middle',\n\t textAlign: orient === 'horizontal' ? 'center' : align,\n\t x: textPoint[0],\n\t y: textPoint[1]\n\t });\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _enableHoverLinkToSeries: function () {\n\t var self = this;\n\t this._shapes.barGroup\n\t\n\t .on('mousemove', function (e) {\n\t self._hovering = true;\n\t\n\t if (!self._dragging) {\n\t var itemSize = self.visualMapModel.itemSize;\n\t var pos = self._applyTransform(\n\t [e.offsetX, e.offsetY], self._shapes.barGroup, true, true\n\t );\n\t // For hover link show when hover handle, which might be\n\t // below or upper than sizeExtent.\n\t pos[1] = mathMin(mathMax(0, pos[1]), itemSize[1]);\n\t\n\t self._doHoverLinkToSeries(\n\t pos[1],\n\t 0 <= pos[0] && pos[0] <= itemSize[0]\n\t );\n\t }\n\t })\n\t\n\t .on('mouseout', function () {\n\t // When mouse is out of handle, hoverLink still need\n\t // to be displayed when realtime is set as false.\n\t self._hovering = false;\n\t !self._dragging && self._clearHoverLinkToSeries();\n\t });\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _enableHoverLinkFromSeries: function () {\n\t var zr = this.api.getZr();\n\t\n\t if (this.visualMapModel.option.hoverLink) {\n\t zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this);\n\t zr.on('mouseout', this._hideIndicator, this);\n\t }\n\t else {\n\t this._clearHoverLinkFromSeries();\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _doHoverLinkToSeries: function (cursorPos, hoverOnBar) {\n\t var visualMapModel = this.visualMapModel;\n\t var itemSize = visualMapModel.itemSize;\n\t\n\t if (!visualMapModel.option.hoverLink) {\n\t return;\n\t }\n\t\n\t var sizeExtent = [0, itemSize[1]];\n\t var dataExtent = visualMapModel.getExtent();\n\t\n\t // For hover link show when hover handle, which might be below or upper than sizeExtent.\n\t cursorPos = mathMin(mathMax(sizeExtent[0], cursorPos), sizeExtent[1]);\n\t\n\t var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent);\n\t var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize];\n\t var cursorValue = linearMap(cursorPos, sizeExtent, dataExtent, true);\n\t var valueRange = [\n\t linearMap(hoverRange[0], sizeExtent, dataExtent, true),\n\t linearMap(hoverRange[1], sizeExtent, dataExtent, true)\n\t ];\n\t // Consider data range is out of visualMap range, see test/visualMap-continuous.html,\n\t // where china and india has very large population.\n\t hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity);\n\t hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity);\n\t\n\t // Do not show indicator when mouse is over handle,\n\t // otherwise labels overlap, especially when dragging.\n\t if (hoverOnBar) {\n\t if (valueRange[0] === -Infinity) {\n\t this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize);\n\t }\n\t else if (valueRange[1] === Infinity) {\n\t this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize);\n\t }\n\t else {\n\t this._showIndicator(cursorValue, cursorValue, '≈ ', halfHoverLinkSize);\n\t }\n\t }\n\t\n\t // When realtime is set as false, handles, which are in barGroup,\n\t // also trigger hoverLink, which help user to realize where they\n\t // focus on when dragging. (see test/heatmap-large.html)\n\t // When realtime is set as true, highlight will not show when hover\n\t // handle, because the label on handle, which displays a exact value\n\t // but not range, might mislead users.\n\t var oldBatch = this._hoverLinkDataIndices;\n\t var newBatch = [];\n\t if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) {\n\t newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange);\n\t }\n\t\n\t var resultBatches = modelUtil.compressBatches(oldBatch, newBatch);\n\t this._dispatchHighDown('downplay', helper.convertDataIndex(resultBatches[0]));\n\t this._dispatchHighDown('highlight', helper.convertDataIndex(resultBatches[1]));\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _hoverLinkFromSeriesMouseOver: function (e) {\n\t var el = e.target;\n\t\n\t if (!el || el.dataIndex == null) {\n\t return;\n\t }\n\t\n\t var dataModel = el.dataModel || this.ecModel.getSeriesByIndex(el.seriesIndex);\n\t var data = dataModel.getData(el.dataType);\n\t var dim = data.getDimension(this.visualMapModel.getDataDimension(data));\n\t var value = data.get(dim, el.dataIndex, true);\n\t\n\t if (!isNaN(value)) {\n\t this._showIndicator(value, value);\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _hideIndicator: function () {\n\t var shapes = this._shapes;\n\t shapes.indicator && shapes.indicator.attr('invisible', true);\n\t shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _clearHoverLinkToSeries: function () {\n\t this._hideIndicator();\n\t\n\t var indices = this._hoverLinkDataIndices;\n\t\n\t this._dispatchHighDown('downplay', helper.convertDataIndex(indices));\n\t\n\t indices.length = 0;\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _clearHoverLinkFromSeries: function () {\n\t this._hideIndicator();\n\t\n\t var zr = this.api.getZr();\n\t zr.off('mouseover', this._hoverLinkFromSeriesMouseOver);\n\t zr.off('mouseout', this._hideIndicator);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _applyTransform: function (vertex, element, inverse, global) {\n\t var transform = graphic.getTransform(element, global ? null : this.group);\n\t\n\t return graphic[\n\t zrUtil.isArray(vertex) ? 'applyTransform' : 'transformDirection'\n\t ](vertex, transform, inverse);\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _dispatchHighDown: function (type, batch) {\n\t batch && batch.length && this.api.dispatchAction({\n\t type: type,\n\t batch: batch\n\t });\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t dispose: function () {\n\t this._clearHoverLinkFromSeries();\n\t this._clearHoverLinkToSeries();\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t remove: function () {\n\t this._clearHoverLinkFromSeries();\n\t this._clearHoverLinkToSeries();\n\t }\n\t\n\t });\n\t\n\t function createPolygon(points, cursor, onDrift, onDragEnd) {\n\t return new graphic.Polygon({\n\t shape: {points: points},\n\t draggable: !!onDrift,\n\t cursor: cursor,\n\t drift: onDrift,\n\t ondragend: onDragEnd\n\t });\n\t }\n\t\n\t function createHandlePoints(handleIndex, textSize) {\n\t return handleIndex === 0\n\t ? [[0, 0], [textSize, 0], [textSize, -textSize]]\n\t : [[0, 0], [textSize, 0], [textSize, textSize]];\n\t }\n\t\n\t function createIndicatorPoints(isRange, halfHoverLinkSize, pos, extentMax) {\n\t return isRange\n\t ? [ // indicate range\n\t [0, -mathMin(halfHoverLinkSize, mathMax(pos, 0))],\n\t [HOVER_LINK_OUT, 0],\n\t [0, mathMin(halfHoverLinkSize, mathMax(extentMax - pos, 0))]\n\t ]\n\t : [ // indicate single value\n\t [0, 0], [5, -5], [5, 5]\n\t ];\n\t }\n\t\n\t function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) {\n\t var halfHoverLinkSize = HOVER_LINK_SIZE / 2;\n\t var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize');\n\t if (hoverLinkDataSize) {\n\t halfHoverLinkSize = linearMap(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2;\n\t }\n\t return halfHoverLinkSize;\n\t }\n\t\n\t function useHoverLinkOnHandle(visualMapModel) {\n\t return !visualMapModel.get('realtime') && visualMapModel.get('hoverLinkOnHandle');\n\t }\n\t\n\t module.exports = ContinuousView;\n\t\n\n\n/***/ },\n/* 689 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var VisualMapModel = __webpack_require__(226);\n\t var zrUtil = __webpack_require__(1);\n\t var VisualMapping = __webpack_require__(69);\n\t var visualDefault = __webpack_require__(242);\n\t var reformIntervals = __webpack_require__(5).reformIntervals;\n\t\n\t var PiecewiseModel = VisualMapModel.extend({\n\t\n\t type: 'visualMap.piecewise',\n\t\n\t /**\n\t * Order Rule:\n\t *\n\t * option.categories / option.pieces / option.text / option.selected:\n\t * If !option.inverse,\n\t * Order when vertical: ['top', ..., 'bottom'].\n\t * Order when horizontal: ['left', ..., 'right'].\n\t * If option.inverse, the meaning of\n\t * the order should be reversed.\n\t *\n\t * this._pieceList:\n\t * The order is always [low, ..., high].\n\t *\n\t * Mapping from location to low-high:\n\t * If !option.inverse\n\t * When vertical, top is high.\n\t * When horizontal, right is high.\n\t * If option.inverse, reverse.\n\t */\n\t\n\t /**\n\t * @protected\n\t */\n\t defaultOption: {\n\t selected: null, // Object. If not specified, means selected.\n\t // When pieces and splitNumber: {'0': true, '5': true}\n\t // When categories: {'cate1': false, 'cate3': true}\n\t // When selected === false, means all unselected.\n\t\n\t minOpen: false, // Whether include values that smaller than `min`.\n\t maxOpen: false, // Whether include values that bigger than `max`.\n\t\n\t align: 'auto', // 'auto', 'left', 'right'\n\t itemWidth: 20, // When put the controller vertically, it is the length of\n\t // horizontal side of each item. Otherwise, vertical side.\n\t itemHeight: 14, // When put the controller vertically, it is the length of\n\t // vertical side of each item. Otherwise, horizontal side.\n\t itemSymbol: 'roundRect',\n\t pieceList: null, // Each item is Object, with some of those attrs:\n\t // {min, max, lt, gt, lte, gte, value,\n\t // color, colorSaturation, colorAlpha, opacity,\n\t // symbol, symbolSize}, which customize the range or visual\n\t // coding of the certain piece. Besides, see \"Order Rule\".\n\t categories: null, // category names, like: ['some1', 'some2', 'some3'].\n\t // Attr min/max are ignored when categories set. See \"Order Rule\"\n\t splitNumber: 5, // If set to 5, auto split five pieces equally.\n\t // If set to 0 and component type not set, component type will be\n\t // determined as \"continuous\". (It is less reasonable but for ec2\n\t // compatibility, see echarts/component/visualMap/typeDefaulter)\n\t selectedMode: 'multiple', // Can be 'multiple' or 'single'.\n\t itemGap: 10, // The gap between two items, in px.\n\t hoverLink: true // Enable hover highlight.\n\t },\n\t\n\t /**\n\t * @override\n\t */\n\t optionUpdated: function (newOption, isInit) {\n\t PiecewiseModel.superApply(this, 'optionUpdated', arguments);\n\t\n\t /**\n\t * The order is always [low, ..., high].\n\t * [{text: string, interval: Array.}, ...]\n\t * @private\n\t * @type {Array.}\n\t */\n\t this._pieceList = [];\n\t\n\t this.resetTargetSeries();\n\t this.resetExtent();\n\t\n\t /**\n\t * 'pieces', 'categories', 'splitNumber'\n\t * @type {string}\n\t */\n\t var mode = this._mode = this._determineMode();\n\t\n\t resetMethods[this._mode].call(this);\n\t\n\t this._resetSelected(newOption, isInit);\n\t\n\t var categories = this.option.categories;\n\t\n\t this.resetVisual(function (mappingOption, state) {\n\t if (mode === 'categories') {\n\t mappingOption.mappingMethod = 'category';\n\t mappingOption.categories = zrUtil.clone(categories);\n\t }\n\t else {\n\t mappingOption.dataExtent = this.getExtent();\n\t mappingOption.mappingMethod = 'piecewise';\n\t mappingOption.pieceList = zrUtil.map(this._pieceList, function (piece) {\n\t var piece = zrUtil.clone(piece);\n\t if (state !== 'inRange') {\n\t piece.visual = null;\n\t }\n\t return piece;\n\t });\n\t }\n\t });\n\t },\n\t\n\t /**\n\t * @protected\n\t * @override\n\t */\n\t completeVisualOption: function () {\n\t // Consider this case:\n\t // visualMap: {\n\t // pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}]\n\t // }\n\t // where no inRange/outOfRange set but only pieces. So we should make\n\t // default inRange/outOfRange for this case, otherwise visuals that only\n\t // appear in `pieces` will not be taken into account in visual encoding.\n\t\n\t var option = this.option;\n\t var visualTypesInPieces = {};\n\t var visualTypes = VisualMapping.listVisualTypes();\n\t var isCategory = this.isCategory();\n\t\n\t zrUtil.each(option.pieces, function (piece) {\n\t zrUtil.each(visualTypes, function (visualType) {\n\t if (piece.hasOwnProperty(visualType)) {\n\t visualTypesInPieces[visualType] = 1;\n\t }\n\t });\n\t });\n\t\n\t zrUtil.each(visualTypesInPieces, function (v, visualType) {\n\t var exists = 0;\n\t zrUtil.each(this.stateList, function (state) {\n\t exists |= has(option, state, visualType)\n\t || has(option.target, state, visualType);\n\t }, this);\n\t\n\t !exists && zrUtil.each(this.stateList, function (state) {\n\t (option[state] || (option[state] = {}))[visualType] = visualDefault.get(\n\t visualType, state === 'inRange' ? 'active' : 'inactive', isCategory\n\t );\n\t });\n\t }, this);\n\t\n\t function has(obj, state, visualType) {\n\t return obj && obj[state] && (\n\t zrUtil.isObject(obj[state])\n\t ? obj[state].hasOwnProperty(visualType)\n\t : obj[state] === visualType // e.g., inRange: 'symbol'\n\t );\n\t }\n\t\n\t VisualMapModel.prototype.completeVisualOption.apply(this, arguments);\n\t },\n\t\n\t _resetSelected: function (newOption, isInit) {\n\t var thisOption = this.option;\n\t var pieceList = this._pieceList;\n\t\n\t // Selected do not merge but all override.\n\t var selected = (isInit ? thisOption : newOption).selected || {};\n\t thisOption.selected = selected;\n\t\n\t // Consider 'not specified' means true.\n\t zrUtil.each(pieceList, function (piece, index) {\n\t var key = this.getSelectedMapKey(piece);\n\t if (!selected.hasOwnProperty(key)) {\n\t selected[key] = true;\n\t }\n\t }, this);\n\t\n\t if (thisOption.selectedMode === 'single') {\n\t // Ensure there is only one selected.\n\t var hasSel = false;\n\t\n\t zrUtil.each(pieceList, function (piece, index) {\n\t var key = this.getSelectedMapKey(piece);\n\t if (selected[key]) {\n\t hasSel\n\t ? (selected[key] = false)\n\t : (hasSel = true);\n\t }\n\t }, this);\n\t }\n\t // thisOption.selectedMode === 'multiple', default: all selected.\n\t },\n\t\n\t /**\n\t * @public\n\t */\n\t getSelectedMapKey: function (piece) {\n\t return this._mode === 'categories'\n\t ? piece.value + '' : piece.index + '';\n\t },\n\t\n\t /**\n\t * @public\n\t */\n\t getPieceList: function () {\n\t return this._pieceList;\n\t },\n\t\n\t /**\n\t * @private\n\t * @return {string}\n\t */\n\t _determineMode: function () {\n\t var option = this.option;\n\t\n\t return option.pieces && option.pieces.length > 0\n\t ? 'pieces'\n\t : this.option.categories\n\t ? 'categories'\n\t : 'splitNumber';\n\t },\n\t\n\t /**\n\t * @public\n\t * @override\n\t */\n\t setSelected: function (selected) {\n\t this.option.selected = zrUtil.clone(selected);\n\t },\n\t\n\t /**\n\t * @public\n\t * @override\n\t */\n\t getValueState: function (value) {\n\t var index = VisualMapping.findPieceIndex(value, this._pieceList);\n\t\n\t return index != null\n\t ? (this.option.selected[this.getSelectedMapKey(this._pieceList[index])]\n\t ? 'inRange' : 'outOfRange'\n\t )\n\t : 'outOfRange';\n\t },\n\t\n\t /**\n\t * @public\n\t * @params {number} pieceIndex piece index in visualMapModel.getPieceList()\n\t * @return {Array.} [{seriesId, dataIndices: >}, ...]\n\t */\n\t findTargetDataIndices: function (pieceIndex) {\n\t var result = [];\n\t\n\t this.eachTargetSeries(function (seriesModel) {\n\t var dataIndices = [];\n\t var data = seriesModel.getData();\n\t\n\t data.each(this.getDataDimension(data), function (value, dataIndex) {\n\t // Should always base on model pieceList, because it is order sensitive.\n\t var pIdx = VisualMapping.findPieceIndex(value, this._pieceList);\n\t pIdx === pieceIndex && dataIndices.push(dataIndex);\n\t }, true, this);\n\t\n\t result.push({seriesId: seriesModel.id, dataIndex: dataIndices});\n\t }, this);\n\t\n\t return result;\n\t },\n\t\n\t /**\n\t * @private\n\t * @param {Object} piece piece.value or piece.interval is required.\n\t * @return {number} Can be Infinity or -Infinity\n\t */\n\t getRepresentValue: function (piece) {\n\t var representValue;\n\t if (this.isCategory()) {\n\t representValue = piece.value;\n\t }\n\t else {\n\t if (piece.value != null) {\n\t representValue = piece.value;\n\t }\n\t else {\n\t var pieceInterval = piece.interval || [];\n\t representValue = (pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity)\n\t ? 0\n\t : (pieceInterval[0] + pieceInterval[1]) / 2;\n\t }\n\t }\n\t return representValue;\n\t },\n\t\n\t getVisualMeta: function (getColorVisual) {\n\t // Do not support category. (category axis is ordinal, numerical)\n\t if (this.isCategory()) {\n\t return;\n\t }\n\t\n\t var stops = [];\n\t var outerColors = [];\n\t var visualMapModel = this;\n\t\n\t function setStop(interval, valueState) {\n\t var representValue = visualMapModel.getRepresentValue({interval: interval});\n\t if (!valueState) {\n\t valueState = visualMapModel.getValueState(representValue);\n\t }\n\t var color = getColorVisual(representValue, valueState);\n\t if (interval[0] === -Infinity) {\n\t outerColors[0] = color;\n\t }\n\t else if (interval[1] === Infinity) {\n\t outerColors[1] = color;\n\t }\n\t else {\n\t stops.push(\n\t {value: interval[0], color: color},\n\t {value: interval[1], color: color}\n\t );\n\t }\n\t }\n\t\n\t // Suplement\n\t var pieceList = this._pieceList.slice();\n\t if (!pieceList.length) {\n\t pieceList.push({interval: [-Infinity, Infinity]});\n\t }\n\t else {\n\t var edge = pieceList[0].interval[0];\n\t edge !== -Infinity && pieceList.unshift({interval: [-Infinity, edge]});\n\t edge = pieceList[pieceList.length - 1].interval[1];\n\t edge !== Infinity && pieceList.push({interval: [edge, Infinity]});\n\t }\n\t\n\t var curr = -Infinity;\n\t zrUtil.each(pieceList, function (piece) {\n\t var interval = piece.interval;\n\t if (interval) {\n\t // Fulfill gap.\n\t interval[0] > curr && setStop([curr, interval[0]], 'outOfRange');\n\t setStop(interval.slice());\n\t curr = interval[1];\n\t }\n\t }, this);\n\t\n\t return {stops: stops, outerColors: outerColors};\n\t }\n\t\n\t });\n\t\n\t /**\n\t * Key is this._mode\n\t * @type {Object}\n\t * @this {module:echarts/component/viusalMap/PiecewiseMode}\n\t */\n\t var resetMethods = {\n\t\n\t splitNumber: function () {\n\t var thisOption = this.option;\n\t var pieceList = this._pieceList;\n\t var precision = thisOption.precision;\n\t var dataExtent = this.getExtent();\n\t var splitNumber = thisOption.splitNumber;\n\t splitNumber = Math.max(parseInt(splitNumber, 10), 1);\n\t thisOption.splitNumber = splitNumber;\n\t\n\t var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber;\n\t // Precision auto-adaption\n\t while (+splitStep.toFixed(precision) !== splitStep && precision < 5) {\n\t precision++;\n\t }\n\t thisOption.precision = precision;\n\t splitStep = +splitStep.toFixed(precision);\n\t\n\t var index = 0;\n\t\n\t if (thisOption.minOpen) {\n\t pieceList.push({\n\t index: index++,\n\t interval: [-Infinity, dataExtent[0]],\n\t close: [0, 0]\n\t });\n\t }\n\t\n\t for (\n\t var curr = dataExtent[0], len = index + splitNumber;\n\t index < len;\n\t curr += splitStep\n\t ) {\n\t var max = index === splitNumber - 1 ? dataExtent[1] : (curr + splitStep);\n\t\n\t pieceList.push({\n\t index: index++,\n\t interval: [curr, max],\n\t close: [1, 1]\n\t });\n\t }\n\t\n\t if (thisOption.maxOpen) {\n\t pieceList.push({\n\t index: index++,\n\t interval: [dataExtent[1], Infinity],\n\t close: [0, 0]\n\t });\n\t }\n\t\n\t reformIntervals(pieceList);\n\t\n\t zrUtil.each(pieceList, function (piece) {\n\t piece.text = this.formatValueText(piece.interval);\n\t }, this);\n\t },\n\t\n\t categories: function () {\n\t var thisOption = this.option;\n\t zrUtil.each(thisOption.categories, function (cate) {\n\t // FIXME category模式也使用pieceList,但在visualMapping中不是使用pieceList。\n\t // 是否改一致。\n\t this._pieceList.push({\n\t text: this.formatValueText(cate, true),\n\t value: cate\n\t });\n\t }, this);\n\t\n\t // See \"Order Rule\".\n\t normalizeReverse(thisOption, this._pieceList);\n\t },\n\t\n\t pieces: function () {\n\t var thisOption = this.option;\n\t var pieceList = this._pieceList;\n\t\n\t zrUtil.each(thisOption.pieces, function (pieceListItem, index) {\n\t\n\t if (!zrUtil.isObject(pieceListItem)) {\n\t pieceListItem = {value: pieceListItem};\n\t }\n\t\n\t var item = {text: '', index: index};\n\t\n\t if (pieceListItem.label != null) {\n\t item.text = pieceListItem.label;\n\t }\n\t\n\t if (pieceListItem.hasOwnProperty('value')) {\n\t var value = item.value = pieceListItem.value;\n\t item.interval = [value, value];\n\t item.close = [1, 1];\n\t }\n\t else {\n\t // `min` `max` is legacy option.\n\t // `lt` `gt` `lte` `gte` is recommanded.\n\t var interval = item.interval = [];\n\t var close = item.close = [0, 0];\n\t\n\t var closeList = [1, 0, 1];\n\t var infinityList = [-Infinity, Infinity];\n\t\n\t var useMinMax = [];\n\t for (var lg = 0; lg < 2; lg++) {\n\t var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg];\n\t for (var i = 0; i < 3 && interval[lg] == null; i++) {\n\t interval[lg] = pieceListItem[names[i]];\n\t close[lg] = closeList[i];\n\t useMinMax[lg] = i === 2;\n\t }\n\t interval[lg] == null && (interval[lg] = infinityList[lg]);\n\t }\n\t useMinMax[0] && interval[1] === Infinity && (close[0] = 0);\n\t useMinMax[1] && interval[0] === -Infinity && (close[1] = 0);\n\t\n\t if (__DEV__) {\n\t if (interval[0] > interval[1]) {\n\t console.warn(\n\t 'Piece ' + index + 'is illegal: ' + interval\n\t + ' lower bound should not greater then uppper bound.'\n\t );\n\t }\n\t }\n\t\n\t if (interval[0] === interval[1] && close[0] && close[1]) {\n\t // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}],\n\t // we use value to lift the priority when min === max\n\t item.value = interval[0];\n\t }\n\t }\n\t\n\t item.visual = VisualMapping.retrieveVisuals(pieceListItem);\n\t\n\t pieceList.push(item);\n\t\n\t }, this);\n\t\n\t // See \"Order Rule\".\n\t normalizeReverse(thisOption, pieceList);\n\t // Only pieces\n\t reformIntervals(pieceList);\n\t\n\t zrUtil.each(pieceList, function (piece) {\n\t var close = piece.close;\n\t var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]];\n\t piece.text = piece.text || this.formatValueText(\n\t piece.value != null ? piece.value : piece.interval,\n\t false,\n\t edgeSymbols\n\t );\n\t }, this);\n\t }\n\t };\n\t\n\t function normalizeReverse(thisOption, pieceList) {\n\t var inverse = thisOption.inverse;\n\t if (thisOption.orient === 'vertical' ? !inverse : inverse) {\n\t pieceList.reverse();\n\t }\n\t }\n\t\n\t module.exports = PiecewiseModel;\n\n\n/***/ },\n/* 690 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var VisualMapView = __webpack_require__(227);\n\t var zrUtil = __webpack_require__(1);\n\t var graphic = __webpack_require__(4);\n\t var symbolCreators = __webpack_require__(49);\n\t var layout = __webpack_require__(16);\n\t var helper = __webpack_require__(228);\n\t\n\t var PiecewiseVisualMapView = VisualMapView.extend({\n\t\n\t type: 'visualMap.piecewise',\n\t\n\t /**\n\t * @protected\n\t * @override\n\t */\n\t doRender: function () {\n\t var thisGroup = this.group;\n\t\n\t thisGroup.removeAll();\n\t\n\t var visualMapModel = this.visualMapModel;\n\t var textGap = visualMapModel.get('textGap');\n\t var textStyleModel = visualMapModel.textStyleModel;\n\t var textFont = textStyleModel.getFont();\n\t var textFill = textStyleModel.getTextColor();\n\t var itemAlign = this._getItemAlign();\n\t var itemSize = visualMapModel.itemSize;\n\t\n\t var viewData = this._getViewData();\n\t var showLabel = !viewData.endsText;\n\t var showEndsText = !showLabel;\n\t\n\t showEndsText && this._renderEndsText(thisGroup, viewData.endsText[0], itemSize);\n\t\n\t zrUtil.each(viewData.viewPieceList, renderItem, this);\n\t\n\t showEndsText && this._renderEndsText(thisGroup, viewData.endsText[1], itemSize);\n\t\n\t layout.box(\n\t visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap')\n\t );\n\t\n\t this.renderBackground(thisGroup);\n\t\n\t this.positionGroup(thisGroup);\n\t\n\t function renderItem(item) {\n\t var piece = item.piece;\n\t\n\t var itemGroup = new graphic.Group();\n\t itemGroup.onclick = zrUtil.bind(this._onItemClick, this, piece);\n\t\n\t this._enableHoverLink(itemGroup, item.indexInModelPieceList);\n\t\n\t var representValue = visualMapModel.getRepresentValue(piece);\n\t\n\t this._createItemSymbol(\n\t itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]]\n\t );\n\t\n\t if (showLabel) {\n\t var visualState = this.visualMapModel.getValueState(representValue);\n\t\n\t itemGroup.add(new graphic.Text({\n\t style: {\n\t x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap,\n\t y: itemSize[1] / 2,\n\t text: piece.text,\n\t textVerticalAlign: 'middle',\n\t textAlign: itemAlign,\n\t textFont: textFont,\n\t fill: textFill,\n\t opacity: visualState === 'outOfRange' ? 0.5 : 1\n\t }\n\t }));\n\t }\n\t\n\t thisGroup.add(itemGroup);\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _enableHoverLink: function (itemGroup, pieceIndex) {\n\t itemGroup\n\t .on('mouseover', zrUtil.bind(onHoverLink, this, 'highlight'))\n\t .on('mouseout', zrUtil.bind(onHoverLink, this, 'downplay'));\n\t\n\t function onHoverLink(method) {\n\t var visualMapModel = this.visualMapModel;\n\t\n\t visualMapModel.option.hoverLink && this.api.dispatchAction({\n\t type: method,\n\t batch: helper.convertDataIndex(\n\t visualMapModel.findTargetDataIndices(pieceIndex)\n\t )\n\t });\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _getItemAlign: function () {\n\t var visualMapModel = this.visualMapModel;\n\t var modelOption = visualMapModel.option;\n\t\n\t if (modelOption.orient === 'vertical') {\n\t return helper.getItemAlign(\n\t visualMapModel, this.api, visualMapModel.itemSize\n\t );\n\t }\n\t else { // horizontal, most case left unless specifying right.\n\t var align = modelOption.align;\n\t if (!align || align === 'auto') {\n\t align = 'left';\n\t }\n\t return align;\n\t }\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _renderEndsText: function (group, text, itemSize) {\n\t if (!text) {\n\t return;\n\t }\n\t\n\t var itemGroup = new graphic.Group();\n\t var textStyleModel = this.visualMapModel.textStyleModel;\n\t\n\t itemGroup.add(new graphic.Text({\n\t style: {\n\t x: itemSize[0] / 2,\n\t y: itemSize[1] / 2,\n\t textVerticalAlign: 'middle',\n\t textAlign: 'center',\n\t text: text,\n\t textFont: textStyleModel.getFont(),\n\t fill: textStyleModel.getTextColor()\n\t }\n\t }));\n\t\n\t group.add(itemGroup);\n\t },\n\t\n\t /**\n\t * @private\n\t * @return {Object} {peiceList, endsText} The order is the same as screen pixel order.\n\t */\n\t _getViewData: function () {\n\t var visualMapModel = this.visualMapModel;\n\t\n\t var viewPieceList = zrUtil.map(visualMapModel.getPieceList(), function (piece, index) {\n\t return {piece: piece, indexInModelPieceList: index};\n\t });\n\t var endsText = visualMapModel.get('text');\n\t\n\t // Consider orient and inverse.\n\t var orient = visualMapModel.get('orient');\n\t var inverse = visualMapModel.get('inverse');\n\t\n\t // Order of model pieceList is always [low, ..., high]\n\t if (orient === 'horizontal' ? inverse : !inverse) {\n\t viewPieceList.reverse();\n\t }\n\t // Origin order of endsText is [high, low]\n\t else if (endsText) {\n\t endsText = endsText.slice().reverse();\n\t }\n\t\n\t return {viewPieceList: viewPieceList, endsText: endsText};\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _createItemSymbol: function (group, representValue, shapeParam) {\n\t group.add(symbolCreators.createSymbol(\n\t this.getControllerVisual(representValue, 'symbol'),\n\t shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3],\n\t this.getControllerVisual(representValue, 'color')\n\t ));\n\t },\n\t\n\t /**\n\t * @private\n\t */\n\t _onItemClick: function (piece) {\n\t var visualMapModel = this.visualMapModel;\n\t var option = visualMapModel.option;\n\t var selected = zrUtil.clone(option.selected);\n\t var newKey = visualMapModel.getSelectedMapKey(piece);\n\t\n\t if (option.selectedMode === 'single') {\n\t selected[newKey] = true;\n\t zrUtil.each(selected, function (o, key) {\n\t selected[key] = key === newKey;\n\t });\n\t }\n\t else {\n\t selected[newKey] = !selected[newKey];\n\t }\n\t\n\t this.api.dispatchAction({\n\t type: 'selectDataRange',\n\t from: this.uid,\n\t visualMapId: this.visualMapModel.id,\n\t selected: selected\n\t });\n\t }\n\t });\n\t\n\t module.exports = PiecewiseVisualMapView;\n\t\n\n\n/***/ },\n/* 691 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t var Axis = __webpack_require__(68);\n\t var axisLabelInterval = __webpack_require__(695);\n\t\n\t /**\n\t * Extend axis 2d\n\t * @constructor module:echarts/coord/cartesian/Axis2D\n\t * @extends {module:echarts/coord/cartesian/Axis}\n\t * @param {string} dim\n\t * @param {*} scale\n\t * @param {Array.} coordExtent\n\t * @param {string} axisType\n\t * @param {string} position\n\t */\n\t var Axis2D = function (dim, scale, coordExtent, axisType, position) {\n\t Axis.call(this, dim, scale, coordExtent);\n\t /**\n\t * Axis type\n\t * - 'category'\n\t * - 'value'\n\t * - 'time'\n\t * - 'log'\n\t * @type {string}\n\t */\n\t this.type = axisType || 'value';\n\t\n\t /**\n\t * Axis position\n\t * - 'top'\n\t * - 'bottom'\n\t * - 'left'\n\t * - 'right'\n\t */\n\t this.position = position || 'bottom';\n\t };\n\t\n\t Axis2D.prototype = {\n\t\n\t constructor: Axis2D,\n\t\n\t /**\n\t * Index of axis, can be used as key\n\t */\n\t index: 0,\n\t /**\n\t * If axis is on the zero position of the other axis\n\t * @type {boolean}\n\t */\n\t onZero: false,\n\t\n\t /**\n\t * Axis model\n\t * @param {module:echarts/coord/cartesian/AxisModel}\n\t */\n\t model: null,\n\t\n\t isHorizontal: function () {\n\t var position = this.position;\n\t return position === 'top' || position === 'bottom';\n\t },\n\t\n\t getGlobalExtent: function () {\n\t var ret = this.getExtent();\n\t ret[0] = this.toGlobalCoord(ret[0]);\n\t ret[1] = this.toGlobalCoord(ret[1]);\n\t return ret;\n\t },\n\t\n\t /**\n\t * @return {number}\n\t */\n\t getLabelInterval: function () {\n\t var labelInterval = this._labelInterval;\n\t if (!labelInterval) {\n\t labelInterval = this._labelInterval = axisLabelInterval(this);\n\t }\n\t return labelInterval;\n\t },\n\t\n\t /**\n\t * If label is ignored.\n\t * Automatically used when axis is category and label can not be all shown\n\t * @param {number} idx\n\t * @return {boolean}\n\t */\n\t isLabelIgnored: function (idx) {\n\t if (this.type === 'category') {\n\t var labelInterval = this.getLabelInterval();\n\t return ((typeof labelInterval === 'function')\n\t && !labelInterval(idx, this.scale.getLabel(idx)))\n\t || idx % (labelInterval + 1);\n\t }\n\t },\n\t\n\t /**\n\t * Transform global coord to local coord,\n\t * i.e. var localCoord = axis.toLocalCoord(80);\n\t * designate by module:echarts/coord/cartesian/Grid.\n\t * @type {Function}\n\t */\n\t toLocalCoord: null,\n\t\n\t /**\n\t * Transform global coord to local coord,\n\t * i.e. var globalCoord = axis.toLocalCoord(40);\n\t * designate by module:echarts/coord/cartesian/Grid.\n\t * @type {Function}\n\t */\n\t toGlobalCoord: null\n\t\n\t };\n\t zrUtil.inherits(Axis2D, Axis);\n\t\n\t module.exports = Axis2D;\n\n\n/***/ },\n/* 692 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t/**\n\t * Cartesian coordinate system\n\t * @module echarts/coord/Cartesian\n\t *\n\t */\n\t\n\t\n\t var zrUtil = __webpack_require__(1);\n\t\n\t function dimAxisMapper(dim) {\n\t return this._axes[dim];\n\t }\n\t\n\t /**\n\t * @alias module:echarts/coord/Cartesian\n\t * @constructor\n\t */\n\t var Cartesian = function (name) {\n\t this._axes = {};\n\t\n\t this._dimList = [];\n\t\n\t /**\n\t * @type {string}\n\t */\n\t this.name = name || '';\n\t };\n\t\n\t Cartesian.prototype = {\n\t\n\t constructor: Cartesian,\n\t\n\t type: 'cartesian',\n\t\n\t /**\n\t * Get axis\n\t * @param {number|string} dim\n\t * @return {module:echarts/coord/Cartesian~Axis}\n\t */\n\t getAxis: function (dim) {\n\t return this._axes[dim];\n\t },\n\t\n\t /**\n\t * Get axes list\n\t * @return {Array.}\n\t */\n\t getAxes: function () {\n\t return zrUtil.map(this._dimList, dimAxisMapper, this);\n\t },\n\t\n\t /**\n\t * Get axes list by given scale type\n\t */\n\t getAxesByScale: function (scaleType) {\n\t scaleType = scaleType.toLowerCase();\n\t return zrUtil.filter(\n\t this.getAxes(),\n\t function (axis) {\n\t return axis.scale.type === scaleType;\n\t }\n\t );\n\t },\n\t\n\t /**\n\t * Add axis\n\t * @param {module:echarts/coord/Cartesian.Axis}\n\t */\n\t addAxis: function (axis) {\n\t var dim = axis.dim;\n\t\n\t this._axes[dim] = axis;\n\t\n\t this._dimList.push(dim);\n\t },\n\t\n\t /**\n\t * Convert data to coord in nd space\n\t * @param {Array.|Object.} val\n\t * @return {Array.|Object.